From 0b9cfb17a99674902fab97eb3cccc35b04f27b8e Mon Sep 17 00:00:00 2001 From: chan <1499188352@qq.com> Date: Fri, 7 Aug 2026 21:07:04 +0800 Subject: [PATCH 01/12] docs: add Android SDK documentation content - add Android SDK docs for chat, group, message, user, and calling - update generated navigation, routes, sidebar, and search metadata - adjust docs pages and tests to support Android content --- .../calling/managing-calls/accept-call.mdx | 17 + .../calling/managing-calls/cancel-call.mdx | 17 + .../managing-calls/handle-call-events.mdx | 17 + .../calling/managing-calls/hang-up-call.mdx | 17 + .../calling/managing-calls/reject-call.mdx | 17 + .../managing-calls/start-group-call.mdx | 17 + .../managing-calls/start-single-call.mdx | 17 + .../sdk/android/calling/overview-calling.mdx | 17 + .../get-room-by-group-id.mdx | 17 + .../get-token-by-room-id.mdx | 17 + .../restore-pending-invitation.mdx | 17 + .../send-a-custom-signal.mdx | 17 + .../clear-conversation-messages.mdx | 33 + .../clear-group-mentions.mdx | 33 + .../delete-conversation-with-messages.mdx | 34 + .../get-total-unread-count.mdx | 33 + .../hide-a-conversation.mdx | 33 + .../mark-conversation-read.mdx | 35 + .../pin-conversation.mdx | 32 + .../set-burn-duration.mdx | 32 + .../set-conversation-draft.mdx | 34 + .../set-conversation-extension.mdx | 34 + .../set-message-destruct.mdx | 38 + .../set-message-receive-option.mdx | 38 + .../set-private-chat.mdx | 32 + .../conversation/overview-conversation.mdx | 50 + .../get-conversation-by-target.mdx | 36 + .../get-conversation-id.mdx | 26 + .../get-conversations-by-id.mdx | 35 + .../retrieve-conversation-list.mdx | 59 + .../sdk/android/events/overview-events.mdx | 17 + .../track-file-upload-progress.mdx | 17 + .../sdk/android/file-uploads/upload-file.mdx | 17 + .../authenticate-and-manage-session.mdx | 195 + .../getting-started/before-you-start.mdx | 64 + .../environment-specific-implementation.mdx | 40 + .../getting-started/send-first-message.mdx | 109 +- .../sdk/android/group/change-group-mute.mdx | 17 + .../chat/sdk/android/group/create-group.mdx | 17 + .../chat/sdk/android/group/dismiss-group.mdx | 17 + .../accept-group-application.mdx | 17 + ...et-group-application-list-as-applicant.mdx | 17 + ...et-group-application-list-as-recipient.mdx | 17 + .../overview-group-applications.mdx | 17 + .../refuse-group-application.mdx | 17 + .../chat/sdk/android/group/join-group.mdx | 17 + .../change-group-member-mute.mdx | 17 + .../invite-user-to-group.mdx | 17 + .../kick-group-member.mdx | 17 + .../set-group-member-avatar.mdx | 17 + .../set-group-member-extension.mdx | 17 + .../set-group-member-nickname.mdx | 17 + .../set-group-member-role-level.mdx | 17 + .../transfer-group-owner.mdx | 17 + .../chat/sdk/android/group/overview-group.mdx | 17 + .../chat/sdk/android/group/quit-group.mdx | 17 + .../get-group-member-list.mdx | 17 + .../get-group-member-owner-and-admin.mdx | 17 + .../get-specified-group-members-info.mdx | 17 + .../get-users-in-group.mdx | 17 + .../overview-retrieving-group-members.mdx | 17 + .../search-group-members.mdx | 17 + .../get-joined-group-list-page.mdx | 17 + .../get-specified-groups-info.mdx | 17 + .../group/retrieving-groups/is-join-group.mdx | 17 + .../group/retrieving-groups/search-groups.mdx | 17 + .../android/group/set-group-announcement.mdx | 17 + .../sdk/android/group/set-group-extension.mdx | 17 + .../group/set-group-join-verification.mdx | 17 + .../set-group-member-friend-permission.mdx | 17 + .../group/set-group-member-profile-access.mdx | 17 + .../android/group/update-group-profile.mdx | 17 + .../update-typing-status.mdx | 17 + .../creating-messages/create-card-message.mdx | 17 + .../create-custom-message.mdx | 17 + .../creating-messages/create-face-message.mdx | 17 + .../create-file-message-by-file.mdx | 17 + .../create-file-message-by-url.mdx | 17 + .../create-forward-message.mdx | 17 + .../create-image-message-by-file.mdx | 17 + .../create-image-message-by-url.mdx | 17 + .../create-location-message.mdx | 17 + .../create-merger-message.mdx | 17 + .../create-quote-message.mdx | 17 + .../create-sound-message-by-file.mdx | 17 + .../create-sound-message-by-url.mdx | 17 + .../create-text-at-message.mdx | 17 + .../creating-messages/create-text-message.mdx | 17 + .../create-video-message-by-file.mdx | 17 + .../create-video-message-by-url.mdx | 17 + .../clear-all-local-messages.mdx | 17 + .../managing-messages/clear-all-messages.mdx | 17 + .../delete-local-message.mdx | 17 + .../delete-saved-messages.mdx | 17 + .../managing-messages/get-pinned-messages.mdx | 17 + .../insert-local-group-message.mdx | 17 + .../insert-local-single-message.mdx | 17 + .../managing-messages/modify-a-message.mdx | 17 + .../managing-messages/revoke-a-message.mdx | 17 + .../set-message-local-ex.mdx | 17 + .../managing-messages/set-message-pinned.mdx | 17 + .../receive-custom-business-messages.mdx | 17 + .../receiving-messages/receive-messages.mdx | 17 + .../find-messages-by-id.mdx | 17 + .../load-newer-messages.mdx | 17 + .../load-older-messages.mdx | 17 + .../searching-messages/search-messages.mdx | 17 + .../sending-messages/send-message-not-oss.mdx | 17 + .../message/sending-messages/send-message.mdx | 17 + .../set-msg-send-progress-listener.mdx | 17 + content/docs/chat/sdk/android/overview.mdx | 28 +- .../android/user/blacklist/add-blacklist.mdx | 43 + .../android/user/blacklist/get-blacklist.mdx | 55 + .../user/blacklist/remove-blacklist.mdx | 40 + .../accept-friend-application.mdx | 32 + .../user/friend-applications/add-friend.mdx | 34 + .../get-recv-friend-application-list.mdx | 75 + .../get-send-friend-application-list.mdx | 36 + .../refuse-friend-application.mdx | 32 + .../sdk/android/user/friends/check-friend.mdx | 33 + .../android/user/friends/delete-friend.mdx | 31 + .../user/friends/get-friend-list-page.mdx | 73 + .../android/user/friends/get-friends-info.mdx | 38 + .../android/user/friends/search-friends.mdx | 36 + .../android/user/friends/update-friends.mdx | 44 + .../get-subscribe-online-users-status.mdx | 32 + .../subscribe-users-online-status.mdx | 52 + .../chat/sdk/android/user/overview-user.mdx | 60 +- .../user-profile/get-self-local-user-info.mdx | 46 + .../user/user-profile/get-users-info.mdx | 55 + .../set-global-message-reception.mdx | 44 + .../user/user-profile/set-self-info.mdx | 60 + .../calling/managing-calls/accept-call.mdx | 32 + .../calling/managing-calls/cancel-call.mdx | 26 + .../managing-calls/handle-call-events.mdx | 74 + .../calling/managing-calls/hang-up-call.mdx | 26 + .../calling/managing-calls/reject-call.mdx | 26 + .../managing-calls/start-group-call.mdx | 44 + .../managing-calls/start-single-call.mdx | 64 + .../sdk/android/calling/overview-calling.mdx | 46 + .../get-room-by-group-id.mdx | 30 + .../get-token-by-room-id.mdx | 35 + .../restore-pending-invitation.mdx | 30 + .../send-a-custom-signal.mdx | 64 + .../clear-conversation-messages.mdx | 26 + .../clear-group-mentions.mdx | 28 + .../delete-conversation-with-messages.mdx | 29 + .../get-total-unread-count.mdx | 28 + .../hide-a-conversation.mdx | 28 + .../mark-conversation-read.mdx | 28 + .../pin-conversation.mdx | 27 + .../set-burn-duration.mdx | 27 + .../set-conversation-draft.mdx | 27 + .../set-conversation-extension.mdx | 27 + .../set-message-destruct.mdx | 33 + .../set-message-receive-option.mdx | 31 + .../set-private-chat.mdx | 27 + .../conversation/overview-conversation.mdx | 63 + .../get-conversation-by-target.mdx | 29 + .../get-conversation-id.mdx | 19 + .../get-conversations-by-id.mdx | 30 + .../retrieve-conversation-list.mdx | 52 + .../sdk/android/events/overview-events.mdx | 118 + .../track-file-upload-progress.mdx | 44 + .../sdk/android/file-uploads/upload-file.mdx | 54 + .../authenticate-and-manage-session.mdx | 188 + .../getting-started/before-you-start.mdx | 57 + .../environment-specific-implementation.mdx | 33 + .../getting-started/send-first-message.mdx | 104 + .../sdk/android/group/change-group-mute.mdx | 16 + .../chat/sdk/android/group/create-group.mdx | 23 + .../chat/sdk/android/group/dismiss-group.mdx | 16 + .../accept-group-application.mdx | 16 + ...et-group-application-list-as-applicant.mdx | 18 + ...et-group-application-list-as-recipient.mdx | 18 + .../overview-group-applications.mdx | 9 + .../refuse-group-application.mdx | 16 + .../chat/sdk/android/group/join-group.mdx | 16 + .../change-group-member-mute.mdx | 16 + .../invite-user-to-group.mdx | 16 + .../kick-group-member.mdx | 16 + .../set-group-member-avatar.mdx | 21 + .../set-group-member-extension.mdx | 21 + .../set-group-member-nickname.mdx | 21 + .../set-group-member-role-level.mdx | 21 + .../transfer-group-owner.mdx | 16 + .../chat/sdk/android/group/overview-group.mdx | 33 + .../chat/sdk/android/group/quit-group.mdx | 16 + .../get-group-member-list.mdx | 17 + .../get-group-member-owner-and-admin.mdx | 17 + .../get-specified-group-members-info.mdx | 17 + .../get-users-in-group.mdx | 16 + .../overview-retrieving-group-members.mdx | 9 + .../search-group-members.mdx | 17 + .../get-joined-group-list-page.mdx | 16 + .../get-specified-groups-info.mdx | 16 + .../group/retrieving-groups/is-join-group.mdx | 16 + .../group/retrieving-groups/search-groups.mdx | 16 + .../android/group/set-group-announcement.mdx | 20 + .../sdk/android/group/set-group-extension.mdx | 20 + .../group/set-group-join-verification.mdx | 20 + .../set-group-member-friend-permission.mdx | 20 + .../group/set-group-member-profile-access.mdx | 20 + .../android/group/update-group-profile.mdx | 21 + content/zh/docs/chat/sdk/android/logger.mdx | 112 + .../update-typing-status.mdx | 33 + .../creating-messages/create-card-message.mdx | 11 + .../create-custom-message.mdx | 12 + .../creating-messages/create-face-message.mdx | 11 + .../create-file-message-by-file.mdx | 12 + .../create-file-message-by-url.mdx | 11 + .../create-forward-message.mdx | 11 + .../create-image-message-by-file.mdx | 11 + .../create-image-message-by-url.mdx | 12 + .../create-location-message.mdx | 12 + .../create-merger-message.mdx | 12 + .../create-quote-message.mdx | 12 + .../create-sound-message-by-file.mdx | 12 + .../create-sound-message-by-url.mdx | 11 + .../create-text-at-message.mdx | 12 + .../creating-messages/create-text-message.mdx | 11 + .../create-video-message-by-file.mdx | 12 + .../create-video-message-by-url.mdx | 11 + .../clear-all-local-messages.mdx | 11 + .../managing-messages/clear-all-messages.mdx | 11 + .../delete-local-message.mdx | 11 + .../delete-saved-messages.mdx | 11 + .../managing-messages/get-pinned-messages.mdx | 14 + .../insert-local-group-message.mdx | 11 + .../insert-local-single-message.mdx | 11 + .../managing-messages/modify-a-message.mdx | 11 + .../managing-messages/revoke-a-message.mdx | 11 + .../set-message-local-ex.mdx | 11 + .../managing-messages/set-message-pinned.mdx | 11 + .../sdk/android/message/overview-message.mdx | 15 + .../receive-custom-business-messages.mdx | 17 + .../receiving-messages/receive-messages.mdx | 14 + .../find-messages-by-id.mdx | 14 + .../load-newer-messages.mdx | 11 + .../load-older-messages.mdx | 11 + .../searching-messages/search-messages.mdx | 12 + .../sending-messages/send-message-not-oss.mdx | 11 + .../message/sending-messages/send-message.mdx | 14 + .../set-msg-send-progress-listener.mdx | 15 + content/zh/docs/chat/sdk/android/overview.mdx | 21 + .../android/user/blacklist/add-blacklist.mdx | 36 + .../android/user/blacklist/get-blacklist.mdx | 50 + .../user/blacklist/remove-blacklist.mdx | 33 + .../accept-friend-application.mdx | 25 + .../user/friend-applications/add-friend.mdx | 27 + .../get-recv-friend-application-list.mdx | 68 + .../get-send-friend-application-list.mdx | 29 + .../refuse-friend-application.mdx | 25 + .../sdk/android/user/friends/check-friend.mdx | 26 + .../android/user/friends/delete-friend.mdx | 24 + .../user/friends/get-friend-list-page.mdx | 66 + .../android/user/friends/get-friends-info.mdx | 31 + .../android/user/friends/search-friends.mdx | 29 + .../android/user/friends/update-friends.mdx | 37 + .../get-subscribe-online-users-status.mdx | 25 + .../subscribe-users-online-status.mdx | 45 + .../chat/sdk/android/user/overview-user.mdx | 55 + .../user-profile/get-self-local-user-info.mdx | 39 + .../user/user-profile/get-users-info.mdx | 48 + .../set-global-message-reception.mdx | 37 + .../user/user-profile/set-self-info.mdx | 55 + data/structure/android-content-audit.json | 4520 +++++++++++++++++ data/structure/android-navigation-labels.json | 377 ++ data/structure/android-sidebar.json | 550 ++ data/structure/chat-pages.json | 1066 ++-- package.json | 8 +- .../build-client-sdk-zh-content.test.mjs | 7 + scripts/__tests__/build-search-index.test.mjs | 17 +- .../__tests__/client-sdk-publication.test.mjs | 16 +- scripts/__tests__/client-sdk-sidebar.test.mjs | 38 +- .../__tests__/search-index-contract.test.mjs | 9 +- .../sync-client-sdk-route-skeletons.test.mjs | 29 +- scripts/__tests__/wasm-commercial.test.mjs | 10 +- scripts/build-client-sdk-zh-content.mjs | 4 +- scripts/check-client-sdk-content-audit.mjs | 6 +- scripts/lib/client-sdk-platforms.mjs | 13 + scripts/sync-client-sdk-route-skeletons.mjs | 68 +- scripts/sync-content-metadata.mjs | 20 +- src/components/docs/documentation-page.tsx | 1 + src/components/docs/sdk-overview-page.tsx | 50 +- src/config/docs.ts | 3 +- src/generated/android-sdk-zh-content.json | 1765 +++++++ src/generated/navigation.json | 2071 ++++---- src/generated/routes.json | 2414 ++++----- src/generated/search-index-zh.json | 1324 ++--- src/generated/search-index.json | 1108 +--- src/lib/client-sdk-commercial.ts | 13 +- src/lib/client-sdk-publication.ts | 9 +- src/lib/localized-docs.ts | 2 + 294 files changed, 18405 insertions(+), 4350 deletions(-) create mode 100644 content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx create mode 100644 content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx create mode 100644 content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx create mode 100644 content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx create mode 100644 content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx create mode 100644 content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx create mode 100644 content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx create mode 100644 content/docs/chat/sdk/android/calling/overview-calling.mdx create mode 100644 content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx create mode 100644 content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx create mode 100644 content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx create mode 100644 content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx create mode 100644 content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx create mode 100644 content/docs/chat/sdk/android/conversation/overview-conversation.mdx create mode 100644 content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx create mode 100644 content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx create mode 100644 content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx create mode 100644 content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx create mode 100644 content/docs/chat/sdk/android/events/overview-events.mdx create mode 100644 content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx create mode 100644 content/docs/chat/sdk/android/file-uploads/upload-file.mdx create mode 100644 content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx create mode 100644 content/docs/chat/sdk/android/getting-started/before-you-start.mdx create mode 100644 content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx create mode 100644 content/docs/chat/sdk/android/group/change-group-mute.mdx create mode 100644 content/docs/chat/sdk/android/group/create-group.mdx create mode 100644 content/docs/chat/sdk/android/group/dismiss-group.mdx create mode 100644 content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx create mode 100644 content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx create mode 100644 content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx create mode 100644 content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx create mode 100644 content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx create mode 100644 content/docs/chat/sdk/android/group/join-group.mdx create mode 100644 content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx create mode 100644 content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx create mode 100644 content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx create mode 100644 content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx create mode 100644 content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx create mode 100644 content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx create mode 100644 content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx create mode 100644 content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx create mode 100644 content/docs/chat/sdk/android/group/overview-group.mdx create mode 100644 content/docs/chat/sdk/android/group/quit-group.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx create mode 100644 content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx create mode 100644 content/docs/chat/sdk/android/group/set-group-announcement.mdx create mode 100644 content/docs/chat/sdk/android/group/set-group-extension.mdx create mode 100644 content/docs/chat/sdk/android/group/set-group-join-verification.mdx create mode 100644 content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx create mode 100644 content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx create mode 100644 content/docs/chat/sdk/android/group/update-group-profile.mdx create mode 100644 content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx create mode 100644 content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx create mode 100644 content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx create mode 100644 content/docs/chat/sdk/android/message/sending-messages/send-message.mdx create mode 100644 content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx create mode 100644 content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx create mode 100644 content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx create mode 100644 content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx create mode 100644 content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx create mode 100644 content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx create mode 100644 content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx create mode 100644 content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx create mode 100644 content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx create mode 100644 content/docs/chat/sdk/android/user/friends/check-friend.mdx create mode 100644 content/docs/chat/sdk/android/user/friends/delete-friend.mdx create mode 100644 content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx create mode 100644 content/docs/chat/sdk/android/user/friends/get-friends-info.mdx create mode 100644 content/docs/chat/sdk/android/user/friends/search-friends.mdx create mode 100644 content/docs/chat/sdk/android/user/friends/update-friends.mdx create mode 100644 content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx create mode 100644 content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx create mode 100644 content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx create mode 100644 content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx create mode 100644 content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx create mode 100644 content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/overview-calling.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx create mode 100644 content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/overview-conversation.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx create mode 100644 content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx create mode 100644 content/zh/docs/chat/sdk/android/events/overview-events.mdx create mode 100644 content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx create mode 100644 content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx create mode 100644 content/zh/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx create mode 100644 content/zh/docs/chat/sdk/android/getting-started/before-you-start.mdx create mode 100644 content/zh/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx create mode 100644 content/zh/docs/chat/sdk/android/getting-started/send-first-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/change-group-mute.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/create-group.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/dismiss-group.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/join-group.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/overview-group.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/quit-group.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/set-group-extension.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/set-group-join-verification.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/set-group-member-profile-access.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/update-group-profile.mdx create mode 100644 content/zh/docs/chat/sdk/android/logger.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/overview-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/searching-messages/search-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx create mode 100644 content/zh/docs/chat/sdk/android/overview.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friend-applications/add-friend.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friends/check-friend.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friends/delete-friend.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friends/get-friends-info.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friends/search-friends.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/friends/update-friends.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/overview-user.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/user-profile/get-users-info.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/user-profile/set-self-info.mdx create mode 100644 data/structure/android-content-audit.json create mode 100644 data/structure/android-navigation-labels.json create mode 100644 data/structure/android-sidebar.json create mode 100644 src/generated/android-sdk-zh-content.json diff --git a/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx new file mode 100644 index 0000000000..dab1418694 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx @@ -0,0 +1,17 @@ +--- +title: 'Accept a call' +description: 'OpenIM Android SDK guide for Accept a call.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/accept-call' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx new file mode 100644 index 0000000000..cfe818d79a --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx @@ -0,0 +1,17 @@ +--- +title: 'Cancel a call invitation' +description: 'OpenIM Android SDK guide for Cancel a call invitation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/cancel-call' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx b/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx new file mode 100644 index 0000000000..5e00226229 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx @@ -0,0 +1,17 @@ +--- +title: 'Handle call events' +description: 'OpenIM Android SDK guide for Handle call events.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/handle-call-events' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx new file mode 100644 index 0000000000..a8f59457c7 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx @@ -0,0 +1,17 @@ +--- +title: 'End a call' +description: 'OpenIM Android SDK guide for End a call.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/hang-up-call' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx new file mode 100644 index 0000000000..1ab2de057c --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx @@ -0,0 +1,17 @@ +--- +title: 'Reject a call' +description: 'OpenIM Android SDK guide for Reject a call.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/reject-call' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx new file mode 100644 index 0000000000..0b701cf118 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx @@ -0,0 +1,17 @@ +--- +title: 'Start a group call' +description: 'OpenIM Android SDK guide for Start a group call.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/start-group-call' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx new file mode 100644 index 0000000000..09e21d3939 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx @@ -0,0 +1,17 @@ +--- +title: 'Start a one-to-one call' +description: 'OpenIM Android SDK guide for Start a one-to-one call.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/start-single-call' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/overview-calling.mdx b/content/docs/chat/sdk/android/calling/overview-calling.mdx new file mode 100644 index 0000000000..1893a85cc9 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/overview-calling.mdx @@ -0,0 +1,17 @@ +--- +title: 'Audio and video calling overview' +description: 'OpenIM Android SDK guide for Audio and video calling overview.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/overview-calling' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx new file mode 100644 index 0000000000..bbff58ad19 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx @@ -0,0 +1,17 @@ +--- +title: 'Get a group call room' +description: 'OpenIM Android SDK guide for Get a group call room.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/retrieving-call-information/get-room-by-group-id' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx new file mode 100644 index 0000000000..a4642bd62a --- /dev/null +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx @@ -0,0 +1,17 @@ +--- +title: 'Get a call room token' +description: 'OpenIM Android SDK guide for Get a call room token.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/retrieving-call-information/get-token-by-room-id' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx new file mode 100644 index 0000000000..46f22f6153 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx @@ -0,0 +1,17 @@ +--- +title: 'Restore a pending call invitation' +description: 'OpenIM Android SDK guide for Restore a pending call invitation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/retrieving-call-information/restore-pending-invitation' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx b/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx new file mode 100644 index 0000000000..98d59a1877 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx @@ -0,0 +1,17 @@ +--- +title: 'Send a custom signal' +description: 'OpenIM Android SDK guide for Send a custom signal.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/sending-custom-signals/send-a-custom-signal' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx new file mode 100644 index 0000000000..223229b3e4 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx @@ -0,0 +1,33 @@ +--- +title: 'Clear messages in a conversation' +description: 'Use messageManager.clearConversationAndDeleteAllMsg() to keep an Android conversation entry while clearing its messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/clear-conversation-messages' +--- + +Use `messageManager.clearConversationAndDeleteAllMsg()` for a product action such as “clear chat history”. + +```java +OpenIMClient.getInstance().messageManager.clearConversationAndDeleteAllMsg( + conversationID, + new OnBase() { + @Override + public void onSuccess(String data) { + messageStore.clearConversation(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationClearFailure(code, error); + } + } +); +``` + +The conversation entry remains while the current account's messages and summary state are cleared. Clear the visible message list immediately, then reconcile the latest message, summary, and unread state from `onConversationChanged` or a fresh query. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx new file mode 100644 index 0000000000..05d2285f71 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx @@ -0,0 +1,33 @@ +--- +title: 'Reset group mention status' +description: 'Use resetConversationGroupAtType() to reset an Android conversation group mention state.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/clear-group-mentions' +--- + +After handling group messages that mention the current user, call `resetConversationGroupAtType()` to reset `groupAtType` to the normal state. + +```java +OpenIMClient.getInstance().conversationManager.resetConversationGroupAtType( + new OnBase() { + @Override + public void onSuccess(String data) { + markGroupMentionStateReset(conversationID); + } + + @Override + public void onError(int code, String error) { + recordGroupMentionResetFailure(code, error); + } + }, + conversationID +); +``` + +This operation only resets the state and must not be used to set `atMe` or `atAll`. Group mention state is distinct from message read state. Reconcile the conversation through `onConversationChanged`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx new file mode 100644 index 0000000000..ad542400b3 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx @@ -0,0 +1,34 @@ +--- +title: 'Delete a conversation and its messages' +description: 'Use deleteConversationAndDeleteAllMsg() to delete an Android conversation and its messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/delete-conversation-with-messages' +--- + +Use `deleteConversationAndDeleteAllMsg()` for a product action such as “delete this chat”. + +```java +OpenIMClient.getInstance().conversationManager.deleteConversationAndDeleteAllMsg( + new OnBase() { + @Override + public void onSuccess(String data) { + messageStore.clearConversation(conversationID); + conversationStore.remove(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationDeleteFailure(code, error); + } + }, + conversationID +); +``` + +After success, clear the current message list and conversation row. This does not delete a friend relationship or leave or dismiss a group. A conversation can be regenerated by a new message or synchronization while the chat target still exists; reconcile through `onConversationChanged` or a fresh query. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx new file mode 100644 index 0000000000..85aee970c4 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx @@ -0,0 +1,33 @@ +--- +title: 'Track the total unread count' +description: 'Use getTotalUnreadMsgCount() to retrieve the total unread count for the current Android account.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/get-total-unread-count' +--- + +`getTotalUnreadMsgCount()` returns the complete unread snapshot for the signed-in account. Do not sum `unreadCount` values from only the currently loaded conversation pages. + +```java +OpenIMClient.getInstance().conversationManager.getTotalUnreadMsgCount( + new OnBase() { + @Override + public void onSuccess(String value) { + int totalUnread = Integer.parseInt(value); + updateApplicationBadge(totalUnread); + } + + @Override + public void onError(int code, String error) { + recordTotalUnreadFailure(code, error); + } + } +); +``` + +The callback value is a `String`; handle parse failures as an application error rather than treating it as a partial list total. This page owns `OnConversationListener.onTotalUnreadMessageCountChanged(int count)`, which updates the application badge after the initial query. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx new file mode 100644 index 0000000000..6e105c864a --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx @@ -0,0 +1,33 @@ +--- +title: 'Hide a conversation' +description: 'Use hideConversation() to hide a conversation entry from the current Android account.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/hide-a-conversation' +--- + +`hideConversation()` hides only the current account's conversation entry. It does not delete a one-to-one relationship, leave a group, or affect another account. + +```java +OpenIMClient.getInstance().conversationManager.hideConversation( + new OnBase() { + @Override + public void onSuccess(String data) { + conversationStore.remove(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationHideFailure(code, error); + } + }, + conversationID +); +``` + +A hidden conversation can appear again after a new message or resynchronization. Remove it optimistically after success, then merge later `onConversationChanged` events idempotently by `conversationID`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx new file mode 100644 index 0000000000..e73766fafb --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx @@ -0,0 +1,35 @@ +--- +title: 'Mark a conversation as read' +description: 'Use messageManager.markConversationMessageAsRead() to mark Android conversation messages as read.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/mark-conversation-read' +--- + +Call `messageManager.markConversationMessageAsRead()` after the user has opened and read visible messages. Do not mark a conversation read merely because a notification was previewed or a message arrived in the background. + +```java +OpenIMClient.getInstance().messageManager.markConversationMessageAsRead( + conversationID, + new OnBase() { + @Override + public void onSuccess(String data) { + markConversationReadSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordMarkReadFailure(code, error); + } + } +); +``` + +Request completion does not guarantee `onConversationChanged` has arrived. Merge the current `ConversationInfo` by `conversationID`, or re-query it when immediate confirmation is required. + +For one-to-one chats, the peer can receive `OnAdvanceMsgListener.onRecvC2CReadReceipt`. Validate `sessionType == ConversationType.SINGLE_CHAT` and a non-empty `userID`, then update message read state from `msgIDList`. `MessageManager` retains one advanced message listener and should be configured once in a shared message state layer. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx new file mode 100644 index 0000000000..169a69bdaa --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx @@ -0,0 +1,32 @@ +--- +title: 'Pin or unpin a conversation' +description: 'Use pinConversation() to set the pinned state of an Android conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/pin-conversation' +--- + +```java +OpenIMClient.getInstance().conversationManager.pinConversation( + new OnBase() { + @Override + public void onSuccess(String data) { + markPinRequestSubmitted(conversationID, true); + } + + @Override + public void onError(int code, String error) { + recordConversationPinFailure(code, error); + } + }, + conversationID, + true +); +``` + +Pass `true` to pin and `false` to unpin. The setting affects only the current account's conversation list. A successful callback does not mean `onConversationChanged` has arrived; merge the later conversation increment by `conversationID`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx new file mode 100644 index 0000000000..e8a7398fb2 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx @@ -0,0 +1,32 @@ +--- +title: 'Set the burn duration' +description: 'Use setConversationBurnDuration() to set the Android burn-after-reading retention duration.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/set-burn-duration' +--- + +```java +OpenIMClient.getInstance().conversationManager.setConversationBurnDuration( + new OnBase() { + @Override + public void onSuccess(String data) { + markBurnDurationSubmitted(conversationID, 30); + } + + @Override + public void onError(int code, String error) { + recordBurnDurationFailure(code, error); + } + }, + conversationID, + 30 +); +``` + +`burnDuration` is measured in seconds. Enable or disable burn after reading with `isPrivateChat`; do not confuse this value with the scheduled server deletion period `msgDestructTime`. Merge the updated duration from `onConversationChanged`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx new file mode 100644 index 0000000000..82479d7b70 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx @@ -0,0 +1,34 @@ +--- +title: 'Set a conversation draft' +description: 'Use setConversationDraft() to save an Android conversation draft.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/set-conversation-draft' +--- + +Save the draft when a chat is left, the conversation changes, or editor content changes. Maintain editor state locally and debounce intermediate saves; submit the newest value before leaving the page. + +```java +OpenIMClient.getInstance().conversationManager.setConversationDraft( + new OnBase() { + @Override + public void onSuccess(String data) { + markDraftSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordDraftSaveFailure(code, error); + } + }, + conversationID, + editorValue +); +``` + +Pass an empty string to clear the draft. Request completion and the later `onConversationChanged` update are separate; merge `draftText` and `draftTextTime` by `conversationID`, and clear in-memory editor state after logout or an account switch. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx new file mode 100644 index 0000000000..db34de0d69 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx @@ -0,0 +1,34 @@ +--- +title: 'Set conversation extra data' +description: 'Use setConversationEx() to set an Android conversation extension string.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/set-conversation-extension' +--- + +`ex` is a complete string. The SDK does not merge JSON, so read the prior value and retain namespaces owned by other application modules. + +```java +OpenIMClient.getInstance().conversationManager.setConversationEx( + new OnBase() { + @Override + public void onSuccess(String data) { + markConversationExtensionSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationExtensionFailure(code, error); + } + }, + conversationID, + mergedExtensionJSON +); +``` + +Reconcile the result through `onConversationChanged` by `conversationID`; listener ownership is documented in [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list). diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx new file mode 100644 index 0000000000..80d1f51b7e --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx @@ -0,0 +1,38 @@ +--- +title: 'Schedule server message deletion' +description: 'Use setConversation() to configure scheduled server message deletion for an Android conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/set-message-destruct' +--- + +`isMsgDestruct` and `msgDestructTime` together configure scheduled server message deletion and can be sent in one `ConversationReq`. + +```java +ConversationReq request = new ConversationReq(); +request.setMsgDestruct(true); +request.setMsgDestructTime(3600); + +OpenIMClient.getInstance().conversationManager.setConversation( + new OnBase() { + @Override + public void onSuccess(String data) { + markMessageDestructSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordMessageDestructFailure(code, error); + } + }, + conversationID, + request +); +``` + +`msgDestructTime` is measured in seconds. Set `request.setMsgDestruct(false)` to disable the policy. This capability is distinct from burn after reading. Reconcile the latest switch and period through `onConversationChanged`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx new file mode 100644 index 0000000000..2de3a73dd1 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx @@ -0,0 +1,38 @@ +--- +title: 'Set conversation message reception' +description: 'Use setConversationRecvMessageOpt() to set message reception and notification behavior for one Android conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/set-message-receive-option' +--- + +```java +OpenIMClient.getInstance().conversationManager.setConversationRecvMessageOpt( + new OnBase() { + @Override + public void onSuccess(String data) { + markReceiveOptionSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordReceiveOptionFailure(code, error); + } + }, + conversationID, + 2 +); +``` + +| Value | Meaning | +| ----- | ------------------------------------------------------------- | +| `0` | Receive messages and allow notifications. | +| `1` | Do not receive messages from this conversation or notify. | +| `2` | Receive messages from this conversation without notification. | + +The account default is documented in [Set global message reception](/sdk/android/user/user-profile/set-global-message-reception). Merge the later `onConversationChanged` result by `conversationID`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx new file mode 100644 index 0000000000..899e5cb2b4 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx @@ -0,0 +1,32 @@ +--- +title: 'Enable or disable burn after reading' +description: 'Use setOneConversationPrivateChat() to configure burn-after-reading mode for an Android conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/set-private-chat' +--- + +```java +OpenIMClient.getInstance().conversationManager.setOneConversationPrivateChat( + new OnBase() { + @Override + public void onSuccess(String data) { + markPrivateChatSubmitted(conversationID, true); + } + + @Override + public void onError(int code, String error) { + recordPrivateChatFailure(code, error); + } + }, + conversationID, + true +); +``` + +Pass `false` to disable burn after reading. Set the duration separately with `burnDuration`; see [Set the burn duration](/sdk/android/conversation/managing-conversations/set-burn-duration). This is distinct from scheduled server message deletion. Reconcile the final state through `onConversationChanged`. diff --git a/content/docs/chat/sdk/android/conversation/overview-conversation.mdx b/content/docs/chat/sdk/android/conversation/overview-conversation.mdx new file mode 100644 index 0000000000..c8dd673cd0 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/overview-conversation.mdx @@ -0,0 +1,50 @@ +--- +title: 'Conversation overview' +description: 'Learn about ConversationInfo, conversationID, conversation settings, and conversation events in the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/overview-conversation' +--- + +A conversation is the chat-list state maintained by the signed-in account for a one-to-one or group chat. A `ConversationInfo` record contains unread count, latest message, pinning, draft, message reception, and extension data. `conversationID` identifies the account's conversation state; the chat target is the peer `userID` for a one-to-one chat or the `groupID` for a group chat. + +Group profile, membership, and permissions belong to Group APIs. Use `groupID` for group operations and `conversationID` for conversation settings, unread state, drafts, and message cleanup. + +## Conversation identifiers + +| Identifier | Purpose | +| ---------------- | ------------------------------------------------------------------------------------------------------------ | +| `conversationID` | Conversation record ID for settings, unread state, and message history. | +| `userID` | Peer user ID in a one-to-one chat. | +| `groupID` | Group ID for a group chat and Group API target. | +| `sourceId` | Chat target passed to queries and ID resolution: `userID` for a one-to-one chat, `groupID` for a group chat. | + +Use `ConversationType.SINGLE_CHAT` for one-to-one chats. For a group chat, use `ConversationType.GROUP_CHAT` or `ConversationType.SUPER_GROUP_CHAT` according to the group type. Do not construct a `conversationID` in application code. + +## ConversationInfo + +| Field | Description | +| ------------------------------------- | -------------------------------------------------- | +| `conversationID` / `conversationType` | Conversation ID and type. | +| `userID` / `groupID` | Peer user or target group. | +| `showName` / `faceURL` | Conversation-list display name and avatar. | +| `unreadCount` | Unread count for the conversation. | +| `latestMsg` / `latestMsgSendTime` | Latest-message JSON and send time. | +| `recvMsgOpt` / `groupAtType` | Reception option and group mention state. | +| `draftText` / `draftTextTime` | Draft and draft update time. | +| `isPinned` | Whether the conversation is pinned. | +| `isPrivateChat` / `burnDuration` | Burn-after-reading setting and duration. | +| `isMsgDestruct` / `msgDestructTime` | Server message-destruction configuration. | +| `ex` | Application-defined conversation extension string. | + +## State updates + +- [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) owns `onNewConversation` and `onConversationChanged`. +- [Track the total unread count](/sdk/android/conversation/managing-conversations/get-total-unread-count) owns `onTotalUnreadMessageCountChanged`. + +`ConversationManager` retains one `OnConversationListener`; `setOnConversationListener()` replaces it. Set a composed listener once in a shared state layer. Request completion, event arrival, and snapshot reconciliation are separate stages. diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx new file mode 100644 index 0000000000..ebea8b814b --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx @@ -0,0 +1,36 @@ +--- +title: 'Open a conversation' +description: 'Use getOneConversation() to retrieve one Android conversation by user or group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversation-by-target' +--- + +Use `getOneConversation()` when opening a chat from a contact, user profile, or group profile. Pass the peer user ID for a one-to-one chat and the group ID for a group chat; do not construct `ConversationInfo` locally when no messages exist yet. + +```java +OpenIMClient.getInstance().conversationManager.getOneConversation( + new OnBase() { + @Override + public void onSuccess(ConversationInfo conversation) { + openChatPage(conversation); + } + + @Override + public void onError(int code, String error) { + recordConversationOpenFailure(code, error); + } + }, + targetUserID, + ConversationType.SINGLE_CHAT +); +``` + +`sourceId` is the peer `userID` for a one-to-one chat and `groupID` for a group chat. Use `ConversationType.GROUP_CHAT` or `ConversationType.SUPER_GROUP_CHAT` for a group according to its type. + +The callback returns `ConversationInfo`. This query does not trigger a conversation listener; [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) merges later changes by `conversationID`. diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx new file mode 100644 index 0000000000..dc28debd0b --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx @@ -0,0 +1,26 @@ +--- +title: 'Resolve a conversation ID' +description: 'Use getConversationIDBySessionType() to resolve an Android conversation ID from a chat target.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversation-id' +--- + +When only the conversation ID is needed, call `getConversationIDBySessionType()` rather than constructing it in application code. + +```java +String conversationID = OpenIMClient.getInstance().conversationManager + .getConversationIDBySessionType( + targetUserID, + ConversationType.SINGLE_CHAT + ); +``` + +`sourceId` is the peer `userID` for a one-to-one chat and `groupID` for a group chat. Use the group conversation type that matches the target group. + +This Android API synchronously returns a `String` `conversationID`. It does not return `ConversationInfo` or trigger a conversation listener. Use [Open a conversation](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target) when profile data is required. diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx new file mode 100644 index 0000000000..2f522702e2 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx @@ -0,0 +1,35 @@ +--- +title: 'Get conversations by ID' +description: 'Use getMultipleConversation() to retrieve Android conversations by conversationID.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversations-by-id' +--- + +Use `getMultipleConversation()` when a set of `conversationID` values is already available and the latest conversation snapshot is needed. + +```java +OpenIMClient.getInstance().conversationManager.getMultipleConversation( + new OnBase>() { + @Override + public void onSuccess(List conversations) { + for (ConversationInfo item : conversations) { + conversationStore.put(item.getConversationID(), item); + } + } + + @Override + public void onError(int code, String error) { + recordConversationQueryFailure(code, error); + } + }, + conversationIDs +); +``` + +Remove empty and duplicate IDs before calling. The callback returns `List`. Treat an ID with no returned item as missing; do not assume response order exactly matches request order. This query does not trigger a conversation listener. diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx new file mode 100644 index 0000000000..78bd222c37 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx @@ -0,0 +1,59 @@ +--- +title: 'Get the conversation list' +description: 'Use getConversationListSplit() to retrieve the current Android account conversation list by page.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list' +--- + +The conversation list belongs to the signed-in account. Each `ConversationInfo` contains list state such as unread count, latest message, pinning, and draft. Use the paged API instead of the non-paged `getAllConversationList()`. + +## Retrieve a page + +```java +OpenIMClient.getInstance().conversationManager.getConversationListSplit( + new OnBase>() { + @Override + public void onSuccess(List conversations) { + mergeConversations(conversations); + } + + @Override + public void onError(int code, String error) { + recordConversationListFailure(code, error); + } + }, + 0, + 50 +); +``` + +| Parameter | Type | Description | +| --------- | ------ | ----------------------------------------------------- | +| `offset` | `long` | Zero-based paging offset; reset it to `0` on refresh. | +| `count` | `long` | Requested number of conversations. | + +The callback returns the current `List` page. Advance `offset` by the requested item count and deduplicate by `conversationID`. A page smaller than `count` normally indicates the end; clear paging state and reload from `0` on refresh. + +## Keep the list synchronized + +`getConversationListSplit()` only creates a snapshot. Combine these callbacks in the application's single `OnConversationListener`: + +```java +@Override +public void onNewConversation(List conversations) { + mergeConversations(conversations); +} + +@Override +public void onConversationChanged(List conversations) { + mergeConversations(conversations); +} +``` + +Both callbacks carry `List` and must merge idempotently by `conversationID`. A user can join a group without an existing conversation, and a historical conversation can remain after leaving a group, so do not substitute the joined-group list for the conversation list. diff --git a/content/docs/chat/sdk/android/events/overview-events.mdx b/content/docs/chat/sdk/android/events/overview-events.mdx new file mode 100644 index 0000000000..7b89f87bab --- /dev/null +++ b/content/docs/chat/sdk/android/events/overview-events.mdx @@ -0,0 +1,17 @@ +--- +title: 'Events overview' +description: 'OpenIM Android SDK guide for Events overview.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/events/overview-events' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx b/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx new file mode 100644 index 0000000000..b140b51680 --- /dev/null +++ b/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx @@ -0,0 +1,17 @@ +--- +title: 'Track file upload progress' +description: 'OpenIM Android SDK guide for Track file upload progress.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/file-uploads/track-file-upload-progress' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/file-uploads/upload-file.mdx b/content/docs/chat/sdk/android/file-uploads/upload-file.mdx new file mode 100644 index 0000000000..d42e494ae4 --- /dev/null +++ b/content/docs/chat/sdk/android/file-uploads/upload-file.mdx @@ -0,0 +1,17 @@ +--- +title: 'Upload a file' +description: 'OpenIM Android SDK guide for Upload a file.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/file-uploads/upload-file' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx b/content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx new file mode 100644 index 0000000000..29856453bf --- /dev/null +++ b/content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx @@ -0,0 +1,195 @@ +--- +title: 'Authenticate and manage a session' +description: 'Initialize OpenIM Android SDK, log in, inspect login state, handle connection callbacks, and sign out the current account.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/getting-started/authenticate-and-manage-session' +--- + +OpenIM Android SDK uses `initSDK()` to initialize the local runtime and `login()` to establish the current user's session. Complete the service, user, and token preparation in [Before you start](/sdk/android/getting-started/before-you-start), then add dependencies and permissions as described in [Integrate for Android](/sdk/android/getting-started/environment-specific-implementation). + +The complete flow is: + +1. Create a stable `OnConnListener` in an application-level session component. +2. Call `initSDK()` and confirm that it returns `true`. +3. Register message, user, relationship, conversation, group, and call-signaling listeners before login. +4. Obtain the matching `userID` and token from a trusted backend, then call `login()`. +5. Wait separately for login success and `onConnectSuccess()` before enabling operations that require the persistent connection. +6. On sign-out or account switching, call `logout()` and then clear application state owned by the current account. + +The `apiAddr`, `wsAddr`, `userID`, and `token` used below are all provided by a trusted backend. + +## Initialize and handle the connection lifecycle + +During the `Application` lifecycle, create the data directory, initialize the SDK, and provide the connection listener. Store connection state without recording tokens or complete service credentials in callback logs. + +```java +import android.app.Application; + +import java.io.File; + +import io.openim.android.sdk.OpenIMClient; +import io.openim.android.sdk.enums.LogLevel; +import io.openim.android.sdk.listener.OnConnListener; +import io.openim.android.sdk.models.InitConfig; + +File dataDirectory = new File(application.getFilesDir(), "openim"); +if (!dataDirectory.exists() && !dataDirectory.mkdirs()) { + throw new IllegalStateException("Cannot create the OpenIM data directory."); +} + +InitConfig config = new InitConfig( + apiAddr, + wsAddr, + dataDirectory.getAbsolutePath() +); +config.logLevel = LogLevel.Info; +config.isLogStandardOutput = false; + +OnConnListener connectionListener = new OnConnListener() { + @Override + public void onConnecting() { + sessionState.setConnectionState("connecting"); + } + + @Override + public void onConnectSuccess() { + sessionState.setConnectionState("connected"); + sessionState.enableConnectedOperations(); + } + + @Override + public void onConnectFailed(long code, String error) { + sessionState.setConnectionState("failed"); + recordConnectionFailure(code, error); + } + + @Override + public void onKickedOffline() { + sessionState.clearCurrentAccount(); + showSignedInElsewhereScreen(); + } + + @Override + public void onUserTokenExpired() { + requestNewTokenAndRelogin(); + } + + @Override + public void onUserTokenInvalid(String reason) { + sessionState.clearCurrentAccount(); + showSignInScreen(reason); + } +}; + +boolean initialized = OpenIMClient.getInstance().initSDK( + application, + config, + connectionListener +); + +if (!initialized) { + throw new IllegalStateException("OpenIMClientSDK initialization failed."); +} +``` + +A `true` return value means that the local SDK runtime initialized successfully. `OnConnListener` starts reporting persistent-connection state after `login()` is called. + +| Field | Type | Description | +| --------------------- | ------------- | ------------------------------------------------------------------------- | +| `application` | `Application` | Application-level context that owns the SDK lifecycle. | +| `apiAddr` | `String` | OpenIMServer HTTP API endpoint. | +| `wsAddr` | `String` | OpenIMServer WebSocket endpoint. | +| `dataDirectory` | `File` | Application-private persistent directory for the SDK database and logs. | +| `config.logLevel` | `int` | A `LogLevel` constant; reduce the logging level explicitly in production. | +| `isLogStandardOutput` | `boolean` | Whether OpenIM Core logs are emitted to the standard log stream. | + +Initialize the SDK only once in `Application` or an application-level session component. The Java wrapper exposes `networkChanged()` to ask Core to re-evaluate network connectivity; call it only when the application already has one centralized system-network observer, not from multiple screens. + +## Register business listeners before login + +Listener registration uses set semantics, so a later call replaces the previous listener. Create stable listener instances in an application-level event dispatcher and forward events to screen state. See [Send your first message](/sdk/android/getting-started/send-first-message) for the complete message-listener registration and incremental merge example. User, relationship, conversation, group, and call-signaling listeners follow the same ownership rule. + +The SDK does not expose remove or unset methods. During sign-out or account switching, the application event dispatcher must stop delivering callbacks to state owned by the previous account and replace the complete listener set before the next login. + +## Log in the current user + +```java +OpenIMClient.getInstance().login(new OnBase() { + @Override + public void onError(int code, String error) { + sessionState.setLoginState("failed"); + recordLoginFailure(code, error); + } + + @Override + public void onSuccess(String data) { + sessionState.setLoginState("logged"); + sessionState.setCurrentUserID(userID); + } +}, userID, token); +``` + +The successful `login()` callback means that the current login call completed. `OnConnListener.onConnectSuccess()` means that the persistent connection is available. Handle these as separate stages. Do not call `login()` concurrently or infer both states from only one callback. + +## Inspect login state + +```java +int loginStatus = OpenIMClient.getInstance().getLoginStatus(); + +if (loginStatus == LoginStatus.Logged) { + String currentUserID = OpenIMClient.getInstance().getLoginUserID(); + restoreSessionFor(currentUserID); +} +``` + +| State | Description | +| --------------------- | ------------------------------------------------------------------------------------ | +| `LoginStatus.Logout` | The SDK is not logged in. | +| `LoginStatus.Logging` | Login is in progress; do not start another login concurrently. | +| `LoginStatus.Logged` | The SDK is logged in. Persistent-connection state still comes from `OnConnListener`. | + +`getLoginStatus()` and `getLoginUserID()` return local SDK snapshots and do not trigger connection callbacks. Sign out the previous account before logging in with a different account. + +## Handle token failure and forced logout + +After `onUserTokenExpired()` or `onUserTokenInvalid()`, obtain new credentials for the current user from a trusted backend, then reauthenticate or return to the sign-in flow according to product policy. After `onKickedOffline()`, clear conversations, message views, unread counts, and other state owned by the current account. Do not treat forced logout as an explicit user sign-out. + +These callbacks do not have a business-entity merge key. Isolate them by the current `OpenIMClient` singleton and logged-in user. Stop asynchronous work and screen subscriptions owned by the previous account before starting a new login. + +## Sign out and release the SDK + +```java +OpenIMClient.getInstance().logout(new OnBase() { + @Override + public void onError(int code, String error) { + recordLogoutFailure(code, error); + } + + @Override + public void onSuccess(String data) { + sessionState.clearCurrentAccount(); + } +}); +``` + +Successful completion means that the current SDK login session has signed out. Clear application state after the success callback. For account switching, wait for the previous logout before calling `login()` for the next account. + +When the application will no longer use the SDK, release the runtime with: + +```java +OpenIMClient.getInstance().unInit(); +``` + +`unInit()` is not a replacement for `logout()` and must not run when an ordinary screen is destroyed. + +## Next steps + +- [Before you start](/sdk/android/getting-started/before-you-start) +- [Integrate for Android](/sdk/android/getting-started/environment-specific-implementation) +- [Send your first message](/sdk/android/getting-started/send-first-message) diff --git a/content/docs/chat/sdk/android/getting-started/before-you-start.mdx b/content/docs/chat/sdk/android/getting-started/before-you-start.mdx new file mode 100644 index 0000000000..b792c4ae9e --- /dev/null +++ b/content/docs/chat/sdk/android/getting-started/before-you-start.mdx @@ -0,0 +1,64 @@ +--- +title: 'Before you start' +description: 'Prepare OpenIMServer, user credentials, and the Android project before initializing, authenticating, or sending messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/getting-started/before-you-start' +--- + +Before integrating OpenIMClientSDK into a native Android application, prepare an accessible OpenIMServer deployment, a trusted user-authentication flow, and an Android project that satisfies the SDK build requirements. These prerequisites apply to both [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session) and [Send your first message](/sdk/android/getting-started/send-first-message). + +## Prepare OpenIMServer + +If OpenIMServer is not yet available, follow the [Docker deployment guide](/docs/guides/quick-deployment/docker). Confirm that both physical devices and emulators can reach these endpoints: + +| Field | Description | +| --------- | ---------------------------------------------------------------------------------------- | +| `apiAddr` | OpenIMServer HTTP API endpoint used for login, synchronization, and resource requests. | +| `wsAddr` | OpenIMServer WebSocket endpoint used for the persistent connection and real-time events. | + +Do not validate the endpoints only from the development computer. `localhost` inside an Android emulator refers to the emulator itself, so it cannot directly access services running locally on the development computer. When OpenIMServer runs on the development computer, map the API and WebSocket ports to the emulator first: + +```bash +adb reverse tcp:10002 tcp:10002 +adb reverse tcp:10001 tcp:10001 +``` + +After mapping, the emulator can use `http://127.0.0.1:10002` as `apiAddr` and `ws://127.0.0.1:10001` as `wsAddr`. Replace the port numbers with the ports that the development computer actually listens on, and confirm that `adb` is connected to the target emulator before running the commands. Production applications should use HTTPS and WSS, with DNS, TLS certificates, firewalls, reverse proxies, and WebSocket upgrades verified from a physical device. + +## Prepare the user and token + +`userID` identifies an OpenIMSDK user, while the token authenticates that user. A trusted backend must create or associate users, issue tokens, and enforce application permissions. The Android application must never store an administrator token, secret, or other server-side credential. + +For the backend flow, see [Prepare to use the Platform API](/platform-api/prepare-to-use-api) and [Issue a session token](/platform-api/user/managing-session-tokens/issue-a-session-token). After authenticating the application account, the backend should return only the following data needed for SDK login: + +| Data | Description | +| --- | --- | +| `userID` | The current user's OpenIM user ID. | +| `token` | The login token associated with that user. | +| `apiAddr` | The OpenIMServer HTTP API endpoint. | +| `wsAddr` | The OpenIMServer WebSocket endpoint. | + +The `userID` must correspond to the token. The client must not accept an arbitrary user ID and then issue, assemble, or exchange an administrator token. + +## Prepare the Android project + +Before integration, verify that the Android project meets the following requirements: + +- The application uses `minSdk` 21 or later, Java 8 compiler options, and `compileSdk` 36 or later. +- The application manifest declares `android.permission.INTERNET` and permits the SDK to inspect network state. +- An application-private persistent data directory is available, such as a dedicated directory under `Application.getFilesDir()`. Do not store the SDK database in a temporary cache or shared storage. +- Physical devices can reach `apiAddr`, `wsAddr`, and message-media domains. +- The release package covers the target device ABI; verify the native ABIs included in the actual delivery package. +- Product behavior is defined for network recovery, foreground and background transitions, token failure, forced logout, and multi-device login. + +For dependencies and manifest entries, see [Integrate for Android](/sdk/android/getting-started/environment-specific-implementation). For SDK initialization and authentication, see [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session). + +## Continue the integration + +Complete [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session) first. After the login callback succeeds and `OnConnListener.onConnectSuccess()` arrives, verify the messaging path with [Send your first message](/sdk/android/getting-started/send-first-message). diff --git a/content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx b/content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx new file mode 100644 index 0000000000..aa6ac6db23 --- /dev/null +++ b/content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx @@ -0,0 +1,40 @@ +--- +title: 'Integrate for Android' +description: 'Add OpenIM Android SDK dependencies and network permissions to an Android project.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/getting-started/environment-specific-implementation' +--- + +This page covers Android project dependencies and permissions only. For SDK initialization, connection listeners, and sign-in, see [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session). + +## Add SDK dependencies + +Add the dependencies to the application module's `build.gradle`: + +```groovy +dependencies { + implementation 'io.openim:android-sdk:latest@aar' + implementation 'io.openim:core-sdk:latest@aar' + implementation 'com.google.code.gson:gson:2.9.0' +} +``` + +## Configure the manifest + +The application needs network access: + +```xml + + +``` + +## Next steps + +- [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session) +- [Send your first message](/sdk/android/getting-started/send-first-message) diff --git a/content/docs/chat/sdk/android/getting-started/send-first-message.mdx b/content/docs/chat/sdk/android/getting-started/send-first-message.mdx index 5371214066..e0d5c79bea 100644 --- a/content/docs/chat/sdk/android/getting-started/send-first-message.mdx +++ b/content/docs/chat/sdk/android/getting-started/send-first-message.mdx @@ -1,18 +1,111 @@ --- title: 'Send your first message' -description: 'OpenIM · SDK · Android · v4 documentation scaffold for Send your first message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.' +description: 'Send and verify the first one-to-one text message in an Android application.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'scaffold' -lastUpdated: '2026-06-24' +status: 'published' +lastUpdated: '2026-08-06' version: 'v4' platform: 'android' sourcePath: '/sdk/android/getting-started/send-first-message' --- - +Use one-to-one text messaging to confirm that OpenIM is integrated correctly. Before starting, complete SDK initialization and sign-in in [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session). + +## Before you start + +- Prepare a test account for the sender and another for the receiver. +- Initialize the SDK for both accounts as described in [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session). Register the following listener on the receiver before it signs in. +- Replace `user_b` in the example with the receiver's actual `userID`. + +## Step 1: Listen for incoming messages on the receiver + +Register the message listener on the receiver before sign-in. When a message arrives, add it to the chat list or refresh the UI. + +```java +OpenIMClient.getInstance() + .messageManager + .setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override + public void onRecvNewMessage(Message message) { + // Display message in the chat UI. + } + }); +``` + +## Step 2: Confirm that sending is available + +After both accounts sign in, the sender can send only after its login callback succeeds and `OnConnListener.onConnectSuccess()` arrives. Keep the receiver connected so it can receive the new message. If a connection is not ready, wait for it to recover instead of calling `login()` again. + +## Step 3: Send a text message + +### Send a one-to-one text message + +Create the message, then send it. Put the receiver's `userID` in the user destination and leave the group destination empty. + +```java +Message message = OpenIMClient.getInstance() + .messageManager + .createTextMessage("Hello, OpenIMSDK"); + +OnMsgSendCallback sendCallback = new OnMsgSendCallback() { + @Override + public void onProgress(long progress) { + // Text messages usually do not need progress handling. + } + + @Override + public void onError(int code, String error) { + // Tell the user that sending failed and allow a retry. + } + + @Override + public void onSuccess(Message sentMessage) { + // Update the sender's chat UI with sentMessage. + } +}; + +OpenIMClient.getInstance().messageManager.sendMessage( + sendCallback, + message, + "user_b", + "", + new OfflinePushInfo() +); +``` + +`OfflinePushInfo` configures offline-push content. For this first test, pass an empty object and add a title, summary, or extra data later if needed. + +`onSuccess()` means the sender has sent the message successfully. `onRecvNewMessage()` on the receiver means the other side received it. Both callbacks should arrive before considering this one-to-one test complete. + +### Send a group text message + +To send a group message, leave the receiver `userID` empty and provide the group's `groupID`: + +```java +Message groupMessage = OpenIMClient.getInstance() + .messageManager + .createTextMessage("Hello, OpenIMSDK"); + +OpenIMClient.getInstance().messageManager.sendMessage( + sendCallback, + groupMessage, + "", + "group_123", + new OfflinePushInfo() +); +``` + +Set either `userID` or `groupID` in a single call, never both. + +## Verify success + +- The sender enters `onSuccess()`. +- The receiver enters `onRecvNewMessage()` and sees the text message. +- A one-to-one message sets only the receiver's `userID`; a group message sets only `groupID`. + +## Next steps + +- [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session) +- [OpenIM Android SDK overview](/sdk/android/overview) diff --git a/content/docs/chat/sdk/android/group/change-group-mute.mdx b/content/docs/chat/sdk/android/group/change-group-mute.mdx new file mode 100644 index 0000000000..9c15b73f1b --- /dev/null +++ b/content/docs/chat/sdk/android/group/change-group-mute.mdx @@ -0,0 +1,17 @@ +--- +title: 'Change group mute status' +description: 'OpenIM Android SDK guide for Change group mute status.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/change-group-mute' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/create-group.mdx b/content/docs/chat/sdk/android/group/create-group.mdx new file mode 100644 index 0000000000..69c7b84bab --- /dev/null +++ b/content/docs/chat/sdk/android/group/create-group.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a group' +description: 'OpenIM Android SDK guide for Create a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/create-group' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/dismiss-group.mdx b/content/docs/chat/sdk/android/group/dismiss-group.mdx new file mode 100644 index 0000000000..470891a2b7 --- /dev/null +++ b/content/docs/chat/sdk/android/group/dismiss-group.mdx @@ -0,0 +1,17 @@ +--- +title: 'Dismiss a group' +description: 'OpenIM Android SDK guide for Dismiss a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/dismiss-group' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx b/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx new file mode 100644 index 0000000000..002afef04a --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx @@ -0,0 +1,17 @@ +--- +title: 'Accept a group application' +description: 'OpenIM Android SDK guide for Accept a group application.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/accept-group-application' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx new file mode 100644 index 0000000000..7f5554b186 --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx @@ -0,0 +1,17 @@ +--- +title: 'Get sent group applications' +description: 'OpenIM Android SDK guide for Get sent group applications.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-applicant' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx new file mode 100644 index 0000000000..6dfb5603ad --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx @@ -0,0 +1,17 @@ +--- +title: 'Get received group applications' +description: 'OpenIM Android SDK guide for Get received group applications.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-recipient' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx b/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx new file mode 100644 index 0000000000..09014ab0b3 --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx @@ -0,0 +1,17 @@ +--- +title: 'Group applications overview' +description: 'OpenIM Android SDK guide for Group applications overview.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/overview-group-applications' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx b/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx new file mode 100644 index 0000000000..e1096ebbe8 --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx @@ -0,0 +1,17 @@ +--- +title: 'Reject a group application' +description: 'OpenIM Android SDK guide for Reject a group application.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/refuse-group-application' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/join-group.mdx b/content/docs/chat/sdk/android/group/join-group.mdx new file mode 100644 index 0000000000..6d8cf63d19 --- /dev/null +++ b/content/docs/chat/sdk/android/group/join-group.mdx @@ -0,0 +1,17 @@ +--- +title: 'Apply to join a group' +description: 'OpenIM Android SDK guide for Apply to join a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/join-group' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx b/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx new file mode 100644 index 0000000000..1cfdf22d93 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx @@ -0,0 +1,17 @@ +--- +title: 'Mute or unmute a group member' +description: 'OpenIM Android SDK guide for Mute or unmute a group member.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/change-group-member-mute' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx b/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx new file mode 100644 index 0000000000..4a92ebecde --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx @@ -0,0 +1,17 @@ +--- +title: 'Invite users to a group' +description: 'OpenIM Android SDK guide for Invite users to a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/invite-user-to-group' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx b/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx new file mode 100644 index 0000000000..b26abd5092 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx @@ -0,0 +1,17 @@ +--- +title: 'Remove group members' +description: 'OpenIM Android SDK guide for Remove group members.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/kick-group-member' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx new file mode 100644 index 0000000000..2eed4eff78 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx @@ -0,0 +1,17 @@ +--- +title: 'Update a group member’s avatar' +description: 'OpenIM Android SDK guide for Update a group member’s avatar.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-avatar' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx new file mode 100644 index 0000000000..eb98faea13 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx @@ -0,0 +1,17 @@ +--- +title: 'Set a group member extension' +description: 'OpenIM Android SDK guide for Set a group member extension.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-extension' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx new file mode 100644 index 0000000000..fdad13ad63 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx @@ -0,0 +1,17 @@ +--- +title: 'Update a member’s group nickname' +description: 'OpenIM Android SDK guide for Update a member’s group nickname.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-nickname' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx new file mode 100644 index 0000000000..33d54640cb --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx @@ -0,0 +1,17 @@ +--- +title: 'Manage group administrators' +description: 'OpenIM Android SDK guide for Manage group administrators.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-role-level' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx b/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx new file mode 100644 index 0000000000..d93b0ea0c7 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx @@ -0,0 +1,17 @@ +--- +title: 'Transfer group ownership' +description: 'OpenIM Android SDK guide for Transfer group ownership.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/transfer-group-owner' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/overview-group.mdx b/content/docs/chat/sdk/android/group/overview-group.mdx new file mode 100644 index 0000000000..067715a67d --- /dev/null +++ b/content/docs/chat/sdk/android/group/overview-group.mdx @@ -0,0 +1,17 @@ +--- +title: 'Group overview' +description: 'OpenIM Android SDK guide for Group overview.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/overview-group' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/quit-group.mdx b/content/docs/chat/sdk/android/group/quit-group.mdx new file mode 100644 index 0000000000..ee871c76e6 --- /dev/null +++ b/content/docs/chat/sdk/android/group/quit-group.mdx @@ -0,0 +1,17 @@ +--- +title: 'Leave a group' +description: 'OpenIM Android SDK guide for Leave a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/quit-group' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx new file mode 100644 index 0000000000..fd056bb831 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx @@ -0,0 +1,17 @@ +--- +title: 'List group members' +description: 'OpenIM Android SDK guide for List group members.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-list' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx new file mode 100644 index 0000000000..d758141c79 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx @@ -0,0 +1,17 @@ +--- +title: 'Get the group owner and administrators' +description: 'OpenIM Android SDK guide for Get the group owner and administrators.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx new file mode 100644 index 0000000000..8faea3fba3 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx @@ -0,0 +1,17 @@ +--- +title: 'Get specified group member profiles' +description: 'OpenIM Android SDK guide for Get specified group member profiles.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/get-specified-group-members-info' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx new file mode 100644 index 0000000000..3b19bb1eef --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx @@ -0,0 +1,17 @@ +--- +title: 'Check group membership' +description: 'OpenIM Android SDK guide for Check group membership.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/get-users-in-group' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx new file mode 100644 index 0000000000..09f43f4f5f --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx @@ -0,0 +1,17 @@ +--- +title: 'Group member queries overview' +description: 'OpenIM Android SDK guide for Group member queries overview.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/overview-retrieving-group-members' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx new file mode 100644 index 0000000000..261b3b6b1d --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx @@ -0,0 +1,17 @@ +--- +title: 'Search group members' +description: 'OpenIM Android SDK guide for Search group members.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/search-group-members' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx new file mode 100644 index 0000000000..9260220b44 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx @@ -0,0 +1,17 @@ +--- +title: 'Get joined groups by page' +description: 'OpenIM Android SDK guide for Get joined groups by page.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-groups/get-joined-group-list-page' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx new file mode 100644 index 0000000000..3efd2eec6f --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx @@ -0,0 +1,17 @@ +--- +title: 'Get group information' +description: 'OpenIM Android SDK guide for Get group information.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-groups/get-specified-groups-info' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx new file mode 100644 index 0000000000..6c1a41ea33 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx @@ -0,0 +1,17 @@ +--- +title: 'Check group membership' +description: 'OpenIM Android SDK guide for Check group membership.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-groups/is-join-group' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx new file mode 100644 index 0000000000..28f5870b58 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx @@ -0,0 +1,17 @@ +--- +title: 'Search groups' +description: 'OpenIM Android SDK guide for Search groups.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-groups/search-groups' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/set-group-announcement.mdx b/content/docs/chat/sdk/android/group/set-group-announcement.mdx new file mode 100644 index 0000000000..21b94105d2 --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-announcement.mdx @@ -0,0 +1,17 @@ +--- +title: 'Publish a group announcement' +description: 'OpenIM Android SDK guide for Publish a group announcement.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-announcement' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/set-group-extension.mdx b/content/docs/chat/sdk/android/group/set-group-extension.mdx new file mode 100644 index 0000000000..2ff7858f49 --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-extension.mdx @@ -0,0 +1,17 @@ +--- +title: 'Set group extra data' +description: 'OpenIM Android SDK guide for Set group extra data.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-extension' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/set-group-join-verification.mdx b/content/docs/chat/sdk/android/group/set-group-join-verification.mdx new file mode 100644 index 0000000000..dbb80b7c6a --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-join-verification.mdx @@ -0,0 +1,17 @@ +--- +title: 'Set group join verification' +description: 'OpenIM Android SDK guide for Set group join verification.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-join-verification' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx b/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx new file mode 100644 index 0000000000..6d04505804 --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx @@ -0,0 +1,17 @@ +--- +title: 'Set member friend request permission' +description: 'OpenIM Android SDK guide for Set member friend request permission.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-member-friend-permission' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx b/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx new file mode 100644 index 0000000000..dd5387bdca --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx @@ -0,0 +1,17 @@ +--- +title: 'Set member profile access' +description: 'OpenIM Android SDK guide for Set member profile access.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-member-profile-access' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/group/update-group-profile.mdx b/content/docs/chat/sdk/android/group/update-group-profile.mdx new file mode 100644 index 0000000000..dcd2399ee6 --- /dev/null +++ b/content/docs/chat/sdk/android/group/update-group-profile.mdx @@ -0,0 +1,17 @@ +--- +title: 'Update group profile' +description: 'OpenIM Android SDK guide for Update group profile.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/update-group-profile' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx b/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx new file mode 100644 index 0000000000..de5209df08 --- /dev/null +++ b/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx @@ -0,0 +1,17 @@ +--- +title: 'Report typing status' +description: 'OpenIM Android SDK guide for Report typing status.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/composing-messages/update-typing-status' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx new file mode 100644 index 0000000000..1580e92d0b --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a contact card message' +description: 'OpenIM Android SDK guide for Create a contact card message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-card-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx new file mode 100644 index 0000000000..e673b56096 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a custom message' +description: 'OpenIM Android SDK guide for Create a custom message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-custom-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx new file mode 100644 index 0000000000..4101251733 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create an emoji message' +description: 'OpenIM Android SDK guide for Create an emoji message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-face-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx new file mode 100644 index 0000000000..4996020871 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a file message from a file' +description: 'OpenIM Android SDK guide for Create a file message from a file.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-file' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx new file mode 100644 index 0000000000..3fa9cce541 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a file message from a URL' +description: 'OpenIM Android SDK guide for Create a file message from a URL.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-url' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx new file mode 100644 index 0000000000..e5868d7827 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a forwarded message' +description: 'OpenIM Android SDK guide for Create a forwarded message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-forward-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx new file mode 100644 index 0000000000..204f98e23a --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create an image message from a file' +description: 'OpenIM Android SDK guide for Create an image message from a file.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-file' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx new file mode 100644 index 0000000000..09ff19a178 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create an image message from a URL' +description: 'OpenIM Android SDK guide for Create an image message from a URL.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-url' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx new file mode 100644 index 0000000000..1cb0f5805f --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a location message' +description: 'OpenIM Android SDK guide for Create a location message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-location-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx new file mode 100644 index 0000000000..a7d9803089 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a merged forward message' +description: 'OpenIM Android SDK guide for Create a merged forward message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-merger-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx new file mode 100644 index 0000000000..41a9694cb6 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a reply message' +description: 'OpenIM Android SDK guide for Create a reply message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-quote-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx new file mode 100644 index 0000000000..c4b8965e56 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create an audio message from a file' +description: 'OpenIM Android SDK guide for Create an audio message from a file.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-file' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx new file mode 100644 index 0000000000..da093ce0e0 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create an audio message from a URL' +description: 'OpenIM Android SDK guide for Create an audio message from a URL.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-url' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx new file mode 100644 index 0000000000..e17e180fd3 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create an @ message' +description: 'OpenIM Android SDK guide for Create an @ message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-text-at-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx new file mode 100644 index 0000000000..9c71b67d46 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a text message' +description: 'OpenIM Android SDK guide for Create a text message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-text-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx new file mode 100644 index 0000000000..7960d05813 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a video message from files' +description: 'OpenIM Android SDK guide for Create a video message from files.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-file' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx new file mode 100644 index 0000000000..6777dc8506 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx @@ -0,0 +1,17 @@ +--- +title: 'Create a video message from URLs' +description: 'OpenIM Android SDK guide for Create a video message from URLs.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-url' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx new file mode 100644 index 0000000000..2cb99cd5e6 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx @@ -0,0 +1,17 @@ +--- +title: 'Clear all local messages' +description: 'OpenIM Android SDK guide for Clear all local messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/clear-all-local-messages' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx new file mode 100644 index 0000000000..1030a9cb05 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx @@ -0,0 +1,17 @@ +--- +title: 'Clear local and server messages' +description: 'OpenIM Android SDK guide for Clear local and server messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/clear-all-messages' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx new file mode 100644 index 0000000000..f026d8cd54 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Delete a local message' +description: 'OpenIM Android SDK guide for Delete a local message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/delete-local-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx new file mode 100644 index 0000000000..7649e1dfbe --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx @@ -0,0 +1,17 @@ +--- +title: 'Delete messages in a batch' +description: 'OpenIM Android SDK guide for Delete messages in a batch.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/delete-saved-messages' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx new file mode 100644 index 0000000000..969069c18b --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx @@ -0,0 +1,17 @@ +--- +title: 'Get pinned messages in a conversation' +description: 'OpenIM Android SDK guide for Get pinned messages in a conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/get-pinned-messages' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx new file mode 100644 index 0000000000..f3543c748b --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Insert a local group message' +description: 'OpenIM Android SDK guide for Insert a local group message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/insert-local-group-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx new file mode 100644 index 0000000000..ccaf2bcc05 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Insert a local one-to-one message' +description: 'OpenIM Android SDK guide for Insert a local one-to-one message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/insert-local-single-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx new file mode 100644 index 0000000000..57f100501a --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Modify a message' +description: 'OpenIM Android SDK guide for Modify a message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/modify-a-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx new file mode 100644 index 0000000000..c47af6dbb7 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Revoke a message' +description: 'OpenIM Android SDK guide for Revoke a message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/revoke-a-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx b/content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx new file mode 100644 index 0000000000..628339da08 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx @@ -0,0 +1,17 @@ +--- +title: 'Set a local message extension' +description: 'OpenIM Android SDK guide for Set a local message extension.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/set-message-local-ex' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx b/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx new file mode 100644 index 0000000000..7491a448cd --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx @@ -0,0 +1,17 @@ +--- +title: 'Pin or unpin a message' +description: 'OpenIM Android SDK guide for Pin or unpin a message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/set-message-pinned' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx b/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx new file mode 100644 index 0000000000..eb318b59c8 --- /dev/null +++ b/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx @@ -0,0 +1,17 @@ +--- +title: 'Receive custom business messages' +description: 'OpenIM Android SDK guide for Receive custom business messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/receiving-messages/receive-custom-business-messages' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx b/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx new file mode 100644 index 0000000000..ccaaaf7102 --- /dev/null +++ b/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx @@ -0,0 +1,17 @@ +--- +title: 'Receive messages' +description: 'OpenIM Android SDK guide for Receive messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/receiving-messages/receive-messages' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx new file mode 100644 index 0000000000..f606fc6ddc --- /dev/null +++ b/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx @@ -0,0 +1,17 @@ +--- +title: 'Find messages by ID' +description: 'OpenIM Android SDK guide for Find messages by ID.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/retrieving-messages/find-messages-by-id' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx new file mode 100644 index 0000000000..d582a57fdc --- /dev/null +++ b/content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx @@ -0,0 +1,17 @@ +--- +title: 'Load message history in reverse' +description: 'OpenIM Android SDK guide for Load message history in reverse.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/retrieving-messages/load-newer-messages' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx new file mode 100644 index 0000000000..af547c4b35 --- /dev/null +++ b/content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx @@ -0,0 +1,17 @@ +--- +title: 'Load message history' +description: 'OpenIM Android SDK guide for Load message history.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/retrieving-messages/load-older-messages' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx b/content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx new file mode 100644 index 0000000000..aa0346051e --- /dev/null +++ b/content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx @@ -0,0 +1,17 @@ +--- +title: 'Search messages' +description: 'OpenIM Android SDK guide for Search messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/searching-messages/search-messages' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx b/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx new file mode 100644 index 0000000000..173ae35cee --- /dev/null +++ b/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx @@ -0,0 +1,17 @@ +--- +title: 'Send an uploaded media message' +description: 'OpenIM Android SDK guide for Send an uploaded media message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/sending-messages/send-message-not-oss' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx b/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx new file mode 100644 index 0000000000..3764812cef --- /dev/null +++ b/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx @@ -0,0 +1,17 @@ +--- +title: 'Send a message' +description: 'OpenIM Android SDK guide for Send a message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/sending-messages/send-message' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx b/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx new file mode 100644 index 0000000000..9cfa3ba752 --- /dev/null +++ b/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx @@ -0,0 +1,17 @@ +--- +title: 'Track message sending progress' +description: 'OpenIM Android SDK guide for Track message sending progress.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'draft' +lastUpdated: '2026-07-20' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/sending-messages/set-msg-send-progress-listener' +generatedBy: 'sync-client-sdk-route-skeletons' +--- + +## Overview + +The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. diff --git a/content/docs/chat/sdk/android/overview.mdx b/content/docs/chat/sdk/android/overview.mdx index 05c6cb1618..08072e5a4a 100644 --- a/content/docs/chat/sdk/android/overview.mdx +++ b/content/docs/chat/sdk/android/overview.mdx @@ -1,18 +1,28 @@ --- -title: 'OpenIM SDK for Android' -description: 'OpenIM · SDK · Android · v4 documentation scaffold for OpenIM SDK for Android. Replace this placeholder with OpenIM-specific guidance, examples, and assets.' +title: 'OpenIM Android SDK overview' +description: 'Integrate users, conversations, groups, messages, calling signals, and events into a native Android application with OpenIM Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'overview' -status: 'scaffold' -lastUpdated: '2026-06-24' +status: 'published' +lastUpdated: '2026-08-06' version: 'v4' platform: 'android' sourcePath: '/sdk/android/overview' --- - +OpenIM Android SDK brings OpenIMSDK capabilities to native Android applications. Choose a domain below to open its documentation. + +## Documentation navigation + +| Domain | Content | +| --- | --- | +| [Getting started](/sdk/android/getting-started/environment-specific-implementation) | Integrate the SDK, configure the Android project, authenticate, manage the connection lifecycle, and send the first message. | +| [Users and relationships](/sdk/android/user/overview-user) | User profiles, online status, friends, friend applications, and blacklist. | +| [Conversations](/sdk/android/conversation/overview-conversation) | Conversation queries, drafts, unread counts, receive options, burn-after-reading settings, hiding, and deletion. | +| [Groups](/sdk/android/group/overview-group) | Group profiles, members, applications, permissions, mute settings, and group events. | +| [Messages](/sdk/android/message/overview-message) | Message creation, sending, receiving, history, search, deletion, revocation, and read receipts. | +| [File uploads](/sdk/android/file-uploads/upload-file) | Standalone file uploads and upload progress. | +| [Audio and video calls](/sdk/android/calling/overview-calling) | Invitations, acceptance, rejection, cancellation, hangup, room credentials, and custom signaling. | +| [Events](/sdk/android/events/overview-events) | Manager listeners, connection state, and data events. | +| [Logging](/sdk/android/logger) | SDK logging configuration and troubleshooting. | diff --git a/content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx b/content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx new file mode 100644 index 0000000000..251fc09ca4 --- /dev/null +++ b/content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx @@ -0,0 +1,43 @@ +--- +title: 'Block a user' +description: 'Use addBlacklist() to add a user to the current account blacklist.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/blacklist/add-blacklist' +--- + +```java +OpenIMClient.getInstance().friendshipManager.addBlacklist( + new OnBase() { + @Override + public void onSuccess(String data) { + markBlacklistRequestSubmitted(targetUserID); + } + + @Override + public void onError(int code, String error) { + recordBlacklistAddFailure(code, error); + } + }, + targetUserID, + "{\"source\":\"profile-menu\"}" +); +``` + +The second argument is the target `userID`, and the third argument is optional extension data. Use the overload without `ex` when no extension data is needed. A successful callback means the block request completed, not that the event has arrived. + +The blacklist is one-way: the blocked user cannot send messages to the current account. Whether the current account can continue to send messages is an application-level rule. `ex` is a complete string, so merge application-owned fields before updating it. + +This page owns `onBlacklistAdded`. Combine it into the application's single `OnFriendshipListener`: + +```java +@Override +public void onBlacklistAdded(BlacklistInfo user) { + blacklistStore.put(user.getUserID(), user); +} +``` diff --git a/content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx b/content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx new file mode 100644 index 0000000000..33ad0f2ff1 --- /dev/null +++ b/content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx @@ -0,0 +1,55 @@ +--- +title: 'Get the blacklist' +description: 'Use getBlacklist() to retrieve the current user blacklist.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/blacklist/get-blacklist' +--- + +The blacklist records users blocked by the current account. Use it for a blacklist settings screen, relationship state on a profile card, or to limit a chat entry point. Blacklist management and group member management are separate capabilities; use Group APIs to mute, remove, or change the role of a group member. + +## Get the blacklist + +After SDK initialization and login, call `getBlacklist()` to retrieve the full blacklist for the signed-in account. An empty list means no users are blocked. + +```java +OpenIMClient.getInstance().friendshipManager.getBlacklist( + new OnBase>() { + @Override + public void onSuccess(List users) { + blacklistStore.replace(users); + } + + @Override + public void onError(int code, String error) { + recordBlacklistFailure(code, error); + } + } +); +``` + +The callback returns `List`; call `UserInfo.getBlackInfo()` to retrieve the blacklist relationship object. + +## Blacklist record fields + +Common `BlacklistInfo` fields are: + +| Field | Description | +| ---------------- | ------------------------------------------------------------------- | +| `userID` | Target user ID blocked by the current user and the stable list key. | +| `nickname` | Target user nickname snapshot. | +| `faceURL` | Target user avatar URL. | +| `gender` | Target user gender value. | +| `operatorUserID` | User ID that performed the block operation. | +| `createTime` | Blacklist relationship creation time. | +| `addSource` | Source that added the blacklist relationship. | +| `ex` | Blacklist relationship extension string. | + +When the screen also needs friend remarks or the latest public profile, separately merge `FriendInfo` or `PublicUserInfo` by `userID`. Do not treat blacklist fields as friend profile data. + +Merge blacklist state by `userID`. This query does not trigger blacklist added or deleted callbacks. Replace the local snapshot on initial load, after reconnecting, or after an explicit refresh; incremental changes are owned by the [Block a user](/sdk/android/user/blacklist/add-blacklist) and [Unblock a user](/sdk/android/user/blacklist/remove-blacklist) listener pages. diff --git a/content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx b/content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx new file mode 100644 index 0000000000..fb9ed93480 --- /dev/null +++ b/content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx @@ -0,0 +1,40 @@ +--- +title: 'Unblock a user' +description: 'Use removeBlacklist() to remove a user from the current account blacklist.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/blacklist/remove-blacklist' +--- + +```java +OpenIMClient.getInstance().friendshipManager.removeBlacklist( + new OnBase() { + @Override + public void onSuccess(String data) { + markBlacklistRemovalSubmitted(targetUserID); + } + + @Override + public void onError(int code, String error) { + recordBlacklistRemovalFailure(code, error); + } + }, + targetUserID +); +``` + +A successful callback means the remove request completed, not that the event has arrived. Remove the local entry after `onBlacklistDeleted`; if the event is missed, reconcile through [Get the blacklist](/sdk/android/user/blacklist/get-blacklist). + +This page owns `onBlacklistDeleted`; remove the local entry by `userID`: + +```java +@Override +public void onBlacklistDeleted(BlacklistInfo user) { + blacklistStore.remove(user.getUserID()); +} +``` diff --git a/content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx b/content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx new file mode 100644 index 0000000000..39b0d1a0e1 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx @@ -0,0 +1,32 @@ +--- +title: 'Accept a friend request' +description: 'Use acceptFriendApplication() to accept a friend request.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friend-applications/accept-friend-application' +--- + +```java +OpenIMClient.getInstance().friendshipManager.acceptFriendApplication( + new OnBase() { + @Override + public void onSuccess(String data) { + markApplicationAccepted(applicantUserID); + } + + @Override + public void onError(int code, String error) { + recordApplicationAcceptFailure(code, error); + } + }, + applicantUserID, + "Accepted" +); +``` + +`applicantUserID` identifies the applicant, and the final argument is the handling message. A successful callback means the accept request completed. The request state and new friendship can arrive through separate callbacks and should be merged independently: `onFriendApplicationAccepted` updates the application and `onFriendAdded` updates the friendship. diff --git a/content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx b/content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx new file mode 100644 index 0000000000..a4e3ec4000 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx @@ -0,0 +1,34 @@ +--- +title: 'Send a friend request' +description: 'Use addFriend() to send a friend request to a specified user.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friend-applications/add-friend' +--- + +```java +OpenIMClient.getInstance().friendshipManager.addFriend( + new OnBase() { + @Override + public void onSuccess(String data) { + markFriendApplicationSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordFriendApplicationFailure(code, error); + } + }, + "user_b", + "Hello, I am Alex" +); +``` + +The second argument is the recipient's `userID`, and the third argument is the request message. A successful callback means the server received the request, not that the recipient accepted it. The target ID cannot be empty. Let a trusted application backend handle lookup by nickname, phone number, or other private fields. + +Merge friend request changes through `OnFriendshipListener`, as documented in [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list). diff --git a/content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx b/content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx new file mode 100644 index 0000000000..b50f4bd867 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx @@ -0,0 +1,75 @@ +--- +title: 'Get received friend requests' +description: 'Use getRecvFriendApplicationList() to query received friend requests by page.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friend-applications/get-recv-friend-application-list' +--- + +```java +GetFriendApplicationListAsRecipientReq request = + new GetFriendApplicationListAsRecipientReq(0, 20); + +OpenIMClient.getInstance().friendshipManager.getRecvFriendApplicationList( + new OnBase>() { + @Override + public void onSuccess(List applications) { + replaceReceivedApplications(applications); + } + + @Override + public void onError(int code, String error) { + recordReceivedApplicationFailure(code, error); + } + }, + request +); +``` + +`offset` starts at `0`, and `count` is the page size. To filter by handling state, use `setHandleResults(int[])` with values defined by the server contract. The callback returns the current page as `List`. + +| Field | Description | +| --------------------------------------------- | ---------------------------------------------------------------- | +| `fromUserID` / `fromNickname` / `fromFaceURL` | Applicant ID, nickname, and avatar snapshot. | +| `toUserID` / `toNickname` / `toFaceURL` | Recipient ID, nickname, and avatar snapshot. | +| `reqMsg` | Friend request message. | +| `handleResult` | Handling result: `0` pending, `1` accepted, `2` rejected. | +| `handlerUserID` | User ID that handled the request; it can be empty while pending. | +| `handleMsg` | Handling message. | +| `handleTime` | Handling time; do not treat it as valid while pending. | +| `createTime` | Request creation time. | +| `ex` | Friend request extension string. | + +Use `fromUserID:toUserID` as the stable request key. This page owns the friend request added, accepted, rejected, and deleted callbacks. Combine them into the application's single `OnFriendshipListener`: + +```java +@Override +public void onFriendApplicationAdded(FriendApplicationInfo application) { + friendApplicationStore.merge(application); +} + +@Override +public void onFriendApplicationAccepted(FriendApplicationInfo application) { + friendApplicationStore.merge(application); +} + +@Override +public void onFriendApplicationRejected(FriendApplicationInfo application) { + friendApplicationStore.merge(application); +} + +@Override +public void onFriendApplicationDeleted(FriendApplicationInfo application) { + friendApplicationStore.remove( + application.getFromUserID(), + application.getToUserID() + ); +} +``` + +Use whether `toUserID` equals the signed-in user ID to route a record to the received or sent list. After an application is accepted, `onFriendAdded`, owned by [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page), merges the new friendship. diff --git a/content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx b/content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx new file mode 100644 index 0000000000..1a9e8ee929 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx @@ -0,0 +1,36 @@ +--- +title: 'Get sent friend requests' +description: 'Use getSendFriendApplicationList() to query sent friend requests by page.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friend-applications/get-send-friend-application-list' +--- + +```java +GetFriendApplicationListAsApplicantReq request = + new GetFriendApplicationListAsApplicantReq(0, 20); + +OpenIMClient.getInstance().friendshipManager.getSendFriendApplicationList( + new OnBase>() { + @Override + public void onSuccess(List applications) { + replaceSentApplications(applications); + } + + @Override + public void onError(int code, String error) { + recordSentApplicationFailure(code, error); + } + }, + request +); +``` + +`offset` starts at `0`, and `count` is the page size. The callback returns the current page as `List`. Merge items by `fromUserID:toUserID`. This query only establishes a snapshot and does not trigger friend request callbacks. + +For sent requests, the signed-in user is normally `fromUserID`. The record fields and handling semantics are the same as [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list): the Android server contract uses `0` for pending, `1` for accepted, and `2` for rejected. diff --git a/content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx b/content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx new file mode 100644 index 0000000000..ae72e17d21 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx @@ -0,0 +1,32 @@ +--- +title: 'Reject a friend request' +description: 'Use refuseFriendApplication() to reject a friend request.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friend-applications/refuse-friend-application' +--- + +```java +OpenIMClient.getInstance().friendshipManager.refuseFriendApplication( + new OnBase() { + @Override + public void onSuccess(String data) { + markApplicationRejected(applicantUserID); + } + + @Override + public void onError(int code, String error) { + recordApplicationRejectFailure(code, error); + } + }, + applicantUserID, + "Not now" +); +``` + +`applicantUserID` identifies the applicant, and the final argument is the handling message. A successful callback means the reject request completed. Merge request state through the shared friend request listener; the final rejected state is `handleResult == 2`. diff --git a/content/docs/chat/sdk/android/user/friends/check-friend.mdx b/content/docs/chat/sdk/android/user/friends/check-friend.mdx new file mode 100644 index 0000000000..100488a665 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/check-friend.mdx @@ -0,0 +1,33 @@ +--- +title: 'Check friendship' +description: 'Use checkFriend() to check whether specified users are friends of the current user.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friends/check-friend' +--- + +```java +OpenIMClient.getInstance().friendshipManager.checkFriend( + new OnBase>() { + @Override + public void onSuccess(List relations) { + showFriendshipStates(relations); + } + + @Override + public void onError(int code, String error) { + recordFriendshipCheckFailure(code, error); + } + }, + Arrays.asList("user_a", "user_b") +); +``` + +The callback returns `List`. Each item's `userID` identifies the target user. `result == 1` means the user is a friend and is not in the blacklist. Interpret other result values only through the server contract; do not create additional client-side states. + +This method only establishes a relationship snapshot and does not trigger friendship callbacks. Use [`getFriendsInfo()`](/sdk/android/user/friends/get-friends-info) when nickname, avatar, or friend remark data is required. diff --git a/content/docs/chat/sdk/android/user/friends/delete-friend.mdx b/content/docs/chat/sdk/android/user/friends/delete-friend.mdx new file mode 100644 index 0000000000..4cab7ed68e --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/delete-friend.mdx @@ -0,0 +1,31 @@ +--- +title: 'Delete a friend' +description: 'Use deleteFriend() to remove one friendship from the current user.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friends/delete-friend' +--- + +```java +OpenIMClient.getInstance().friendshipManager.deleteFriend( + new OnBase() { + @Override + public void onSuccess(String data) { + markFriendDeletionSubmitted(friendUserID); + } + + @Override + public void onError(int code, String error) { + recordFriendDeletionFailure(code, error); + } + }, + friendUserID +); +``` + +A successful callback means the delete request completed. Remove the local record by `userID` after `onFriendDeleted` arrives. Event handling is documented in [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page). diff --git a/content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx b/content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx new file mode 100644 index 0000000000..f06689e125 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx @@ -0,0 +1,73 @@ +--- +title: 'Get the friend list by page' +description: 'Use getFriendListPage() to retrieve the current user friend list by page.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friends/get-friend-list-page' +--- + +```java +OpenIMClient.getInstance().friendshipManager.getFriendListPage( + new OnBase>() { + @Override + public void onSuccess(List friends) { + for (UserInfo friend : friends) { + friendStore.put(friend.getUserID(), friend); + } + } + + @Override + public void onError(int code, String error) { + recordFriendListFailure(code, error); + } + }, + 0, + 40, + true +); +``` + +The arguments after the callback are `offset`, `count`, and `filterBlack`. `offset` starts at `0`, `count` is the page size, and `filterBlack` removes blocked users when `true`. The callback returns the current page as `List`; call `getFriendInfo()` on each item for relationship details. Increase `offset` by the requested item count when loading another page; a page smaller than `count` normally marks the end. + +Use the paged API instead of `getFriendList()`. Merge snapshots and increments by `userID`. + +## Friend profile fields + +`UserInfo` is the Android wrapper object. `getFriendInfo()` returns `FriendInfo` for a friend list item. Common fields are: + +| Field | Description | +| ---------------- | ------------------------------------------------- | +| `userID` | Friend user ID and the stable friend-list key. | +| `nickname` | Account nickname of the friend. | +| `faceURL` | Account avatar URL of the friend. | +| `remark` | Friend remark set by the current account. | +| `ex` | Friendship extension string. | +| `addSource` | Source that created the friendship. | +| `operatorUserID` | User ID that created or updated the relationship. | +| `createTime` | Friendship creation time. | + +`nickname` and `faceURL` are account data, while `remark` and `ex` belong to the friendship. `UpdateFriendsReq` can submit `isPinned`, but the current Android `FriendInfo` model has no corresponding read field, so pinned state needs application-owned storage. Do not use a friend object to overwrite a stranger's `PublicUserInfo`, or write a friend remark back to the account nickname. + +This page owns the friend added, changed, and deleted callbacks. Combine them into the application's single `OnFriendshipListener`: + +```java +@Override +public void onFriendAdded(FriendInfo friend) { + friendStore.put(friend.getUserID(), friend); +} + +@Override +public void onFriendInfoChanged(FriendInfo friend) { + friendStore.put(friend.getUserID(), friend); +} + +@Override +public void onFriendDeleted(FriendInfo friend) { + friendStore.remove(friend.getUserID()); +} +``` diff --git a/content/docs/chat/sdk/android/user/friends/get-friends-info.mdx b/content/docs/chat/sdk/android/user/friends/get-friends-info.mdx new file mode 100644 index 0000000000..cbd885d042 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/get-friends-info.mdx @@ -0,0 +1,38 @@ +--- +title: 'Get specified friend profiles' +description: 'Use getFriendsInfo() to query friendship profiles for specified users.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friends/get-friends-info' +--- + +```java +OpenIMClient.getInstance().friendshipManager.getFriendsInfo( + new OnBase>() { + @Override + public void onSuccess(List friends) { + for (UserInfo friend : friends) { + friendStore.put(friend.getUserID(), friend); + } + } + + @Override + public void onError(int code, String error) { + recordFriendInfoFailure(code, error); + } + }, + Arrays.asList("user_a", "user_b"), + true +); +``` + +The second argument is the target user ID list. `filterBlack` controls whether blocked users are removed. Remove empty and duplicate IDs before calling. The callback returns `List`; use `getFriendInfo()` for friend remarks and relationship fields, then merge by `userID`. + +The result can omit a target that is not a friend or is excluded by `filterBlack == true`. When the UI also needs account-level public data, call [Get specified user profiles](/sdk/android/user/user-profile/get-users-info) and merge the two sources by `userID`. + +This query does not trigger friendship callbacks. Use [`checkFriend()`](/sdk/android/user/friends/check-friend) when only the relationship state is needed. diff --git a/content/docs/chat/sdk/android/user/friends/search-friends.mdx b/content/docs/chat/sdk/android/user/friends/search-friends.mdx new file mode 100644 index 0000000000..10d52db56a --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/search-friends.mdx @@ -0,0 +1,36 @@ +--- +title: 'Search friends' +description: 'Use searchFriends() to search the current user friend list.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friends/search-friends' +--- + +```java +OpenIMClient.getInstance().friendshipManager.searchFriends( + new OnBase>() { + @Override + public void onSuccess(List results) { + showFriendSearchResults(results); + } + + @Override + public void onError(int code, String error) { + recordFriendSearchFailure(code, error); + } + }, + Collections.singletonList(keyword.trim()), + true, + true, + true +); +``` + +Pass one non-empty value in `keywordList`. The three Boolean arguments select matching by user ID, nickname, and friend remark. Enable at least one field. To search multiple fields, enable the corresponding flags; the API does not treat multiple keywords as independent search conditions. + +The callback returns `List`. Search results belong to the current search view and should not replace the full friend snapshot. This query does not trigger friendship callbacks. diff --git a/content/docs/chat/sdk/android/user/friends/update-friends.mdx b/content/docs/chat/sdk/android/user/friends/update-friends.mdx new file mode 100644 index 0000000000..624e158896 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/update-friends.mdx @@ -0,0 +1,44 @@ +--- +title: 'Update friend profiles' +description: 'Use updateFriendsReq() to update friend remarks, pinned state, or extension data.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friends/update-friends' +--- + +```java +UpdateFriendsReq request = new UpdateFriendsReq(); +request.setFriendUserIDs(new String[] { friendUserID }); +request.setRemark(remark.trim()); + +OpenIMClient.getInstance().friendshipManager.updateFriendsReq( + new OnBase() { + @Override + public void onSuccess(String data) { + markFriendUpdateSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordFriendUpdateFailure(code, error); + } + }, + request +); +``` + +`UpdateFriendsReq` supports `friendUserIDs`, `remark`, `isPinned`, and `ex`. One call applies the same field value to every target friend. Use separate calls when friends need different values. `ex` is a complete string. + +| Field | Description | +| --------------- | ---------------------------------------------------------- | +| `friendUserIDs` | Friend ID array to update. | +| `remark` | Friend remark for the current account. | +| `isPinned` | Whether to pin the friend. | +| `ex` | Friendship extension string, replaced as a complete value. | + +A successful callback means the update request completed. Merge the friend increment through `onFriendInfoChanged`, as documented in [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page). diff --git a/content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx b/content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx new file mode 100644 index 0000000000..4c61c8b9c7 --- /dev/null +++ b/content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx @@ -0,0 +1,32 @@ +--- +title: 'Get subscribed user online status' +description: 'Use getSubscribeOnlineUsersStatus() to retrieve online status for subscribed users.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/online-status/get-subscribe-online-users-status' +--- + +```java +OpenIMClient.getInstance().userInfoManager.getSubscribeOnlineUsersStatus( + new OnBase>() { + @Override + public void onSuccess(List states) { + mergeOnlineStates(states); + } + + @Override + public void onError(int code, String error) { + recordStatusQueryFailure(code, error); + } + } +); +``` + +This method does not accept user IDs or modify the subscription set. The callback returns the current subscribed-user `List` snapshot, which can reconcile status by `userID` after reconnecting or reopening a screen. + +The query does not trigger `onUserStatusChanged`. Apply the snapshot only to presence state; retrieve names and avatars through the user profile APIs. diff --git a/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx b/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx new file mode 100644 index 0000000000..d0d5962638 --- /dev/null +++ b/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx @@ -0,0 +1,52 @@ +--- +title: 'Subscribe to user online status' +description: 'Use subscribeUsersOnlineStatus() to subscribe to online status for specified users.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/online-status/subscribe-users-online-status' +--- + +```java +List userIDs = Arrays.asList("user_a", "user_b"); + +OpenIMClient.getInstance().userInfoManager.subscribeUsersOnlineStatus( + new OnBase>() { + @Override + public void onSuccess(List states) { + mergeOnlineStates(states); + } + + @Override + public void onError(int code, String error) { + recordStatusSubscriptionFailure(code, error); + } + }, + userIDs +); +``` + +Remove empty and duplicate IDs, and subscribe only to users whose status is needed. The callback returns the initial `List` snapshot. Each item contains `userID`, `status`, and `platformIDs`. Deduplicate repeated subscriptions in the application state layer. + +## Status fields + +| Field | Description | +| ------------- | --------------------------------------------------- | +| `userID` | Target user ID. | +| `status` | Online status value defined by the server contract. | +| `platformIDs` | Platforms on which the user is online. | + +This page owns `onUserStatusChanged`. Combine it into the application's single `OnUserListener` and merge by `userID`: + +```java +@Override +public void onUserStatusChanged(UsersOnlineStatus status) { + onlineStatusStore.put(status.getUserID(), status); +} +``` + +Subscription only creates or updates the subscription set; do not treat its callback as friend profile data. Manage the subscription set centrally when users leave the visible range or the account changes. Android does not expose a verifiable unsubscribe entry point, so this documentation does not record one. diff --git a/content/docs/chat/sdk/android/user/overview-user.mdx b/content/docs/chat/sdk/android/user/overview-user.mdx index 0cfecbbd0d..a4e83af60a 100644 --- a/content/docs/chat/sdk/android/user/overview-user.mdx +++ b/content/docs/chat/sdk/android/user/overview-user.mdx @@ -1,18 +1,60 @@ --- -title: 'Overview' -description: 'OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.' +title: 'User overview' +description: 'Learn about user profiles, friendships, friend requests, blacklists, and online status in the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'scaffold' -lastUpdated: '2026-06-24' +status: 'published' +lastUpdated: '2026-08-06' version: 'v4' platform: 'android' sourcePath: '/sdk/android/user/overview-user' --- - +OpenIM Android SDK identifies each user by `userID`. When implementing profile cards, friend requests, contacts, or a blocklist, distinguish an application's public user profile from the current user's friend relationship and blocklist state. + +Group member lists, in-group nicknames, group roles, and member administration belong to the Groups domain. User APIs cover profiles, friendships, friend requests, blacklists, and online status. + +## User objects + +Android SDK returns different user objects for different scenarios: + +| Type | Use case | Main APIs | +| ----------------------- | ---------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | +| `LocalUser` | The current user's local profile, settings page, avatar, nickname, and account-level receive setting | `getSelfLocalUserInfo()`, `setSelfInfo()` | +| `PublicUserInfo` | Application user lookup, friend candidates, and profiles for users who are not friends | `getUsersInfo()` | +| `UserInfo` | Combined Android wrapper object that can carry public, friend, or blacklist information | `getFriendListPage()`, `getFriendsInfo()`, `getBlacklist()` | +| `FriendInfo` | The current user's friend list, friend remarks, and relationship extension data | `searchFriends()`, `getFriendListPage()` | +| `FriendApplicationInfo` | The parties, handling state, and message for a friend request | Friend request queries and callbacks | +| `BlacklistInfo` | Users blocked by the current user and their blocklist relationship fields | `getBlacklist()`, `addBlacklist()`, `removeBlacklist()` | +| `UsersOnlineStatus` | User online status and connected platforms | `subscribeUsersOnlineStatus()`, `getSubscribeOnlineUsersStatus()` | + +The same `userID` can appear in public profile, friend, blocklist, and group member data. Prefer `UserInfo.getFriendInfo()` when displaying a contact, `PublicUserInfo` when only a public account profile is needed, and `UserInfo.getBlackInfo()` on a blocklist screen. Conversation list and chat page titles belong to conversation data and should use the conversation display name. + +Use `userID` as the stable key for user lists and events. A friend request contains both parties, so use `fromUserID:toUserID` to identify one request. + +## Feature entry points + +| Requirement | Recommended page | +| --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | +| Retrieve public profiles by `userID` for friend candidates or profile cards | [Get specified user profiles](/sdk/android/user/user-profile/get-users-info) | +| Page through, search, or retrieve friend relationships by ID | [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page) | +| Send, retrieve, accept, or reject friend requests | [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list) | +| Update friend data | [Update friend profiles](/sdk/android/user/friends/update-friends) | +| Delete a friend relationship | [Delete a friend](/sdk/android/user/friends/delete-friend) | +| View and maintain the current user's blocklist | [Get the blacklist](/sdk/android/user/blacklist/get-blacklist) | +| Read or update the current user's nickname, avatar, and extension data | [Update the current user profile](/sdk/android/user/user-profile/set-self-info) | +| Configure account-level message reception and notification behavior | [Set global message reception](/sdk/android/user/user-profile/set-global-message-reception) | +| Subscribe to and retrieve online status | [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status) | + +## State updates + +Each user-related capability page owns the listener and merge behavior for its events: + +- Current user profile changes: [Update the current user profile](/sdk/android/user/user-profile/set-self-info). +- Friend request changes: [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list). +- Friend relationship and profile changes: [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page). +- Blocklist changes: [Block a user](/sdk/android/user/blacklist/add-blacklist). +- Online status changes: [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status). + +`UserInfoManager` and `FriendshipManager` each retain one listener. `setOnUserListener()` and `setOnFriendshipListener()` replace the current listener. Combine the required callbacks in a shared state layer and set each listener once; multiple pages must not overwrite one another's listeners. diff --git a/content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx b/content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx new file mode 100644 index 0000000000..fab369eb88 --- /dev/null +++ b/content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx @@ -0,0 +1,46 @@ +--- +title: 'Get the current user profile' +description: 'Use getSelfLocalUserInfo() to retrieve the local profile for the current user.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/user-profile/get-self-local-user-info' +--- + +```java +OpenIMClient.getInstance().userInfoManager.getSelfLocalUserInfo( + new OnBase() { + @Override + public void onSuccess(LocalUser user) { + currentUserStore.set(user); + } + + @Override + public void onError(int code, String error) { + recordSelfProfileFailure(code, error); + } + } +); +``` + +After initialization and login, call this method to retrieve the current account's local profile. Success returns `LocalUser` with fields such as `userID`, `nickname`, `faceURL`, `ex`, `attachedInfo`, `globalRecvMsgOpt`, and `addFriendPermission`. + +## Returned fields + +| Field | Description | +| --------------------- | -------------------------------------------------------------------------------------------- | +| `userID` | Signed-in user ID. | +| `nickname` | Current account nickname. | +| `faceURL` | Current account avatar URL. | +| `ex` | Current account extension string. | +| `attachedInfo` | SDK-attached data; parse only an application-defined format. | +| `globalRecvMsgOpt` | Global message reception: `0` receive, `1` do not receive, `2` receive without notification. | +| `addFriendPermission` | Add-friend permission value defined by the server contract. | + +The query does not trigger a profile callback. Clear the previous account snapshot when logging out or switching accounts so that the previous user's data is not rendered for the new account. + +`getSelfUserInfo()` is deprecated and is not the recommended API. diff --git a/content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx b/content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx new file mode 100644 index 0000000000..900d018e33 --- /dev/null +++ b/content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx @@ -0,0 +1,55 @@ +--- +title: 'Get specified user profiles' +description: 'Use getUsersInfo() to query public profiles by userID.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/user-profile/get-users-info' +--- + +`getUsersInfo()` returns public profiles for a list of user IDs. It is suitable for friend candidates and profiles of users outside the current friend list. It does not return relationship fields such as the current user's friend remark. + +```java +List userIDs = Arrays.asList("user_a", "user_b"); + +OpenIMClient.getInstance().userInfoManager.getUsersInfo( + new OnBase>() { + @Override + public void onSuccess(List users) { + for (PublicUserInfo user : users) { + publicUserStore.put(user.getUserID(), user); + } + } + + @Override + public void onError(int code, String error) { + recordUserQueryFailure(code, error); + } + }, + userIDs +); +``` + +Remove empty and duplicate IDs before calling the API, and keep each request within the application's batch limit. The callback returns `List` with fields such as `userID`, `nickname`, `faceURL`, `ex`, and `createTime`. This query does not trigger `OnUserListener`; query again and merge by `userID` when the profile snapshot must be refreshed. + +## Returned fields + +| Field | Description | +| ------------ | ----------------------------------------------------------------- | +| `userID` | OpenIM user ID and the stable local cache key. | +| `nickname` | Account-level public nickname. | +| `faceURL` | Account-level public avatar URL. | +| `ex` | Account-level public extension string defined by the application. | +| `createTime` | User profile creation time. | + +Do not use `PublicUserInfo` to overwrite friend remarks, pinned state, or in-group nicknames. Use `FriendInfo` for friends and the group member model for group members. + +Searching by nickname, phone number, or email is an application backend capability. A trusted backend should perform the search and permission checks, then return candidate user IDs for this API. + +## Refreshing profiles + +Replace or merge the public profile snapshot after a successful query. Re-query when opening a profile card, when the user explicitly refreshes, after reconnecting, or after a trusted backend reports a profile change. `OnUserListener.onSelfInfoUpdated` only describes the signed-in user's profile and is not a change event for other users. diff --git a/content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx b/content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx new file mode 100644 index 0000000000..6a42e061ef --- /dev/null +++ b/content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx @@ -0,0 +1,44 @@ +--- +title: 'Set global message reception' +description: 'Use setSelfInfo() to set the account-wide message reception and notification policy.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/user-profile/set-global-message-reception' +--- + +Use a separate `UserInfoReq` for `globalRecvMsgOpt` so profile updates do not accidentally overwrite the account-wide message policy. + +```java +UserInfoReq request = new UserInfoReq(); +request.setGlobalRecvMsgOpt(2); + +OpenIMClient.getInstance().userInfoManager.setSelfInfo( + new OnBase() { + @Override + public void onSuccess(String data) { + markGlobalReceiveOptionSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordGlobalReceiveOptionFailure(code, error); + } + }, + request +); +``` + +| Value | Meaning | +| ----- | ----------------------------------------- | +| `0` | Receive messages and allow notifications. | +| `1` | Do not receive messages. | +| `2` | Receive messages without notifications. | + +If the product exposes only a global do-not-disturb switch, it usually toggles between `0` and `2`; `1` stops message reception and should be presented as a separate option. Per-conversation reception is managed by conversation APIs and is not replaced by this setting. + +A successful callback means the request completed. Reconcile the final account snapshot through `onSelfInfoUpdated` or `getSelfLocalUserInfo()`. Event handling is documented in [Update the current user profile](/sdk/android/user/user-profile/set-self-info). diff --git a/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx b/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx new file mode 100644 index 0000000000..1994106aca --- /dev/null +++ b/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx @@ -0,0 +1,60 @@ +--- +title: 'Update the current user profile' +description: 'Use setSelfInfo() to update the nickname, avatar, or extension data of the current user.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/user-profile/set-self-info' +--- + +Set only the fields that must change on `UserInfoReq`. The SDK omits `null` fields when serializing the request. + +```java +UserInfoReq request = new UserInfoReq(); +request.setNickname(displayName.trim()); +request.setFaceURL(avatarURL); +request.setEx(mergedExtra); + +OpenIMClient.getInstance().userInfoManager.setSelfInfo( + new OnBase() { + @Override + public void onSuccess(String data) { + markProfileUpdateSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordProfileUpdateFailure(code, error); + } + }, + request +); +``` + +`UserInfoReq` supports fields such as `nickname`, `faceURL`, `ex`, and `addFriendPermission`. `ex` is a complete string; read, parse, and merge the application's namespace before updating it rather than overwriting the value with a partial JSON object. + +A successful callback means the update request completed. Merge the final profile increment from `onSelfInfoUpdated(UserInfo info)`, or query `getSelfLocalUserInfo()` again. + +## Updatable fields + +| Field | Description | +| --------------------- | ---------------------------- | +| `nickname` | New nickname. | +| `faceURL` | New avatar URL. | +| `ex` | Complete extension string. | +| `addFriendPermission` | Add-friend permission value. | + +Send only fields that should change. Although the global message reception setting is also written with `setSelfInfo()`, use the dedicated [Set global message reception](/sdk/android/user/user-profile/set-global-message-reception) entry point. + +This page owns `onSelfInfoUpdated`. Combine it into the application's single `OnUserListener`: + +```java +@Override +public void onSelfInfoUpdated(UserInfo info) { + currentUserStore.merge(info.getUserID(), info); +} +``` diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx new file mode 100644 index 0000000000..8e6ab3dc0c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx @@ -0,0 +1,32 @@ +--- +title: '接受通话' +description: '使用 Android SDK 接受通话邀请并获取房间凭据。' +sourcePath: '/sdk/android/calling/managing-calls/accept-call' +--- + +从 `onReceiveNewInvitation` 取得原始 `SignalingInfo` 后,使用 `signalingAccept()` 接受邀请: + +```java +OpenIMClient.getInstance().signalingManager.signalingAccept( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + joinMediaRoom( + credentials.getRoomID(), + credentials.getToken(), + credentials.getLiveURL() + ); + } + + @Override + public void onError(int code, String error) { + showAcceptError(code, error); + } + }, + receivedInfo +); +``` + +`receivedInfo` 必须保留收到的原始 `roomID`、邀请人、被邀请人和会话类型,不能重新构造为只包含 `roomID` 的对象。 + +成功回调返回 `SignalingCertificate`。取得有效的 `token` 和 `roomID` 后再连接媒体房间;远端状态由[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)继续合并。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx new file mode 100644 index 0000000000..0c754c80b4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx @@ -0,0 +1,26 @@ +--- +title: '取消通话邀请' +description: '使用 Android SDK 取消尚未接通的通话邀请。' +sourcePath: '/sdk/android/calling/managing-calls/cancel-call' +--- + +邀请尚未接通时,发起方调用 `signalingCancel()`: + +```java +OpenIMClient.getInstance().signalingManager.signalingCancel( + new OnBase() { + @Override + public void onSuccess(String result) { + stopWaitingForAnswer(activeInfo.getInvitation().getRoomID()); + } + + @Override + public void onError(int code, String error) { + showCancelError(code, error); + } + }, + activeInfo +); +``` + +必须传入发起时保存的完整 `SignalingInfo`,不能只构造一个 `roomID`。成功回调表示取消信令请求完成;应用还应结束本地等待接听状态,并释放尚未使用的媒体资源。远端通过 `onInvitationCancelled` 更新。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx new file mode 100644 index 0000000000..d3890e8447 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx @@ -0,0 +1,74 @@ +--- +title: '处理通话事件' +description: '集中设置 Android SDK 的通话邀请、参与者和媒体流 listener。' +sourcePath: '/sdk/android/calling/managing-calls/handle-call-events' +--- + +通话状态层应集中设置一次 `OnSignalingListener`,并按 `roomID` 合并邀请生命周期、参与者连接状态和媒体流变化。 + +```java +OpenIMClient.getInstance().signalingManager.setSignalingListener( + new OnSignalingListener() { + @Override + public void onReceiveNewInvitation(SignalingInfo info) { + upsertCall(info, "ringing"); + } + + @Override + public void onInviteeAccepted(SignalingInfo info) { + mergeCallEvent("accepted", info); + } + + @Override + public void onInviteeRejected(SignalingInfo info) { + mergeCallEvent("rejected", info); + } + + @Override + public void onInvitationCancelled(SignalingInfo info) { + mergeCallEvent("cancelled", info); + } + + @Override + public void onInvitationTimeout(SignalingInfo info) { + mergeCallEvent("timeout", info); + } + + @Override + public void onInviteeAcceptedByOtherDevice(SignalingInfo info) { + mergeCallEvent("accepted-by-other-device", info); + } + + @Override + public void onInviteeRejectedByOtherDevice(SignalingInfo info) { + mergeCallEvent("rejected-by-other-device", info); + } + + @Override + public void onHangup(SignalingInfo info) { + finishCall(info.getInvitation().getRoomID()); + } + + @Override + public void onRoomParticipantConnected(RoomCallingInfo room) { + mergeConnectedParticipants(room.getRoomID(), room.getParticipant()); + } + + @Override + public void onRoomParticipantDisconnected(RoomCallingInfo room) { + mergeDisconnectedParticipants(room.getRoomID(), room.getParticipant()); + } + + @Override + public void onStreamChange(String streamInfo) { + mergeStreamChange(streamInfo); + } + } +); +``` + +本页是除 `onReceiveCustomSignal` 外 11 个已接入 Android 适配层的通话回调的完整归属页。自定义信令的处理边界见[发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal)。 + +邀请事件使用 `SignalingInfo.invitation.roomID` 合并。参与者状态使用 `RoomCallingInfo.roomID`,并结合参与者的用户 ID 更新;不要按事件顺序、展示名称或数组位置合并。`onStreamChange` 当前提供字符串载荷,应由接入层按服务端实际协议解析并校验。 + +`SignalingManager` 只设置一个 listener,后一次设置会替换先前实例,并且没有公开移除方法。自定义信令回调必须与本页的其他回调组合在同一个应用级 listener 中。退出登录或切换账号时,应停止向旧账号状态写入,并用新账号的完整 listener 覆盖。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx new file mode 100644 index 0000000000..3301761f13 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx @@ -0,0 +1,26 @@ +--- +title: '挂断通话' +description: '使用 Android SDK 挂断已经建立的通话。' +sourcePath: '/sdk/android/calling/managing-calls/hang-up-call' +--- + +通话已经建立后,参与者调用 `signalingHungUp()`。传入的 `SignalingInfo` 应保留本次通话的完整邀请信息,其中 `roomID` 必须与当前媒体房间一致。 + +```java +OpenIMClient.getInstance().signalingManager.signalingHungUp( + new OnBase() { + @Override + public void onSuccess(String result) { + releaseCallResources(activeInfo.getInvitation().getRoomID()); + } + + @Override + public void onError(int code, String error) { + showHangUpError(code, error); + } + }, + activeInfo +); +``` + +成功回调只表示挂断信令请求完成。应用还需要停止本地采集、断开媒体房间,并释放摄像头和麦克风。取消、拒绝、超时和挂断应进入同一套按 `roomID` 幂等执行的清理流程。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx new file mode 100644 index 0000000000..3b0240957a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx @@ -0,0 +1,26 @@ +--- +title: '拒绝通话' +description: '使用 Android SDK 拒绝通话邀请。' +sourcePath: '/sdk/android/calling/managing-calls/reject-call' +--- + +用户拒绝来电时,将收到的原始 `SignalingInfo` 交给 `signalingReject()`: + +```java +OpenIMClient.getInstance().signalingManager.signalingReject( + new OnBase() { + @Override + public void onSuccess(String result) { + closeIncomingCallUI(); + } + + @Override + public void onError(int code, String error) { + showRejectError(code, error); + } + }, + receivedInfo +); +``` + +成功回调只表示拒绝信令请求完成。发起端随后通过 `onInviteeRejected` 更新界面;完整处理见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx new file mode 100644 index 0000000000..d88962deea --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx @@ -0,0 +1,44 @@ +--- +title: '发起群聊通话' +description: '使用 Android SDK 发起群聊音视频通话。' +sourcePath: '/sdk/android/calling/managing-calls/start-group-call' +--- + +`signalingInviteInGroup()` 发起群聊通话,只邀请 `inviteeUserIDList` 明确列出的群成员,不会因为填写 `groupID` 自动邀请全群。 + +```java +SignalingInvitationInfo invitation = new SignalingInvitationInfo(); +invitation.setInviterUserID(currentUserID); +invitation.setInviteeUserIDList(selectedGroupMemberIDs); +invitation.setGroupID(groupID); +invitation.setRoomID(groupID); +invitation.setTimeout(30); +invitation.setMediaType("video"); +invitation.setSessionType(ConversationType.GROUP_CHAT); +invitation.setPlatformID(Platform.ANDROID); +invitation.setCustomData("{\"source\":\"group-call\"}"); + +SignalingInfo info = new SignalingInfo(); +info.setUserID(currentUserID); +info.setInvitation(invitation); +info.setOfflinePushInfo(offlinePushInfo); + +OpenIMClient.getInstance().signalingManager.signalingInviteInGroup( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + startGroupCall(credentials); + } + + @Override + public void onError(int code, String error) { + showCallError(code, error); + } + }, + info +); +``` + +`groupID` 不能为空,`inviteeUserIDList` 应排除当前用户、空值和重复成员。示例沿用群组 ID 作为房间 ID;若业务自行生成 `roomID`,所有参与端必须使用同一个值。 + +成功回调返回 `SignalingCertificate`,字段含义见[发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)。`busyLineUserIDList` 只表示部分成员忙线,不应中止其他成员的邀请流程;成功也不表示其他成员已经接听。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx new file mode 100644 index 0000000000..d983335caf --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx @@ -0,0 +1,64 @@ +--- +title: '发起单聊通话' +description: '使用 Android SDK 发起单聊音视频通话。' +sourcePath: '/sdk/android/calling/managing-calls/start-single-call' +--- + +`signalingInvite()` 发起单聊通话。Android SDK 负责通话信令,应用仍需使用返回的房间凭据接入实时音视频媒体引擎。 + +## 参数说明 + +| 字段 | 类型 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| `userID` | `String` | 是 | 执行邀请操作的当前登录用户 ID。 | +| `inviterUserID` | `String` | 是 | 邀请方用户 ID,通常与当前登录用户一致。 | +| `inviteeUserIDList` | `List` | 是 | 被邀请用户列表;单聊只填写对方一个用户。 | +| `groupID` | `String` | 是 | 单聊固定传空字符串。 | +| `roomID` | `String` | 是 | 本次通话的唯一房间标识,后续状态按它合并。 | +| `timeout` | `long` | 是 | 邀请等待时长,单位为秒。 | +| `mediaType` | `String` | 是 | 媒体类型,业务通常约定为 `audio` 或 `video`。 | +| `sessionType` | `int` | 是 | 单聊使用 `ConversationType.SINGLE_CHAT`。 | +| `platformID` | `int` | 是 | Android 手机端使用 `Platform.ANDROID`。 | +| `customData` | `String` | 否 | 随邀请携带的业务扩展字符串。 | +| `offlinePushInfo` | `OfflinePushInfo` | 否 | 被邀请人离线时使用的推送内容。 | + +```java +SignalingInvitationInfo invitation = new SignalingInvitationInfo(); +invitation.setInviterUserID(currentUserID); +invitation.setInviteeUserIDList(Collections.singletonList(peerUserID)); +invitation.setGroupID(""); +invitation.setRoomID(roomID); +invitation.setTimeout(30); +invitation.setMediaType("video"); +invitation.setSessionType(ConversationType.SINGLE_CHAT); +invitation.setPlatformID(Platform.ANDROID); +invitation.setCustomData("{\"source\":\"contact-card\"}"); + +SignalingInfo info = new SignalingInfo(); +info.setUserID(currentUserID); +info.setInvitation(invitation); +info.setOfflinePushInfo(offlinePushInfo); + +OpenIMClient.getInstance().signalingManager.signalingInvite( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + joinMediaRoom( + credentials.getRoomID(), + credentials.getToken(), + credentials.getLiveURL() + ); + } + + @Override + public void onError(int code, String error) { + showCallError(code, error); + } + }, + info +); +``` + +成功回调返回 `SignalingCertificate`。其中 `roomID` 是媒体房间 ID,`token` 是加入房间使用的短期凭据,`liveURL` 是媒体服务提供的连接地址,`busyLineUserIDList` 是忙线用户列表。 + +只有取得有效的 `token` 和 `roomID` 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态由[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)合并。 diff --git a/content/zh/docs/chat/sdk/android/calling/overview-calling.mdx b/content/zh/docs/chat/sdk/android/calling/overview-calling.mdx new file mode 100644 index 0000000000..52cf8f4c9e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/overview-calling.mdx @@ -0,0 +1,46 @@ +--- +title: '音视频通话概览' +description: '了解 Android SDK 的音视频通话信令、房间信息和事件边界。' +sourcePath: '/sdk/android/calling/overview-calling' +--- + +Android SDK 的 `SignalingManager` 提供发起邀请、接受、拒绝、取消、挂断、查询房间和同步通话状态所需的信令 API。它负责协调通话参与者、房间信息和通话生命周期,不负责采集摄像头画面、播放远端媒体流或渲染通话界面。 + +应用需要把 SDK 返回的 `roomID`、`token` 和 `liveURL` 交给所选的实时音视频媒体引擎,并自行处理 Android 权限、音视频设备、媒体轨道、弱网策略和界面状态。信令 API 不是一套完整的实时音视频媒体 SDK。 + +## 通话流程 + +1. 调用 `signalingInvite()` 发起单聊通话,或调用 `signalingInviteInGroup()` 发起群聊通话。 +2. 被邀请方从 `onReceiveNewInvitation` 获取 `SignalingInfo`,选择接受或拒绝。 +3. 接受方调用 `signalingAccept()`,双方使用返回的房间凭据接入媒体引擎。 +4. 通话过程中根据参与者、媒体流和自定义信令回调更新本地状态。 +5. 发起方可以取消尚未接通的邀请;任一通话参与者都可以挂断已经建立的通话。 + +## 核心数据 + +| 数据 | 说明 | +| --- | --- | +| `SignalingInvitationInfo` | 邀请人、被邀请人、群组、房间、媒体类型、超时时间、会话类型和业务扩展数据。 | +| `SignalingInfo` | 当前操作用户、原始邀请、参与者资料和可选的离线推送信息。 | +| `SignalingCertificate` | OpenIMServer 返回的 `roomID`、`token`、`liveURL` 和忙线用户列表。 | +| `RoomCallingInfo` | 按群组查询到的房间、邀请、参与者、群组和入会凭据快照。 | + +`customData` 和自定义信令只适合传递业务协商信息。长期凭据、管理员密钥和其他敏感数据不应写入这些字段。 + +## 状态更新与事件归属 + +发起、接受、拒绝、取消和挂断等写操作需要分别处理 API 回调与通话 listener。API 成功回调表示当前信令请求已经完成;listener 反映邀请方、被邀请方、其他设备或房间参与者看到的增量状态,两者不是同一个完成信号。 + +邀请生命周期、参与者进出房间、挂断和媒体流变化的完整 listener 统一见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events);自定义信令见[发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal)。房间、凭据和待处理邀请查询只返回调用时的状态快照。 + +概览页不设置 listener。通话状态以 `roomID` 为主键;参与者状态还需要结合用户 ID。需要恢复或校准当前房间状态时,再调用对应查询 API。 + +## 按任务查找页面 + +| 任务 | 页面 | +| --- | --- | +| 发起单聊或群聊通话 | [发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)、[发起群聊通话](/sdk/android/calling/managing-calls/start-group-call) | +| 接受或拒绝邀请 | [接受通话](/sdk/android/calling/managing-calls/accept-call)、[拒绝通话](/sdk/android/calling/managing-calls/reject-call) | +| 取消邀请或挂断通话 | [取消通话邀请](/sdk/android/calling/managing-calls/cancel-call)、[挂断通话](/sdk/android/calling/managing-calls/hang-up-call) | +| 恢复房间或待处理邀请 | [查询群组通话房间](/sdk/android/calling/retrieving-call-information/get-room-by-group-id)、[获取通话房间 Token](/sdk/android/calling/retrieving-call-information/get-token-by-room-id)、[恢复启动前收到的通话邀请](/sdk/android/calling/retrieving-call-information/restore-pending-invitation) | +| 处理通话事件和业务协商 | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)、[发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) | diff --git a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx new file mode 100644 index 0000000000..dcfadafd97 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx @@ -0,0 +1,30 @@ +--- +title: '查询群组通话房间' +description: '使用 Android SDK 按群组 ID 查询进行中的通话房间。' +sourcePath: '/sdk/android/calling/retrieving-call-information/get-room-by-group-id' +--- + +`signalingGetRoomByGroupID()` 的参数是群组 ID,不是自定义 `roomID`: + +```java +OpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID( + new OnBase() { + @Override + public void onSuccess(RoomCallingInfo room) { + if (room.getRoomID() != null && !room.getRoomID().isEmpty()) { + renderParticipants(room.getParticipant()); + } + } + + @Override + public void onError(int code, String error) { + showNoActiveGroupCall(); + } + }, + groupID +); +``` + +成功回调返回 `RoomCallingInfo` 快照,其中包含房间 ID、原始邀请、参与者、群组 ID、Token 和连接地址。参与者资料中的账号资料、群内资料和群资料属于不同数据源,不应相互覆盖。 + +没有进行中的群通话时,应把错误或空房间视为“当前没有可恢复的通话”,不要继续使用旧凭据。即使业务为群通话使用自定义房间 ID,本方法仍然传入 `groupID`。 diff --git a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx new file mode 100644 index 0000000000..f49f7a0827 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx @@ -0,0 +1,35 @@ +--- +title: '获取通话房间 Token' +description: '使用 Android SDK 按房间 ID 重新获取入会凭据。' +sourcePath: '/sdk/android/calling/retrieving-call-information/get-token-by-room-id' +--- + +已经知道 `roomID`、但需要重新获取入会凭据时,调用 `signalingGetTokenByRoomID()`: + +```java +OpenIMClient.getInstance().signalingManager.signalingGetTokenByRoomID( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + if (credentials.getToken() != null + && credentials.getRoomID() != null) { + joinMediaRoom( + credentials.getRoomID(), + credentials.getToken(), + credentials.getLiveURL() + ); + } + } + + @Override + public void onError(int code, String error) { + showCredentialError(code, error); + } + }, + roomID +); +``` + +成功回调返回 `SignalingCertificate`,字段含义见[发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)。只有取得有效的 `token` 和 `roomID` 后才能连接媒体引擎。 + +房间 Token 是短期敏感凭据,只在内存中使用,不要写入日志、URL、分析事件或持久化存储。 diff --git a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx new file mode 100644 index 0000000000..c466e6033a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx @@ -0,0 +1,30 @@ +--- +title: '恢复启动前收到的通话邀请' +description: '使用 Android SDK 恢复应用启动时尚未处理的通话邀请。' +sourcePath: '/sdk/android/calling/retrieving-call-information/restore-pending-invitation' +--- + +`getSignalingInvitationInfoStartApp()` 不接收业务参数,返回应用启动或恢复时需要处理的邀请快照: + +```java +OpenIMClient.getInstance().signalingManager.getSignalingInvitationInfoStartApp( + new OnBase() { + @Override + public void onSuccess(SignalingInfo info) { + if (info != null + && info.getInvitation() != null + && info.getInvitation().getRoomID() != null + && !info.getInvitation().getRoomID().isEmpty()) { + restoreIncomingCall(info); + } + } + + @Override + public void onError(int code, String error) { + clearExpiredIncomingCall(); + } + } +); +``` + +成功回调只表示取得当前快照,不会替代通话 listener。仅在 `invitation` 和 `roomID` 有效时恢复来电界面;随后仍需处理取消、超时、接受和挂断,完整处理见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。 diff --git a/content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx b/content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx new file mode 100644 index 0000000000..27854c43a6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx @@ -0,0 +1,64 @@ +--- +title: '发送自定义信令' +description: '使用 Android SDK 在通话房间中发送和接收自定义信令。' +sourcePath: '/sdk/android/calling/sending-custom-signals/send-a-custom-signal' +--- + +`signalingSendCustomSignal()` 用于向指定通话房间发送轻量级业务协商数据,例如举手、切换布局提示或业务侧状态同步。它不是聊天消息接口,也不能替代媒体引擎的数据通道。 + +## 发送信令 + +`roomID` 与 `customInfo` 都是必填字符串。需要传递结构化数据时,应定义稳定的数据格式并序列化为 JSON。 + +```java +JSONObject signal = new JSONObject(); +signal.put("version", 1); +signal.put("eventID", eventID); +signal.put("type", "hand-raised"); +signal.put("userID", currentUserID); +signal.put("sentAt", System.currentTimeMillis()); + +OpenIMClient.getInstance().signalingManager.signalingSendCustomSignal( + new OnBase() { + @Override + public void onSuccess(String result) { + markSignalSent(eventID); + } + + @Override + public void onError(int code, String error) { + showSignalError(code, error); + } + }, + roomID, + signal.toString() +); +``` + +成功回调表示本次自定义信令发送请求已经完成,不等于其他参与者已经处理。自定义信令应保持精简,并包含协议版本和业务幂等 ID。大文件、聊天记录、长期状态和敏感凭据不应放入 `customInfo`。 + +## 接收信令 + +`OnSignalingListener.onReceiveCustomSignal` 返回 `CustomSignalingInfo`。应用应先校验房间和自有业务协议,再更新界面: + +```java +@Override +public void onReceiveCustomSignal(CustomSignalingInfo info) { + if (info == null || !activeRoomID.equals(info.getRoomID())) { + return; + } + + CallSignal signal = parseAndValidateCallSignal(info.getCustomInfo()); + String mergeID = info.getRoomID() + ":" + signal.getEventID(); + if (hasAppliedSignal(mergeID)) { + return; + } + applyCallSignal(signal); +} +``` + +本页是 `onReceiveCustomSignal` 的完整处理归属页。`parseAndValidateCallSignal()` 应检查 JSON 结构、协议版本、`eventID`、`type` 和业务字段。按 `roomID:eventID` 幂等处理,不要依赖事件顺序。 + +`SignalingManager` 只设置一个 listener。接收自定义信令的回调应合并到[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)所示的应用级 listener 中,不能为本页单独设置一个新 listener,否则会覆盖其他通话回调。 + +客户端自定义信令不能用于授予主持人、付费或隐私权限。需要权威校验的状态应由可信后端保存和判断;连接恢复后,通过房间查询或业务后端校准长期状态。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx new file mode 100644 index 0000000000..9d5b035e1f --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx @@ -0,0 +1,26 @@ +--- +title: '清空会话消息' +description: '使用 messageManager.clearConversationAndDeleteAllMsg() 保留 Android 会话入口并清空其消息。' +sourcePath: '/sdk/android/conversation/managing-conversations/clear-conversation-messages' +--- + +产品语义为“清空聊天记录”时,调用 `messageManager.clearConversationAndDeleteAllMsg()`。 + +```java +OpenIMClient.getInstance().messageManager.clearConversationAndDeleteAllMsg( + conversationID, + new OnBase() { + @Override + public void onSuccess(String data) { + messageStore.clearConversation(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationClearFailure(code, error); + } + } +); +``` + +成功 callback 后保留会话入口,但清除当前账号下的消息和摘要状态。立即清理当前消息列表,再通过 `onConversationChanged` 或重新查询校准最后一条消息、摘要和未读状态。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx new file mode 100644 index 0000000000..6989af75e3 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx @@ -0,0 +1,28 @@ +--- +title: '重置群聊 @ 状态' +description: '使用 resetConversationGroupAtType() 将 Android 指定会话的群聊 @ 状态重置为普通状态。' +sourcePath: '/sdk/android/conversation/managing-conversations/clear-group-mentions' +--- + +用户处理完群聊中的 @ 消息后,调用 `resetConversationGroupAtType()` 将 `groupAtType` 重置为普通状态。 + +```java +OpenIMClient.getInstance().conversationManager.resetConversationGroupAtType( + new OnBase() { + @Override + public void onSuccess(String data) { + markGroupMentionStateReset(conversationID); + } + + @Override + public void onError(int code, String error) { + recordGroupMentionResetFailure(code, error); + } + }, + conversationID +); +``` + +本操作只负责重置为普通状态,不应用于主动写入 `atMe`、`atAll` 等状态。群聊 @ 状态与消息已读状态不同。 + +成功 callback 后通过 `onConversationChanged` 按 `conversationID` 合并该会话;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx new file mode 100644 index 0000000000..9e9f3c5c36 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx @@ -0,0 +1,29 @@ +--- +title: '删除会话及消息' +description: '使用 deleteConversationAndDeleteAllMsg() 删除 Android 指定会话及其全部消息。' +sourcePath: '/sdk/android/conversation/managing-conversations/delete-conversation-with-messages' +--- + +产品语义为“删除此聊天”时,调用 `deleteConversationAndDeleteAllMsg()`。 + +```java +OpenIMClient.getInstance().conversationManager.deleteConversationAndDeleteAllMsg( + new OnBase() { + @Override + public void onSuccess(String data) { + messageStore.clearConversation(conversationID); + conversationStore.remove(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationDeleteFailure(code, error); + } + }, + conversationID +); +``` + +成功 callback 后清理当前消息列表和会话行。该操作不删除好友关系,也不退出或解散群组;聊天目标仍存在时,会话可能由新消息或同步重新生成。 + +后续通过 `onConversationChanged` 或重新查询校准会话列表,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx new file mode 100644 index 0000000000..c189d9265c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx @@ -0,0 +1,28 @@ +--- +title: '获取消息总未读数' +description: '使用 getTotalUnreadMsgCount() 获取 Android 当前账号的总未读数。' +sourcePath: '/sdk/android/conversation/managing-conversations/get-total-unread-count' +--- + +`getTotalUnreadMsgCount()` 返回当前账号所有会话的总未读快照,不要把当前已加载分页中的 `unreadCount` 简单相加。 + +```java +OpenIMClient.getInstance().conversationManager.getTotalUnreadMsgCount( + new OnBase() { + @Override + public void onSuccess(String value) { + int totalUnread = Integer.parseInt(value); + updateApplicationBadge(totalUnread); + } + + @Override + public void onError(int code, String error) { + recordTotalUnreadFailure(code, error); + } + } +); +``` + +回调值是 `String`,解析失败时应按业务错误处理,不能将其默认为会话列表分页的局部总数。查询本身不触发 callback。 + +本页归属 `OnConversationListener.onTotalUnreadMessageCountChanged(int count)`。在应用唯一的 `OnConversationListener` 中按该值更新应用角标;会话 listener 的集中设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx new file mode 100644 index 0000000000..488aa5fad4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx @@ -0,0 +1,28 @@ +--- +title: '隐藏会话' +description: '使用 hideConversation() 从 Android 当前账号的会话列表隐藏入口。' +sourcePath: '/sdk/android/conversation/managing-conversations/hide-a-conversation' +--- + +`hideConversation()` 只隐藏当前登录用户的会话入口,不会删除单聊关系、退出群组或影响其他用户。 + +```java +OpenIMClient.getInstance().conversationManager.hideConversation( + new OnBase() { + @Override + public void onSuccess(String data) { + conversationStore.remove(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationHideFailure(code, error); + } + }, + conversationID +); +``` + +该方法适合临时从聊天列表移除入口。收到新消息或重新同步后,隐藏的会话可能再次出现。 + +成功 callback 表示隐藏请求已完成,调用端可以从当前列表移除该 `conversationID`。后续收到 `onConversationChanged` 时仍应按 `conversationID` 幂等合并;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx new file mode 100644 index 0000000000..a126331ecf --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx @@ -0,0 +1,28 @@ +--- +title: '标记会话已读' +description: '使用 messageManager.markConversationMessageAsRead() 将 Android 指定会话的消息标记为已读。' +sourcePath: '/sdk/android/conversation/managing-conversations/mark-conversation-read' +--- + +用户打开会话并阅读完当前可见消息后,调用 `messageManager.markConversationMessageAsRead()`。不要在仅预览通知或后台收到消息时提前标记。 + +```java +OpenIMClient.getInstance().messageManager.markConversationMessageAsRead( + conversationID, + new OnBase() { + @Override + public void onSuccess(String data) { + markConversationReadSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordMarkReadFailure(code, error); + } + } +); +``` + +成功 callback 表示请求完成,不等于 `onConversationChanged` 已到达。随后按 `conversationID` 合并最新 `ConversationInfo`;需要立即确认时重新查询该会话。 + +对于单聊,当前用户标记会话已读后,对端可通过 `OnAdvanceMsgListener.onRecvC2CReadReceipt` 收到已读回执。对每个 `C2CReadReceiptInfo` 先验证 `sessionType == ConversationType.SINGLE_CHAT` 和非空 `userID`,再按 `msgIDList` 更新对应消息的已读状态。`MessageManager` 同样只保存一个高级消息 listener,应在应用级消息状态层统一设置。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx new file mode 100644 index 0000000000..310288bcfc --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx @@ -0,0 +1,27 @@ +--- +title: '置顶或取消置顶会话' +description: '使用 pinConversation() 设置 Android 指定会话的置顶状态。' +sourcePath: '/sdk/android/conversation/managing-conversations/pin-conversation' +--- + +```java +OpenIMClient.getInstance().conversationManager.pinConversation( + new OnBase() { + @Override + public void onSuccess(String data) { + markPinRequestSubmitted(conversationID, true); + } + + @Override + public void onError(int code, String error) { + recordConversationPinFailure(code, error); + } + }, + conversationID, + true +); +``` + +最后一个参数为 `true` 时置顶,传 `false` 时取消置顶。该状态只影响当前账号的会话列表。 + +成功 callback 不等于 `onConversationChanged` 已经到达。后续按 `conversationID` 合并最新会话,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx new file mode 100644 index 0000000000..db690ccb80 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx @@ -0,0 +1,27 @@ +--- +title: '设置阅后即焚时长' +description: '使用 setConversationBurnDuration() 设置 Android 阅后即焚模式的消息保留时长。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-burn-duration' +--- + +```java +OpenIMClient.getInstance().conversationManager.setConversationBurnDuration( + new OnBase() { + @Override + public void onSuccess(String data) { + markBurnDurationSubmitted(conversationID, 30); + } + + @Override + public void onError(int code, String error) { + recordBurnDurationFailure(code, error); + } + }, + conversationID, + 30 +); +``` + +`burnDuration` 的单位为秒。启用或关闭阅后即焚需要设置 `isPrivateChat`,见[开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat)。不要把它与服务端消息定期删除周期 `msgDestructTime` 混用。 + +成功 callback 后,通过 `onConversationChanged` 合并最新 `burnDuration`;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx new file mode 100644 index 0000000000..29b1051927 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx @@ -0,0 +1,27 @@ +--- +title: '设置会话草稿' +description: '使用 setConversationDraft() 保存 Android 会话草稿。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-conversation-draft' +--- + +用户离开聊天页、切换会话或输入框内容变化时,可以使用 `setConversationDraft()` 保存草稿。输入过程中先维护编辑器状态并对保存调用做防抖;离开页面前再提交一次最新文本。 + +```java +OpenIMClient.getInstance().conversationManager.setConversationDraft( + new OnBase() { + @Override + public void onSuccess(String data) { + markDraftSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordDraftSaveFailure(code, error); + } + }, + conversationID, + editorValue +); +``` + +清空草稿时传空字符串。成功 callback 只表示保存请求已经完成,不等同于会话变化回调已经到达;SDK 后续通过 `onConversationChanged` 同步 `draftText` 和 `draftTextTime`,需要校准时重新查询会话。退出登录或切换账号时清理编辑器内存状态。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx new file mode 100644 index 0000000000..a04da9cd63 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx @@ -0,0 +1,27 @@ +--- +title: '设置会话扩展字段' +description: '使用 setConversationEx() 设置 Android 指定会话的业务扩展字符串。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-conversation-extension' +--- + +`ex` 是完整字符串,SDK 不会自动合并 JSON。更新前应读取旧值并保留其他业务模块的命名空间。 + +```java +OpenIMClient.getInstance().conversationManager.setConversationEx( + new OnBase() { + @Override + public void onSuccess(String data) { + markConversationExtensionSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationExtensionFailure(code, error); + } + }, + conversationID, + mergedExtensionJSON +); +``` + +成功 callback 表示设置请求完成。通过 `onConversationChanged` 按 `conversationID` 合并最新会话;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx new file mode 100644 index 0000000000..9b4cc1a3d4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx @@ -0,0 +1,33 @@ +--- +title: '定期删除服务端消息' +description: '使用 setConversation() 启用、关闭并配置 Android 会话的服务端消息定期删除策略。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-message-destruct' +--- + +`isMsgDestruct` 与 `msgDestructTime` 共同构成服务端消息定期删除设置,可以在一次 `ConversationReq` 中提交。 + +```java +ConversationReq request = new ConversationReq(); +request.setMsgDestruct(true); +request.setMsgDestructTime(3600); + +OpenIMClient.getInstance().conversationManager.setConversation( + new OnBase() { + @Override + public void onSuccess(String data) { + markMessageDestructSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordMessageDestructFailure(code, error); + } + }, + conversationID, + request +); +``` + +`msgDestructTime` 的单位为秒。关闭时只传 `request.setMsgDestruct(false)`;该能力用于定期删除服务端消息,不是阅后即焚。 + +成功 callback 表示设置请求完成。最新开关和周期通过 `onConversationChanged` 按 `conversationID` 合并,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx new file mode 100644 index 0000000000..df9fe47afe --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx @@ -0,0 +1,31 @@ +--- +title: '设置会话消息接收方式' +description: '使用 setConversationRecvMessageOpt() 设置 Android 单个会话的消息接收与通知方式。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-message-receive-option' +--- + +```java +OpenIMClient.getInstance().conversationManager.setConversationRecvMessageOpt( + new OnBase() { + @Override + public void onSuccess(String data) { + markReceiveOptionSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordReceiveOptionFailure(code, error); + } + }, + conversationID, + 2 +); +``` + +| 数值 | 含义 | +| ---- | ---------------------------- | +| `0` | 正常接收消息并允许通知。 | +| `1` | 不接收该会话消息,也不通知。 | +| `2` | 接收该会话消息,但不通知。 | + +账号级默认策略见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。成功 callback 后通过 `onConversationChanged` 按 `conversationID` 合并最新会话。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx new file mode 100644 index 0000000000..8e6096e451 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx @@ -0,0 +1,27 @@ +--- +title: '开启或关闭阅后即焚' +description: '使用 setOneConversationPrivateChat() 设置 Android 会话的阅后即焚模式。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-private-chat' +--- + +```java +OpenIMClient.getInstance().conversationManager.setOneConversationPrivateChat( + new OnBase() { + @Override + public void onSuccess(String data) { + markPrivateChatSubmitted(conversationID, true); + } + + @Override + public void onError(int code, String error) { + recordPrivateChatFailure(code, error); + } + }, + conversationID, + true +); +``` + +传入 `false` 关闭阅后即焚。具体保留时长由 `burnDuration` 单独设置,见[设置阅后即焚时长](/sdk/android/conversation/managing-conversations/set-burn-duration)。该能力与定期删除服务端消息不同。 + +成功 callback 只表示设置请求完成;最新状态通过 `onConversationChanged` 按 `conversationID` 合并,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/overview-conversation.mdx b/content/zh/docs/chat/sdk/android/conversation/overview-conversation.mdx new file mode 100644 index 0000000000..ab61713832 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/overview-conversation.mdx @@ -0,0 +1,63 @@ +--- +title: '会话概览' +description: '了解 Android SDK 中 ConversationInfo、conversationID、会话设置和会话事件的职责。' +sourcePath: '/sdk/android/conversation/overview-conversation' +--- + +会话是当前登录用户围绕一次单聊或群聊维护的聊天列表状态,由一条 `ConversationInfo` 记录表示。它保存未读数、最后一条消息、置顶、草稿、消息接收方式和扩展字段。`conversationID` 用于定位当前账号的会话状态;单聊目标使用对方 `userID`,群聊目标使用 `groupID`。 + +群资料、成员关系和群权限属于群组能力。群聊页面使用 `groupID` 调用群组 API,使用 `conversationID` 处理会话设置、未读数、草稿和消息清理。 + +## 会话标识 + +| 标识 | 用途 | +| ---------------- | ----------------------------------------------------------------------------- | +| `conversationID` | 当前账号的会话记录 ID,用于会话设置、未读状态和消息历史。 | +| `userID` | 单聊对方的用户 ID。 | +| `groupID` | 群聊对应的群组 ID,也是群组 API 的目标标识。 | +| `sourceId` | 按会话类型查询或生成 ID 时传入的聊天目标:单聊为 `userID`,群聊为 `groupID`。 | + +单聊使用 `ConversationType.SINGLE_CHAT`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`;不要在应用层自行拼接 `conversationID`。 + +## ConversationInfo + +| 字段 | 说明 | +| ----------------------------------- | ------------------------------------ | +| `conversationID` | 会话 ID。 | +| `conversationType` | 会话类型。 | +| `userID` / `groupID` | 单聊目标用户或群聊目标群组。 | +| `showName` / `faceURL` | 会话列表显示名称和头像。 | +| `unreadCount` | 当前会话未读数。 | +| `latestMsg` / `latestMsgSendTime` | 最后一条消息 JSON 字符串及发送时间。 | +| `recvMsgOpt` | 当前会话消息接收方式。 | +| `groupAtType` | 群聊 @ 提醒状态。 | +| `draftText` / `draftTextTime` | 会话草稿及更新时间。 | +| `isPinned` | 是否置顶。 | +| `isPrivateChat` / `burnDuration` | 阅后即焚开关和保留时长。 | +| `isMsgDestruct` / `msgDestructTime` | 服务端消息定期删除设置。 | +| `ex` | 业务约定的会话扩展字符串。 | + +## 查询和设置 + +- [查询指定会话](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target) +- [生成会话 ID](/sdk/android/conversation/retrieving-conversations/get-conversation-id) +- [按 ID 批量获取会话](/sdk/android/conversation/retrieving-conversations/get-conversations-by-id) +- [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) +- [置顶或取消置顶会话](/sdk/android/conversation/managing-conversations/pin-conversation) +- [设置会话扩展字段](/sdk/android/conversation/managing-conversations/set-conversation-extension) +- [设置会话草稿](/sdk/android/conversation/managing-conversations/set-conversation-draft) +- [设置会话消息接收方式](/sdk/android/conversation/managing-conversations/set-message-receive-option) +- [重置群聊 @ 状态](/sdk/android/conversation/managing-conversations/clear-group-mentions) +- [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) +- [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) +- [开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat) +- [定期删除服务端消息](/sdk/android/conversation/managing-conversations/set-message-destruct) + +## 状态更新 + +查询方法建立会话快照,事件负责合并后续增量: + +- 新会话和会话属性变化由[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)归属的 `onNewConversation` 与 `onConversationChanged` 处理。 +- 当前账号总未读数由[获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count)归属的 `onTotalUnreadMessageCountChanged` 处理。 + +`ConversationManager` 只保存一个 `OnConversationListener`,`setOnConversationListener()` 会替换当前 listener。应用应在统一状态层组合所有 callback 并设置一次;请求成功、事件到达和重新查询校准是三个独立阶段。 diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx new file mode 100644 index 0000000000..dc69577130 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx @@ -0,0 +1,29 @@ +--- +title: '查询指定会话' +description: '使用 getOneConversation() 按用户或群组获取一个 Android 会话。' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversation-by-target' +--- + +从通讯录、用户资料或群资料进入聊天页时,使用 `getOneConversation()`。单聊传对方用户 ID,群聊传群组 ID;即使还没有消息,也不要自行构造 `ConversationInfo`。 + +```java +OpenIMClient.getInstance().conversationManager.getOneConversation( + new OnBase() { + @Override + public void onSuccess(ConversationInfo conversation) { + openChatPage(conversation); + } + + @Override + public void onError(int code, String error) { + recordConversationOpenFailure(code, error); + } + }, + targetUserID, + ConversationType.SINGLE_CHAT +); +``` + +参数 `sourceId` 在单聊中是对方 `userID`,在群聊中是 `groupID`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。 + +成功 callback 返回 `ConversationInfo`。查询本身不触发会话 listener;后续变化由[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)统一按 `conversationID` 合并。 diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx new file mode 100644 index 0000000000..d71b5e879e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx @@ -0,0 +1,19 @@ +--- +title: '生成会话 ID' +description: '使用 getConversationIDBySessionType() 按聊天目标计算 Android 会话 ID。' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversation-id' +--- + +只需要会话 ID 时,调用 `getConversationIDBySessionType()`,不要在应用层自行拼接。 + +```java +String conversationID = OpenIMClient.getInstance().conversationManager + .getConversationIDBySessionType( + targetUserID, + ConversationType.SINGLE_CHAT + ); +``` + +`sourceId` 在单聊中是对方 `userID`,在群聊中是 `groupID`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。 + +该方法同步返回 `String` 类型的 `conversationID`,不返回完整 `ConversationInfo`,也不触发会话 listener。需要会话资料时调用[查询指定会话](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx new file mode 100644 index 0000000000..c5230cbe99 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx @@ -0,0 +1,30 @@ +--- +title: '按 ID 批量获取会话' +description: '使用 getMultipleConversation() 按 conversationID 批量获取 Android 会话。' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversations-by-id' +--- + +已经持有一组 `conversationID` 时,使用 `getMultipleConversation()` 读取最新会话快照。 + +```java +OpenIMClient.getInstance().conversationManager.getMultipleConversation( + new OnBase>() { + @Override + public void onSuccess(List conversations) { + for (ConversationInfo item : conversations) { + conversationStore.put(item.getConversationID(), item); + } + } + + @Override + public void onError(int code, String error) { + recordConversationQueryFailure(code, error); + } + }, + conversationIDs +); +``` + +调用前去除空值和重复 ID。成功 callback 返回 `List`;某个 ID 没有结果时按缺失记录处理,不要依赖响应与请求列表的位置完全一一对应。 + +查询本身不触发会话 listener。会话列表的持续同步见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx new file mode 100644 index 0000000000..1bc528f9b7 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx @@ -0,0 +1,52 @@ +--- +title: '获取会话列表' +description: '使用 getConversationListSplit() 分页获取当前 Android 账号的会话列表。' +sourcePath: '/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list' +--- + +会话列表属于当前登录用户。每条 `ConversationInfo` 包含会话标识、未读数、最后一条消息、置顶和草稿等状态。使用分页接口读取会话,不使用一次加载完整列表的 `getAllConversationList()`。 + +## 分页获取会话 + +```java +OpenIMClient.getInstance().conversationManager.getConversationListSplit( + new OnBase>() { + @Override + public void onSuccess(List conversations) { + mergeConversations(conversations); + } + + @Override + public void onError(int code, String error) { + recordConversationListFailure(code, error); + } + }, + 0, + 50 +); +``` + +| 参数 | 类型 | 说明 | +| -------- | ------ | ------------------------------------------- | +| `offset` | `long` | 从 `0` 开始的分页偏移量;刷新时重置为 `0`。 | +| `count` | `long` | 本页期望返回的会话数量。 | + +成功 callback 返回当前页 `List`。继续加载时按已经请求的条目数量推进 `offset`,并按 `conversationID` 去重;返回数量小于 `count` 时通常表示到达末页。主动刷新时清空分页状态后从 `0` 重载。 + +## 保持列表同步 + +`getConversationListSplit()` 只建立快照,不触发会话 callback。以下 callback 应组合进应用唯一的 `OnConversationListener`: + +```java +@Override +public void onNewConversation(List conversations) { + mergeConversations(conversations); +} + +@Override +public void onConversationChanged(List conversations) { + mergeConversations(conversations); +} +``` + +两个事件都携带 `List`,按 `conversationID` 幂等合并。`setOnConversationListener()` 采用替换语义,应由应用级状态层设置一次。用户加入群组但尚未产生消息时不一定有会话;退出群组后也可能保留历史会话记录,不能用已加入群组列表替代会话列表。 diff --git a/content/zh/docs/chat/sdk/android/events/overview-events.mdx b/content/zh/docs/chat/sdk/android/events/overview-events.mdx new file mode 100644 index 0000000000..fbb9e7a665 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/events/overview-events.mdx @@ -0,0 +1,118 @@ +--- +title: '事件概览' +description: '集中设置 Android SDK listener,并按业务领域分发连接、同步和数据事件。' +sourcePath: '/sdk/android/events/overview-events' +--- + +OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。 + +连接 listener 是例外:`OnConnListener` 在 `initSDK()` 时传入,其完整处理见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。 + +## 集中设置 listener + +下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。 + +```java +public final class OpenIMEventCenter { + private final OpenIMClient client = OpenIMClient.getInstance(); + + private final OnUserListener userListener = buildUserListener(); + private final OnFriendshipListener friendshipListener = buildFriendshipListener(); + private final OnConversationListener conversationListener = buildConversationListener(); + private final OnGroupListener groupListener = buildGroupListener(); + private final OnAdvanceMsgListener messageListener = buildMessageListener(); + private final OnCustomBusinessListener businessListener = buildBusinessListener(); + private final OnSignalingListener signalingListener = buildSignalingListener(); + + public void registerBeforeLogin() { + client.userInfoManager.setOnUserListener(userListener); + client.friendshipManager.setOnFriendshipListener(friendshipListener); + client.conversationManager.setOnConversationListener(conversationListener); + client.groupManager.setOnGroupListener(groupListener); + client.messageManager.setAdvancedMsgListener(messageListener); + client.messageManager.setCustomBusinessListener(businessListener); + client.signalingManager.setSignalingListener(signalingListener); + } +} +``` + +Android SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。 + +## 事件归属 + +| 事件范围 | 合并标识 | 完整处理页面 | +| --- | --- | --- | +| 连接、Token 和强制下线 | 当前 SDK 实例与登录用户 | [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) | +| 当前用户资料 | `userID` | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) | +| 在线状态 | `userID` | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) | +| 好友关系与资料 | `userID` | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) | +| 好友申请 | `fromUserID:toUserID` | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) | +| 黑名单 | `userID` | [拉黑用户](/sdk/android/user/blacklist/add-blacklist)、[移出黑名单](/sdk/android/user/blacklist/remove-blacklist) | +| 会话列表 | `conversationID` | [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) | +| 总未读数 | 当前登录用户 | [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) | +| 输入状态 | `conversationID:userID` | [更新输入状态](/sdk/android/message/composing-messages/update-typing-status) | +| 群资料、成员和群申请 | `groupID` 或 `groupID:userID` | [群组概览](/sdk/android/group/overview-group) | +| 新消息、离线消息和在线消息 | `clientMsgID`,必要时结合 `conversationID` | [接收消息](/sdk/android/message/receiving-messages/receive-messages) | +| 消息撤回、删除、修改和置顶 | `clientMsgID`,必要时结合 `conversationID` | [消息概览](/sdk/android/message/overview-message) | +| 单聊已读回执 | `conversationID:clientMsgID` | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) | +| 自定义业务消息 | 业务协议中的幂等 ID | [接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) | +| 通话 | `roomID`,参与者结合用户 ID | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events) | +| 通话自定义信令 | `roomID:eventID` | [发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) | +| SDK 数据同步 | 当前 SDK 实例与登录用户 | 本页“监听初始化同步” | + +查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。 + +## 监听初始化同步 + +同步生命周期属于应用级 `OnConversationListener`。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑: + +```java +private OnConversationListener buildConversationListener() { + return new OnConversationListener() { + @Override + public void onNewConversation(List conversations) { + mergeNewConversations(conversations); + } + + @Override + public void onConversationChanged(List conversations) { + mergeChangedConversations(conversations); + } + + @Override + public void onTotalUnreadMessageCountChanged(int total) { + updateTotalUnreadCount(total); + } + + @Override + public void onConversationUserInputStatusChanged(String payload) { + handleInputStatus(payload); + } + + @Override + public void onSyncServerStart(boolean reinstall) { + setSyncState("syncing", 0, reinstall); + } + + @Override + public void onSyncServerProgress(long progress) { + setSyncProgress(progress); + } + + @Override + public void onSyncServerFinish(boolean reinstall) { + setSyncState("ready", 100, reinstall); + reloadVisibleSnapshots(); + } + + @Override + public void onSyncServerFailed(boolean reinstall) { + setSyncState("failed", 0, reinstall); + } + }; +} +``` + +`reinstall` 为 `true` 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。`onSyncServerProgress` 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。 + +本页是 `onSyncServerStart`、`onSyncServerProgress`、`onSyncServerFinish` 和 `onSyncServerFailed` 的完整处理归属页。同步状态没有业务实体合并键,应按当前 `OpenIMClient` 单例和登录用户隔离。 diff --git a/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx b/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx new file mode 100644 index 0000000000..5083948c6c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx @@ -0,0 +1,44 @@ +--- +title: '跟踪文件上传进度' +description: '使用 Android SDK 的 OnPutFileListener 跟踪单次文件上传任务。' +sourcePath: '/sdk/android/file-uploads/track-file-upload-progress' +--- + +Android SDK 不设置全局文件上传 listener。每次调用 `uploadFile()` 时传入一个 `OnPutFileListener`,由该 listener 接收当前上传任务的进度、分片状态和完成信息。 + +```java +OnPutFileListener uploadListener = new OnPutFileListener() { + @Override + public void open(long size) { + initializeUploadProgress(uploadTaskID, size); + } + + @Override + public void uploadID(String id) { + bindSdkUploadID(uploadTaskID, id); + } + + @Override + public void uploadComplete(long fileSize, long uploadedSize, long storageSize) { + updateUploadProgress(uploadTaskID, uploadedSize, fileSize); + } + + @Override + public void uploadPartComplete(long partNumber, long partSize, String partHash) { + markPartComplete(uploadTaskID, partNumber, partSize, partHash); + } + + @Override + public void complete(long size, String url, long type) { + completeUpload(uploadTaskID, size, url, type); + } +}; + +OpenIMClient.getInstance().uploadFile(resultCallback, uploadListener, putArgs); +``` + +`open()` 可用于初始化总大小,`uploadID()` 返回 SDK 上传任务标识,`uploadComplete()` 提供上传过程数据,`uploadPartComplete()` 表示一个分片已经完成,`complete()` 返回最终大小、远端 URL 和资源类型。只有业务需要展示分片细节时才处理分片回调;普通进度条通常只需要过程回调和最终完成回调。 + +业务层仍应生成自己的稳定 `uploadTaskID`,并在 listener 闭包中关联界面状态。SDK 上传 ID、文件名和数组位置都不应代替业务任务主键。每个上传任务使用独立 listener;页面或账号状态销毁后应停止向旧状态分发回调。 + +完整的参数构造和错误处理见[上传文件](/sdk/android/file-uploads/upload-file)。 diff --git a/content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx b/content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx new file mode 100644 index 0000000000..b0e10e9ffd --- /dev/null +++ b/content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx @@ -0,0 +1,54 @@ +--- +title: '上传文件' +description: '使用 Android SDK 独立上传文件并获取远端资源地址。' +sourcePath: '/sdk/android/file-uploads/upload-file' +--- + +`uploadFile()` 是独立文件上传能力,可用于头像、群头像、资料附件或其他业务文件。上传过程不从属于消息,也不会自动创建消息或更新用户资料。 + +## 参数说明 + +| 参数 | 类型 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| `base` | `OnBase` | 是 | 接收上传请求的最终成功或失败结果。 | +| `listener` | `OnPutFileListener` | 是 | 接收当前任务的上传进度、分片状态和完成信息。 | +| `putArgs.filepath` | `String` | 是 | Android 应用可读取的本地文件路径。 | +| `putArgs.name` | `String` | 是 | 上传使用的文件名;`PutArgs` 默认使用传入路径,可按业务需要改为原始文件名。 | +| `putArgs.cuase` | `String` | 否 | 业务约定的上传原因。字段名以 Android SDK 的 `PutArgs` 声明为准。 | + +```java +File file = new File(localPath); +PutArgs args = new PutArgs(file.getAbsolutePath()); +args.name = file.getName(); +args.cuase = "user-avatar"; + +OpenIMClient.getInstance().uploadFile( + new OnBase() { + @Override + public void onSuccess(String result) { + finishUploadRequest(result); + } + + @Override + public void onError(int code, String error) { + showUploadError(code, error); + } + }, + new OnPutFileListener() { + @Override + public void uploadComplete(long fileSize, long uploadedSize, long storageSize) { + updateUploadProgress(uploadTaskID, uploadedSize, fileSize); + } + + @Override + public void complete(long size, String url, long type) { + completeUpload(uploadTaskID, size, url, type); + } + }, + args +); +``` + +每次调用都传入独立的 `OnPutFileListener`,因此无需设置全局上传 listener。并行上传时应由业务层为任务生成稳定 ID,并在回调闭包中关联对应任务,不要使用文件名或列表位置作为唯一标识。各回调的职责见[跟踪文件上传进度](/sdk/android/file-uploads/track-file-upload-progress)。 + +`complete()` 返回的 URL 可用于后续更新头像、保存附件地址或创建 URL 类型的媒体消息。上传成功只表示文件资源已经写入远端;资料更新、消息创建和消息发送仍需分别调用对应 API。 diff --git a/content/zh/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx b/content/zh/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx new file mode 100644 index 0000000000..a0d74ec748 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx @@ -0,0 +1,188 @@ +--- +title: '认证与管理登录会话' +description: '使用 OpenIM Android SDK 初始化、登录、查询登录状态、处理连接 callback 并退出当前账号。' +sourcePath: '/sdk/android/getting-started/authenticate-and-manage-session' +--- + +OpenIM Android SDK 使用 `initSDK()` 初始化本机运行环境,再使用 `login()` 建立当前用户的登录会话。开始认证前,应先完成[开始之前](/sdk/android/getting-started/before-you-start)列出的服务、用户和 Token 准备,并按[按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation)添加依赖和权限。 + +完整流程如下: + +1. 在应用级会话组件中创建稳定的 `OnConnListener`。 +2. 调用 `initSDK()` 并确认返回 `true`。 +3. 在登录前设置消息、用户、好友、会话、群组和通话信令 listener。 +4. 从可信后端取得对应的 `userID` 与 Token,然后调用 `login()`。 +5. 分别等待登录 callback 成功与 `onConnectSuccess()`,再开放依赖连接的业务操作。 +6. 主动退出或切换账号时调用 `logout()`,完成后清理当前账号的应用状态。 + +下文中的 `apiAddr`、`wsAddr`、`userID` 和 `token` 均由可信后端提供。 + +## 初始化并处理连接生命周期 + +在 `Application` 生命周期内创建数据目录、初始化 SDK,并传入连接 listener。应用应保存连接状态,但不要在 callback 中记录 Token 或完整服务凭据。 + +```java +import android.app.Application; + +import java.io.File; + +import io.openim.android.sdk.OpenIMClient; +import io.openim.android.sdk.enums.LogLevel; +import io.openim.android.sdk.listener.OnConnListener; +import io.openim.android.sdk.models.InitConfig; + +File dataDirectory = new File(application.getFilesDir(), "openim"); +if (!dataDirectory.exists() && !dataDirectory.mkdirs()) { + throw new IllegalStateException("Cannot create the OpenIM data directory."); +} + +InitConfig config = new InitConfig( + apiAddr, + wsAddr, + dataDirectory.getAbsolutePath() +); +config.logLevel = LogLevel.Info; +config.isLogStandardOutput = false; + +OnConnListener connectionListener = new OnConnListener() { + @Override + public void onConnecting() { + sessionState.setConnectionState("connecting"); + } + + @Override + public void onConnectSuccess() { + sessionState.setConnectionState("connected"); + sessionState.enableConnectedOperations(); + } + + @Override + public void onConnectFailed(long code, String error) { + sessionState.setConnectionState("failed"); + recordConnectionFailure(code, error); + } + + @Override + public void onKickedOffline() { + sessionState.clearCurrentAccount(); + showSignedInElsewhereScreen(); + } + + @Override + public void onUserTokenExpired() { + requestNewTokenAndRelogin(); + } + + @Override + public void onUserTokenInvalid(String reason) { + sessionState.clearCurrentAccount(); + showSignInScreen(reason); + } +}; + +boolean initialized = OpenIMClient.getInstance().initSDK( + application, + config, + connectionListener +); + +if (!initialized) { + throw new IllegalStateException("OpenIMClientSDK initialization failed."); +} +``` + +`initSDK()` 返回 `true` 表示 SDK 本地运行环境初始化成功。`OnConnListener` 的连接 callback 在调用 `login()` 后开始反映长连接状态。 + +| 字段 | 类型 | 说明 | +| --------------------- | ------------- | ---------------------------------------------------------- | +| `application` | `Application` | 应用级 Context,用于持有 SDK 生命周期。 | +| `apiAddr` | `String` | OpenIMServer HTTP API 地址。 | +| `wsAddr` | `String` | OpenIMServer WebSocket 地址。 | +| `dataDirectory` | `File` | SDK 数据库和日志使用的应用私有持久化目录。 | +| `config.logLevel` | `int` | 使用 `LogLevel` 常量;正式环境应主动收敛日志级别。 | +| `isLogStandardOutput` | `boolean` | 是否把 SDK Core 日志输出到标准日志流。 | + +SDK 只应在 `Application` 或应用级会话组件中初始化一次。当前 Java wrapper 公开 `networkChanged()`,用于通知 Core 重新检查网络;只有在应用已经统一监听系统网络变化时才调用,不能由多个页面重复注册网络 callback。 + +## 在登录前设置业务 listener + +SDK 的 listener 注册方法采用 set 语义,后一次设置会替换前一次设置。应由应用级事件中心创建稳定 listener,再把事件分发给页面状态层。消息 listener 的完整注册与增量合并示例见[发送第一条消息](/sdk/android/getting-started/send-first-message);用户、好友、会话、群组和通话信令 listener 采用相同的集中注册原则。 + +SDK 没有公开的 remove/unset 方法。退出或切换账号时,应用事件中心应停止向旧账号页面分发 callback,并在下次登录前用新账号对应的完整 listener 组合覆盖设置。 + +## 登录当前用户 + +```java +OpenIMClient.getInstance().login(new OnBase() { + @Override + public void onError(int code, String error) { + sessionState.setLoginState("failed"); + recordLoginFailure(code, error); + } + + @Override + public void onSuccess(String data) { + sessionState.setLoginState("logged"); + sessionState.setCurrentUserID(userID); + } +}, userID, token); +``` + +`login()` 的成功 callback 表示当前登录调用完成;`OnConnListener.onConnectSuccess()` 表示长连接可用。这两个阶段必须分别处理。不要并发调用 `login()`,也不要仅凭某一个 callback 同时推断登录与连接状态。 + +## 查询登录状态 + +```java +int loginStatus = OpenIMClient.getInstance().getLoginStatus(); + +if (loginStatus == LoginStatus.Logged) { + String currentUserID = OpenIMClient.getInstance().getLoginUserID(); + restoreSessionFor(currentUserID); +} +``` + +| 状态 | 说明 | +| --------------------- | ---------------------------------------------------- | +| `LoginStatus.Logout` | SDK 当前未登录。 | +| `LoginStatus.Logging` | 登录正在进行,不应再次发起并行登录。 | +| `LoginStatus.Logged` | SDK 已登录;网络是否连接仍以 `OnConnListener` 为准。 | + +`getLoginStatus()` 和 `getLoginUserID()` 返回本地 SDK 状态快照,不会触发连接 callback。切换账号时应先退出旧账号,而不是直接用新参数覆盖当前登录。 + +## 处理 Token 和强制下线 + +收到 `onUserTokenExpired()` 或 `onUserTokenInvalid()` 后,应重新向可信后端取得当前用户凭据,再按产品策略重新登录或返回登录页。收到 `onKickedOffline()` 时,应清理当前用户的会话列表、消息视图、未读数和其他业务状态,不能把它当作用户主动退出。 + +这些 callback 没有业务实体合并键,应按当前 `OpenIMClient` 单例和登录用户隔离状态。旧账号的异步任务和页面订阅必须在新账号登录前停止。 + +## 主动退出与释放 SDK + +```java +OpenIMClient.getInstance().logout(new OnBase() { + @Override + public void onError(int code, String error) { + recordLogoutFailure(code, error); + } + + @Override + public void onSuccess(String data) { + sessionState.clearCurrentAccount(); + } +}); +``` + +`logout()` 成功表示当前 SDK 登录会话已退出。应用状态清理应在成功 callback 后执行;切换账号时,等待旧账号退出完成后再调用新账号的 `login()`。 + +应用最终不再使用 SDK 时可以调用: + +```java +OpenIMClient.getInstance().unInit(); +``` + +`unInit()` 用于释放 SDK 运行环境,不是 `logout()` 的替代品,也不应在普通页面销毁时调用。 + +## 下一步 + +- [开始之前](/sdk/android/getting-started/before-you-start) +- [按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation) +- [发送第一条消息](/sdk/android/getting-started/send-first-message) diff --git a/content/zh/docs/chat/sdk/android/getting-started/before-you-start.mdx b/content/zh/docs/chat/sdk/android/getting-started/before-you-start.mdx new file mode 100644 index 0000000000..6a015cdf88 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/getting-started/before-you-start.mdx @@ -0,0 +1,57 @@ +--- +title: '开始之前' +description: '准备 OpenIMServer、用户登录信息和 Android 工程环境,再开始初始化、认证或发送消息。' +sourcePath: '/sdk/android/getting-started/before-you-start' +--- + +在原生 Android 应用中接入 OpenIMClientSDK 前,需要准备可访问的 OpenIMServer、可信的用户认证流程,以及满足 SDK 构建要求的 Android 工程。这些条件同时适用于[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)和[发送第一条消息](/sdk/android/getting-started/send-first-message)。 + +## 准备 OpenIMServer + +如果还没有可用的 OpenIMServer,先按 [Docker 部署指南](/docs/guides/quick-deployment/docker)完成部署,并确认 Android 真机和模拟器均可访问以下地址: + +| 字段 | 说明 | +| --------- | ------------------------------------------------------ | +| `apiAddr` | OpenIMServer HTTP API 地址,用于登录、同步和资源请求。 | +| `wsAddr` | OpenIMServer WebSocket 地址,用于长连接和实时事件。 | + +不要只在开发电脑上验证地址。Android 模拟器中的 `localhost` 指向模拟器自身,不能直接访问开发电脑上的本地服务。如果 OpenIMServer 运行在开发电脑上,先将 API 和 WebSocket 端口映射到模拟器: + +```bash +adb reverse tcp:10002 tcp:10002 +adb reverse tcp:10001 tcp:10001 +``` + +映射后,模拟器中的应用可以使用 `http://127.0.0.1:10002` 作为 `apiAddr`,使用 `ws://127.0.0.1:10001` 作为 `wsAddr`。端口号应替换为开发电脑上实际监听的端口;执行命令前确认 `adb` 已连接到目标模拟器。生产环境应使用 HTTPS 与 WSS,并从真机检查 DNS、TLS 证书、防火墙、反向代理和 WebSocket 升级。 + +## 准备用户和 Token + +`userID` 标识 OpenIMSDK 用户,Token 用于认证该用户。创建或绑定用户、签发 Token 和校验业务权限都应由可信后端完成。Android 应用不能保存管理员 Token、secret 或其他服务端凭据。 + +后端接入 OpenIMServer REST API 前,可阅读[准备使用 Platform API](/platform-api/prepare-to-use-api)和[签发会话 Token](/platform-api/user/managing-session-tokens/issue-a-session-token)。业务后端完成自身账号认证后,只向客户端返回 SDK 登录所需的以下数据: + +| 数据 | 说明 | +| --- | --- | +| `userID` | 当前登录用户的 OpenIM 用户 ID。 | +| `token` | 与该用户对应的登录 Token。 | +| `apiAddr` | OpenIMServer HTTP API 地址。 | +| `wsAddr` | OpenIMServer WebSocket 地址。 | + +`userID` 必须与 Token 对应。客户端不得接受任意用户 ID 后自行签发、拼装或交换管理员 Token。 + +## 准备 Android 工程 + +接入前,确认 Android 工程具备以下条件: + +- 应用的 `minSdk` 不低于 `21`,使用 Java 8 编译选项,并将 `compileSdk` 设置为 `36` 或更高。 +- 应用 Manifest 声明 `android.permission.INTERNET`,并允许 SDK 读取网络状态。 +- 已准备应用私有且可持久化的数据目录,例如 `Application.getFilesDir()` 下的独立子目录;不要把 SDK 数据库放在临时缓存或共享存储中。 +- 真机能够访问 `apiAddr`、`wsAddr` 以及消息媒体资源域名。 +- 发布包覆盖目标设备 ABI;接入交付包时应核对实际包含的 native ABI。 +- 产品已经定义断网恢复、前后台切换、Token 失效、账号被踢下线和多端登录的处理方式。 + +具体依赖和 Manifest 配置见[按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation);SDK 初始化和认证流程见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。 + +## 继续接入 + +准备完成后,先完成[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。确认登录 callback 成功且 `OnConnListener.onConnectSuccess()` 已到达,再按照[发送第一条消息](/sdk/android/getting-started/send-first-message)验证消息链路。 diff --git a/content/zh/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx b/content/zh/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx new file mode 100644 index 0000000000..3d27fc3bbe --- /dev/null +++ b/content/zh/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx @@ -0,0 +1,33 @@ +--- +title: '按 Android 环境接入' +description: '在 Android 工程中添加 OpenIM Android SDK 依赖并配置网络权限。' +sourcePath: '/sdk/android/getting-started/environment-specific-implementation' +--- + +本页只说明 Android 工程的依赖和权限配置。SDK 初始化、连接监听和登录流程见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。 + +## 添加 SDK 依赖 + +在应用 module 的 `build.gradle` 中添加依赖: + +```groovy +dependencies { + implementation 'io.openim:android-sdk:latest@aar' + implementation 'io.openim:core-sdk:latest@aar' + implementation 'com.google.code.gson:gson:2.9.0' +} +``` + +## 配置 Manifest + +应用需要网络访问权限: + +```xml + + +``` + +## 下一步 + +- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) +- [发送第一条消息](/sdk/android/getting-started/send-first-message) diff --git a/content/zh/docs/chat/sdk/android/getting-started/send-first-message.mdx b/content/zh/docs/chat/sdk/android/getting-started/send-first-message.mdx new file mode 100644 index 0000000000..05af8e0166 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/getting-started/send-first-message.mdx @@ -0,0 +1,104 @@ +--- +title: '发送第一条消息' +description: '在 Android 应用中发送并验证第一条单聊文本消息。' +sourcePath: '/sdk/android/getting-started/send-first-message' +--- + +本页用一条单聊文本消息验证 OpenIM 已接入成功。开始前,先按[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)完成 SDK 初始化和登录。 + +## 开始前准备 + +- 为发送方和接收方各准备一个测试账号。 +- 两个账号都需要按[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)完成 SDK 初始化;接收方需要在登录前设置下面的消息 listener。 +- 将示例中的 `user_b` 替换为接收方的真实 `userID`。 + +## 第 1 步:让接收方监听新消息 + +接收方在登录前设置消息 listener。收到消息后,将它加入页面消息列表或刷新界面即可。 + +```java +OpenIMClient.getInstance() + .messageManager + .setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override + public void onRecvNewMessage(Message message) { + // 将 message 显示在聊天界面中。 + } + }); +``` + +## 第 2 步:确认可以发送 + +两个账号登录后,发送方的登录 callback 成功且 `OnConnListener.onConnectSuccess()` 已到达,即可发送消息。接收方也应保持连接,以便收到新消息。连接尚未成功时,先等待连接恢复,不要重复调用 `login()`。 + +## 第 3 步:发送文本消息 + +### 发送单聊文本消息 + +先创建消息,再发送它。第三个目标参数填写接收方 `userID`,群组目标参数保持空字符串。 + +```java +Message message = OpenIMClient.getInstance() + .messageManager + .createTextMessage("你好,OpenIMSDK"); + +OnMsgSendCallback sendCallback = new OnMsgSendCallback() { + @Override + public void onProgress(long progress) { + // 文本消息通常不需要处理进度。 + } + + @Override + public void onError(int code, String error) { + // 提示发送失败,并允许用户重试。 + } + + @Override + public void onSuccess(Message sentMessage) { + // 将 sentMessage 更新到发送方的聊天界面。 + } +}; + +OpenIMClient.getInstance().messageManager.sendMessage( + sendCallback, + message, + "user_b", + "", + new OfflinePushInfo() +); +``` + +`OfflinePushInfo` 用于配置离线推送内容。首次验证时可以传入空对象,后续再按产品需要设置标题、摘要和扩展数据。 + +`onSuccess()` 表示发送方已成功发送消息;接收方的 `onRecvNewMessage()` 表示另一端已收到消息。这两个回调都会到达,才说明这次单聊验证完成。 + +### 发送群聊文本消息 + +发送群消息时,将接收方 `userID` 改为空字符串,并填写群组的 `groupID`: + +```java +Message groupMessage = OpenIMClient.getInstance() + .messageManager + .createTextMessage("大家好,OpenIMSDK"); + +OpenIMClient.getInstance().messageManager.sendMessage( + sendCallback, + groupMessage, + "", + "group_123", + new OfflinePushInfo() +); +``` + +一次调用只能填写 `userID` 或 `groupID` 其中之一。 + +## 验证成功 + +- 发送方进入 `onSuccess()`。 +- 接收方进入 `onRecvNewMessage()`,并看到文本消息。 +- 单聊只填写接收方 `userID`;群聊只填写 `groupID`。 + +## 下一步 + +- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) +- [OpenIM Android SDK 概览](/sdk/android/overview) diff --git a/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx b/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx new file mode 100644 index 0000000000..92c5b37c37 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx @@ -0,0 +1,16 @@ +--- +title: '设置全员禁言' +description: '使用 changeGroupMute 开启或关闭群组全员禁言。' +sourcePath: '/sdk/android/group/change-group-mute' +--- + +使用 `changeGroupMute()` 切换全员禁言。`true` 开启,`false` 关闭;成员级禁言见“禁言或解除禁言群成员”。 + +```java +OpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() { + @Override public void onSuccess(String data) { markGroupMuteSubmitted(groupID, true); } + @Override public void onError(int code, String error) { showGroupMuteError(error); } +}, groupID, true); +``` + +群主和管理员的实际发言权限以及服务端权限校验以部署策略为准。 diff --git a/content/zh/docs/chat/sdk/android/group/create-group.mdx b/content/zh/docs/chat/sdk/android/group/create-group.mdx new file mode 100644 index 0000000000..f233608aec --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/create-group.mdx @@ -0,0 +1,23 @@ +--- +title: '创建群组' +description: '使用 createGroup 创建群资料并指定初始成员、管理员和群主。' +sourcePath: '/sdk/android/group/create-group' +--- + +使用 `createGroup()` 创建群组。`GroupInfo` 填写群资料;初始普通成员、管理员和群主分别通过独立参数传入。成功回调返回创建后的完整 `GroupInfo`,应保存服务端确定的 `groupID`。 + +```java +GroupInfo info = new GroupInfo(); +info.setGroupName("项目讨论"); +info.setIntroduction("仅限项目成员"); + +OpenIMClient.getInstance().groupManager.createGroup( + memberUserIDs, adminUserIDs, info, ownerUserID, + new OnBase() { + @Override public void onSuccess(GroupInfo group) { openGroup(group.getGroupID()); } + @Override public void onError(int code, String error) { showCreateError(error); } + } +); +``` + +群主和管理员必须由业务侧按权限选择。不要在客户端根据本地用户列表推导群主身份。 diff --git a/content/zh/docs/chat/sdk/android/group/dismiss-group.mdx b/content/zh/docs/chat/sdk/android/group/dismiss-group.mdx new file mode 100644 index 0000000000..4224a10244 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/dismiss-group.mdx @@ -0,0 +1,16 @@ +--- +title: '解散群组' +description: '使用 dismissGroup 解散当前用户有权限管理的群组。' +sourcePath: '/sdk/android/group/dismiss-group' +--- + +`dismissGroup()` 解散指定群组,通常仅群主可执行。调用前应在产品层提供明确确认,避免将“退出群组”误实现为解散。 + +```java +OpenIMClient.getInstance().groupManager.dismissGroup(new OnBase() { + @Override public void onSuccess(String data) { markDismissSubmitted(groupID); } + @Override public void onError(int code, String error) { showDismissError(error); } +}, groupID); +``` + +最终状态通过 `onGroupDismissed` 合并;收到事件后移除群资料、成员和群会话相关缓存。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx new file mode 100644 index 0000000000..15ea849e77 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx @@ -0,0 +1,16 @@ +--- +title: '同意群申请' +description: '使用 acceptGroupApplication 同意指定用户的入群申请。' +sourcePath: '/sdk/android/group/group-applications/accept-group-application' +--- + +调用时同时传入申请的 `groupID`、申请人 `userID` 和处理说明。服务端负责校验当前用户是否有审批权限。 + +```java +OpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() { + @Override public void onSuccess(String data) { markApplicationHandled(groupID, applicantUserID); } + @Override public void onError(int code, String error) { showHandleError(error); } +}, groupID, applicantUserID, "欢迎加入"); +``` + +同意后通过群申请事件与 `onGroupMemberAdded` 更新申请列表和成员列表。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx new file mode 100644 index 0000000000..8393c7f2a2 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx @@ -0,0 +1,18 @@ +--- +title: '获取发出的群申请' +description: '使用 getSendGroupApplicationList 分页读取当前用户发出的入群申请。' +sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-applicant' +--- + +使用 `GetGroupApplicationListAsApplicantReq` 设置分页和筛选条件,再调用 `getSendGroupApplicationList()`。 + +```java +GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq(0, 20); +OpenIMClient.getInstance().groupManager.getSendGroupApplicationList( + new OnBase>() { + @Override public void onSuccess(List items) { mergeSentApplications(items); } + @Override public void onError(int code, String error) { showApplicationError(error); } + }, request); +``` + +申请被同意后,群列表变化以 `onJoinedGroupAdded` 为准。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx new file mode 100644 index 0000000000..363217b817 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx @@ -0,0 +1,18 @@ +--- +title: '获取收到的群申请' +description: '使用 getRecvGroupApplicationList 分页读取当前用户可处理的入群申请。' +sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-recipient' +--- + +使用非废弃重载并传入 `GetGroupApplicationListAsRecipientReq`。可设置 `offset`、`count`、`groupIDs` 和 `handleResults` 筛选条件。 + +```java +GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq(0, 20); +OpenIMClient.getInstance().groupManager.getRecvGroupApplicationList( + new OnBase>() { + @Override public void onSuccess(List items) { mergeReceivedApplications(items); } + @Override public void onError(int code, String error) { showApplicationError(error); } + }, request); +``` + +收到事件后按申请中的 `groupID` 和 `userID` 合并,不要把列表下标作为申请标识。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx new file mode 100644 index 0000000000..879a6b5f7c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx @@ -0,0 +1,9 @@ +--- +title: '群申请概览' +description: '说明 Android SDK 中收到和发出的群申请、处理结果及状态事件。' +sourcePath: '/sdk/android/group/group-applications/overview-group-applications' +--- + +群申请记录使用 `GroupApplicationInfo` 表示。收到的申请面向群管理者,发出的申请面向当前用户;`handleResult`、`reqMsg`、`handledMsg` 和处理时间用于展示申请状态。 + +Android SDK 提供收到与发出申请的分页查询,以及同意、拒绝操作;不提供 Flutter 菜单中的“待处理申请数量”接口。申请新增、同意、拒绝和删除事件由[群组概览](/sdk/android/group/overview-group)的统一 listener 负责合并。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx new file mode 100644 index 0000000000..da3929960b --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx @@ -0,0 +1,16 @@ +--- +title: '拒绝群申请' +description: '使用 refuseGroupApplication 拒绝指定用户的入群申请。' +sourcePath: '/sdk/android/group/group-applications/refuse-group-application' +--- + +拒绝操作同样使用申请所属 `groupID`、申请人 `userID` 和处理说明。 + +```java +OpenIMClient.getInstance().groupManager.refuseGroupApplication(new OnBase() { + @Override public void onSuccess(String data) { markApplicationRejected(groupID, applicantUserID); } + @Override public void onError(int code, String error) { showHandleError(error); } +}, groupID, applicantUserID, "当前群组人数已满"); +``` + +成功 callback 后不要直接删除本地申请记录;以 `onGroupApplicationRejected` 或重新查询结果更新。 diff --git a/content/zh/docs/chat/sdk/android/group/join-group.mdx b/content/zh/docs/chat/sdk/android/group/join-group.mdx new file mode 100644 index 0000000000..8df82e8c90 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/join-group.mdx @@ -0,0 +1,16 @@ +--- +title: '申请加入群组' +description: '使用 joinGroup 提交入群申请或加入请求。' +sourcePath: '/sdk/android/group/join-group' +--- + +使用 `joinGroup()` 提交入群请求。`joinSource` 使用群组来源值,例如邀请、搜索或二维码;带扩展数据时使用五参数重载。 + +```java +OpenIMClient.getInstance().groupManager.joinGroup(new OnBase() { + @Override public void onSuccess(String data) { markJoinSubmitted(groupID); } + @Override public void onError(int code, String error) { showJoinError(error); } +}, groupID, "希望加入项目讨论", 3, "{\"from\":\"search\"}"); +``` + +验证方式决定请求是否立即加入。后续通过 `onJoinedGroupAdded` 或群申请事件更新本地状态。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx new file mode 100644 index 0000000000..b7f69cd49d --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx @@ -0,0 +1,16 @@ +--- +title: '禁言或解除禁言群成员' +description: '使用 changeGroupMemberMute 设置指定成员的禁言时长。' +sourcePath: '/sdk/android/group/managing-group-members/change-group-member-mute' +--- + +`seconds` 为禁言时长,单位为秒;传 `0` 解除成员禁言。该操作与全员禁言相互独立。 + +```java +OpenIMClient.getInstance().groupManager.changeGroupMemberMute(new OnBase() { + @Override public void onSuccess(String data) { markMemberMuteSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberMuteError(error); } +}, groupID, userID, 3600L); +``` + +在 `onGroupMemberInfoChanged` 中读取 `muteEndTime` 更新成员状态;不要用本机时间和请求时长长期推算最终禁言状态。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx new file mode 100644 index 0000000000..789b2e2c37 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx @@ -0,0 +1,16 @@ +--- +title: '邀请用户入群' +description: '使用 inviteUserToGroup 邀请一组用户加入指定群组。' +sourcePath: '/sdk/android/group/managing-group-members/invite-user-to-group' +--- + +传入群 ID、待邀请用户 ID 列表和邀请说明。服务端根据群设置和当前用户权限决定是否立即加入。 + +```java +OpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() { + @Override public void onSuccess(String data) { markInviteSubmitted(groupID); } + @Override public void onError(int code, String error) { showInviteError(error); } +}, groupID, inviteeUserIDs, "邀请加入项目讨论"); +``` + +成员实际加入后以 `onGroupMemberAdded` 合并,不能仅以提交成功显示为已加入。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx new file mode 100644 index 0000000000..2c0746b445 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx @@ -0,0 +1,16 @@ +--- +title: '移除群成员' +description: '使用 kickGroupMember 将指定成员移出群组。' +sourcePath: '/sdk/android/group/managing-group-members/kick-group-member' +--- + +`kickGroupMember()` 接收成员 ID 列表和移除说明。产品层应先防止当前用户误移除自身,并遵守群主、管理员权限边界。 + +```java +OpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() { + @Override public void onSuccess(String data) { markRemovalSubmitted(groupID); } + @Override public void onError(int code, String error) { showRemovalError(error); } +}, groupID, memberUserIDs, "已不再参与该项目"); +``` + +收到 `onGroupMemberDeleted` 后再从成员缓存中移除目标成员。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx new file mode 100644 index 0000000000..989825ed52 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx @@ -0,0 +1,21 @@ +--- +title: '更新群成员头像' +description: '使用 SetGroupMemberInfo.faceURL 更新成员在群内展示的头像。' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-avatar' +--- + +群成员头像是群内资料字段,不修改用户全局头像。传入已可访问的头像 URL。 + +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setFaceURL(avatarURL); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markAvatarSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberUpdateError(error); } +}); +``` + +事件到达前保留原头像或使用本地乐观状态,并按最新成员资料校准。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx new file mode 100644 index 0000000000..aed46f645a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx @@ -0,0 +1,21 @@ +--- +title: '设置群成员扩展字段' +description: '使用 SetGroupMemberInfo.ex 保存应用定义的群成员扩展数据。' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-extension' +--- + +`SetGroupMemberInfo.ex` 是完整字符串,不会自动合并 JSON。多个业务模块共享时应先读取、合并并保留其他命名空间。 + +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setEx("{\"duty\":\"reviewer\"}"); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markMemberExtensionSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberUpdateError(error); } +}); +``` + +不要将凭据、令牌或仅限本机的显示状态写入该字段。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx new file mode 100644 index 0000000000..b5644f4a58 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx @@ -0,0 +1,21 @@ +--- +title: '更新群昵称' +description: '使用 SetGroupMemberInfo.nickname 更新成员在指定群中的显示昵称。' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-nickname' +--- + +成员资料修改统一使用 `setGroupMemberInfo()`。请求中填写 `groupID`、`userID` 和 `nickname`。 + +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setNickname("小林"); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markNicknameSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberUpdateError(error); } +}); +``` + +以 `onGroupMemberInfoChanged` 返回的 `GroupMembersInfo.nickname` 更新显示。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx new file mode 100644 index 0000000000..4c7276d677 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx @@ -0,0 +1,21 @@ +--- +title: '管理群管理员' +description: '使用 SetGroupMemberInfo.roleLevel 设置成员的群内角色。' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-role-level' +--- + +`roleLevel` 使用 `GroupRole` 常量:`OWNER`、`ADMIN` 和 `MEMBER`。群主转让使用独立接口,不应通过本接口推测转让流程。 + +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setRoleLevel(GroupRole.ADMIN); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markRoleSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showRoleError(error); } +}); +``` + +实际角色变更和权限由服务端校验,以成员资料变化事件为准。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx new file mode 100644 index 0000000000..a8370f10c0 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx @@ -0,0 +1,16 @@ +--- +title: '转让群主' +description: '使用 transferGroupOwner 将群主身份转让给指定群成员。' +sourcePath: '/sdk/android/group/managing-group-members/transfer-group-owner' +--- + +目标用户必须是该群成员。转让前应在产品层要求明确确认,并在完成后重新查询群主和管理员资料。 + +```java +OpenIMClient.getInstance().groupManager.transferGroupOwner(new OnBase() { + @Override public void onSuccess(String data) { markOwnershipTransferSubmitted(groupID); } + @Override public void onError(int code, String error) { showTransferError(error); } +}, groupID, newOwnerUserID); +``` + +`onGroupMemberInfoChanged` 和群资料变化可能异步到达;不要在成功 callback 中假定本地角色已完成更新。 diff --git a/content/zh/docs/chat/sdk/android/group/overview-group.mdx b/content/zh/docs/chat/sdk/android/group/overview-group.mdx new file mode 100644 index 0000000000..55b60c0f40 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/overview-group.mdx @@ -0,0 +1,33 @@ +--- +title: '群组概览' +description: '了解 Android SDK 中群资料、成员、申请和群组事件的职责。' +sourcePath: '/sdk/android/group/overview-group' +--- + +群组由 `GroupInfo` 表示,`groupID` 是群资料、成员、申请和权限设置的唯一目标标识。`GroupMembersInfo` 表示成员在某个群内的昵称、角色、禁言结束时间和扩展字段;单聊关系和会话未读数不属于群组 API。 + +`GroupManager` 将群资料变化、成员增删改、入群申请处理和加入群组变化统一发送到一个 `OnGroupListener`。在共享状态层设置一次 listener,并按 `groupID` 或 `userID` 合并事件。 + +```java +OpenIMClient.getInstance().groupManager.setOnGroupListener(new OnGroupListener() { + @Override public void onGroupInfoChanged(GroupInfo group) { + groupStore.put(group.getGroupID(), group); + } + + @Override public void onGroupMemberInfoChanged(GroupMembersInfo member) { + memberStore.put(member.getGroupID() + member.getUserID(), member); + } +}); +``` + +群资料或成员操作的成功 callback 只表示该请求完成;状态以对应群组事件或重新查询结果为准。 + +## 主要能力 + +- [群资料与设置](/sdk/android/group/create-group) +- [群权限](/sdk/android/group/set-group-join-verification) +- [加入与退出群组](/sdk/android/group/join-group) +- [查询群组](/sdk/android/group/retrieving-groups/get-specified-groups-info) +- [群申请](/sdk/android/group/group-applications/overview-group-applications) +- [查询群成员](/sdk/android/group/retrieving-group-members/overview-retrieving-group-members) +- [管理群成员](/sdk/android/group/managing-group-members/invite-user-to-group) diff --git a/content/zh/docs/chat/sdk/android/group/quit-group.mdx b/content/zh/docs/chat/sdk/android/group/quit-group.mdx new file mode 100644 index 0000000000..be4a35e7ce --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/quit-group.mdx @@ -0,0 +1,16 @@ +--- +title: '退出群组' +description: '使用 quitGroup 让当前登录用户退出指定群组。' +sourcePath: '/sdk/android/group/quit-group' +--- + +`quitGroup()` 仅作用于当前登录用户,不会解散群组或移除其他成员。 + +```java +OpenIMClient.getInstance().groupManager.quitGroup(new OnBase() { + @Override public void onSuccess(String data) { removeJoinedGroup(groupID); } + @Override public void onError(int code, String error) { showQuitError(error); } +}, groupID); +``` + +请求成功后仍应处理 `onJoinedGroupDeleted`,并清理该群的成员列表、群会话入口等应用缓存。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx new file mode 100644 index 0000000000..f364f78db8 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx @@ -0,0 +1,17 @@ +--- +title: '获取群成员列表' +description: '使用 getGroupMemberList 按角色和分页条件读取群成员。' +sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-list' +--- + +`filter` 传 `0` 查询全部成员,`1` 普通成员,`2` 群主,`3` 管理员。`offset` 与 `count` 控制分页。 + +```java +OpenIMClient.getInstance().groupManager.getGroupMemberList( + new OnBase>() { + @Override public void onSuccess(List members) { appendMembers(members); } + @Override public void onError(int code, String error) { showMemberQueryError(error); } + }, groupID, 0, offset, 50); +``` + +分页期间仍应接受成员事件,合并键使用 `groupID` 与 `userID`。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx new file mode 100644 index 0000000000..688906b0b2 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx @@ -0,0 +1,17 @@ +--- +title: '获取群主和管理员' +description: '使用 getGroupMemberOwnerAndAdmin 查询群主和管理员成员资料。' +sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin' +--- + +使用 `getGroupMemberOwnerAndAdmin()` 获取需要展示或校验管理身份的成员记录。 + +```java +OpenIMClient.getInstance().groupManager.getGroupMemberOwnerAndAdmin( + new OnBase>() { + @Override public void onSuccess(List members) { showModerators(members); } + @Override public void onError(int code, String error) { showMemberQueryError(error); } + }, groupID); +``` + +`roleLevel` 的群主、管理员和普通成员常量见 `GroupRole`;实际操作权限仍由服务端决定。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx new file mode 100644 index 0000000000..1b3a030a06 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx @@ -0,0 +1,17 @@ +--- +title: '获取群成员资料' +description: '使用 getGroupMembersInfo 批量读取指定成员在群内的资料。' +sourcePath: '/sdk/android/group/retrieving-group-members/get-specified-group-members-info' +--- + +`getGroupMembersInfo()` 接收一个 `groupID` 和目标用户 ID 列表,返回这些用户在群内的 `GroupMembersInfo`。 + +```java +OpenIMClient.getInstance().groupManager.getGroupMembersInfo( + new OnBase>() { + @Override public void onSuccess(List members) { mergeMembers(members); } + @Override public void onError(int code, String error) { showMemberQueryError(error); } + }, groupID, userIDs); +``` + +返回空列表可能表示目标未在群内或无读取权限,应按业务需求处理。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx new file mode 100644 index 0000000000..db3243966b --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx @@ -0,0 +1,16 @@ +--- +title: '检查用户是否在群内' +description: '使用 getUsersInGroup 从候选用户中筛出当前在群内的用户 ID。' +sourcePath: '/sdk/android/group/retrieving-group-members/get-users-in-group' +--- + +`getUsersInGroup()` 返回传入用户中已在指定群内的 ID 列表,不返回成员资料。 + +```java +OpenIMClient.getInstance().groupManager.getUsersInGroup(new OnBase>() { + @Override public void onSuccess(List joinedUserIDs) { updateMembership(joinedUserIDs); } + @Override public void onError(int code, String error) { showMembershipError(error); } +}, groupID, candidateUserIDs); +``` + +需要昵称、角色或禁言状态时,再调用“获取群成员资料”。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx new file mode 100644 index 0000000000..77b68f84ea --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx @@ -0,0 +1,9 @@ +--- +title: '群成员查询概览' +description: '说明 Android SDK 中群成员列表、指定成员资料和成员状态查询。' +sourcePath: '/sdk/android/group/retrieving-group-members/overview-retrieving-group-members' +--- + +成员查询使用 `groupID` 限定范围,结果为 `GroupMembersInfo` 或用户 ID 列表。成员列表提供角色过滤和 offset 分页;指定成员资料、在群检查、群主管理员和关键词搜索各有独立接口。 + +成员增删和资料变化由[群组概览](/sdk/android/group/overview-group)归属的 `OnGroupListener` 统一合并。查询只建立快照,不能替代事件处理。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx new file mode 100644 index 0000000000..b85d2d3f91 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx @@ -0,0 +1,17 @@ +--- +title: '搜索群成员' +description: '使用 searchGroupMembers 按用户 ID 或群昵称搜索群成员。' +sourcePath: '/sdk/android/group/retrieving-group-members/search-group-members' +--- + +指定关键词列表、用户 ID 与群昵称两个搜索开关,以及分页条件。 + +```java +OpenIMClient.getInstance().groupManager.searchGroupMembers( + new OnBase>() { + @Override public void onSuccess(List members) { showMemberSearch(members); } + @Override public void onError(int code, String error) { showSearchError(error); } + }, groupID, Collections.singletonList(keyword), true, true, 0, 20); +``` + +搜索仅限目标群组;空关键词或两个搜索开关均关闭时不应发起请求。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx new file mode 100644 index 0000000000..b5dce64676 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx @@ -0,0 +1,16 @@ +--- +title: '分页获取已加入群组' +description: '使用 getJoinedGroupListPage 分页读取当前账号已加入的群组。' +sourcePath: '/sdk/android/group/retrieving-groups/get-joined-group-list-page' +--- + +Android SDK 仅提供分页版本。`offset` 从 `0` 开始,后续页按已经成功合并的条目数推进;返回为空时停止加载。 + +```java +OpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() { + @Override public void onSuccess(List groups) { appendJoinedGroups(groups); } + @Override public void onError(int code, String error) { showPageError(error); } +}, offset, 20); +``` + +使用 `onJoinedGroupAdded` 与 `onJoinedGroupDeleted` 合并增量,不要仅依赖已加载分页作为完整群列表。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx new file mode 100644 index 0000000000..97c8eaaff6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx @@ -0,0 +1,16 @@ +--- +title: '获取群资料' +description: '使用 getGroupsInfo 批量查询指定群组的最新资料。' +sourcePath: '/sdk/android/group/retrieving-groups/get-specified-groups-info' +--- + +已持有一组 `groupID` 时,使用 `getGroupsInfo()` 查询群资料。结果是 `GroupInfo` 列表,不能依赖响应顺序与请求列表完全一致。 + +```java +OpenIMClient.getInstance().groupManager.getGroupsInfo(new OnBase>() { + @Override public void onSuccess(List groups) { mergeGroups(groups); } + @Override public void onError(int code, String error) { showGroupQueryError(error); } +}, groupIDs); +``` + +先移除空值和重复 ID;权限不足或群组不存在的 ID 应按缺失结果处理。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx new file mode 100644 index 0000000000..a495b3e12c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx @@ -0,0 +1,16 @@ +--- +title: '检查是否加入群组' +description: '使用 isJoinGroup 查询当前登录用户是否已经加入指定群组。' +sourcePath: '/sdk/android/group/retrieving-groups/is-join-group' +--- + +`isJoinGroup()` 仅检查当前登录用户与目标 `groupID` 的成员关系。 + +```java +OpenIMClient.getInstance().groupManager.isJoinGroup(groupID, new OnBase() { + @Override public void onSuccess(Boolean joined) { updateJoinAction(Boolean.TRUE.equals(joined)); } + @Override public void onError(int code, String error) { showMembershipError(error); } +}); +``` + +该结果不替代群资料查询,也不能用于判断其他用户是否在群内。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx new file mode 100644 index 0000000000..6c3d3472d7 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx @@ -0,0 +1,16 @@ +--- +title: '搜索群组' +description: '使用 searchGroups 按群 ID 或群名称搜索本地可查询的群组。' +sourcePath: '/sdk/android/group/retrieving-groups/search-groups' +--- + +`searchGroups()` 接收关键词列表,并分别指定是否搜索群 ID、群名称。两个开关都关闭时没有有效搜索范围。 + +```java +OpenIMClient.getInstance().groupManager.searchGroups(new OnBase>() { + @Override public void onSuccess(List groups) { showSearchResults(groups); } + @Override public void onError(int code, String error) { showSearchError(error); } +}, Collections.singletonList(keyword), true, true); +``` + +搜索结果不是成员资格证明。进入群组前可使用“检查是否加入群组”确认当前状态。 diff --git a/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx b/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx new file mode 100644 index 0000000000..358f31067c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx @@ -0,0 +1,20 @@ +--- +title: '发布群公告' +description: '通过 GroupInfo.notification 发布或更新群公告。' +sourcePath: '/sdk/android/group/set-group-announcement' +--- + +Android SDK 没有独立的公告方法。构造包含 `groupID` 与 `notification` 的 `GroupInfo`,再调用 `setGroupInfo()`。 + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setNotification("今晚 20:00 进行版本发布确认。"); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { refreshAnnouncement(groupID); } + @Override public void onError(int code, String error) { showAnnouncementError(error); } +}); +``` + +公告的更新时间和更新人由返回的 `GroupInfo` 中 `notificationUpdateTime`、`notificationUserID` 表示。权限由服务端校验。 diff --git a/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx b/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx new file mode 100644 index 0000000000..5a3f42d309 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx @@ -0,0 +1,20 @@ +--- +title: '设置群扩展字段' +description: '通过 GroupInfo.ex 保存应用定义的群组扩展数据。' +sourcePath: '/sdk/android/group/set-group-extension' +--- + +`GroupInfo.ex` 是完整字符串,SDK 不会合并 JSON。多个业务模块共用该字段时,应由应用读取旧值、合并自己的命名空间后再提交。 + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setEx("{\"projectCode\":\"mobile\",\"archived\":false}"); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markExtensionSubmitted(groupID); } + @Override public void onError(int code, String error) { showExtensionError(error); } +}); +``` + +不要将访问令牌、密钥或仅适合本机的 UI 状态写入群扩展字段。 diff --git a/content/zh/docs/chat/sdk/android/group/set-group-join-verification.mdx b/content/zh/docs/chat/sdk/android/group/set-group-join-verification.mdx new file mode 100644 index 0000000000..04c67d00a6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/set-group-join-verification.mdx @@ -0,0 +1,20 @@ +--- +title: '设置入群验证方式' +description: '通过 GroupInfo.needVerification 配置申请和邀请的入群验证规则。' +sourcePath: '/sdk/android/group/set-group-join-verification' +--- + +入群验证写入 `GroupInfo.needVerification`,再调用 `setGroupInfo()`。可使用 `GroupVerification` 常量:`APPLY_NEED_VERIFICATION_INVITE_DIRECTLY`、`ALL_NEED_VERIFICATION` 和 `DIRECTLY`。 + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setNeedVerification(GroupVerification.ALL_NEED_VERIFICATION); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markVerificationSubmitted(groupID); } + @Override public void onError(int code, String error) { showVerificationError(error); } +}); +``` + +该设置影响后续入群请求,不替代对已存在申请的同意或拒绝处理。 diff --git a/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx b/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx new file mode 100644 index 0000000000..595cc08ede --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx @@ -0,0 +1,20 @@ +--- +title: '设置成员好友申请权限' +description: '通过 GroupInfo.applyMemberFriend 设置是否允许从群成员发起好友申请。' +sourcePath: '/sdk/android/group/set-group-member-friend-permission' +--- + +`applyMemberFriend` 使用整数开关:`0` 关闭,`1` 打开。该规则只影响从该群成员关系入口发起的好友申请。 + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setApplyMemberFriend(0); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markFriendPermissionSubmitted(groupID); } + @Override public void onError(int code, String error) { showPermissionError(error); } +}); +``` + +更新后以 `onGroupInfoChanged` 或重新读取的 `GroupInfo` 为准。 diff --git a/content/zh/docs/chat/sdk/android/group/set-group-member-profile-access.mdx b/content/zh/docs/chat/sdk/android/group/set-group-member-profile-access.mdx new file mode 100644 index 0000000000..82a448d4b9 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/set-group-member-profile-access.mdx @@ -0,0 +1,20 @@ +--- +title: '设置成员资料查看权限' +description: '通过 GroupInfo.lookMemberInfo 设置是否允许通过群组查看成员资料。' +sourcePath: '/sdk/android/group/set-group-member-profile-access' +--- + +`lookMemberInfo` 使用整数开关:`0` 关闭,`1` 打开。更新时只提交该权限字段和 `groupID`。 + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setLookMemberInfo(1); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markMemberInfoAccessSubmitted(groupID); } + @Override public void onError(int code, String error) { showPermissionError(error); } +}); +``` + +此开关约束通过群组入口获取成员资料的权限,不改变成员已经拥有的用户资料。 diff --git a/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx b/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx new file mode 100644 index 0000000000..9ed87d5dfd --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx @@ -0,0 +1,21 @@ +--- +title: '更新群资料' +description: '使用 setGroupInfo 更新群名称、头像、简介和其他群资料字段。' +sourcePath: '/sdk/android/group/update-group-profile' +--- + +使用 `setGroupInfo()` 更新群资料。请求对象至少应包含 `groupID` 和需要修改的字段;不要用不完整的本地缓存覆盖未参与本次编辑的字段。 + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setGroupName("移动端项目组"); +update.setIntroduction("Android 与 iOS 协作群"); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markGroupUpdateSubmitted(groupID); } + @Override public void onError(int code, String error) { showGroupUpdateError(error); } +}); +``` + +最新群资料通过 `onGroupInfoChanged` 合并。群公告和扩展字段使用相同接口,分别见相关页面。 diff --git a/content/zh/docs/chat/sdk/android/logger.mdx b/content/zh/docs/chat/sdk/android/logger.mdx new file mode 100644 index 0000000000..7e40da542f --- /dev/null +++ b/content/zh/docs/chat/sdk/android/logger.mdx @@ -0,0 +1,112 @@ +--- +title: '日志' +description: '配置 Android SDK 日志、写入应用诊断信息并上传日志。' +sourcePath: '/sdk/android/logger' +--- + +OpenIM Android SDK 日志用于定位初始化、连接和业务 API 调用问题。开发和预发布环境可以输出较详细的信息;生产环境应减少日志量,并避免记录 Token、完整消息正文、原始文件 URL、通话房间凭据和用户隐私字段。 + +## 初始化日志配置 + +日志选项属于 `InitConfig`,必须在 `initSDK()` 前设置: + +```java +File dataDirectory = new File(application.getFilesDir(), "openim"); +File logDirectory = new File(application.getFilesDir(), "openim-logs"); + +InitConfig config = new InitConfig( + apiAddr, + wsAddr, + dataDirectory.getAbsolutePath() +); +config.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn; +config.isLogStandardOutput = BuildConfig.DEBUG; +config.logFilePath = logDirectory.getAbsolutePath(); + +boolean initialized = OpenIMClient.getInstance().initSDK( + application, + config, + connectionListener +); +``` + +| 字段 | 说明 | +| --- | --- | +| `logLevel` | 使用 `LogLevel` 常量控制详细程度。可选值包括 `DebugWithSQL`、`Debug`、`Info`、`Warn`、`Error`、`Panic` 和 `Fatal`。 | +| `isLogStandardOutput` | 是否把 SDK 日志输出到 Android 标准日志;开发诊断时开启。 | +| `logFilePath` | 可选日志目录,应位于应用可写范围并纳入容量与保留期管理。 | + +开发诊断可以使用 `Debug`;只有排查数据库问题时才临时启用 `DebugWithSQL`。生产环境通常使用 `Warn` 或 `Error`,并关闭不必要的标准输出。 + +## 写入应用诊断日志 + +需要把业务上下文写入 SDK 日志时,使用未废弃的 `logs()` 重载: + +```java +OpenIMClient.getInstance().logs( + LogLevel.Error, + ChatRepository.class.getSimpleName(), + 184, + "send_message_failed", + errorMessage, + "conversationID", conversationID, + "clientMsgID", clientMsgID +); +``` + +`currentClassName` 和 `currentLineNum` 用于定位调用位置,`msgStr` 是简短动作描述,`errStr` 是错误信息。`Warn`、`Error`、`Panic` 和 `Fatal` 级别必须提供非空错误信息。末尾的 `extra` 按“键、值”成对传入;只记录排查所需的非敏感标识。 + +旧的带 `OnBase`、`Map` 参数的 `logs()` 重载已经废弃,不应在新代码中使用。 + +## 上传诊断日志 + +只在用户明确同意提交诊断信息后调用 `uploadLogs()`。Android API 保留了 `params` 参数;没有额外参数时传空列表。`line` 表示本次上传读取的日志行数配置。 + +```java +String uploadID = UUID.randomUUID().toString(); + +OpenIMClient.getInstance().uploadLogs( + new OnBase() { + @Override + public void onSuccess(String data) { + showLogUploadCompleted(); + } + + @Override + public void onError(int code, String error) { + showLogUploadError(code, error); + } + }, + Collections.emptyList(), + 2000, + uploadID, + "support-ticket-42", + new UploadLogProgress() { + @Override + public void onProgress(long current, long total) { + updateLogUploadProgress(current, total); + } + } +); +``` + +| 参数 | 说明 | +| --- | --- | +| `line` | 本次上传读取的日志行数配置。 | +| `cancelID` | 本次上传的稳定标识,可使用业务生成的 UUID。 | +| `ex` | 附加到上传任务的诊断说明,例如工单 ID;不能包含凭据或隐私数据。 | +| `UploadLogProgress` | 提供当前进度和总量,用于更新上传界面。 | + +成功 callback 表示本次日志上传请求完成,不会修改用户、会话或消息状态,也不会触发业务领域事件。上传失败时记录错误码、当前用户和业务诊断 ID,不要再次输出完整日志内容。 + +## operationID 与业务追踪 + +Android Java wrapper 的公共业务方法不接收 `operationID`。每次调用时,wrapper 会通过 `ParamsUtil.buildOperationID()` 自动生成并传给 Core,因此应用通常不需要创建或传递该值。 + +应用日志应另外维护自己的 trace ID,并记录业务动作、错误码以及必要的 `conversationID`、`clientMsgID`、`groupID` 或 `roomID`。应用 trace ID 用于串联多步骤业务流程;SDK 的 `operationID` 用于单次 SDK 调用链路,两者都不是身份凭据或业务幂等键。 + +## 相关页面 + +- [按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation) +- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) +- [发送消息](/sdk/android/message/sending-messages/send-message) diff --git a/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx b/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx new file mode 100644 index 0000000000..373932fa94 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx @@ -0,0 +1,33 @@ +--- +title: '更新输入状态' +description: '使用 typingStatusUpdate 提示单聊对方当前正在输入。' +sourcePath: '/sdk/android/message/composing-messages/update-typing-status' +--- + +输入框变化时传入对方用户 ID 和业务约定的提示字符串。调用侧应防抖,避免每次按键都发送请求。 + +```java +messageManager.typingStatusUpdate(callback, peerUserID, "typing"); +``` + +成功 callback 表示输入状态上报请求完成,不表示对端已经处理。对端通过应用级 `OnConversationListener.onConversationUserInputStatusChanged` 接收字符串载荷;Android wrapper 不会自动把它转换为模型,应在校验 JSON 后再解析: + +```java +@Override +public void onConversationUserInputStatusChanged(String payload) { + InputStatesChangedData state = JsonUtil.toObj( + payload, + InputStatesChangedData.class + ); + if (state == null || state.getConversationID() == null) { + return; + } + updateTypingState( + state.getConversationID(), + state.getUserID(), + state.getPlatformIDs() + ); +} +``` + +输入状态按 `conversationID:userID` 合并,并设置业务侧超时自动清除。`ConversationManager` 只保存一个会话 listener,本回调必须与会话列表、总未读数和同步事件组合后统一设置,不能在输入框页面单独覆盖。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx new file mode 100644 index 0000000000..09c8ceef54 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx @@ -0,0 +1,11 @@ +--- +title: '创建名片消息' +description: '使用 createCardMessage 创建联系人名片消息。' +sourcePath: '/sdk/android/message/creating-messages/create-card-message' +--- + +`CardElem` 保存名片用户的展示资料。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createCardMessage(cardElem); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx new file mode 100644 index 0000000000..75470bcac6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建自定义消息' +description: '使用 createCustomMessage 承载业务定义的 JSON 消息。' +sourcePath: '/sdk/android/message/creating-messages/create-custom-message' +--- + +`data`、`extension` 和 `description` 由业务定义,接收端应按自己的协议解析。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createCustomMessage( + dataJson, extensionJson, description); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx new file mode 100644 index 0000000000..c803bbacc7 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx @@ -0,0 +1,11 @@ +--- +title: '创建表情消息' +description: '使用 createFaceMessage 创建自定义表情消息。' +sourcePath: '/sdk/android/message/creating-messages/create-face-message' +--- + +`index` 表示表情位置,`data` 保存表情 URL 等 JSON 数据。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createFaceMessage(index, dataJson); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx new file mode 100644 index 0000000000..a08758fce1 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx @@ -0,0 +1,12 @@ +--- +title: '从文件创建文件消息' +description: '使用相对路径或绝对路径创建文件消息。' +sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-file' +--- + +文件名与路径分别传入;相对路径相对于 SDK 初始化时配置的缓存目录。 + +```java +Message message = OpenIMClient.getInstance().messageManager + .createFileMessageFromFullPath(filePath, fileName); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx new file mode 100644 index 0000000000..2ce7b0a895 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx @@ -0,0 +1,11 @@ +--- +title: '从 URL 创建文件消息' +description: '使用 FileElem 创建已上传资源的文件消息。' +sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-url' +--- + +`FileElem` 应包含远端 URL、文件名和文件大小。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createFileMessageByURL(fileElem); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx new file mode 100644 index 0000000000..c7140fff6a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx @@ -0,0 +1,11 @@ +--- +title: '创建转发消息' +description: '使用 createForwardMessage 创建转发消息。' +sourcePath: '/sdk/android/message/creating-messages/create-forward-message' +--- + +传入待转发的 `Message`,创建结果仍需通过发送方法投递到目标会话。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createForwardMessage(sourceMessage); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx new file mode 100644 index 0000000000..b01ed5ea73 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx @@ -0,0 +1,11 @@ +--- +title: '从文件创建图片消息' +description: '使用相对路径或绝对路径创建图片消息。' +sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-file' +--- + +缓存目录内使用 `createImageMessage()`,绝对路径使用 `createImageMessageFromFullPath()`。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createImageMessageFromFullPath(filePath); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx new file mode 100644 index 0000000000..e789e2283f --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx @@ -0,0 +1,12 @@ +--- +title: '从 URL 创建图片消息' +description: '使用 createImageMessageByURL 创建已上传资源的图片消息。' +sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-url' +--- + +准备 `PictureInfo` 的原图、大图和缩略图信息后创建消息。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createImageMessageByURL( + sourceURL, sourcePicture, bigPicture, snapshotPicture); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx new file mode 100644 index 0000000000..d4b9115a1e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建位置消息' +description: '使用 createLocationMessage 创建经纬度和描述位置消息。' +sourcePath: '/sdk/android/message/creating-messages/create-location-message' +--- + +经纬度使用十进制度数,描述用于地图或列表展示。 + +```java +Message message = OpenIMClient.getInstance().messageManager + .createLocationMessage(latitude, longitude, description); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx new file mode 100644 index 0000000000..a1526dfaed --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建合并消息' +description: '使用 createMergerMessage 将多条消息合并为一条摘要消息。' +sourcePath: '/sdk/android/message/creating-messages/create-merger-message' +--- + +传入消息列表、标题和摘要列表;摘要顺序应与展示协议保持一致。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createMergerMessage( + messages, title, summaries); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx new file mode 100644 index 0000000000..498b2717ce --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建引用消息' +description: '使用 createQuoteMessage 创建引用已有消息的回复。' +sourcePath: '/sdk/android/message/creating-messages/create-quote-message' +--- + +引用消息保存被引用的完整 `Message`,发送前应确保引用对象包含稳定的 `clientMsgID`。 + +```java +Message message = OpenIMClient.getInstance().messageManager + .createQuoteMessage(replyText, quotedMessage); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx new file mode 100644 index 0000000000..5c3ee21b12 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx @@ -0,0 +1,12 @@ +--- +title: '从文件创建音频消息' +description: '使用相对路径或绝对路径创建音频消息。' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-file' +--- + +音频时长单位为秒;根据文件位置选择相对路径或绝对路径方法。 + +```java +Message message = OpenIMClient.getInstance().messageManager + .createSoundMessageFromFullPath(soundPath, durationSeconds); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx new file mode 100644 index 0000000000..f647e57883 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx @@ -0,0 +1,11 @@ +--- +title: '从 URL 创建音频消息' +description: '使用 SoundElem 创建已上传资源的音频消息。' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-url' +--- + +`createSoundMessageByURL()` 接收已经包含 URL、时长和大小的 `SoundElem`。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createSoundMessageByURL(soundElem); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx new file mode 100644 index 0000000000..61732847ed --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建 @ 消息' +description: '使用 createTextAtMessage 创建带成员提醒的文本消息。' +sourcePath: '/sdk/android/message/creating-messages/create-text-at-message' +--- + +传入文本、被提醒用户 ID、`AtUserInfo` 列表和可选引用消息。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createTextAtMessage( + text, userIDs, atUserInfos, quoteMessage); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx new file mode 100644 index 0000000000..080407ba62 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx @@ -0,0 +1,11 @@ +--- +title: '创建文本消息' +description: '使用 createTextMessage 创建文本 Message。' +sourcePath: '/sdk/android/message/creating-messages/create-text-message' +--- + +`createTextMessage()` 只创建本地消息对象,不发送消息。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createTextMessage(text); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx new file mode 100644 index 0000000000..1de9a128c6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx @@ -0,0 +1,12 @@ +--- +title: '从文件创建视频消息' +description: '使用相对路径或绝对路径创建视频消息及缩略图。' +sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-file' +--- + +视频方法需要 MIME 类型、时长和缩略图路径。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessageFromFullPath( + videoPath, mimeType, durationSeconds, snapshotPath); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx new file mode 100644 index 0000000000..8f15837c33 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx @@ -0,0 +1,11 @@ +--- +title: '从 URL 创建视频消息' +description: '使用 VideoElem 创建已上传资源的视频消息。' +sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-url' +--- + +将远端视频及缩略图信息填入 `VideoElem` 后创建消息。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessageByURL(videoElem); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx new file mode 100644 index 0000000000..8c35a9aea7 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx @@ -0,0 +1,11 @@ +--- +title: '清空全部本地消息' +description: '使用 deleteAllMsgFromLocal 清理当前设备的全部消息。' +sourcePath: '/sdk/android/message/managing-messages/clear-all-local-messages' +--- + +该操作只清理当前设备本地缓存,不删除服务端记录。 + +```java +messageManager.deleteAllMsgFromLocal(callback); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx new file mode 100644 index 0000000000..cdcb7102f0 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx @@ -0,0 +1,11 @@ +--- +title: '清空全部已保存消息' +description: '使用 deleteAllMsgFromLocalAndSvr 清理本地和服务端消息。' +sourcePath: '/sdk/android/message/managing-messages/clear-all-messages' +--- + +这是高影响操作,产品层应二次确认,并在完成后清理本地会话展示。 + +```java +messageManager.deleteAllMsgFromLocalAndSvr(callback); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx new file mode 100644 index 0000000000..dd06859d57 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx @@ -0,0 +1,11 @@ +--- +title: '删除本地消息' +description: '使用 deleteMessageFromLocalStorage 仅删除当前设备的消息副本。' +sourcePath: '/sdk/android/message/managing-messages/delete-local-message' +--- + +该操作不影响其他设备和其他用户的消息记录。 + +```java +messageManager.deleteMessageFromLocalStorage(conversationID, clientMsgID, callback); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx new file mode 100644 index 0000000000..846606b0cd --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx @@ -0,0 +1,11 @@ +--- +title: '删除已保存消息' +description: '使用 deleteMessageFromLocalAndSvr 删除本地和服务端的一条消息。' +sourcePath: '/sdk/android/message/managing-messages/delete-saved-messages' +--- + +删除结果通过消息事件同步,调用成功不代表所有端已经刷新。 + +```java +messageManager.deleteMessageFromLocalAndSvr(conversationID, clientMsgID, callback); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx new file mode 100644 index 0000000000..faccb79cd4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx @@ -0,0 +1,14 @@ +--- +title: '查看置顶消息' +description: '使用 getConversationPinnedMsgs 查询会话中的置顶消息。' +sourcePath: '/sdk/android/message/managing-messages/get-pinned-messages' +--- + +查询结果是指定会话当前的置顶消息快照。 + +```java +messageManager.getConversationPinnedMsgs(new OnBase>() { + @Override public void onSuccess(List messages) { showPinned(messages); } + @Override public void onError(int code, String error) { showPinnedError(error); } +}, conversationID); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx new file mode 100644 index 0000000000..fe438ba7c7 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx @@ -0,0 +1,11 @@ +--- +title: '插入本地群聊消息' +description: '使用 insertGroupMessageToLocalStorage 插入仅当前设备可见的群聊消息。' +sourcePath: '/sdk/android/message/managing-messages/insert-local-group-message' +--- + +传入群 ID 与发送者 ID,消息不会同步到其他设备。 + +```java +messageManager.insertGroupMessageToLocalStorage(callback, message, groupID, senderUserID); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx new file mode 100644 index 0000000000..398f05f14a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx @@ -0,0 +1,11 @@ +--- +title: '插入本地单聊消息' +description: '使用 insertSingleMessageToLocalStorage 插入仅当前设备可见的单聊消息。' +sourcePath: '/sdk/android/message/managing-messages/insert-local-single-message' +--- + +该方法不向服务器发送消息,`receiver` 和 `sender` 用于建立本地消息归属。 + +```java +messageManager.insertSingleMessageToLocalStorage(callback, message, receiverUserID, senderUserID); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx new file mode 100644 index 0000000000..5faba1be23 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx @@ -0,0 +1,11 @@ +--- +title: '修改消息' +description: '使用 ModifyMessageReq 修改支持修改的消息内容。' +sourcePath: '/sdk/android/message/managing-messages/modify-a-message' +--- + +请求对象中填写会话 ID、客户端消息 ID 和新的消息内容,修改结果通过 `onMessageModified` 同步。 + +```java +messageManager.modifyMessage(callback, modifyRequest); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx new file mode 100644 index 0000000000..315f117125 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx @@ -0,0 +1,11 @@ +--- +title: '撤回消息' +description: '使用 revokeMessageV2 撤回已发送消息。' +sourcePath: '/sdk/android/message/managing-messages/revoke-a-message' +--- + +Android 的撤回方法为 `revokeMessageV2()`,撤回详情通过 `onRecvMessageRevokedV2` 返回。 + +```java +messageManager.revokeMessageV2(callback, conversationID, clientMsgID); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx new file mode 100644 index 0000000000..c991a22e6a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx @@ -0,0 +1,11 @@ +--- +title: '设置消息本地扩展字段' +description: '使用 setMessageLocalEx 保存仅当前设备使用的消息扩展数据。' +sourcePath: '/sdk/android/message/managing-messages/set-message-local-ex' +--- + +`localEx` 适合保存下载路径、播放状态等本地信息,不会同步给其他用户。 + +```java +messageManager.setMessageLocalEx(callback, conversationID, clientMsgID, localExJson); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx new file mode 100644 index 0000000000..308db6a098 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx @@ -0,0 +1,11 @@ +--- +title: '置顶或取消置顶消息' +description: '使用 setConversationPinnedMsg 设置会话消息的置顶状态。' +sourcePath: '/sdk/android/message/managing-messages/set-message-pinned' +--- + +最后一个参数为 `true` 置顶,`false` 取消置顶;变化通过 `onChangedPinnedMsg` 同步。 + +```java +messageManager.setConversationPinnedMsg(callback, conversationID, clientMsgID, true); +``` diff --git a/content/zh/docs/chat/sdk/android/message/overview-message.mdx b/content/zh/docs/chat/sdk/android/message/overview-message.mdx new file mode 100644 index 0000000000..57abdea9ad --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/overview-message.mdx @@ -0,0 +1,15 @@ +--- +title: '消息概览' +description: '了解 Android SDK 的 Message 模型、消息生命周期和消息监听。' +sourcePath: '/sdk/android/message/overview-message' +--- + +Android 消息以 `Message` 表示,使用 `clientMsgID` 去重,使用 `sessionType`、`recvID` 和 `groupID` 区分单聊与群聊。消息内容由对应的 element 字段承载,发送、接收、撤回和删除是不同的状态变化。 + +```java +OpenIMClient.getInstance().messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); } +}); +``` + +查询建立快照,`OnAdvanceMsgListener` 合并增量;`MessageManager` 的 listener 设置会替换当前 listener。 diff --git a/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx new file mode 100644 index 0000000000..f1154c2d43 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx @@ -0,0 +1,17 @@ +--- +title: '接收自定义业务消息' +description: '使用 setCustomBusinessListener 接收独立于普通聊天消息的业务回调。' +sourcePath: '/sdk/android/message/receiving-messages/receive-custom-business-messages' +--- + +自定义业务回调携带字符串,业务侧应按协议校验来源和 JSON 结构,不要将其直接当作 `Message` 渲染。 + +```java +messageManager.setCustomBusinessListener(new OnCustomBusinessListener() { + @Override public void onRecvCustomBusinessMessage(String payload) { handleBusiness(payload); } +}); +``` + +本页是 `onRecvCustomBusinessMessage` 的完整处理归属页。载荷应包含业务协议版本和稳定幂等 ID,并按该 ID 去重;不要依赖回调顺序,也不要使用自定义业务消息授予客户端权限。 + +`MessageManager` 只保存一个自定义业务 listener,后一次设置会替换前一次。应在应用级事件中心设置一次,并在退出或切换账号时停止向旧账号状态分发。 diff --git a/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx new file mode 100644 index 0000000000..aba5b08446 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx @@ -0,0 +1,14 @@ +--- +title: '接收消息' +description: '使用 OnAdvanceMsgListener 接收新消息、离线消息和在线消息。' +sourcePath: '/sdk/android/message/receiving-messages/receive-messages' +--- + +设置 `setAdvancedMsgListener()` 后,`onRecvNewMessage` 接收实时消息,`onRecvOfflineNewMessage` 接收离线批次,`onRecvOnlineOnlyMessage` 接收在线消息字符串。所有消息都按 `clientMsgID` 幂等合并。 + +```java +messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); } + @Override public void onRecvOfflineNewMessage(List messages) { messageStore.mergeAll(messages); } +}); +``` diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx new file mode 100644 index 0000000000..381f4ab42c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx @@ -0,0 +1,14 @@ +--- +title: '按 ID 查询消息' +description: '使用 findMessageList 按 SearchParams 查询消息记录。' +sourcePath: '/sdk/android/message/retrieving-messages/find-messages-by-id' +--- + +构造 `SearchParams` 列表查询消息。返回结果应按消息 ID 合并,不要用列表位置作为稳定标识。 + +```java +messageManager.findMessageList(new OnBase() { + @Override public void onSuccess(SearchResult result) { showFoundMessages(result); } + @Override public void onError(int code, String error) { showQueryError(error); } +}, searchParams); +``` diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx new file mode 100644 index 0000000000..8ae412f2cb --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx @@ -0,0 +1,11 @@ +--- +title: '加载更新消息' +description: '使用 getAdvancedHistoryMessageListReverse 加载起点之后的消息。' +sourcePath: '/sdk/android/message/retrieving-messages/load-newer-messages' +--- + +该方法用于从消息定位点向后读取,适合搜索定位或上下文分页。 + +```java +messageManager.getAdvancedHistoryMessageListReverse(callback, conversationID, startMessage, 20, ViewType.NORMAL); +``` diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx new file mode 100644 index 0000000000..7f6fa2a448 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx @@ -0,0 +1,11 @@ +--- +title: '加载更早消息' +description: '使用 getAdvancedHistoryMessageList 分页加载会话历史消息。' +sourcePath: '/sdk/android/message/retrieving-messages/load-older-messages' +--- + +首次查询传 `startMsg` 为 `null`,后续将上一页边界消息作为起点。按返回的 `clientMsgID` 去重。 + +```java +messageManager.getAdvancedHistoryMessageList(callback, conversationID, startMessage, 20, ViewType.NORMAL); +``` diff --git a/content/zh/docs/chat/sdk/android/message/searching-messages/search-messages.mdx b/content/zh/docs/chat/sdk/android/message/searching-messages/search-messages.mdx new file mode 100644 index 0000000000..df7132f4c3 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/searching-messages/search-messages.mdx @@ -0,0 +1,12 @@ +--- +title: '搜索消息' +description: '使用 searchLocalMessages 搜索当前账号已同步到本地的消息。' +sourcePath: '/sdk/android/message/searching-messages/search-messages' +--- + +可按会话、关键词、发送者、消息类型、时间范围和分页参数搜索。`conversationID` 传 `null` 表示全局搜索。 + +```java +messageManager.searchLocalMessages(callback, conversationID, keywords, 1, + senderIDs, messageTypes, 0, 0, 0, 20); +``` diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx new file mode 100644 index 0000000000..86bbd1a9fb --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx @@ -0,0 +1,11 @@ +--- +title: '发送非 OSS 消息' +description: '使用 sendMessageNotOss 发送已经由业务上传资源的媒体消息。' +sourcePath: '/sdk/android/message/sending-messages/send-message-not-oss' +--- + +消息中的媒体 URL 已准备好时使用该方法,避免 SDK 再次进入内置上传流程。 + +```java +messageManager.sendMessageNotOss(callback, message, peerUserID, null, offlinePushInfo); +``` diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx new file mode 100644 index 0000000000..e14f1ddc5e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx @@ -0,0 +1,14 @@ +--- +title: '发送消息' +description: '使用 sendMessage 将 Message 发送到单聊或群聊。' +sourcePath: '/sdk/android/message/sending-messages/send-message' +--- + +单聊填写 `recvUid`,群聊填写 `recvGid`,另一个目标参数传 `null`。`OnMsgSendCallback` 同时承载成功、失败和媒体进度。 + +```java +messageManager.sendMessage(new OnMsgSendCallback() { + @Override public void onSuccess(String id) { mergeSentMessage(message); } + @Override public void onError(int code, String error) { showSendError(error); } +}, message, peerUserID, null, offlinePushInfo); +``` diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx new file mode 100644 index 0000000000..107d841dff --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx @@ -0,0 +1,15 @@ +--- +title: '跟踪消息发送进度' +description: '通过 OnMsgSendCallback 的进度回调更新媒体发送进度。' +sourcePath: '/sdk/android/message/sending-messages/set-msg-send-progress-listener' +--- + +Android 没有独立的全局发送进度 listener;进度随每次 `sendMessage()` 或 `sendMessageNotOss()` 传入的 `OnMsgSendCallback` 返回。 + +```java +messageManager.sendMessage(new OnMsgSendCallback() { + @Override public void onProgress(long progress) { updateProgress(progress); } + @Override public void onSuccess(String id) { finishProgress(); } + @Override public void onError(int code, String error) { failProgress(error); } +}, message, peerUserID, null, offlinePushInfo); +``` diff --git a/content/zh/docs/chat/sdk/android/overview.mdx b/content/zh/docs/chat/sdk/android/overview.mdx new file mode 100644 index 0000000000..448e3fa4e4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/overview.mdx @@ -0,0 +1,21 @@ +--- +title: 'OpenIM Android SDK 概览' +description: '在原生 Android 应用中使用 OpenIM Android SDK 接入用户、会话、群组、消息、通话信令和事件能力。' +sourcePath: '/sdk/android/overview' +--- + +OpenIM Android SDK 用于在原生 Android 应用中接入 OpenIMSDK。选择下方领域进入对应章节。 + +## 文档导航 + +| 领域 | 内容 | +| --- | --- | +| [快速开始](/sdk/android/getting-started/environment-specific-implementation) | 接入 SDK、配置 Android 工程、认证、连接生命周期和发送第一条消息。 | +| [用户与关系链](/sdk/android/user/overview-user) | 用户资料、在线状态、好友、好友申请和黑名单。 | +| [会话](/sdk/android/conversation/overview-conversation) | 会话查询、草稿、未读数、接收选项、阅后即焚、隐藏和删除。 | +| [群组](/sdk/android/group/overview-group) | 群资料、群成员、入群申请、权限、禁言和群组事件。 | +| [消息](/sdk/android/message/overview-message) | 消息创建、发送、接收、历史记录、搜索、删除、撤回和已读回执。 | +| [文件上传](/sdk/android/file-uploads/upload-file) | 独立文件上传和上传进度。 | +| [音视频通话](/sdk/android/calling/overview-calling) | 通话邀请、接受、拒绝、取消、挂断、房间凭据和自定义信令。 | +| [事件](/sdk/android/events/overview-events) | 各 manager 的 listener、连接状态和数据事件。 | +| [日志](/sdk/android/logger) | SDK 日志配置和排查。 | diff --git a/content/zh/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx b/content/zh/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx new file mode 100644 index 0000000000..ef8e11487b --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx @@ -0,0 +1,36 @@ +--- +title: '拉黑用户' +description: '使用 addBlacklist() 将用户加入当前账号黑名单。' +sourcePath: '/sdk/android/user/blacklist/add-blacklist' +--- + +```java +OpenIMClient.getInstance().friendshipManager.addBlacklist( + new OnBase() { + @Override + public void onSuccess(String data) { + markBlacklistRequestSubmitted(targetUserID); + } + + @Override + public void onError(int code, String error) { + recordBlacklistAddFailure(code, error); + } + }, + targetUserID, + "{\"source\":\"profile-menu\"}" +); +``` + +第二个参数是目标 `userID`,第三个参数是可选扩展字符串。无需扩展信息时可使用不带 `ex` 的重载。成功 callback 表示拉黑请求完成,不表示事件已经到达。 + +黑名单是单向关系:被拉黑用户不能向当前用户发送消息,但当前用户是否允许继续向对方发送消息由业务层决定。`ex` 是完整字符串,更新前应合并业务自己的扩展字段。 + +`onBlacklistAdded` 由本页归属,应组合进应用唯一的 `OnFriendshipListener`: + +```java +@Override +public void onBlacklistAdded(BlacklistInfo user) { + blacklistStore.put(user.getUserID(), user); +} +``` diff --git a/content/zh/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx b/content/zh/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx new file mode 100644 index 0000000000..19443fc3b4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx @@ -0,0 +1,50 @@ +--- +title: '获取黑名单列表' +description: '使用 getBlacklist() 获取当前用户的黑名单。' +sourcePath: '/sdk/android/user/blacklist/get-blacklist' +--- + +黑名单记录当前用户主动拉黑的用户,可用于黑名单设置页、资料卡中的关系状态和聊天入口限制。黑名单与群成员管理是独立能力;禁言、移除群成员或调整群角色时,应使用群组 API。 + +## 获取黑名单 + +完成 SDK 初始化并登录后,调用 `getBlacklist()` 获取当前账号的完整黑名单。返回空列表表示当前没有黑名单用户。 + +```java +OpenIMClient.getInstance().friendshipManager.getBlacklist( + new OnBase>() { + @Override + public void onSuccess(List users) { + blacklistStore.replace(users); + } + + @Override + public void onError(int code, String error) { + recordBlacklistFailure(code, error); + } + } +); +``` + +成功 callback 返回 `List`;通过 `UserInfo.getBlackInfo()` 读取黑名单关系对象。 + +## 黑名单记录字段 + +`BlacklistInfo` 的常用字段如下: + +| 字段 | 说明 | +| ---------------- | ------------------------------------------------- | +| `userID` | 被当前用户拉黑的目标用户 ID,也是列表的稳定 key。 | +| `nickname` | 目标用户昵称快照。 | +| `faceURL` | 目标用户头像地址。 | +| `gender` | 目标用户性别值。 | +| `operatorUserID` | 执行拉黑操作的用户 ID。 | +| `createTime` | 黑名单关系创建时间。 | +| `addSource` | 黑名单关系的添加来源。 | +| `ex` | 黑名单关系扩展字符串。 | + +如果页面还要展示好友备注或最新公开资料,应按 `userID` 额外合并 `FriendInfo` 或 `PublicUserInfo`,不能把黑名单字段当作好友资料。 + +黑名单状态统一按 `userID` 合并。查询本身不会触发黑名单新增或删除事件。 + +首次进入页面、重连或用户主动刷新时,使用返回的完整列表替换本地快照;增量变化由[拉黑用户](/sdk/android/user/blacklist/add-blacklist)和[取消拉黑用户](/sdk/android/user/blacklist/remove-blacklist)页面归属的 listener 处理。 diff --git a/content/zh/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx b/content/zh/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx new file mode 100644 index 0000000000..f19628f9a3 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx @@ -0,0 +1,33 @@ +--- +title: '取消拉黑用户' +description: '使用 removeBlacklist() 将用户移出当前账号黑名单。' +sourcePath: '/sdk/android/user/blacklist/remove-blacklist' +--- + +```java +OpenIMClient.getInstance().friendshipManager.removeBlacklist( + new OnBase() { + @Override + public void onSuccess(String data) { + markBlacklistRemovalSubmitted(targetUserID); + } + + @Override + public void onError(int code, String error) { + recordBlacklistRemovalFailure(code, error); + } + }, + targetUserID +); +``` + +成功 callback 表示移除请求完成,不表示事件已经到达。黑名单快照应在 `onBlacklistDeleted` 到达后按 `userID` 删除;如果事件丢失,可重新调用[获取黑名单列表](/sdk/android/user/blacklist/get-blacklist)校准。 + +`onBlacklistDeleted` 由本页归属,应按 `userID` 删除本地记录: + +```java +@Override +public void onBlacklistDeleted(BlacklistInfo user) { + blacklistStore.remove(user.getUserID()); +} +``` diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx new file mode 100644 index 0000000000..a4d9c88512 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx @@ -0,0 +1,25 @@ +--- +title: '接受好友申请' +description: '使用 acceptFriendApplication() 接受好友申请。' +sourcePath: '/sdk/android/user/friend-applications/accept-friend-application' +--- + +```java +OpenIMClient.getInstance().friendshipManager.acceptFriendApplication( + new OnBase() { + @Override + public void onSuccess(String data) { + markApplicationAccepted(applicantUserID); + } + + @Override + public void onError(int code, String error) { + recordApplicationAcceptFailure(code, error); + } + }, + applicantUserID, + "已通过" +); +``` + +`applicantUserID` 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示接受请求完成;好友申请状态和新增好友关系可能通过不同 callback 到达,应分别合并。申请状态由 `onFriendApplicationAccepted` 更新,新好友关系由 `onFriendAdded` 更新。 diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/add-friend.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/add-friend.mdx new file mode 100644 index 0000000000..e016f501dc --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/add-friend.mdx @@ -0,0 +1,27 @@ +--- +title: '发送好友申请' +description: '使用 addFriend() 向指定用户发送好友申请。' +sourcePath: '/sdk/android/user/friend-applications/add-friend' +--- + +```java +OpenIMClient.getInstance().friendshipManager.addFriend( + new OnBase() { + @Override + public void onSuccess(String data) { + markFriendApplicationSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordFriendApplicationFailure(code, error); + } + }, + "user_b", + "你好,我是 Alex" +); +``` + +第二个参数是申请接收方的 `userID`,第三个参数是申请附言。成功 callback 表示服务端已收到申请,不表示对方已经同意。目标用户 ID 不能为空;按昵称、手机号等字段搜索目标用户应先由业务后端完成。 + +好友申请状态变化通过 `OnFriendshipListener` 合并,见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。 diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx new file mode 100644 index 0000000000..788d2bfee8 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx @@ -0,0 +1,68 @@ +--- +title: '获取收到的好友申请' +description: '使用 getRecvFriendApplicationList() 分页查询当前用户收到的好友申请。' +sourcePath: '/sdk/android/user/friend-applications/get-recv-friend-application-list' +--- + +```java +GetFriendApplicationListAsRecipientReq request = + new GetFriendApplicationListAsRecipientReq(0, 20); + +OpenIMClient.getInstance().friendshipManager.getRecvFriendApplicationList( + new OnBase>() { + @Override + public void onSuccess(List applications) { + replaceReceivedApplications(applications); + } + + @Override + public void onError(int code, String error) { + recordReceivedApplicationFailure(code, error); + } + }, + request +); +``` + +`offset` 从 `0` 开始,`count` 是页大小。需要筛选处理状态时可通过 `setHandleResults(int[])` 设置服务端约定的状态值。成功 callback 返回当前页 `List`。 + +| 字段 | 说明 | +| --------------------------------------------- | ---------------------------------------------- | +| `fromUserID` / `fromNickname` / `fromFaceURL` | 申请发起人的 ID、昵称和头像快照。 | +| `toUserID` / `toNickname` / `toFaceURL` | 申请接收人的 ID、昵称和头像快照。 | +| `reqMsg` | 申请附言。 | +| `handleResult` | 处理结果:`0` 待处理,`1` 已同意,`2` 已拒绝。 | +| `handlerUserID` | 执行处理的用户 ID,待处理时可能为空。 | +| `handleMsg` | 处理附言。 | +| `handleTime` | 处理时间,待处理时不应作为有效时间使用。 | +| `createTime` | 申请记录创建时间。 | +| `ex` | 申请记录扩展字符串。 | + +好友申请使用 `fromUserID:toUserID` 作为稳定标识。本页归属好友申请新增、接受、拒绝和删除事件,以下 callback 应组合进应用唯一的 `OnFriendshipListener`: + +```java +@Override +public void onFriendApplicationAdded(FriendApplicationInfo application) { + friendApplicationStore.merge(application); +} + +@Override +public void onFriendApplicationAccepted(FriendApplicationInfo application) { + friendApplicationStore.merge(application); +} + +@Override +public void onFriendApplicationRejected(FriendApplicationInfo application) { + friendApplicationStore.merge(application); +} + +@Override +public void onFriendApplicationDeleted(FriendApplicationInfo application) { + friendApplicationStore.remove( + application.getFromUserID(), + application.getToUserID() + ); +} +``` + +按 `toUserID` 是否等于当前登录用户 ID,将记录分流到收到或发出的列表。申请被接受后,新好友关系由[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)归属的 `onFriendAdded` 合并。 diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx new file mode 100644 index 0000000000..8379e69e7e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx @@ -0,0 +1,29 @@ +--- +title: '获取发出的好友申请' +description: '使用 getSendFriendApplicationList() 分页查询当前用户发出的好友申请。' +sourcePath: '/sdk/android/user/friend-applications/get-send-friend-application-list' +--- + +```java +GetFriendApplicationListAsApplicantReq request = + new GetFriendApplicationListAsApplicantReq(0, 20); + +OpenIMClient.getInstance().friendshipManager.getSendFriendApplicationList( + new OnBase>() { + @Override + public void onSuccess(List applications) { + replaceSentApplications(applications); + } + + @Override + public void onError(int code, String error) { + recordSentApplicationFailure(code, error); + } + }, + request +); +``` + +`offset` 从 `0` 开始,`count` 是页大小。成功 callback 返回当前页 `List`;按 `fromUserID:toUserID` 合并。查询只建立快照,不触发好友申请事件。 + +发出的申请中,当前用户通常是 `fromUserID`。列表字段和处理结果含义与[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)相同;申请处理状态使用 Android 服务端约定的 `0`(待处理)、`1`(已同意)和 `2`(已拒绝)。 diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx new file mode 100644 index 0000000000..99dcfee3b4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx @@ -0,0 +1,25 @@ +--- +title: '拒绝好友申请' +description: '使用 refuseFriendApplication() 拒绝好友申请。' +sourcePath: '/sdk/android/user/friend-applications/refuse-friend-application' +--- + +```java +OpenIMClient.getInstance().friendshipManager.refuseFriendApplication( + new OnBase() { + @Override + public void onSuccess(String data) { + markApplicationRejected(applicantUserID); + } + + @Override + public void onError(int code, String error) { + recordApplicationRejectFailure(code, error); + } + }, + applicantUserID, + "暂不添加" +); +``` + +`applicantUserID` 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示拒绝请求完成;申请状态通过统一好友申请 listener 合并,并最终以 `handleResult == 2` 表示已拒绝。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/check-friend.mdx b/content/zh/docs/chat/sdk/android/user/friends/check-friend.mdx new file mode 100644 index 0000000000..b9d5364cb8 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/check-friend.mdx @@ -0,0 +1,26 @@ +--- +title: '检查好友关系' +description: '使用 checkFriend() 检查指定用户是否为当前用户的好友。' +sourcePath: '/sdk/android/user/friends/check-friend' +--- + +```java +OpenIMClient.getInstance().friendshipManager.checkFriend( + new OnBase>() { + @Override + public void onSuccess(List relations) { + showFriendshipStates(relations); + } + + @Override + public void onError(int code, String error) { + recordFriendshipCheckFailure(code, error); + } + }, + Arrays.asList("user_a", "user_b") +); +``` + +成功 callback 返回 `List`。每项的 `userID` 标识目标用户,`result == 1` 表示目标是好友且不在黑名单中。`result` 以服务端返回值为准,不应在客户端扩展未声明的状态枚举。 + +该方法只建立关系快照,不触发好友 listener。需要昵称、头像或好友备注时使用 [`getFriendsInfo()`](/sdk/android/user/friends/get-friends-info)。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/delete-friend.mdx b/content/zh/docs/chat/sdk/android/user/friends/delete-friend.mdx new file mode 100644 index 0000000000..f8325020e4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/delete-friend.mdx @@ -0,0 +1,24 @@ +--- +title: '删除好友' +description: '使用 deleteFriend() 删除当前用户的一条好友关系。' +sourcePath: '/sdk/android/user/friends/delete-friend' +--- + +```java +OpenIMClient.getInstance().friendshipManager.deleteFriend( + new OnBase() { + @Override + public void onSuccess(String data) { + markFriendDeletionSubmitted(friendUserID); + } + + @Override + public void onError(int code, String error) { + recordFriendDeletionFailure(code, error); + } + }, + friendUserID +); +``` + +成功 callback 表示删除请求完成。`onFriendDeleted` 到达后再按 `userID` 从好友状态中移除记录,事件处理见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx b/content/zh/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx new file mode 100644 index 0000000000..c804c69daa --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx @@ -0,0 +1,66 @@ +--- +title: '分页获取好友列表' +description: '使用 getFriendListPage() 分页获取当前用户的好友列表。' +sourcePath: '/sdk/android/user/friends/get-friend-list-page' +--- + +```java +OpenIMClient.getInstance().friendshipManager.getFriendListPage( + new OnBase>() { + @Override + public void onSuccess(List friends) { + for (UserInfo friend : friends) { + friendStore.put(friend.getUserID(), friend); + } + } + + @Override + public void onError(int code, String error) { + recordFriendListFailure(code, error); + } + }, + 0, + 40, + true +); +``` + +参数依次为 `offset`、`count` 和 `filterBlack`。`offset` 从 `0` 开始,`count` 是页大小,`filterBlack` 为 `true` 时过滤黑名单用户。成功 callback 返回当前页 `List`,好友关系详情可通过 `getFriendInfo()` 读取。继续加载下一页时按实际请求数量增加 `offset`;返回数量小于 `count` 时通常表示到达末页。 + +只使用分页 API,不使用非分页的 `getFriendList()`。快照和增量都应按 `userID` 合并。 + +## 好友资料字段 + +`UserInfo` 是 Android wrapper 的组合对象。好友列表中的 `getFriendInfo()` 返回 `FriendInfo`,常用字段如下: + +| 字段 | 说明 | +| ---------------- | ------------------------------------- | +| `userID` | 好友用户 ID,也是好友列表的稳定标识。 | +| `nickname` | 好友账号昵称。 | +| `faceURL` | 好友账号头像地址。 | +| `remark` | 当前账号设置的好友备注。 | +| `ex` | 好友关系扩展字符串。 | +| `addSource` | 好友关系添加来源。 | +| `operatorUserID` | 建立或更新关系的操作用户 ID。 | +| `createTime` | 好友关系创建时间。 | + +`nickname` 和 `faceURL` 是账号资料,`remark` 和 `ex` 属于好友关系。`UpdateFriendsReq` 支持提交 `isPinned`,但当前 Android `FriendInfo` 模型不提供对应读取字段,置顶状态应由业务层单独维护。不要用好友对象覆盖陌生人的 `PublicUserInfo`,也不要把好友备注写回账号昵称。 + +本页归属好友新增、资料变化和删除事件。以下 callback 应组合进应用唯一的 `OnFriendshipListener`: + +```java +@Override +public void onFriendAdded(FriendInfo friend) { + friendStore.put(friend.getUserID(), friend); +} + +@Override +public void onFriendInfoChanged(FriendInfo friend) { + friendStore.put(friend.getUserID(), friend); +} + +@Override +public void onFriendDeleted(FriendInfo friend) { + friendStore.remove(friend.getUserID()); +} +``` diff --git a/content/zh/docs/chat/sdk/android/user/friends/get-friends-info.mdx b/content/zh/docs/chat/sdk/android/user/friends/get-friends-info.mdx new file mode 100644 index 0000000000..7000e76a0e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/get-friends-info.mdx @@ -0,0 +1,31 @@ +--- +title: '查询指定好友资料' +description: '使用 getFriendsInfo() 查询指定用户的好友关系资料。' +sourcePath: '/sdk/android/user/friends/get-friends-info' +--- + +```java +OpenIMClient.getInstance().friendshipManager.getFriendsInfo( + new OnBase>() { + @Override + public void onSuccess(List friends) { + for (UserInfo friend : friends) { + friendStore.put(friend.getUserID(), friend); + } + } + + @Override + public void onError(int code, String error) { + recordFriendInfoFailure(code, error); + } + }, + Arrays.asList("user_a", "user_b"), + true +); +``` + +第二个参数是目标用户 ID 列表,`filterBlack` 决定是否过滤黑名单用户。成功 callback 返回 `List`;通过 `getFriendInfo()` 读取好友备注和关系字段,并按 `userID` 合并。调用前应去除空值和重复 ID。 + +当目标用户不是好友,或目标用户因 `filterBlack == true` 被过滤时,返回结果中可能没有对应记录。需要同时展示账号公开资料时,应再调用[获取指定用户资料](/sdk/android/user/user-profile/get-users-info),并按 `userID` 合并两类数据。 + +该查询不会触发好友 listener。只需要判断好友关系时使用 [`checkFriend()`](/sdk/android/user/friends/check-friend)。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/search-friends.mdx b/content/zh/docs/chat/sdk/android/user/friends/search-friends.mdx new file mode 100644 index 0000000000..c2906f3348 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/search-friends.mdx @@ -0,0 +1,29 @@ +--- +title: '搜索好友' +description: '使用 searchFriends() 搜索当前用户的好友。' +sourcePath: '/sdk/android/user/friends/search-friends' +--- + +```java +OpenIMClient.getInstance().friendshipManager.searchFriends( + new OnBase>() { + @Override + public void onSuccess(List results) { + showFriendSearchResults(results); + } + + @Override + public void onError(int code, String error) { + recordFriendSearchFailure(code, error); + } + }, + Collections.singletonList(keyword.trim()), + true, + true, + true +); +``` + +`keywordList` 当前只传一个非空关键词。后面的三个布尔值依次控制是否匹配用户 ID、昵称和好友备注,至少应启用一种匹配方式。需要同时搜索多个字段时,将对应开关设为 `true`;不支持把多个关键词作为同一请求的独立搜索条件。 + +成功 callback 返回 `List`。搜索结果只属于当前搜索视图,不应覆盖完整好友列表,也不会触发好友 listener。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/update-friends.mdx b/content/zh/docs/chat/sdk/android/user/friends/update-friends.mdx new file mode 100644 index 0000000000..2e60882934 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/update-friends.mdx @@ -0,0 +1,37 @@ +--- +title: '更新好友资料' +description: '使用 updateFriendsReq() 更新好友备注、置顶状态或扩展字段。' +sourcePath: '/sdk/android/user/friends/update-friends' +--- + +```java +UpdateFriendsReq request = new UpdateFriendsReq(); +request.setFriendUserIDs(new String[] { friendUserID }); +request.setRemark(remark.trim()); + +OpenIMClient.getInstance().friendshipManager.updateFriendsReq( + new OnBase() { + @Override + public void onSuccess(String data) { + markFriendUpdateSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordFriendUpdateFailure(code, error); + } + }, + request +); +``` + +`UpdateFriendsReq` 可设置 `friendUserIDs`、`remark`、`isPinned` 和 `ex`。一次调用会把同一字段值应用到全部目标好友;不同好友需要不同值时应分别调用。`ex` 是完整字符串。 + +| 字段 | 说明 | +| --------------- | ---------------------------------- | +| `friendUserIDs` | 待更新的好友 ID 数组。 | +| `remark` | 当前账号设置的好友备注。 | +| `isPinned` | 是否置顶好友。 | +| `ex` | 好友关系扩展字符串,按完整值覆盖。 | + +成功 callback 表示更新请求完成。好友资料增量通过 `onFriendInfoChanged` 合并,事件处理见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。 diff --git a/content/zh/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx b/content/zh/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx new file mode 100644 index 0000000000..906c4b4045 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx @@ -0,0 +1,25 @@ +--- +title: '查询已订阅用户状态' +description: '使用 getSubscribeOnlineUsersStatus() 获取已订阅用户的在线状态快照。' +sourcePath: '/sdk/android/user/online-status/get-subscribe-online-users-status' +--- + +```java +OpenIMClient.getInstance().userInfoManager.getSubscribeOnlineUsersStatus( + new OnBase>() { + @Override + public void onSuccess(List states) { + mergeOnlineStates(states); + } + + @Override + public void onError(int code, String error) { + recordStatusQueryFailure(code, error); + } + } +); +``` + +该方法不接收用户 ID,也不改变订阅集合。成功 callback 返回当前已订阅用户的 `List` 状态快照,适合在重连或重新进入页面时按 `userID` 校准状态。 + +查询本身不会触发 `onUserStatusChanged`。状态快照只应覆盖在线状态存储,不要覆盖用户昵称、头像等资料字段;需要资料时分别调用用户资料 API。 diff --git a/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx b/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx new file mode 100644 index 0000000000..5e8e963d45 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx @@ -0,0 +1,45 @@ +--- +title: '订阅用户在线状态' +description: '使用 subscribeUsersOnlineStatus() 订阅指定用户的在线状态。' +sourcePath: '/sdk/android/user/online-status/subscribe-users-online-status' +--- + +```java +List userIDs = Arrays.asList("user_a", "user_b"); + +OpenIMClient.getInstance().userInfoManager.subscribeUsersOnlineStatus( + new OnBase>() { + @Override + public void onSuccess(List states) { + mergeOnlineStates(states); + } + + @Override + public void onError(int code, String error) { + recordStatusSubscriptionFailure(code, error); + } + }, + userIDs +); +``` + +调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 `List` 快照,每项包含 `userID`、`status` 和 `platformIDs`。重复订阅同一个用户时,应由应用层去重并保留一份状态。 + +## 状态字段 + +| 字段 | 说明 | +| ------------- | ------------------------------------------ | +| `userID` | 目标用户 ID。 | +| `status` | 在线状态值,具体枚举含义以服务端契约为准。 | +| `platformIDs` | 当前在线的平台 ID 列表。 | + +`onUserStatusChanged` 由本页归属,应组合进应用唯一的 `OnUserListener`,并按 `userID` 合并: + +```java +@Override +public void onUserStatusChanged(UsersOnlineStatus status) { + onlineStatusStore.put(status.getUserID(), status); +} +``` + +订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合;Android API 未提供可验证的取消订阅入口,因此不在文档中记录取消订阅调用。 diff --git a/content/zh/docs/chat/sdk/android/user/overview-user.mdx b/content/zh/docs/chat/sdk/android/user/overview-user.mdx new file mode 100644 index 0000000000..cb4d3311f3 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/overview-user.mdx @@ -0,0 +1,55 @@ +--- +title: '用户概览' +description: '了解 Android SDK 中的用户资料、好友关系、好友申请、黑名单和在线状态 API。' +sourcePath: '/sdk/android/user/overview-user' +--- + +OpenIM Android SDK 使用 `userID` 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。 + +群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。 + +## 用户类型 + +Android SDK 会根据使用场景返回不同的用户对象: + +| 类型 | 适用场景 | 主要 API | +| ----------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------- | +| `LocalUser` | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | `getSelfLocalUserInfo()`、`setSelfInfo()` | +| `PublicUserInfo` | 查询应用用户、查找好友候选人和展示陌生人资料卡 | `getUsersInfo()` | +| `UserInfo` | Android wrapper 返回的组合对象,可承载公开资料、好友资料或黑名单资料 | `getFriendListPage()`、`getFriendsInfo()`、`getBlacklist()` | +| `FriendInfo` | 当前用户的好友列表、好友备注和关系扩展字段 | `searchFriends()`、`getFriendListPage()` | +| `FriendApplicationInfo` | 好友申请双方、处理状态和附言 | 好友申请查询与 listener | +| `BlacklistInfo` | 当前用户拉黑的用户及黑名单关系字段 | `getBlacklist()`、`addBlacklist()`、`removeBlacklist()` | +| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()` | + +同一个 `userID` 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 `UserInfo.getFriendInfo()`;只需要账号公开资料时使用 `PublicUserInfo`;黑名单页面使用 `UserInfo.getBlackInfo()`。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。 + +所有列表和事件都应使用 `userID` 作为稳定标识。好友申请同时包含申请方和接收方,应使用 `fromUserID:toUserID` 标识一条申请。 + +## 功能入口 + +下表列出了用户相关的常见需求和对应页面: + +| 需求 | 推荐页面 | +| -------------------------------------------------------- | -------------------------------------------------------------------------------------------- | +| 按 `userID` 查询公开资料,用于查找好友候选人或展示资料卡 | [获取指定用户资料](/sdk/android/user/user-profile/get-users-info) | +| 分页、搜索或按 ID 查询好友关系 | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) | +| 发送、查询、接受或拒绝好友申请 | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) | +| 修改好友资料 | [更新好友资料](/sdk/android/user/friends/update-friends) | +| 删除好友关系 | [删除好友](/sdk/android/user/friends/delete-friend) | +| 查看和维护当前用户黑名单 | [获取黑名单列表](/sdk/android/user/blacklist/get-blacklist) | +| 读取或更新当前用户的昵称、头像和扩展资料 | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) | +| 设置账号级消息接收和通知策略 | [设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception) | +| 订阅和读取在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) | + +## 状态更新 + +用户相关事件由对应能力页负责监听和合并: + +- 当前用户资料变化:见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。 +- 好友申请变化:见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。 +- 好友关系和好友资料变化:见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。 +- 黑名单变化:见[拉黑用户](/sdk/android/user/blacklist/add-blacklist)。 +- 在线状态变化:见[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。 + +Android SDK 的 `UserInfoManager` 和 `FriendshipManager` 各保存一个 listener,`setOnUserListener()` 和 `setOnFriendshipListener()` 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。 diff --git a/content/zh/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx b/content/zh/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx new file mode 100644 index 0000000000..ba1e47677b --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx @@ -0,0 +1,39 @@ +--- +title: '获取当前用户资料' +description: '使用 getSelfLocalUserInfo() 获取当前登录用户的本地资料。' +sourcePath: '/sdk/android/user/user-profile/get-self-local-user-info' +--- + +```java +OpenIMClient.getInstance().userInfoManager.getSelfLocalUserInfo( + new OnBase() { + @Override + public void onSuccess(LocalUser user) { + currentUserStore.set(user); + } + + @Override + public void onError(int code, String error) { + recordSelfProfileFailure(code, error); + } + } +); +``` + +完成初始化并登录后调用该方法获取当前账号的本地资料。成功 callback 返回 `LocalUser`,包含 `userID`、`nickname`、`faceURL`、`ex`、`attachedInfo`、`globalRecvMsgOpt` 和 `addFriendPermission` 等字段。 + +## 返回结果 + +| 字段 | 说明 | +| --------------------- | -------------------------------------------------------------- | +| `userID` | 当前登录用户 ID。 | +| `nickname` | 当前账号昵称。 | +| `faceURL` | 当前账号头像地址。 | +| `ex` | 当前账号扩展字符串。 | +| `attachedInfo` | SDK 附加信息,只按业务约定解析。 | +| `globalRecvMsgOpt` | 全局消息接收方式:`0` 正常接收,`1` 不接收,`2` 接收但不提示。 | +| `addFriendPermission` | 添加好友权限值,具体含义由服务端契约定义。 | + +查询不会触发资料变更 callback。退出或切换账号时应清理旧账号快照,避免把上一个账号的资料显示在当前页面。 + +`getSelfUserInfo()` 已废弃,不作为推荐用法。 diff --git a/content/zh/docs/chat/sdk/android/user/user-profile/get-users-info.mdx b/content/zh/docs/chat/sdk/android/user/user-profile/get-users-info.mdx new file mode 100644 index 0000000000..ecda2545f8 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/user-profile/get-users-info.mdx @@ -0,0 +1,48 @@ +--- +title: '获取指定用户资料' +description: '使用 getUsersInfo() 按 userID 批量查询用户公开资料。' +sourcePath: '/sdk/android/user/user-profile/get-users-info' +--- + +`getUsersInfo()` 根据 `userID` 列表返回用户的公开资料,适合展示好友候选人或陌生人资料卡。该方法只读取公开资料,不返回当前账号为好友设置的备注等关系字段。 + +```java +List userIDs = Arrays.asList("user_a", "user_b"); + +OpenIMClient.getInstance().userInfoManager.getUsersInfo( + new OnBase>() { + @Override + public void onSuccess(List users) { + for (PublicUserInfo user : users) { + publicUserStore.put(user.getUserID(), user); + } + } + + @Override + public void onError(int code, String error) { + recordUserQueryFailure(code, error); + } + }, + userIDs +); +``` + +调用前应去除空值和重复 ID,并控制单次请求的数量。成功 callback 返回 `List`,主要字段包括 `userID`、`nickname`、`faceURL`、`ex` 和 `createTime`。查询不会触发 `OnUserListener`,需要刷新资料时应重新调用并按 `userID` 合并结果。 + +## 返回结果 + +| 字段 | 说明 | +| ------------ | ---------------------------------------- | +| `userID` | OpenIM 用户 ID,也是本地缓存的稳定 key。 | +| `nickname` | 账号级公开昵称。 | +| `faceURL` | 账号级公开头像地址。 | +| `ex` | 账号级公开扩展字符串,格式由业务约定。 | +| `createTime` | 用户资料创建时间。 | + +`PublicUserInfo` 中的资料不能用于覆盖好友备注、置顶状态或群内昵称。展示好友时应使用 `FriendInfo`,展示群成员时应使用群成员模型。 + +按昵称、手机号或邮箱搜索用户属于业务服务能力,应由可信后端完成搜索和权限校验,再把候选 `userID` 交给客户端查询公开资料。 + +## 资料刷新 + +查询成功后,以返回结果更新公开资料快照。打开资料卡、用户主动刷新、断线重连或业务后端通知资料变化时,可以重新调用该方法校准数据。`OnUserListener.onSelfInfoUpdated` 只表示当前登录用户资料变化,不能作为其他用户资料变化事件。 diff --git a/content/zh/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx b/content/zh/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx new file mode 100644 index 0000000000..6b8608767f --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx @@ -0,0 +1,37 @@ +--- +title: '设置全局消息接收方式' +description: '通过 setSelfInfo() 设置当前账号的全局消息接收与通知策略。' +sourcePath: '/sdk/android/user/user-profile/set-global-message-reception' +--- + +使用独立的 `UserInfoReq` 写入 `globalRecvMsgOpt`,避免在更新昵称或头像时意外覆盖账号级消息策略。 + +```java +UserInfoReq request = new UserInfoReq(); +request.setGlobalRecvMsgOpt(2); + +OpenIMClient.getInstance().userInfoManager.setSelfInfo( + new OnBase() { + @Override + public void onSuccess(String data) { + markGlobalReceiveOptionSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordGlobalReceiveOptionFailure(code, error); + } + }, + request +); +``` + +| 数值 | 含义 | +| ---- | ------------------------ | +| `0` | 正常接收消息并允许通知。 | +| `1` | 屏蔽消息。 | +| `2` | 接收消息但不提示。 | + +如果产品只提供“全局免打扰”开关,通常在 `0` 和 `2` 之间切换;`1` 会停止接收消息,应单独展示。单个会话的接收方式由会话 API 管理,不受本设置替代。 + +成功 callback 表示请求完成。最终账号快照通过 `onSelfInfoUpdated` 或 `getSelfLocalUserInfo()` 校准,事件处理见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。 diff --git a/content/zh/docs/chat/sdk/android/user/user-profile/set-self-info.mdx b/content/zh/docs/chat/sdk/android/user/user-profile/set-self-info.mdx new file mode 100644 index 0000000000..0378abf4a0 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/user-profile/set-self-info.mdx @@ -0,0 +1,55 @@ +--- +title: '更新当前用户资料' +description: '使用 setSelfInfo() 更新当前用户的昵称、头像或扩展资料。' +sourcePath: '/sdk/android/user/user-profile/set-self-info' +--- + +使用 `UserInfoReq` 只设置实际需要修改的字段。SDK 序列化请求时会忽略 `null` 字段。 + +```java +UserInfoReq request = new UserInfoReq(); +request.setNickname(displayName.trim()); +request.setFaceURL(avatarURL); +request.setEx(mergedExtra); + +OpenIMClient.getInstance().userInfoManager.setSelfInfo( + new OnBase() { + @Override + public void onSuccess(String data) { + markProfileUpdateSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordProfileUpdateFailure(code, error); + } + }, + request +); +``` + +`UserInfoReq` 支持 `nickname`、`faceURL`、`ex` 和 `addFriendPermission` 等字段。`ex` 是完整字符串,更新前应读取、解析并合并业务自己的命名空间;不要把部分 JSON 直接覆盖到服务端。 + +成功 callback 表示更新请求完成;当前账号资料的最终增量通过 `onSelfInfoUpdated(UserInfo info)` 到达,或重新调用 `getSelfLocalUserInfo()` 校准。 + +## 更新字段 + +| 字段 | 说明 | +| --------------------- | ------------------ | +| `nickname` | 要更新的昵称。 | +| `faceURL` | 要更新的头像地址。 | +| `ex` | 完整扩展字符串。 | +| `addFriendPermission` | 添加好友权限值。 | + +一次请求只写入需要变更的字段。全局消息接收策略虽然也由 `setSelfInfo()` 写入,但应使用独立入口,见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。 + +`onSelfInfoUpdated` 由本页归属,应组合进应用唯一的 `OnUserListener`: + +```java +@Override +public void onSelfInfoUpdated(UserInfo info) { + currentUserStore.merge(info.getUserID(), info); +} +``` + +账号级消息接收策略也通过 `UserInfoReq` 更新,但应使用独立入口,见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。 diff --git a/data/structure/android-content-audit.json b/data/structure/android-content-audit.json new file mode 100644 index 0000000000..7705f7517e --- /dev/null +++ b/data/structure/android-content-audit.json @@ -0,0 +1,4520 @@ +{ + "schemaVersion": 1, + "sources": { + "openimDocs": { + "repository": "https://github.com/openimsdk/docs", + "commit": "efd0f251b288167e1ca617504b10dd73986429f0" + }, + "androidSdk": { + "repository": "https://github.com/openimsdk/open-im-sdk-android-enterprise", + "tag": "v3.8.4.0", + "commit": "f82b142c7d3b4b66ce20586adabc69de9cd61673" + } + }, + "pages": [ + { + "currentPath": "/sdk/android/group/overview-group", + "targetPath": "/sdk/android/group/overview-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setOnGroupListener"], + "sdkEvents": [ + "onGroupApplicationAccepted", + "onGroupApplicationAdded", + "onGroupApplicationDeleted", + "onGroupApplicationRejected", + "onGroupDismissed", + "onGroupInfoChanged", + "onGroupMemberAdded", + "onGroupMemberDeleted", + "onGroupMemberInfoChanged", + "onJoinedGroupAdded", + "onJoinedGroupDeleted" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnGroupListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/create-group", + "targetPath": "/sdk/android/group/create-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["createGroup"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.createGroup"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/update-group-profile", + "targetPath": "/sdk/android/group/update-group-profile", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.setGroupInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/set-group-announcement", + "targetPath": "/sdk/android/group/set-group-announcement", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.setGroupInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/set-group-extension", + "targetPath": "/sdk/android/group/set-group-extension", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.setGroupInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/set-group-join-verification", + "targetPath": "/sdk/android/group/set-group-join-verification", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupInfo.setNeedVerification"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/set-group-member-profile-access", + "targetPath": "/sdk/android/group/set-group-member-profile-access", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupInfo.setLookMemberInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/set-group-member-friend-permission", + "targetPath": "/sdk/android/group/set-group-member-friend-permission", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupInfo.setApplyMemberFriend"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/change-group-mute", + "targetPath": "/sdk/android/group/change-group-mute", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["changeGroupMute"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.changeGroupMute"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/join-group", + "targetPath": "/sdk/android/group/join-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["joinGroup"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.joinGroup"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/quit-group", + "targetPath": "/sdk/android/group/quit-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["quitGroup"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.quitGroup"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/dismiss-group", + "targetPath": "/sdk/android/group/dismiss-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["dismissGroup"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.dismissGroup"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "targetPath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["getGroupsInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.getGroupsInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "targetPath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["getJoinedGroupListPage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.getJoinedGroupListPage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-groups/is-join-group", + "targetPath": "/sdk/android/group/retrieving-groups/is-join-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["isJoinGroup"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.isJoinGroup"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-groups/search-groups", + "targetPath": "/sdk/android/group/retrieving-groups/search-groups", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["searchGroups"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.searchGroups"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/group-applications/overview-group-applications", + "targetPath": "/sdk/android/group/group-applications/overview-group-applications", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnGroupListener.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "概览页仅说明申请状态和页面职责。" + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "targetPath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["getRecvGroupApplicationList"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.getRecvGroupApplicationList"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "targetPath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["getSendGroupApplicationList"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.getSendGroupApplicationList"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/group-applications/accept-group-application", + "targetPath": "/sdk/android/group/group-applications/accept-group-application", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["acceptGroupApplication"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.acceptGroupApplication"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/group-applications/refuse-group-application", + "targetPath": "/sdk/android/group/group-applications/refuse-group-application", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["refuseGroupApplication"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.refuseGroupApplication"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "targetPath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "概览页仅说明成员查询的标识与返回模型。" + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "targetPath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["getGroupMemberList"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.getGroupMemberList"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "targetPath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["getGroupMembersInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.getGroupMembersInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "targetPath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["getUsersInGroup"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.getUsersInGroup"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "targetPath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["getGroupMemberOwnerAndAdmin"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.getGroupMemberOwnerAndAdmin"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/search-group-members", + "targetPath": "/sdk/android/group/retrieving-group-members/search-group-members", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["searchGroupMembers"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.searchGroupMembers"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "targetPath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["inviteUserToGroup"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.inviteUserToGroup"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/kick-group-member", + "targetPath": "/sdk/android/group/managing-group-members/kick-group-member", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["kickGroupMember"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.kickGroupMember"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "targetPath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupMemberInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.setGroupMemberInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "targetPath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupMemberInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.setGroupMemberInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "targetPath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupMemberInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.setGroupMemberInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "targetPath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["setGroupMemberInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.setGroupMemberInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "targetPath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["transferGroupOwner"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.transferGroupOwner"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "targetPath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": ["changeGroupMemberMute"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["GroupManager.changeGroupMemberMute"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/overview", + "targetPath": "/sdk/android/overview", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/tree/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java" + ], + "sdkMethods": ["OpenIMClient.getInstance"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java" + ], + "reason": "Manually translated from the reviewed Chinese page and verified against the pinned Android SDK source." + } + } + }, + "redirectTo": null, + "notes": [ + "2026-08-06:基于 Android SDK v3.8.4.0 固定提交逐页核对客户端入口、manager 划分、状态合并标识和版本边界。" + ] + }, + { + "currentPath": "/sdk/android/getting-started/before-you-start", + "targetPath": "/sdk/android/getting-started/before-you-start", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/build.gradle", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/build.gradle", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/build.gradle", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" + ], + "reason": "Manually translated from the reviewed Chinese page and verified against the pinned Android SDK source." + } + } + }, + "redirectTo": null, + "notes": [ + "2026-08-06:逐页核对服务地址、可信 Token 来源、Android 构建版本、数据目录和 ABI 准备项。" + ] + }, + { + "currentPath": "/sdk/android/getting-started/environment-specific-implementation", + "targetPath": "/sdk/android/getting-started/environment-specific-implementation", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/README.md", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/build.gradle", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" + ], + "sdkMethods": ["initSDK", "networkChanged", "logout", "unInit"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/README.md", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/README.md", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" + ], + "reason": "Manually translated from the reviewed Chinese page and verified against the pinned Android SDK source." + } + } + }, + "redirectTo": null, + "notes": [ + "2026-08-06:逐页核对源码 module、Core AAR、Manifest、混淆、InitConfig 和应用生命周期边界;未沿用旧文档中不可验证的 latest@aar 坐标。" + ] + }, + { + "currentPath": "/sdk/android/getting-started/authenticate-and-manage-session", + "targetPath": "/sdk/android/getting-started/authenticate-and-manage-session", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/enums/LoginStatus.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConnListener.java" + ], + "sdkMethods": ["initSDK", "login", "getLoginStatus", "getLoginUserID", "logout", "unInit"], + "sdkEvents": [ + "onConnecting", + "onConnectSuccess", + "onConnectFailed", + "onKickedOffline", + "onUserTokenExpired", + "onUserTokenInvalid" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/enums/LoginStatus.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConnListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/enums/LoginStatus.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConnListener.java" + ], + "reason": "Manually translated from the reviewed Chinese page and verified against the pinned Android SDK source." + } + } + }, + "redirectTo": null, + "notes": [ + "2026-08-06:逐页核对初始化、登录状态、连接 callback、Token 失效、强制下线、退出与释放边界。" + ] + }, + { + "currentPath": "/sdk/android/getting-started/send-first-message", + "targetPath": "/sdk/android/getting-started/send-first-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnMsgSendCallback.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/OfflinePushInfo.java" + ], + "sdkMethods": ["setAdvancedMsgListener", "login", "createTextMessage", "sendMessage"], + "sdkEvents": ["onRecvNewMessage"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnMsgSendCallback.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnMsgSendCallback.java" + ], + "reason": "Manually translated from the reviewed Chinese page and verified against the pinned Android SDK source." + } + } + }, + "redirectTo": null, + "notes": [ + "2026-08-06:逐页核对文本消息创建、单聊与群聊目标、离线推送信息、发送 callback、接收 listener 和 clientMsgID 合并规则。" + ] + }, + { + "currentPath": "/sdk/android/user/overview-user", + "targetPath": "/sdk/android/user/overview-user", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "概览页不包含代码示例。" + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "The overview does not contain code examples." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/user-profile/get-users-info", + "targetPath": "/sdk/android/user/user-profile/get-users-info", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "sdkMethods": ["getUsersInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/user-profile/get-self-local-user-info", + "targetPath": "/sdk/android/user/user-profile/get-self-local-user-info", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "sdkMethods": ["getSelfLocalUserInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/user-profile/set-self-info", + "targetPath": "/sdk/android/user/user-profile/set-self-info", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" + ], + "sdkMethods": ["setSelfInfo"], + "sdkEvents": ["onSelfInfoUpdated"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/user-profile/set-global-message-reception", + "targetPath": "/sdk/android/user/user-profile/set-global-message-reception", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "sdkMethods": ["setSelfInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friends/get-friend-list-page", + "targetPath": "/sdk/android/user/friends/get-friend-list-page", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "sdkMethods": ["getFriendListPage"], + "sdkEvents": ["onFriendAdded", "onFriendInfoChanged", "onFriendDeleted"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friends/search-friends", + "targetPath": "/sdk/android/user/friends/search-friends", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["searchFriends"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friends/get-friends-info", + "targetPath": "/sdk/android/user/friends/get-friends-info", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["getFriendsInfo"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friends/check-friend", + "targetPath": "/sdk/android/user/friends/check-friend", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["checkFriend"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friends/update-friends", + "targetPath": "/sdk/android/user/friends/update-friends", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["updateFriendsReq"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friends/delete-friend", + "targetPath": "/sdk/android/user/friends/delete-friend", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["deleteFriend"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friend-applications/add-friend", + "targetPath": "/sdk/android/user/friend-applications/add-friend", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["addFriend"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "targetPath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "sdkMethods": ["getRecvFriendApplicationList"], + "sdkEvents": [ + "onFriendApplicationAdded", + "onFriendApplicationAccepted", + "onFriendApplicationRejected", + "onFriendApplicationDeleted" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "targetPath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["getSendFriendApplicationList"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friend-applications/accept-friend-application", + "targetPath": "/sdk/android/user/friend-applications/accept-friend-application", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["acceptFriendApplication"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friend-applications/refuse-friend-application", + "targetPath": "/sdk/android/user/friend-applications/refuse-friend-application", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["refuseFriendApplication"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/blacklist/get-blacklist", + "targetPath": "/sdk/android/user/blacklist/get-blacklist", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": ["getBlacklist"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/blacklist/add-blacklist", + "targetPath": "/sdk/android/user/blacklist/add-blacklist", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "sdkMethods": ["addBlacklist"], + "sdkEvents": ["onBlacklistAdded"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/blacklist/remove-blacklist", + "targetPath": "/sdk/android/user/blacklist/remove-blacklist", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "sdkMethods": ["removeBlacklist"], + "sdkEvents": ["onBlacklistDeleted"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/online-status/subscribe-users-online-status", + "targetPath": "/sdk/android/user/online-status/subscribe-users-online-status", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" + ], + "sdkMethods": ["subscribeUsersOnlineStatus"], + "sdkEvents": ["onUserStatusChanged"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "targetPath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "sdkMethods": ["getSubscribeOnlineUsersStatus"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/overview-conversation", + "targetPath": "/sdk/android/conversation/overview-conversation", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/ConversationInfo.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "概览页不包含代码示例。" + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "The overview does not contain code examples." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "targetPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["getOneConversation"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "targetPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["getConversationIDBySessionType"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "targetPath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["getMultipleConversation"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "targetPath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java" + ], + "sdkMethods": ["getConversationListSplit", "setOnConversationListener"], + "sdkEvents": ["onNewConversation", "onConversationChanged"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "targetPath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["pinConversation"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "targetPath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["setConversationEx"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "targetPath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["setConversationDraft"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "targetPath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["setConversationRecvMessageOpt"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "targetPath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["resetConversationGroupAtType"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "targetPath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" + ], + "sdkMethods": ["markConversationMessageAsRead", "setAdvancedMsgListener"], + "sdkEvents": ["onRecvC2CReadReceipt"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "targetPath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java" + ], + "sdkMethods": ["getTotalUnreadMsgCount"], + "sdkEvents": ["onTotalUnreadMessageCountChanged"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "targetPath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["setOneConversationPrivateChat"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "targetPath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["setConversationBurnDuration"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "targetPath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["setConversation"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "targetPath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["hideConversation"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "targetPath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": ["deleteConversationAndDeleteAllMsg"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "targetPath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["clearConversationAndDeleteAllMsg"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/overview-message", + "targetPath": "/sdk/android/message/overview-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["setAdvancedMsgListener"], + "sdkEvents": [ + "onRecvGroupMessageReadReceipt", + "onRecvMessageRevokedV2", + "onChangedPinnedMsg", + "onMsgDeleted", + "onMessageModified" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-text-message", + "targetPath": "/sdk/android/message/creating-messages/create-text-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createTextMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createTextMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-text-at-message", + "targetPath": "/sdk/android/message/creating-messages/create-text-at-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createTextAtMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createTextAtMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-custom-message", + "targetPath": "/sdk/android/message/creating-messages/create-custom-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createCustomMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createCustomMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createImageMessage", "createImageMessageFromFullPath"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createImageMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createImageMessageByURL"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createImageMessageByURL"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createSoundMessage", "createSoundMessageFromFullPath"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createSoundMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createSoundMessageByURL"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createSoundMessageByURL"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createVideoMessage", "createVideoMessageFromFullPath"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createVideoMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createVideoMessageByURL"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createVideoMessageByURL"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createFileMessage", "createFileMessageFromFullPath"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createFileMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createFileMessageByURL"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createFileMessageByURL"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-card-message", + "targetPath": "/sdk/android/message/creating-messages/create-card-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createCardMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createCardMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-location-message", + "targetPath": "/sdk/android/message/creating-messages/create-location-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createLocationMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createLocationMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-face-message", + "targetPath": "/sdk/android/message/creating-messages/create-face-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createFaceMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createFaceMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-quote-message", + "targetPath": "/sdk/android/message/creating-messages/create-quote-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createQuoteMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createQuoteMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-forward-message", + "targetPath": "/sdk/android/message/creating-messages/create-forward-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createForwardMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createForwardMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-merger-message", + "targetPath": "/sdk/android/message/creating-messages/create-merger-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["createMergerMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.createMergerMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/sending-messages/send-message", + "targetPath": "/sdk/android/message/sending-messages/send-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["sendMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.sendMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/sending-messages/send-message-not-oss", + "targetPath": "/sdk/android/message/sending-messages/send-message-not-oss", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["sendMessageNotOss"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.sendMessageNotOss"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "targetPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnMsgSendCallback.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["OnMsgSendCallback"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/receiving-messages/receive-messages", + "targetPath": "/sdk/android/message/receiving-messages/receive-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" + ], + "sdkMethods": [], + "sdkEvents": ["onRecvOfflineNewMessage", "onRecvOnlineOnlyMessage"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["OnAdvanceMsgListener"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "targetPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnCustomBusinessListener.java" + ], + "sdkMethods": ["setCustomBusinessListener"], + "sdkEvents": ["onRecvCustomBusinessMessage"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setCustomBusinessListener", + "OnCustomBusinessListener.onRecvCustomBusinessMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/retrieving-messages/load-older-messages", + "targetPath": "/sdk/android/message/retrieving-messages/load-older-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["getAdvancedHistoryMessageList"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.getAdvancedHistoryMessageList"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "targetPath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["getAdvancedHistoryMessageListReverse"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.getAdvancedHistoryMessageListReverse"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "targetPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["findMessageList"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.findMessageList"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/searching-messages/search-messages", + "targetPath": "/sdk/android/message/searching-messages/search-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["searchLocalMessages"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.searchLocalMessages"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/composing-messages/update-typing-status", + "targetPath": "/sdk/android/message/composing-messages/update-typing-status", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InputStatesChangedData.java" + ], + "sdkMethods": ["typingStatusUpdate"], + "sdkEvents": ["onConversationUserInputStatusChanged"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.typingStatusUpdate", + "OnConversationListener.onConversationUserInputStatusChanged" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/delete-local-message", + "targetPath": "/sdk/android/message/managing-messages/delete-local-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["deleteMessageFromLocalStorage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.deleteMessageFromLocalStorage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/delete-saved-messages", + "targetPath": "/sdk/android/message/managing-messages/delete-saved-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["deleteMessageFromLocalAndSvr"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.deleteMessageFromLocalAndSvr"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/revoke-a-message", + "targetPath": "/sdk/android/message/managing-messages/revoke-a-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["revokeMessageV2"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.revokeMessageV2"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/modify-a-message", + "targetPath": "/sdk/android/message/managing-messages/modify-a-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["modifyMessage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.modifyMessage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/get-pinned-messages", + "targetPath": "/sdk/android/message/managing-messages/get-pinned-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["getConversationPinnedMsgs"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.getConversationPinnedMsgs"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/set-message-pinned", + "targetPath": "/sdk/android/message/managing-messages/set-message-pinned", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["setConversationPinnedMsg"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.setConversationPinnedMsg"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/insert-local-single-message", + "targetPath": "/sdk/android/message/managing-messages/insert-local-single-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["insertSingleMessageToLocalStorage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.insertSingleMessageToLocalStorage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/insert-local-group-message", + "targetPath": "/sdk/android/message/managing-messages/insert-local-group-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["insertGroupMessageToLocalStorage"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.insertGroupMessageToLocalStorage"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "targetPath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["deleteAllMsgFromLocal"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.deleteAllMsgFromLocal"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/clear-all-messages", + "targetPath": "/sdk/android/message/managing-messages/clear-all-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["deleteAllMsgFromLocalAndSvr"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.deleteAllMsgFromLocalAndSvr"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/set-message-local-ex", + "targetPath": "/sdk/android/message/managing-messages/set-message-local-ex", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": ["setMessageLocalEx"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["MessageManager.setMessageLocalEx"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/file-uploads/track-file-upload-progress", + "targetPath": "/sdk/android/file-uploads/track-file-upload-progress", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnPutFileListener.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["OpenIMClient.uploadFile", "OnPutFileListener"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/file-uploads/upload-file", + "targetPath": "/sdk/android/file-uploads/upload-file", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnPutFileListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/PutArgs.java" + ], + "sdkMethods": ["uploadFile"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["OpenIMClient.uploadFile", "OnPutFileListener", "PutArgs"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/overview-calling", + "targetPath": "/sdk/android/calling/overview-calling", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingInfo.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingCertificate.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "Conceptual overview without a code example." + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/start-single-call", + "targetPath": "/sdk/android/calling/managing-calls/start-single-call", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingInvitationInfo.java" + ], + "sdkMethods": ["signalingInvite"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.signalingInvite", "SignalingInvitationInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/start-group-call", + "targetPath": "/sdk/android/calling/managing-calls/start-group-call", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingInvitationInfo.java" + ], + "sdkMethods": ["signalingInviteInGroup"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.signalingInviteInGroup", "SignalingInvitationInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/accept-call", + "targetPath": "/sdk/android/calling/managing-calls/accept-call", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" + ], + "sdkMethods": ["signalingAccept"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.signalingAccept"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/reject-call", + "targetPath": "/sdk/android/calling/managing-calls/reject-call", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" + ], + "sdkMethods": ["signalingReject"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.signalingReject"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/cancel-call", + "targetPath": "/sdk/android/calling/managing-calls/cancel-call", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" + ], + "sdkMethods": ["signalingCancel"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.signalingCancel"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/hang-up-call", + "targetPath": "/sdk/android/calling/managing-calls/hang-up-call", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" + ], + "sdkMethods": ["signalingHungUp"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.signalingHungUp"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/handle-call-events", + "targetPath": "/sdk/android/calling/managing-calls/handle-call-events", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnSignalingListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/_SignalingListener.java" + ], + "sdkMethods": ["setSignalingListener"], + "sdkEvents": [ + "onHangup", + "onInvitationCancelled", + "onInvitationTimeout", + "onInviteeAccepted", + "onInviteeAcceptedByOtherDevice", + "onInviteeRejected", + "onInviteeRejectedByOtherDevice", + "onReceiveNewInvitation", + "onRoomParticipantConnected", + "onRoomParticipantDisconnected", + "onStreamChange" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.setSignalingListener", "_SignalingListener"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "targetPath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" + ], + "sdkMethods": ["getSignalingInvitationInfoStartApp"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.getSignalingInvitationInfoStartApp"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "targetPath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/RoomCallingInfo.java" + ], + "sdkMethods": ["signalingGetRoomByGroupID"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.signalingGetRoomByGroupID", "RoomCallingInfo"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "targetPath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingCertificate.java" + ], + "sdkMethods": ["signalingGetTokenByRoomID"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.signalingGetTokenByRoomID", "SignalingCertificate"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "targetPath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnSignalingListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/CustomSignalingInfo.java" + ], + "sdkMethods": ["signalingSendCustomSignal"], + "sdkEvents": ["onReceiveCustomSignal"], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["SignalingManager.signalingSendCustomSignal", "OnSignalingListener.onReceiveCustomSignal"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/events/overview-events", + "targetPath": "/sdk/android/events/overview-events", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/_ConversationListener.java" + ], + "sdkMethods": [], + "sdkEvents": [ + "onSyncServerStart", + "onSyncServerProgress", + "onSyncServerFinish", + "onSyncServerFailed" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["ConversationManager.setOnConversationListener", "OnConversationListener"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/logger", + "targetPath": "/sdk/android/logger", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/enums/LogLevel.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/utils/ParamsUtil.java" + ], + "sdkMethods": ["logs", "uploadLogs"], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": ["OpenIMClient.logs", "OpenIMClient.uploadLogs", "InitConfig", "LogLevel"], + "reason": null + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + } + }, + "redirectTo": null + } + ] +} diff --git a/data/structure/android-navigation-labels.json b/data/structure/android-navigation-labels.json new file mode 100644 index 0000000000..49d8fbb708 --- /dev/null +++ b/data/structure/android-navigation-labels.json @@ -0,0 +1,377 @@ +{ + "OpenIM SDK for Android": "OpenIM Android SDK 概览", + "Overview": "概览", + "overview": "概览", + "Getting started": "快速开始", + "getting-started": "快速开始", + "Before you start": "开始之前", + "before-you-start": "开始之前", + "Integrate for Android": "按 Android 环境接入", + "Environment-specific implementation": "按 Android 环境接入", + "environment-specific-implementation": "按 Android 环境接入", + "Authenticate and manage a session": "认证与管理登录会话", + "authenticate-and-manage-session": "认证与管理登录会话", + "Send your first message": "发送第一条消息", + "send-first-message": "发送第一条消息", + "Users": "用户", + "User": "用户", + "user": "用户", + "User overview": "用户概览", + "overview-user": "用户概览", + "User profiles": "用户资料", + "User profile": "用户资料", + "user-profile": "用户资料", + "user/user-profile": "用户资料", + "Get specified user profiles": "获取指定用户资料", + "get-users-info": "获取指定用户资料", + "Get the current user profile": "获取当前用户资料", + "get-self-local-user-info": "获取当前用户资料", + "Update the current user profile": "更新当前用户资料", + "set-self-info": "更新当前用户资料", + "Set global message reception": "设置全局消息接收方式", + "set-global-message-reception": "设置全局消息接收方式", + "Relationships": "关系链", + "relationships": "关系链", + "Friends": "好友", + "friends": "好友", + "user/friends": "好友", + "Get the friend list by page": "分页获取好友列表", + "Get the friend list": "分页获取好友列表", + "get-friend-list-page": "分页获取好友列表", + "Search friends": "搜索好友", + "search-friends": "搜索好友", + "Get specified friend profiles": "查询指定好友资料", + "Get friend profiles": "查询指定好友资料", + "get-friends-info": "查询指定好友资料", + "Check friendship": "检查好友关系", + "Check friendship status": "检查好友关系", + "check-friend": "检查好友关系", + "Update friend profiles": "更新好友资料", + "Update friend information": "更新好友资料", + "update-friends": "更新好友资料", + "Delete a friend": "删除好友", + "delete-friend": "删除好友", + "Friend requests": "好友申请", + "Friend applications": "好友申请", + "friend-applications": "好友申请", + "user/friend-applications": "好友申请", + "Send a friend request": "发送好友申请", + "Send a friend application": "发送好友申请", + "add-friend": "发送好友申请", + "Get received friend requests": "获取收到的好友申请", + "Get received friend applications": "获取收到的好友申请", + "get-recv-friend-application-list": "获取收到的好友申请", + "Get sent friend requests": "获取发出的好友申请", + "Get sent friend applications": "获取发出的好友申请", + "get-send-friend-application-list": "获取发出的好友申请", + "Accept a friend request": "接受好友申请", + "Accept a friend application": "接受好友申请", + "accept-friend-application": "接受好友申请", + "Reject a friend request": "拒绝好友申请", + "Reject a friend application": "拒绝好友申请", + "refuse-friend-application": "拒绝好友申请", + "Blacklist": "黑名单", + "blacklist": "黑名单", + "user/blacklist": "黑名单", + "Get the blacklist": "获取黑名单列表", + "get-blacklist": "获取黑名单列表", + "Block a user": "拉黑用户", + "add-blacklist": "拉黑用户", + "Unblock a user": "取消拉黑用户", + "remove-blacklist": "取消拉黑用户", + "Online status": "在线状态", + "online-status": "在线状态", + "user/online-status": "在线状态", + "Subscribe to user online status": "订阅用户在线状态", + "Subscribe to user status": "订阅用户在线状态", + "subscribe-users-online-status": "订阅用户在线状态", + "Get subscribed user online status": "查询已订阅用户状态", + "Refresh subscribed user status": "查询已订阅用户状态", + "get-subscribe-online-users-status": "查询已订阅用户状态", + "Conversation": "会话", + "conversation": "会话", + "Conversation overview": "会话概览", + "overview-conversation": "会话概览", + "Retrieving conversations": "查询会话", + "retrieving-conversations": "查询会话", + "Open a conversation": "查询指定会话", + "get-conversation-by-target": "查询指定会话", + "Resolve a conversation ID": "生成会话 ID", + "get-conversation-id": "生成会话 ID", + "Get conversations by ID": "按 ID 批量获取会话", + "get-conversations-by-id": "按 ID 批量获取会话", + "Get the conversation list": "获取会话列表", + "retrieve-conversation-list": "获取会话列表", + "Conversation organization": "会话整理", + "conversation-list-and-drafts": "会话整理", + "Pin or unpin a conversation": "置顶或取消置顶会话", + "pin-conversation": "置顶或取消置顶会话", + "Set conversation extra data": "设置会话扩展字段", + "set-conversation-extension": "设置会话扩展字段", + "Set a conversation draft": "设置会话草稿", + "set-conversation-draft": "设置会话草稿", + "Unread status and notifications": "未读与消息提醒", + "message-reception-and-reminders": "未读与消息提醒", + "Set conversation message reception": "设置会话消息接收方式", + "set-message-receive-option": "设置会话消息接收方式", + "Reset group mention status": "重置群聊 @ 状态", + "clear-group-mentions": "重置群聊 @ 状态", + "Mark a conversation as read": "标记会话已读", + "mark-conversation-read": "标记会话已读", + "Track the total unread count": "获取消息总未读数", + "get-total-unread-count": "获取消息总未读数", + "Message retention and privacy": "消息保留与隐私", + "message-retention-and-privacy": "消息保留与隐私", + "Enable or disable burn after reading": "开启或关闭阅后即焚", + "set-private-chat": "开启或关闭阅后即焚", + "Set the burn duration": "设置阅后即焚时长", + "set-burn-duration": "设置阅后即焚时长", + "Schedule server message deletion": "定期删除服务端消息", + "set-message-destruct": "定期删除服务端消息", + "Hiding and deleting conversations": "隐藏与删除会话", + "hiding-and-deleting-conversations": "隐藏与删除会话", + "Hide a conversation": "隐藏会话", + "hide-a-conversation": "隐藏会话", + "Delete a conversation and its messages": "删除会话及消息", + "delete-conversation-with-messages": "删除会话及消息", + "Clear messages in a conversation": "清空会话消息", + "clear-conversation-messages": "清空会话消息", + "Group": "群组", + "group": "群组", + "Group overview": "群组概览", + "overview-group": "群组概览", + "Group profile and settings": "群资料与设置", + "profile-and-settings": "群资料与设置", + "Create a group": "创建群组", + "create-group": "创建群组", + "Update group profile": "更新群资料", + "update-group-profile": "更新群资料", + "Publish a group announcement": "发布群公告", + "set-group-announcement": "发布群公告", + "Set group extra data": "设置群扩展字段", + "set-group-extension": "设置群扩展字段", + "Group permissions": "群权限", + "permissions": "群权限", + "Set group join verification": "设置入群验证方式", + "set-group-join-verification": "设置入群验证方式", + "Set member profile access": "设置成员资料查看权限", + "set-group-member-profile-access": "设置成员资料查看权限", + "Set member friend request permission": "设置成员好友申请权限", + "set-group-member-friend-permission": "设置成员好友申请权限", + "Change group mute status": "设置全员禁言", + "change-group-mute": "设置全员禁言", + "Joining and leaving groups": "加入与退出群组", + "joining-and-leaving": "加入与退出群组", + "Apply to join a group": "申请加入群组", + "join-group": "申请加入群组", + "Leave a group": "退出群组", + "quit-group": "退出群组", + "Dismiss a group": "解散群组", + "dismiss-group": "解散群组", + "Retrieving groups": "查询群组", + "retrieving-groups": "查询群组", + "Get group information": "获取群资料", + "get-specified-groups-info": "获取群资料", + "Get joined groups by page": "分页获取已加入群组", + "get-joined-group-list-page": "分页获取已加入群组", + "Check group membership": "检查是否加入群组", + "is-join-group": "检查是否加入群组", + "Search groups": "搜索群组", + "search-groups": "搜索群组", + "Group applications": "群申请", + "group-applications": "群申请", + "Group applications overview": "群申请概览", + "overview-group-applications": "群申请概览", + "Get received group applications": "获取收到的群申请", + "get-group-application-list-as-recipient": "获取收到的群申请", + "Get sent group applications": "获取发出的群申请", + "get-group-application-list-as-applicant": "获取发出的群申请", + "Accept a group application": "同意群申请", + "accept-group-application": "同意群申请", + "Reject a group application": "拒绝群申请", + "refuse-group-application": "拒绝群申请", + "Retrieving group members": "查询群成员", + "retrieving-group-members": "查询群成员", + "Group member queries overview": "群成员查询概览", + "overview-retrieving-group-members": "群成员查询概览", + "Get group members": "获取群成员列表", + "get-group-member-list": "获取群成员列表", + "Get group member profiles": "获取群成员资料", + "get-specified-group-members-info": "获取群成员资料", + "Check users in a group": "检查用户是否在群内", + "get-users-in-group": "检查用户是否在群内", + "Get group owners and admins": "获取群主和管理员", + "get-group-member-owner-and-admin": "获取群主和管理员", + "Search group members": "搜索群成员", + "search-group-members": "搜索群成员", + "Managing group members": "管理群成员", + "managing-group-members": "管理群成员", + "Invite users to a group": "邀请用户入群", + "invite-user-to-group": "邀请用户入群", + "Remove group members": "移除群成员", + "kick-group-member": "移除群成员", + "Update a group nickname": "更新群昵称", + "set-group-member-nickname": "更新群昵称", + "Manage group administrators": "管理群管理员", + "set-group-member-role-level": "管理群管理员", + "Update a group member avatar": "更新群成员头像", + "set-group-member-avatar": "更新群成员头像", + "Set group member extra data": "设置群成员扩展字段", + "set-group-member-extension": "设置群成员扩展字段", + "Transfer group ownership": "转让群主", + "transfer-group-owner": "转让群主", + "Mute or unmute a group member": "禁言或解除禁言群成员", + "change-group-member-mute": "禁言或解除禁言群成员", + "Message": "消息", + "message": "消息", + "Message overview": "消息概览", + "overview-message": "消息概览", + "Creating messages": "创建消息", + "creating-messages": "创建消息", + "Create a text message": "创建文本消息", + "create-text-message": "创建文本消息", + "Create a mention message": "创建 @ 消息", + "create-text-at-message": "创建 @ 消息", + "Create a custom message": "创建自定义消息", + "create-custom-message": "创建自定义消息", + "Create an image message from a file": "从文件创建图片消息", + "create-image-message-by-file": "从文件创建图片消息", + "Create an image message from a URL": "从 URL 创建图片消息", + "create-image-message-by-url": "从 URL 创建图片消息", + "Create an audio message from a file": "从文件创建音频消息", + "create-sound-message-by-file": "从文件创建音频消息", + "Create an audio message from a URL": "从 URL 创建音频消息", + "create-sound-message-by-url": "从 URL 创建音频消息", + "Create a video message from a file": "从文件创建视频消息", + "create-video-message-by-file": "从文件创建视频消息", + "Create a video message from a URL": "从 URL 创建视频消息", + "create-video-message-by-url": "从 URL 创建视频消息", + "Create a file message from a file": "从文件创建文件消息", + "create-file-message-by-file": "从文件创建文件消息", + "Create a file message from a URL": "从 URL 创建文件消息", + "create-file-message-by-url": "从 URL 创建文件消息", + "Create a contact card message": "创建名片消息", + "create-card-message": "创建名片消息", + "Create a location message": "创建位置消息", + "create-location-message": "创建位置消息", + "Create an emoji message": "创建表情消息", + "create-face-message": "创建表情消息", + "Create a reply message": "创建引用消息", + "create-quote-message": "创建引用消息", + "Create a forwarded message": "创建转发消息", + "create-forward-message": "创建转发消息", + "Create a merged message": "创建合并消息", + "create-merger-message": "创建合并消息", + "Sending messages": "发送消息", + "sending-messages": "发送消息", + "Send a message": "发送消息", + "send-message": "发送消息", + "Send a message without OSS": "发送非 OSS 消息", + "send-message-not-oss": "发送非 OSS 消息", + "Track message sending progress": "跟踪消息发送进度", + "set-msg-send-progress-listener": "跟踪消息发送进度", + "Receiving messages": "接收消息", + "receiving-messages": "接收消息", + "Receive messages": "接收消息", + "receive-messages": "接收消息", + "Receive custom business messages": "接收自定义业务消息", + "receive-custom-business-messages": "接收自定义业务消息", + "Retrieving messages": "查询消息", + "retrieving-messages": "查询消息", + "Load older messages": "加载更早消息", + "load-older-messages": "加载更早消息", + "Load newer messages": "加载更新消息", + "load-newer-messages": "加载更新消息", + "Find messages by ID": "按 ID 查询消息", + "find-messages-by-id": "按 ID 查询消息", + "Search messages": "搜索消息", + "search-messages": "搜索消息", + "Composing messages": "编辑消息", + "composing-messages": "编辑消息", + "Update typing status": "更新输入状态", + "update-typing-status": "更新输入状态", + "Managing messages": "管理消息", + "managing-messages": "管理消息", + "Delete a local message": "删除本地消息", + "delete-local-message": "删除本地消息", + "Delete saved messages": "删除已保存消息", + "delete-saved-messages": "删除已保存消息", + "Revoke a message": "撤回消息", + "revoke-a-message": "撤回消息", + "Modify a message": "修改消息", + "modify-a-message": "修改消息", + "View pinned messages": "查看置顶消息", + "get-pinned-messages": "查看置顶消息", + "Pin or unpin a message": "置顶或取消置顶消息", + "set-message-pinned": "置顶或取消置顶消息", + "Insert a local direct message": "插入本地单聊消息", + "insert-local-single-message": "插入本地单聊消息", + "Insert a local group message": "插入本地群聊消息", + "insert-local-group-message": "插入本地群聊消息", + "Clear all local messages": "清空全部本地消息", + "clear-all-local-messages": "清空全部本地消息", + "Clear all saved messages": "清空全部已保存消息", + "clear-all-messages": "清空全部已保存消息", + "Set local message extensions": "设置消息本地扩展字段", + "set-message-local-ex": "设置消息本地扩展字段", + "Create an @ message": "创建 @ 消息", + "Create a video message from files": "从文件创建视频消息", + "Create a video message from URLs": "从 URL 创建视频消息", + "Create a merged forward message": "创建合并转发消息", + "Send an uploaded media message": "发送已上传媒体消息", + "Load message history": "加载历史消息", + "Load message history in reverse": "逆序加载历史消息", + "Report typing status": "上报输入状态", + "Delete messages in a batch": "批量删除消息", + "Get pinned messages in a conversation": "获取会话置顶消息", + "Insert a local one-to-one message": "插入本地单聊消息", + "Insert a local group message": "插入本地群聊消息", + "Clear local and server messages": "清空本地和服务端消息", + "Set a local message extension": "设置消息本地扩展字段", + "File uploads": "文件上传", + "file-uploads": "文件上传", + "Track file upload progress": "跟踪文件上传进度", + "track-file-upload-progress": "跟踪文件上传进度", + "Upload a file": "上传文件", + "upload-file": "上传文件", + "Calling": "音视频通话", + "calling": "音视频通话", + "Audio and video calling overview": "音视频通话概览", + "Calling overview": "音视频通话概览", + "overview-calling": "音视频通话概览", + "Managing calls": "管理通话", + "managing-calls": "管理通话", + "Start a one-to-one call": "发起单聊通话", + "start-single-call": "发起单聊通话", + "Start a group call": "发起群聊通话", + "start-group-call": "发起群聊通话", + "Accept a call": "接受通话", + "accept-call": "接受通话", + "Reject a call": "拒绝通话", + "reject-call": "拒绝通话", + "Cancel a call invitation": "取消通话邀请", + "cancel-call": "取消通话邀请", + "Hang up a call": "挂断通话", + "hang-up-call": "挂断通话", + "Handle call events": "处理通话事件", + "handle-call-events": "处理通话事件", + "Retrieving call information": "通话恢复与房间信息", + "retrieving-call-information": "通话恢复与房间信息", + "Restore a pending invitation": "恢复启动前收到的通话邀请", + "restore-pending-invitation": "恢复启动前收到的通话邀请", + "Get a group call room": "查询群组通话房间", + "get-room-by-group-id": "查询群组通话房间", + "Get room credentials": "获取通话房间 Token", + "get-token-by-room-id": "获取通话房间 Token", + "Sending custom signals": "发送自定义信令", + "sending-custom-signals": "发送自定义信令", + "Send a custom signal": "发送自定义信令", + "send-a-custom-signal": "发送自定义信令", + "Events": "事件", + "events": "事件", + "Events overview": "事件概览", + "overview-events": "事件概览", + "Logging": "日志", + "Logger": "日志", + "logger": "日志" +} diff --git a/data/structure/android-sidebar.json b/data/structure/android-sidebar.json new file mode 100644 index 0000000000..004995928a --- /dev/null +++ b/data/structure/android-sidebar.json @@ -0,0 +1,550 @@ +{ + "sidebarExpansion": "active-path", + "nodes": [ + { + "path": "/sdk/android/overview", + "navigationTitle": "Overview" + }, + { + "id": "getting-started", + "title": "Getting started", + "children": [ + "/sdk/android/getting-started/before-you-start", + "/sdk/android/getting-started/environment-specific-implementation", + "/sdk/android/getting-started/authenticate-and-manage-session", + "/sdk/android/getting-started/send-first-message" + ] + }, + { + "id": "user", + "title": "User", + "children": [ + "/sdk/android/user/overview-user", + { + "id": "user/user-profile", + "title": "User profile", + "children": [ + "/sdk/android/user/user-profile/get-users-info", + "/sdk/android/user/user-profile/get-self-local-user-info", + "/sdk/android/user/user-profile/set-self-info" + ] + }, + { + "path": "/sdk/android/user/user-profile/set-global-message-reception", + "navigationTitle": "Set global message reception" + }, + { + "id": "user/online-status", + "title": "Online status", + "children": [ + { + "path": "/sdk/android/user/online-status/subscribe-users-online-status", + "navigationTitle": "Subscribe to user status" + }, + { + "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "navigationTitle": "Refresh subscribed user status" + } + ] + } + ] + }, + { + "id": "relationships", + "title": "Relationships", + "children": [ + { + "id": "user/friends", + "title": "Friends", + "children": [ + { + "path": "/sdk/android/user/friends/get-friend-list-page", + "navigationTitle": "Get the friend list" + }, + { + "path": "/sdk/android/user/friends/search-friends", + "navigationTitle": "Search friends" + }, + { + "path": "/sdk/android/user/friends/get-friends-info", + "navigationTitle": "Get friend profiles" + }, + { + "path": "/sdk/android/user/friends/check-friend", + "navigationTitle": "Check friendship status" + }, + { + "path": "/sdk/android/user/friends/update-friends", + "navigationTitle": "Update friend information" + }, + { + "path": "/sdk/android/user/friends/delete-friend", + "navigationTitle": "Delete a friend" + }, + { + "id": "user/friend-applications", + "title": "Friend applications", + "children": [ + { + "path": "/sdk/android/user/friend-applications/add-friend", + "navigationTitle": "Send a friend application" + }, + { + "path": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "navigationTitle": "Get received friend applications" + }, + { + "path": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "navigationTitle": "Get sent friend applications" + }, + { + "path": "/sdk/android/user/friend-applications/accept-friend-application", + "navigationTitle": "Accept a friend application" + }, + { + "path": "/sdk/android/user/friend-applications/refuse-friend-application", + "navigationTitle": "Reject a friend application" + } + ] + } + ] + }, + { + "id": "user/blacklist", + "title": "Blacklist", + "children": [ + "/sdk/android/user/blacklist/get-blacklist", + { + "path": "/sdk/android/user/blacklist/add-blacklist", + "navigationTitle": "Block a user" + }, + { + "path": "/sdk/android/user/blacklist/remove-blacklist", + "navigationTitle": "Unblock a user" + } + ] + } + ] + }, + { + "id": "conversation", + "title": "Conversation", + "children": [ + "/sdk/android/conversation/overview-conversation", + { + "id": "conversation/retrieving-conversations", + "title": "Retrieving conversations", + "children": [ + { + "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "navigationTitle": "Open a conversation" + }, + { + "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "navigationTitle": "Resolve a conversation ID" + }, + { + "path": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "navigationTitle": "Get conversations by ID" + }, + "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list" + ] + }, + { + "id": "conversation/conversation-list-and-drafts", + "title": "Conversation organization", + "children": [ + { + "path": "/sdk/android/conversation/managing-conversations/pin-conversation", + "navigationTitle": "Pin or unpin a conversation" + }, + { + "path": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "navigationTitle": "Set conversation extra data" + }, + "/sdk/android/conversation/managing-conversations/set-conversation-draft" + ] + }, + { + "id": "conversation/message-reception-and-reminders", + "title": "Unread status and notifications", + "children": [ + { + "path": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "navigationTitle": "Set conversation message reception" + }, + { + "path": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "navigationTitle": "Reset group mention status" + }, + { + "path": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "navigationTitle": "Mark a conversation as read" + }, + { + "path": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "navigationTitle": "Track the total unread count" + } + ] + }, + { + "id": "conversation/message-retention-and-privacy", + "title": "Message retention and privacy", + "children": [ + { + "path": "/sdk/android/conversation/managing-conversations/set-private-chat", + "navigationTitle": "Enable or disable burn after reading" + }, + { + "path": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "navigationTitle": "Set the burn duration" + }, + { + "path": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "navigationTitle": "Schedule server message deletion" + } + ] + }, + { + "id": "conversation/hiding-and-deleting-conversations", + "title": "Hiding and deleting conversations", + "children": [ + "/sdk/android/conversation/managing-conversations/hide-a-conversation", + { + "path": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "navigationTitle": "Delete a conversation and its messages" + }, + { + "path": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "navigationTitle": "Clear messages in a conversation" + } + ] + } + ] + }, + { + "id": "group", + "title": "Group", + "children": [ + { "path": "/sdk/android/group/overview-group", "navigationTitle": "Group overview" }, + { + "id": "group/profile-and-settings", + "title": "Group profile and settings", + "children": [ + { "path": "/sdk/android/group/create-group", "navigationTitle": "Create a group" }, + { + "path": "/sdk/android/group/update-group-profile", + "navigationTitle": "Update group profile" + }, + { + "path": "/sdk/android/group/set-group-announcement", + "navigationTitle": "Publish a group announcement" + }, + { + "path": "/sdk/android/group/set-group-extension", + "navigationTitle": "Set group extra data" + } + ] + }, + { + "id": "group/permissions", + "title": "Group permissions", + "children": [ + { + "path": "/sdk/android/group/set-group-join-verification", + "navigationTitle": "Set group join verification" + }, + { + "path": "/sdk/android/group/set-group-member-profile-access", + "navigationTitle": "Set member profile access" + }, + { + "path": "/sdk/android/group/set-group-member-friend-permission", + "navigationTitle": "Set member friend request permission" + }, + { + "path": "/sdk/android/group/change-group-mute", + "navigationTitle": "Change group mute status" + } + ] + }, + { + "id": "group/joining-and-leaving", + "title": "Joining and leaving groups", + "children": [ + { "path": "/sdk/android/group/join-group", "navigationTitle": "Apply to join a group" }, + { "path": "/sdk/android/group/quit-group", "navigationTitle": "Leave a group" }, + { "path": "/sdk/android/group/dismiss-group", "navigationTitle": "Dismiss a group" } + ] + }, + { + "id": "group/retrieving-groups", + "title": "Retrieving groups", + "children": [ + { + "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "navigationTitle": "Get group information" + }, + { + "path": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "navigationTitle": "Get joined groups by page" + }, + { + "path": "/sdk/android/group/retrieving-groups/is-join-group", + "navigationTitle": "Check group membership" + }, + { + "path": "/sdk/android/group/retrieving-groups/search-groups", + "navigationTitle": "Search groups" + } + ] + }, + { + "id": "group/group-applications", + "title": "Group applications", + "children": [ + { + "path": "/sdk/android/group/group-applications/overview-group-applications", + "navigationTitle": "Group applications overview" + }, + { + "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "navigationTitle": "Get received group applications" + }, + { + "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "navigationTitle": "Get sent group applications" + }, + { + "path": "/sdk/android/group/group-applications/accept-group-application", + "navigationTitle": "Accept a group application" + }, + { + "path": "/sdk/android/group/group-applications/refuse-group-application", + "navigationTitle": "Reject a group application" + } + ] + }, + { + "id": "group/retrieving-group-members", + "title": "Retrieving group members", + "children": [ + { + "path": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "navigationTitle": "Group member queries overview" + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "navigationTitle": "Get group members" + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "navigationTitle": "Get group member profiles" + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "navigationTitle": "Check users in a group" + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "navigationTitle": "Get group owners and admins" + }, + { + "path": "/sdk/android/group/retrieving-group-members/search-group-members", + "navigationTitle": "Search group members" + } + ] + }, + { + "id": "group/managing-group-members", + "title": "Managing group members", + "children": [ + { + "path": "/sdk/android/group/managing-group-members/invite-user-to-group", + "navigationTitle": "Invite users to a group" + }, + { + "path": "/sdk/android/group/managing-group-members/kick-group-member", + "navigationTitle": "Remove group members" + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "navigationTitle": "Update a group nickname" + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "navigationTitle": "Manage group administrators" + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "navigationTitle": "Update a group member avatar" + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-extension", + "navigationTitle": "Set group member extra data" + }, + { + "path": "/sdk/android/group/managing-group-members/transfer-group-owner", + "navigationTitle": "Transfer group ownership" + }, + { + "path": "/sdk/android/group/managing-group-members/change-group-member-mute", + "navigationTitle": "Mute or unmute a group member" + } + ] + } + ] + }, + { + "id": "message", + "title": "Message", + "children": [ + "/sdk/android/message/overview-message", + { + "id": "message/creating-messages", + "title": "Creating messages", + "children": [ + "/sdk/android/message/creating-messages/create-text-message", + "/sdk/android/message/creating-messages/create-text-at-message", + "/sdk/android/message/creating-messages/create-custom-message", + "/sdk/android/message/creating-messages/create-image-message-by-file", + "/sdk/android/message/creating-messages/create-image-message-by-url", + "/sdk/android/message/creating-messages/create-sound-message-by-file", + "/sdk/android/message/creating-messages/create-sound-message-by-url", + "/sdk/android/message/creating-messages/create-video-message-by-file", + "/sdk/android/message/creating-messages/create-video-message-by-url", + "/sdk/android/message/creating-messages/create-file-message-by-file", + "/sdk/android/message/creating-messages/create-file-message-by-url", + "/sdk/android/message/creating-messages/create-card-message", + "/sdk/android/message/creating-messages/create-location-message", + "/sdk/android/message/creating-messages/create-face-message", + "/sdk/android/message/creating-messages/create-quote-message", + "/sdk/android/message/creating-messages/create-forward-message", + "/sdk/android/message/creating-messages/create-merger-message" + ] + }, + { + "id": "message/sending-messages", + "title": "Sending messages", + "children": [ + "/sdk/android/message/sending-messages/send-message", + "/sdk/android/message/sending-messages/send-message-not-oss", + { + "path": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "navigationTitle": "Track message sending progress" + } + ] + }, + "/sdk/android/message/receiving-messages/receive-messages", + "/sdk/android/message/receiving-messages/receive-custom-business-messages", + { + "id": "message/retrieving-messages", + "title": "Retrieving messages", + "children": [ + "/sdk/android/message/retrieving-messages/load-older-messages", + "/sdk/android/message/retrieving-messages/load-newer-messages", + "/sdk/android/message/retrieving-messages/find-messages-by-id", + "/sdk/android/message/searching-messages/search-messages" + ] + }, + "/sdk/android/message/composing-messages/update-typing-status", + { + "id": "message/managing-messages", + "title": "Managing messages", + "children": [ + "/sdk/android/message/managing-messages/delete-local-message", + "/sdk/android/message/managing-messages/delete-saved-messages", + "/sdk/android/message/managing-messages/revoke-a-message", + "/sdk/android/message/managing-messages/modify-a-message", + "/sdk/android/message/managing-messages/get-pinned-messages", + "/sdk/android/message/managing-messages/set-message-pinned", + "/sdk/android/message/managing-messages/insert-local-single-message", + "/sdk/android/message/managing-messages/insert-local-group-message", + "/sdk/android/message/managing-messages/clear-all-local-messages", + "/sdk/android/message/managing-messages/clear-all-messages", + "/sdk/android/message/managing-messages/set-message-local-ex" + ] + } + ] + }, + { + "id": "file-uploads", + "title": "File uploads", + "children": [ + { + "path": "/sdk/android/file-uploads/track-file-upload-progress", + "navigationTitle": "Track file upload progress" + }, + { + "path": "/sdk/android/file-uploads/upload-file", + "navigationTitle": "Upload a file" + } + ] + }, + { + "id": "calling", + "title": "Calling", + "children": [ + "/sdk/android/calling/overview-calling", + { + "id": "calling/managing-calls", + "title": "Managing calls", + "children": [ + { + "path": "/sdk/android/calling/managing-calls/start-single-call", + "navigationTitle": "Start a one-to-one call" + }, + { + "path": "/sdk/android/calling/managing-calls/start-group-call", + "navigationTitle": "Start a group call" + }, + { + "path": "/sdk/android/calling/managing-calls/accept-call", + "navigationTitle": "Accept a call" + }, + { + "path": "/sdk/android/calling/managing-calls/reject-call", + "navigationTitle": "Reject a call" + }, + { + "path": "/sdk/android/calling/managing-calls/cancel-call", + "navigationTitle": "Cancel a call invitation" + }, + { + "path": "/sdk/android/calling/managing-calls/hang-up-call", + "navigationTitle": "Hang up a call" + }, + { + "path": "/sdk/android/calling/managing-calls/handle-call-events", + "navigationTitle": "Handle call events" + } + ] + }, + { + "id": "calling/retrieving-call-information", + "title": "Retrieving call information", + "children": [ + { + "path": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "navigationTitle": "Restore a pending invitation" + }, + { + "path": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "navigationTitle": "Get a group call room" + }, + { + "path": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "navigationTitle": "Get room credentials" + } + ] + }, + "/sdk/android/calling/sending-custom-signals/send-a-custom-signal" + ] + }, + { + "path": "/sdk/android/events/overview-events", + "navigationTitle": "Events" + }, + "/sdk/android/logger" + ] +} diff --git a/data/structure/chat-pages.json b/data/structure/chat-pages.json index 4d2df20a9f..1388e302d1 100644 --- a/data/structure/chat-pages.json +++ b/data/structure/chat-pages.json @@ -1312,20 +1312,36 @@ "contentFile": "content/docs/chat/sdk/ios/logger.mdx" }, { - "sourcePath": "/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel", - "openimPath": "/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel", - "title": "Freeze and unfreeze a channel", + "sourcePath": "/sdk/android/overview", + "openimPath": "/sdk/android/overview", + "title": "OpenIM Android SDK overview", + "context": "chat/sdk/android", + "template": "overview", + "contentFile": "content/docs/chat/sdk/android/overview.mdx" + }, + { + "sourcePath": "/sdk/android/getting-started/before-you-start", + "openimPath": "/sdk/android/getting-started/before-you-start", + "title": "Before you start", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/before-you-start.mdx" }, { - "sourcePath": "/sdk/android/channel/overview-channel", - "openimPath": "/sdk/android/channel/overview-channel", - "title": "Overview", + "sourcePath": "/sdk/android/getting-started/environment-specific-implementation", + "openimPath": "/sdk/android/getting-started/environment-specific-implementation", + "title": "Integrate for Android", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/overview-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx" + }, + { + "sourcePath": "/sdk/android/getting-started/authenticate-and-manage-session", + "openimPath": "/sdk/android/getting-started/authenticate-and-manage-session", + "title": "Authenticate and manage a session", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx" }, { "sourcePath": "/sdk/android/getting-started/send-first-message", @@ -1336,1004 +1352,1036 @@ "contentFile": "content/docs/chat/sdk/android/getting-started/send-first-message.mdx" }, { - "sourcePath": "/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message", - "openimPath": "/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message", - "title": "Add extra data to a message", + "sourcePath": "/sdk/android/user/overview-user", + "openimPath": "/sdk/android/user/overview-user", + "title": "User overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/overview-user.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message", - "openimPath": "/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message", - "title": "Generate thumbnails of a file message", + "sourcePath": "/sdk/android/user/user-profile/get-users-info", + "openimPath": "/sdk/android/user/user-profile/get-users-info", + "title": "Get specified user profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel", - "openimPath": "/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel", - "title": "React to a message in a group channel", + "sourcePath": "/sdk/android/user/user-profile/get-self-local-user-info", + "openimPath": "/sdk/android/user/user-profile/get-self-local-user-info", + "title": "Get the current user profile", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members", - "openimPath": "/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members", - "title": "Send typing indicators to other members", + "sourcePath": "/sdk/android/user/user-profile/set-self-info", + "openimPath": "/sdk/android/user/user-profile/set-self-info", + "title": "Update the current user profile", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx" }, { - "sourcePath": "/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message", - "openimPath": "/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message", - "title": "Pin a message", + "sourcePath": "/sdk/android/user/user-profile/set-global-message-reception", + "openimPath": "/sdk/android/user/user-profile/set-global-message-reception", + "title": "Set global message reception", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/create-a-poll", - "openimPath": "/sdk/android/message/managing-polls/create-a-poll", - "title": "Create a poll", + "sourcePath": "/sdk/android/user/online-status/subscribe-users-online-status", + "openimPath": "/sdk/android/user/online-status/subscribe-users-online-status", + "title": "Subscribe to user online status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/create-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", - "title": "Create a scheduled message", + "sourcePath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "openimPath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "title": "Get subscribed user online status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx" }, { - "sourcePath": "/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", - "openimPath": "/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", - "title": "Mark messages as delivered", + "sourcePath": "/sdk/android/user/friends/get-friend-list-page", + "openimPath": "/sdk/android/user/friends/get-friend-list-page", + "title": "Get the friend list by page", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx" }, { - "sourcePath": "/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "openimPath": "/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "title": "Mention other users in a message", + "sourcePath": "/sdk/android/user/friends/search-friends", + "openimPath": "/sdk/android/user/friends/search-friends", + "title": "Search friends", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/search-friends.mdx" }, { - "sourcePath": "/sdk/android/message/overview-message", - "openimPath": "/sdk/android/message/overview-message", - "title": "Overview", + "sourcePath": "/sdk/android/user/friends/get-friends-info", + "openimPath": "/sdk/android/user/friends/get-friends-info", + "title": "Get specified friend profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/get-friends-info.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-messages/retrieve-a-message", - "openimPath": "/sdk/android/message/retrieving-messages/retrieve-a-message", - "title": "Retrieve a message", + "sourcePath": "/sdk/android/user/friends/check-friend", + "openimPath": "/sdk/android/user/friends/check-friend", + "title": "Check friendship", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/retrieve-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/check-friend.mdx" }, { - "sourcePath": "/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", - "openimPath": "/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", - "title": "Search messages by a keyword", + "sourcePath": "/sdk/android/user/friends/update-friends", + "openimPath": "/sdk/android/user/friends/update-friends", + "title": "Update friend profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/update-friends.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/share-an-encrypted-file", - "openimPath": "/sdk/android/message/sending-a-message/share-an-encrypted-file", - "title": "Share an encrypted file", + "sourcePath": "/sdk/android/user/friends/delete-friend", + "openimPath": "/sdk/android/user/friends/delete-friend", + "title": "Delete a friend", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/share-an-encrypted-file.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/delete-friend.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/smart-throttling", - "openimPath": "/sdk/android/message/sending-a-message/smart-throttling", - "title": "Smart throttling", + "sourcePath": "/sdk/android/user/friend-applications/add-friend", + "openimPath": "/sdk/android/user/friend-applications/add-friend", + "title": "Send a friend request", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/smart-throttling.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx" }, { - "sourcePath": "/sdk/android/message/translating-messages/auto-translate-messages", - "openimPath": "/sdk/android/message/translating-messages/auto-translate-messages", - "title": "Auto-translate messages", + "sourcePath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "openimPath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "title": "Get received friend requests", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/translating-messages/auto-translate-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx" }, { - "sourcePath": "/sdk/android/message/translating-messages/translate-messages-on-demand", - "openimPath": "/sdk/android/message/translating-messages/translate-messages-on-demand", - "title": "Translate messages on-demand", + "sourcePath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "openimPath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "title": "Get sent friend requests", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/translating-messages/translate-messages-on-demand.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx" }, { - "sourcePath": "/sdk/android/message/using-message-threading/create-a-message-thread", - "openimPath": "/sdk/android/message/using-message-threading/create-a-message-thread", - "title": "Create a message thread", + "sourcePath": "/sdk/android/user/friend-applications/accept-friend-application", + "openimPath": "/sdk/android/user/friend-applications/accept-friend-application", + "title": "Accept a friend request", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/using-message-threading/create-a-message-thread.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx" }, { - "sourcePath": "/sdk/android/overview", - "openimPath": "/sdk/android/overview", - "title": "OpenIM SDK for Android", + "sourcePath": "/sdk/android/user/friend-applications/refuse-friend-application", + "openimPath": "/sdk/android/user/friend-applications/refuse-friend-application", + "title": "Reject a friend request", "context": "chat/sdk/android", - "template": "overview", - "contentFile": "content/docs/chat/sdk/android/overview.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences", - "openimPath": "/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences", - "title": "Configure push notification preferences", + "sourcePath": "/sdk/android/user/blacklist/get-blacklist", + "openimPath": "/sdk/android/user/blacklist/get-blacklist", + "title": "Get the blacklist", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences.mdx" + "contentFile": "content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-translation", - "openimPath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-translation", - "title": "Push notification translation", + "sourcePath": "/sdk/android/user/blacklist/add-blacklist", + "openimPath": "/sdk/android/user/blacklist/add-blacklist", + "title": "Block a user", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/push-notification-translation.mdx" + "contentFile": "content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/overview-push-notifications", - "openimPath": "/sdk/android/push-notifications/overview-push-notifications", - "title": "Overview", + "sourcePath": "/sdk/android/user/blacklist/remove-blacklist", + "openimPath": "/sdk/android/user/blacklist/remove-blacklist", + "title": "Unblock a user", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/overview-push-notifications.mdx" + "contentFile": "content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx" }, { - "sourcePath": "/sdk/android/report/overview-report", - "openimPath": "/sdk/android/report/overview-report", - "title": "Overview", + "sourcePath": "/sdk/android/conversation/overview-conversation", + "openimPath": "/sdk/android/conversation/overview-conversation", + "title": "Conversation overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/report/overview-report.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/overview-conversation.mdx" }, { - "sourcePath": "/sdk/android/user/moderating-a-user/block-and-unblock-other-members", - "openimPath": "/sdk/android/user/moderating-a-user/block-and-unblock-other-members", - "title": "Block and unblock other members", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "title": "Open a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/block-and-unblock-other-members.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx" }, { - "sourcePath": "/sdk/android/user/moderating-a-user/mute-and-unmute-a-user", - "openimPath": "/sdk/android/user/moderating-a-user/mute-and-unmute-a-user", - "title": "Mute and unmute a user", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/mute-and-unmute-a-user.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", - "openimPath": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", - "title": "Retrieve the online status of a user", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message", - "openimPath": "/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message", - "title": "Retrieve members who have read a message", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "openimPath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "Get the conversation list", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx" }, { - "sourcePath": "/sdk/android/application/authenticating-a-user/authentication", - "openimPath": "/sdk/android/application/authenticating-a-user/authentication", - "title": "Authentication", + "sourcePath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "openimPath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "title": "Pin or unpin a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/application/authenticating-a-user/authentication.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx" }, { - "sourcePath": "/sdk/android/application/overview-application", - "openimPath": "/sdk/android/application/overview-application", - "title": "Overview", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "openimPath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "title": "Set conversation extra data", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/application/overview-application.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx" }, { - "sourcePath": "/sdk/android/application/understanding-rate-limits/rate-limits", - "openimPath": "/sdk/android/application/understanding-rate-limits/rate-limits", - "title": "Rate limits", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "openimPath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "title": "Set a conversation draft", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/application/understanding-rate-limits/rate-limits.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx" }, { - "sourcePath": "/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type", - "openimPath": "/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type", - "title": "Categorize channels by custom type", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "openimPath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "title": "Set conversation message reception", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx" }, { - "sourcePath": "/sdk/android/channel/creating-a-channel/create-a-channel", - "openimPath": "/sdk/android/channel/creating-a-channel/create-a-channel", - "title": "Create a channel", + "sourcePath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "openimPath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "title": "Reset group mention status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/creating-a-channel/create-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx" }, { - "sourcePath": "/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", - "openimPath": "/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", - "title": "Accept or decline an invitation", + "sourcePath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "openimPath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "title": "Mark a conversation as read", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx" }, { - "sourcePath": "/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members", - "openimPath": "/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members", - "title": "Invite users as members", + "sourcePath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "openimPath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "title": "Track the total unread count", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx" }, { - "sourcePath": "/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", - "openimPath": "/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", - "title": "Enter and exit an open channel", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "openimPath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "title": "Enable or disable burn after reading", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx" }, { - "sourcePath": "/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", - "openimPath": "/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", - "title": "Join and leave a group channel", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "openimPath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters", - "openimPath": "/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters", - "title": "Manage channel metacounters", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "openimPath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-channel-metadata/manage-channel-metadata", - "openimPath": "/sdk/android/channel/managing-channel-metadata/manage-channel-metadata", - "title": "Manage channel metadata", + "sourcePath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "openimPath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/managing-channel-metadata/manage-channel-metadata.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-channels/delete-a-channel", - "openimPath": "/sdk/android/channel/managing-channels/delete-a-channel", - "title": "Delete a channel", + "sourcePath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "openimPath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/managing-channels/delete-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel", - "openimPath": "/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel", - "title": "Hide or archive a group channel", + "sourcePath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "openimPath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel", - "openimPath": "/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel", - "title": "Refresh all data related to a group channel", + "sourcePath": "/sdk/android/group/overview-group", + "openimPath": "/sdk/android/group/overview-group", + "title": "Group overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/group/overview-group.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-operators/register-and-remove-operators", - "openimPath": "/sdk/android/channel/managing-operators/register-and-remove-operators", - "title": "Register and remove operators", + "sourcePath": "/sdk/android/group/create-group", + "openimPath": "/sdk/android/group/create-group", + "title": "Create a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/managing-operators/register-and-remove-operators.mdx" + "contentFile": "content/docs/chat/sdk/android/group/create-group.mdx" }, { - "sourcePath": "/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url", - "openimPath": "/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url", - "title": "Retrieve a channel by URL", + "sourcePath": "/sdk/android/group/update-group-profile", + "openimPath": "/sdk/android/group/update-group-profile", + "title": "Update group profile", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url.mdx" + "contentFile": "content/docs/chat/sdk/android/group/update-group-profile.mdx" }, { - "sourcePath": "/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels", - "openimPath": "/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels", - "title": "Retrieve a list of channels", + "sourcePath": "/sdk/android/group/set-group-announcement", + "openimPath": "/sdk/android/group/set-group-announcement", + "title": "Publish a group announcement", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-announcement.mdx" }, { - "sourcePath": "/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids", - "openimPath": "/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids", - "title": "Filter group channels by user IDs", + "sourcePath": "/sdk/android/group/set-group-extension", + "openimPath": "/sdk/android/group/set-group-extension", + "title": "Set group extra data", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-extension.mdx" }, { - "sourcePath": "/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters", - "openimPath": "/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters", - "title": "Search group channels by name, URL, or other filters", + "sourcePath": "/sdk/android/group/set-group-join-verification", + "openimPath": "/sdk/android/group/set-group-join-verification", + "title": "Set group join verification", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-join-verification.mdx" }, { - "sourcePath": "/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types", - "openimPath": "/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types", - "title": "Search open channels by name, URL, or custom type", + "sourcePath": "/sdk/android/group/set-group-member-profile-access", + "openimPath": "/sdk/android/group/set-group-member-profile-access", + "title": "Set member profile access", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx" }, { - "sourcePath": "/sdk/android/deprecated", - "openimPath": "/sdk/android/deprecated", - "title": "Deprecated", + "sourcePath": "/sdk/android/group/set-group-member-friend-permission", + "openimPath": "/sdk/android/group/set-group-member-friend-permission", + "title": "Set member friend request permission", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/deprecated.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx" }, { - "sourcePath": "/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", - "openimPath": "/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", - "title": "Add or remove a channel event handler", + "sourcePath": "/sdk/android/group/change-group-mute", + "openimPath": "/sdk/android/group/change-group-mute", + "title": "Change group mute status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler.mdx" + "contentFile": "content/docs/chat/sdk/android/group/change-group-mute.mdx" }, { - "sourcePath": "/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", - "openimPath": "/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", - "title": "Add or remove a connection event handler", + "sourcePath": "/sdk/android/group/join-group", + "openimPath": "/sdk/android/group/join-group", + "title": "Apply to join a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler.mdx" + "contentFile": "content/docs/chat/sdk/android/group/join-group.mdx" }, { - "sourcePath": "/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", - "openimPath": "/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", - "title": "Add or remove a user event handler", + "sourcePath": "/sdk/android/group/quit-group", + "openimPath": "/sdk/android/group/quit-group", + "title": "Leave a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler.mdx" + "contentFile": "content/docs/chat/sdk/android/group/quit-group.mdx" }, { - "sourcePath": "/sdk/android/event-handler/overview-event-handler", - "openimPath": "/sdk/android/event-handler/overview-event-handler", - "title": "Event handler", + "sourcePath": "/sdk/android/group/dismiss-group", + "openimPath": "/sdk/android/group/dismiss-group", + "title": "Dismiss a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/event-handler/overview-event-handler.mdx" + "contentFile": "content/docs/chat/sdk/android/group/dismiss-group.mdx" }, { - "sourcePath": "/sdk/android/getting-started/collection-migration-guide", - "openimPath": "/sdk/android/getting-started/collection-migration-guide", - "title": "Collection migration guide", + "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "openimPath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "title": "Get group information", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/getting-started/collection-migration-guide.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx" }, { - "sourcePath": "/sdk/android/getting-started/kotlin-extension", - "openimPath": "/sdk/android/getting-started/kotlin-extension", - "title": "Kotlin extension (KTX)", + "sourcePath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "openimPath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "title": "Get joined groups by page", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/getting-started/kotlin-extension.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx" }, { - "sourcePath": "/sdk/android/getting-started/migration-guide", - "openimPath": "/sdk/android/getting-started/migration-guide", - "title": "Migration guide", + "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", + "openimPath": "/sdk/android/group/retrieving-groups/is-join-group", + "title": "Check group membership", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/getting-started/migration-guide.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx" }, { - "sourcePath": "/sdk/android/local-caching/overview-local-caching", - "openimPath": "/sdk/android/local-caching/overview-local-caching", - "title": "Local caching", + "sourcePath": "/sdk/android/group/retrieving-groups/search-groups", + "openimPath": "/sdk/android/group/retrieving-groups/search-groups", + "title": "Search groups", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/local-caching/overview-local-caching.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx" }, { - "sourcePath": "/sdk/android/local-caching/using-group-channel-collection/group-channel-collection", - "openimPath": "/sdk/android/local-caching/using-group-channel-collection/group-channel-collection", - "title": "Group channel collection", + "sourcePath": "/sdk/android/group/group-applications/overview-group-applications", + "openimPath": "/sdk/android/group/group-applications/overview-group-applications", + "title": "Group applications overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/local-caching/using-group-channel-collection/group-channel-collection.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx" }, { - "sourcePath": "/sdk/android/local-caching/using-message-collection/message-collection", - "openimPath": "/sdk/android/local-caching/using-message-collection/message-collection", - "title": "Message collection", + "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "openimPath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "title": "Get received group applications", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/local-caching/using-message-collection/message-collection.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/android/logger", - "openimPath": "/sdk/android/logger", - "title": "Logger", + "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "openimPath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "title": "Get sent group applications", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/logger.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type", - "openimPath": "/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type", - "title": "Categorize messages by custom type", + "sourcePath": "/sdk/android/group/group-applications/accept-group-application", + "openimPath": "/sdk/android/group/group-applications/accept-group-application", + "title": "Accept a group application", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx" }, { - "sourcePath": "/sdk/android/message/listing-changelogs/list-changelogs-of-messages", - "openimPath": "/sdk/android/message/listing-changelogs/list-changelogs-of-messages", - "title": "List changelogs of messages", + "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", + "openimPath": "/sdk/android/group/group-applications/refuse-group-application", + "title": "Reject a group application", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/listing-changelogs/list-changelogs-of-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel", - "openimPath": "/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel", - "title": "Clear the chat history in a group channel", + "sourcePath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "openimPath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "title": "Group member queries overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/copy-a-message", - "openimPath": "/sdk/android/message/managing-a-message/copy-a-message", - "title": "Copy a message", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "openimPath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "title": "List group members", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/copy-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/delete-a-message", - "openimPath": "/sdk/android/message/managing-a-message/delete-a-message", - "title": "Delete a message", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "openimPath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "title": "Get specified group member profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/delete-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message", - "openimPath": "/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message", - "title": "Display Open Graph tags in a message", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "openimPath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "title": "Check group membership", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/update-a-message", - "openimPath": "/sdk/android/message/managing-a-message/update-a-message", - "title": "Update a message", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "openimPath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "Get the group owner and administrators", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/update-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" }, { - "sourcePath": "/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages", - "openimPath": "/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages", - "title": "List pinned messages", + "sourcePath": "/sdk/android/group/retrieving-group-members/search-group-members", + "openimPath": "/sdk/android/group/retrieving-group-members/search-group-members", + "title": "Search group members", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx" }, { - "sourcePath": "/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message", - "openimPath": "/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message", - "title": "Unpin a message", + "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "openimPath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "title": "Invite users to a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/add-a-poll-option", - "openimPath": "/sdk/android/message/managing-polls/add-a-poll-option", - "title": "Add a poll option", + "sourcePath": "/sdk/android/group/managing-group-members/kick-group-member", + "openimPath": "/sdk/android/group/managing-group-members/kick-group-member", + "title": "Remove group members", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/add-a-poll-option.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/cast-or-cancel-a-vote", - "openimPath": "/sdk/android/message/managing-polls/cast-or-cancel-a-vote", - "title": "Cast or cancel a vote", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "title": "Update a member’s group nickname", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/cast-or-cancel-a-vote.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/close-a-poll", - "openimPath": "/sdk/android/message/managing-polls/close-a-poll", - "title": "Close a poll", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "title": "Manage group administrators", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/close-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/delete-a-poll", - "openimPath": "/sdk/android/message/managing-polls/delete-a-poll", - "title": "Delete a poll", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "title": "Update a group member’s avatar", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/delete-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/delete-a-poll-option", - "openimPath": "/sdk/android/message/managing-polls/delete-a-poll-option", - "title": "Delete a poll option", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "title": "Set a group member extension", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/delete-a-poll-option.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/list-changelogs-of-polls", - "openimPath": "/sdk/android/message/managing-polls/list-changelogs-of-polls", - "title": "List changelogs of polls", + "sourcePath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "openimPath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "title": "Transfer group ownership", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/list-changelogs-of-polls.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-list-of-polls", - "openimPath": "/sdk/android/message/managing-polls/retrieve-a-list-of-polls", - "title": "Retrieve a list of polls", + "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "openimPath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "title": "Mute or unmute a group member", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-list-of-polls.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-list-of-voters", - "openimPath": "/sdk/android/message/managing-polls/retrieve-a-list-of-voters", - "title": "Retrieve a list of voters", + "sourcePath": "/sdk/android/message/overview-message", + "openimPath": "/sdk/android/message/overview-message", + "title": "Overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-list-of-voters.mdx" + "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-poll", - "openimPath": "/sdk/android/message/managing-polls/retrieve-a-poll", - "title": "Retrieve a poll", + "sourcePath": "/sdk/android/message/creating-messages/create-text-message", + "openimPath": "/sdk/android/message/creating-messages/create-text-message", + "title": "Create a text message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-poll-option", - "openimPath": "/sdk/android/message/managing-polls/retrieve-a-poll-option", - "title": "Retrieve a poll option", + "sourcePath": "/sdk/android/message/creating-messages/create-text-at-message", + "openimPath": "/sdk/android/message/creating-messages/create-text-at-message", + "title": "Create an @ message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-poll-option.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/update-a-poll", - "openimPath": "/sdk/android/message/managing-polls/update-a-poll", - "title": "Update a poll", + "sourcePath": "/sdk/android/message/creating-messages/create-custom-message", + "openimPath": "/sdk/android/message/creating-messages/create-custom-message", + "title": "Create a custom message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/update-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/update-a-poll-option", - "openimPath": "/sdk/android/message/managing-polls/update-a-poll-option", - "title": "Update a poll option", + "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "title": "Create an image message from a file", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/update-a-poll-option.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx" }, { - "sourcePath": "/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status", - "openimPath": "/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status", - "title": "Get read status of a message", + "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "title": "Create an image message from a URL", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx" }, { - "sourcePath": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read", - "openimPath": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read", - "title": "Mark messages as read", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "title": "Create an audio message from a file", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx" }, { - "sourcePath": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread", - "openimPath": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread", - "title": "Mark messages as unread", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "title": "Create an audio message from a URL", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", - "title": "Cancel a scheduled message", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "title": "Create a video message from files", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", - "title": "List all scheduled messages", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "title": "Create a video message from URLs", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "title": "Retrieve a scheduled message", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "title": "Create a file message from a file", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", - "title": "Retrieve the total number of scheduled messages", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "title": "Create a file message from a URL", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", - "title": "Send scheduled message immediately", + "sourcePath": "/sdk/android/message/creating-messages/create-card-message", + "openimPath": "/sdk/android/message/creating-messages/create-card-message", + "title": "Create a contact card message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", - "title": "Update a scheduled message", + "sourcePath": "/sdk/android/message/creating-messages/create-location-message", + "openimPath": "/sdk/android/message/creating-messages/create-location-message", + "title": "Create a location message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx" }, { - "sourcePath": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", - "openimPath": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", - "title": "Receive messages in a group channel", + "sourcePath": "/sdk/android/message/creating-messages/create-face-message", + "openimPath": "/sdk/android/message/creating-messages/create-face-message", + "title": "Create an emoji message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx" }, { - "sourcePath": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", - "openimPath": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", - "title": "Receive messages in an open channel", + "sourcePath": "/sdk/android/message/creating-messages/create-quote-message", + "openimPath": "/sdk/android/message/creating-messages/create-quote-message", + "title": "Create a reply message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages", - "openimPath": "/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages", - "title": "Retrieve a list of messages", + "sourcePath": "/sdk/android/message/creating-messages/create-forward-message", + "openimPath": "/sdk/android/message/creating-messages/create-forward-message", + "title": "Create a forwarded message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", - "openimPath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", - "title": "Retrieve number of members who haven't read a message", + "sourcePath": "/sdk/android/message/creating-messages/create-merger-message", + "openimPath": "/sdk/android/message/creating-messages/create-merger-message", + "title": "Create a merged forward message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", - "openimPath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", - "title": "Retrieve number of members who haven't received a message", + "sourcePath": "/sdk/android/message/sending-messages/send-message", + "openimPath": "/sdk/android/message/sending-messages/send-message", + "title": "Send a message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels", - "openimPath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels", - "title": "Retrieve number of channels with unread messages", + "sourcePath": "/sdk/android/message/sending-messages/send-message-not-oss", + "openimPath": "/sdk/android/message/sending-messages/send-message-not-oss", + "title": "Send an uploaded media message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels.mdx" + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items", - "openimPath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items", - "title": "Retrieve number of unread items", + "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "openimPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "title": "Track message sending progress", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items.mdx" + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", - "openimPath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", - "title": "Retrieve number of unread messages in a channel", + "sourcePath": "/sdk/android/message/receiving-messages/receive-messages", + "openimPath": "/sdk/android/message/receiving-messages/receive-messages", + "title": "Receive messages", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "openimPath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "title": "Retrieve number of unread messages in all channels", + "sourcePath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "openimPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "title": "Receive custom business messages", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels.mdx" + "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload", - "openimPath": "/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload", - "title": "Cancel an in-progress file upload", + "sourcePath": "/sdk/android/message/retrieving-messages/load-older-messages", + "openimPath": "/sdk/android/message/retrieving-messages/load-older-messages", + "title": "Load message history", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload.mdx" + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "openimPath": "/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "title": "Send a critical alert message to iOS device users", + "sourcePath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "openimPath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "title": "Load message history in reverse", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users.mdx" + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/send-a-message", - "openimPath": "/sdk/android/message/sending-a-message/send-a-message", - "title": "Send a message", + "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "openimPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "title": "Find messages by ID", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/send-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/send-an-admin-message", - "openimPath": "/sdk/android/message/sending-a-message/send-an-admin-message", - "title": "Send an admin message", + "sourcePath": "/sdk/android/message/searching-messages/search-messages", + "openimPath": "/sdk/android/message/searching-messages/search-messages", + "title": "Search messages", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/send-an-admin-message.mdx" + "contentFile": "content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/spam-flood-protection", - "openimPath": "/sdk/android/message/sending-a-message/spam-flood-protection", - "title": "Spam flood protection", + "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", + "openimPath": "/sdk/android/message/composing-messages/update-typing-status", + "title": "Report typing status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/spam-flood-protection.mdx" + "contentFile": "content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler", - "openimPath": "/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler", - "title": "Track file upload progress using a handler", + "sourcePath": "/sdk/android/message/managing-messages/delete-local-message", + "openimPath": "/sdk/android/message/managing-messages/delete-local-message", + "title": "Delete a local message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx" }, { - "sourcePath": "/sdk/android/message/translating-messages/translation-engine", - "openimPath": "/sdk/android/message/translating-messages/translation-engine", - "title": "Translation engine", + "sourcePath": "/sdk/android/message/managing-messages/delete-saved-messages", + "openimPath": "/sdk/android/message/managing-messages/delete-saved-messages", + "title": "Delete messages in a batch", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/translating-messages/translation-engine.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx" }, { - "sourcePath": "/sdk/android/message/using-message-threading/list-replies-in-a-message-thread", - "openimPath": "/sdk/android/message/using-message-threading/list-replies-in-a-message-thread", - "title": "List replies in a message thread", + "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", + "openimPath": "/sdk/android/message/managing-messages/revoke-a-message", + "title": "Revoke a message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/using-message-threading/list-replies-in-a-message-thread.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx" }, { - "sourcePath": "/sdk/android/migrating-to-sendbird", - "openimPath": "/sdk/android/migrating-to-openim", - "title": "Migrating to OpenIM", + "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", + "openimPath": "/sdk/android/message/managing-messages/modify-a-message", + "title": "Modify a message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/migrating-to-openim.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates", - "openimPath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates", - "title": "Push notification content templates", + "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", + "openimPath": "/sdk/android/message/managing-messages/get-pinned-messages", + "title": "Get pinned messages in a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-tester", - "openimPath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-tester", - "title": "Push notification tester", + "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", + "openimPath": "/sdk/android/message/managing-messages/set-message-pinned", + "title": "Pin or unpin a message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/push-notification-tester.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", - "openimPath": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", + "sourcePath": "/sdk/android/message/managing-messages/insert-local-single-message", + "openimPath": "/sdk/android/message/managing-messages/insert-local-single-message", + "title": "Insert a local one-to-one message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", - "openimPath": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", + "sourcePath": "/sdk/android/message/managing-messages/insert-local-group-message", + "openimPath": "/sdk/android/message/managing-messages/insert-local-group-message", + "title": "Insert a local group message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", - "openimPath": "/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", - "title": "Mark push notifications as delivered", + "sourcePath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "openimPath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "title": "Clear all local messages", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm", - "openimPath": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", + "sourcePath": "/sdk/android/message/managing-messages/clear-all-messages", + "openimPath": "/sdk/android/message/managing-messages/clear-all-messages", + "title": "Clear local and server messages", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms", - "openimPath": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", + "sourcePath": "/sdk/android/message/managing-messages/set-message-local-ex", + "openimPath": "/sdk/android/message/managing-messages/set-message-local-ex", + "title": "Set a local message extension", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx" }, { - "sourcePath": "/sdk/android/report/creating-a-report/report-a-message-user-or-channel", - "openimPath": "/sdk/android/report/creating-a-report/report-a-message-user-or-channel", - "title": "Report a message, user, or channel", + "sourcePath": "/sdk/android/file-uploads/track-file-upload-progress", + "openimPath": "/sdk/android/file-uploads/track-file-upload-progress", + "title": "Track file upload progress", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/report/creating-a-report/report-a-message-user-or-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx" }, { - "sourcePath": "/sdk/android/user/managing-user-metadata/manage-user-metadata", - "openimPath": "/sdk/android/user/managing-user-metadata/manage-user-metadata", - "title": "Manage user metadata", + "sourcePath": "/sdk/android/file-uploads/upload-file", + "openimPath": "/sdk/android/file-uploads/upload-file", + "title": "Upload a file", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/managing-user-metadata/manage-user-metadata.mdx" + "contentFile": "content/docs/chat/sdk/android/file-uploads/upload-file.mdx" }, { - "sourcePath": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "openimPath": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "title": "Retrieve a list of blocked users", + "sourcePath": "/sdk/android/calling/overview-calling", + "openimPath": "/sdk/android/calling/overview-calling", + "title": "Audio and video calling overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/overview-calling.mdx" }, { - "sourcePath": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users", - "openimPath": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users", - "title": "Retrieve a list of muted users", + "sourcePath": "/sdk/android/calling/managing-calls/start-single-call", + "openimPath": "/sdk/android/calling/managing-calls/start-single-call", + "title": "Start a one-to-one call", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx" }, { - "sourcePath": "/sdk/android/user/overview-user", - "openimPath": "/sdk/android/user/overview-user", - "title": "Overview", + "sourcePath": "/sdk/android/calling/managing-calls/start-group-call", + "openimPath": "/sdk/android/calling/managing-calls/start-group-call", + "title": "Start a group call", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/overview-user.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "openimPath": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "title": "Retrieve the latest information on participants", + "sourcePath": "/sdk/android/calling/managing-calls/accept-call", + "openimPath": "/sdk/android/calling/managing-calls/accept-call", + "title": "Accept a call", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-and-updating-user-information/update-user-profile", - "openimPath": "/sdk/android/user/retrieving-and-updating-user-information/update-user-profile", - "title": "Update user profile", + "sourcePath": "/sdk/android/calling/managing-calls/reject-call", + "openimPath": "/sdk/android/calling/managing-calls/reject-call", + "title": "Reject a call", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-and-updating-user-information/update-user-profile.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", - "openimPath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", - "title": "Retrieve a list of members and operators in a specific order", + "sourcePath": "/sdk/android/calling/managing-calls/cancel-call", + "openimPath": "/sdk/android/calling/managing-calls/cancel-call", + "title": "Cancel a call invitation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-operators", - "openimPath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-operators", - "title": "Retrieve a list of operators", + "sourcePath": "/sdk/android/calling/managing-calls/hang-up-call", + "openimPath": "/sdk/android/calling/managing-calls/hang-up-call", + "title": "End a call", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-operators.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel", - "openimPath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel", - "title": "Retrieve a list of users in a channel", + "sourcePath": "/sdk/android/calling/managing-calls/handle-call-events", + "openimPath": "/sdk/android/calling/managing-calls/handle-call-events", + "title": "Handle call events", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application", - "openimPath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application", - "title": "Retrieve a list of users in an application", + "sourcePath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "openimPath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "title": "Restore a pending call invitation", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx" + }, + { + "sourcePath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "openimPath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "title": "Get a group call room", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx" }, { - "sourcePath": "/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "openimPath": "/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "title": "Mark messages as read", + "sourcePath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "openimPath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "title": "Get a call room token", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx" + }, + { + "sourcePath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "openimPath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "title": "Send a custom signal", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx" + }, + { + "sourcePath": "/sdk/android/events/overview-events", + "openimPath": "/sdk/android/events/overview-events", + "title": "Events overview", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/events/overview-events.mdx" + }, + { + "sourcePath": "/sdk/android/logger", + "openimPath": "/sdk/android/logger", + "title": "Logger", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/logger.mdx" }, { "sourcePath": "/sdk/flutter/overview", diff --git a/package.json b/package.json index 5cfd03ac82..6c2f78b478 100644 --- a/package.json +++ b/package.json @@ -34,15 +34,15 @@ "content:metadata": "node scripts/sync-content-metadata.mjs", "sdk:zh": "node scripts/build-wasm-sdk-zh-content.mjs", "sdk:zh:check": "node scripts/check-localized-sdk-content.mjs", - "sdk:native:zh": "node scripts/build-client-sdk-zh-content.mjs ios flutter", - "sdk:native:zh:check": "node scripts/check-localized-sdk-content.mjs ios flutter", + "sdk:native:zh": "node scripts/build-client-sdk-zh-content.mjs android ios flutter", + "sdk:native:zh:check": "node scripts/check-localized-sdk-content.mjs android ios flutter", "sdk:native:structure:sync": "node scripts/sync-client-sdk-structure.mjs ios flutter", - "sdk:native:routes:sync": "node scripts/sync-client-sdk-route-skeletons.mjs ios flutter && node scripts/sync-content-metadata.mjs", + "sdk:native:routes:sync": "node scripts/sync-client-sdk-route-skeletons.mjs android ios flutter && node scripts/sync-content-metadata.mjs", "structure:sync": "node scripts/import-structure.mjs", "structure:report": "pnpm content:metadata && node scripts/structure-report.mjs && prettier --write docs/STRUCTURE_REPORT.md", "check": "eslint . && tsc --noEmit && pnpm test:audit && node scripts/check-content.mjs && node scripts/check-guides-content-audit.mjs && node scripts/check-wasm-content-audit.mjs && node scripts/check-localized-sdk-content.mjs && node scripts/check-client-sdk-content-audit.mjs && node scripts/check-wasm-sdk-examples.mjs && pnpm docsets-sync:lint-openapi && pnpm platform-api:test", "postbuild": "node scripts/prepare-standalone.mjs", - "content:sync": "node scripts/build-wasm-sdk-zh-content.mjs && node scripts/build-client-sdk-zh-content.mjs ios flutter && node scripts/build-search-index.mjs", + "content:sync": "node scripts/build-wasm-sdk-zh-content.mjs && node scripts/build-client-sdk-zh-content.mjs android ios flutter && node scripts/build-search-index.mjs", "guides:sync": "node scripts/import-openim-guides.mjs", "platform-api:sync": "node scripts/import-openim-platform-api.mjs && node scripts/sync-openim-user-api.mjs && node scripts/sync-openim-friend-api.mjs && node scripts/sync-openim-group-api.mjs && node scripts/sync-openim-auth-api.mjs && node scripts/sync-openim-third-api.mjs && node scripts/sync-openim-msg-api.mjs && node scripts/sync-openim-conversation-api.mjs && node scripts/sync-openim-platform-api-order.mjs && node scripts/sync-openim-platform-api-english.mjs && node scripts/build-search-index.mjs", "user-api:sync": "node scripts/sync-openim-user-api.mjs", diff --git a/scripts/__tests__/build-client-sdk-zh-content.test.mjs b/scripts/__tests__/build-client-sdk-zh-content.test.mjs index 4243c51ca2..39397033d7 100644 --- a/scripts/__tests__/build-client-sdk-zh-content.test.mjs +++ b/scripts/__tests__/build-client-sdk-zh-content.test.mjs @@ -52,6 +52,13 @@ test('resolves missing native route records from the reviewed WASM suffix baseli test('native audit seeds and generated packages retain the fixed structural contract', () => { const expected = { + android: { + context: 'chat/sdk/android', + root: 'content/zh/docs/chat/sdk/android', + sdkKey: 'androidSdk', + tag: 'v3.8.4.0', + commit: 'f82b142c7d3b4b66ce20586adabc69de9cd61673', + }, ios: { context: 'chat/sdk/ios', root: 'content/zh/docs/chat/sdk/ios', diff --git a/scripts/__tests__/build-search-index.test.mjs b/scripts/__tests__/build-search-index.test.mjs index ff54affccb..1af5521546 100644 --- a/scripts/__tests__/build-search-index.test.mjs +++ b/scripts/__tests__/build-search-index.test.mjs @@ -28,23 +28,28 @@ function auditPage(path, zh, en) { }; } -test('omits unpublished WASM pages and indexes published manual Chinese content', () => { - const nonWasm = route('/sdk/android/overview'); +test('applies publication audits to Android and WASM search content', () => { + const android = route('/sdk/android/overview'); const pending = route('/sdk/wasm/pending', 'chat/sdk/wasm'); const published = route('/sdk/wasm/published', 'chat/sdk/wasm'); const result = buildSearchIndexes({ - routes: [nonWasm, pending, published], + routes: [android, pending, published], sourcePages: new Map([ - [nonWasm.path, { body: 'Android source body' }], + [android.path, { body: 'Android source body' }], [pending.path, { body: 'Pending source body' }], [published.path, { body: 'Published source body' }], ]), manualZhPages: new Map([ + [ + android.path, + { body: 'Android 中文正文', description: 'Android 描述', title: 'Android 标题' }, + ], [pending.path, { body: '待审核正文', description: '待审核', title: '待审核' }], [published.path, { body: '已发布中文正文', description: '中文描述', title: '中文标题' }], ]), auditPages: new Map([ + [android.path, auditPage(android.path, 'published', 'published')], [pending.path, auditPage(pending.path, 'written', 'deferred')], [published.path, auditPage(published.path, 'published', 'published')], ]), @@ -52,11 +57,11 @@ test('omits unpublished WASM pages and indexes published manual Chinese content' assert.deepEqual( result.en.map((record) => record.path), - [nonWasm.path, published.path], + [android.path, published.path], ); assert.deepEqual( result.zh.map((record) => record.path), - [nonWasm.path, published.path], + [android.path, published.path], ); assert.equal(result.zh.at(-1).title, '中文标题'); assert.equal(result.zh.at(-1).description, '中文描述'); diff --git a/scripts/__tests__/client-sdk-publication.test.mjs b/scripts/__tests__/client-sdk-publication.test.mjs index c015fe5d07..b84a523fe7 100644 --- a/scripts/__tests__/client-sdk-publication.test.mjs +++ b/scripts/__tests__/client-sdk-publication.test.mjs @@ -12,6 +12,7 @@ import { } from '../../src/lib/client-sdk-publication.ts'; test('detects all registered active SDK routes and excludes legacy native routes', () => { + assert.equal(getClientSdkPlatform('/sdk/android/overview'), 'android'); assert.equal(getClientSdkPlatform('/sdk/ios/overview'), 'ios'); assert.equal(getClientSdkPlatform('/sdk/flutter/overview/'), 'flutter'); assert.equal(getClientSdkPlatform('/sdk/wasm/overview'), 'wasm'); @@ -19,6 +20,7 @@ test('detects all registered active SDK routes and excludes legacy native routes }); test('reads locale publication state per platform audit', () => { + assert.deepEqual(getPublishedClientSdkLocales('/sdk/android/overview'), ['en', 'zh']); assert.equal(isClientSdkLocalePublished('/sdk/ios/overview', 'zh'), true); assert.deepEqual(getPublishedClientSdkLocales('/sdk/flutter/overview'), ['en', 'zh']); assert.equal(isClientSdkLocalePublished('/sdk/flutter/overview', 'en'), true); @@ -40,14 +42,12 @@ test('creates a platform-specific neutral pending body', () => { description: '审核状态说明', }); assert.match(pending?.body ?? '', /OpenIM Flutter SDK/); - assert.equal( - createClientSdkPendingReviewContent({ - path: '/sdk/android/overview', - title: 'Android', - description: 'Android', - }), - undefined, - ); + const androidPending = createClientSdkPendingReviewContent({ + path: '/sdk/android/overview', + title: 'Android', + description: 'Android', + }); + assert.match(androidPending?.body ?? '', /OpenIM Android SDK/); }); test('only selects manual client SDK content after its locale is published', () => { diff --git a/scripts/__tests__/client-sdk-sidebar.test.mjs b/scripts/__tests__/client-sdk-sidebar.test.mjs index 33ada39c22..c848b78925 100644 --- a/scripts/__tests__/client-sdk-sidebar.test.mjs +++ b/scripts/__tests__/client-sdk-sidebar.test.mjs @@ -12,7 +12,20 @@ import { const wasmSidebar = readJson('data/structure/wasm-sidebar.json'); test('registers the supported client SDK platforms and their structure paths', () => { - assert.deepEqual(clientSdkPlatformIds, ['ios', 'flutter', 'wasm']); + assert.deepEqual(clientSdkPlatformIds, ['android', 'ios', 'flutter', 'wasm']); + assert.deepEqual(getClientSdkPlatform('android'), { + id: 'android', + contextKey: 'chat/sdk/android', + routePrefix: '/sdk/android', + manualRoot: 'content/zh/docs/chat/sdk/android', + auditPath: 'data/structure/android-content-audit.json', + labelsPath: 'data/structure/android-navigation-labels.json', + sidebarPath: 'data/structure/android-sidebar.json', + localizedOutputPath: 'src/generated/android-sdk-zh-content.json', + sdkSourceKey: 'androidSdk', + sdkTag: 'v3.8.4.0', + sdkCommit: 'f82b142c7d3b4b66ce20586adabc69de9cd61673', + }); assert.deepEqual(getClientSdkPlatform('ios'), { id: 'ios', contextKey: 'chat/sdk/ios', @@ -28,7 +41,7 @@ test('registers the supported client SDK platforms and their structure paths', ( }); assert.equal(getClientSdkPlatform('flutter').contextKey, 'chat/sdk/flutter'); assert.equal(getClientSdkPlatform('wasm').contextKey, 'chat/sdk/wasm'); - assert.throws(() => getClientSdkPlatform('android'), /Unknown client SDK platform: android/); + assert.throws(() => getClientSdkPlatform('unknown'), /Unknown client SDK platform: unknown/); }); test('native sidebars keep unique platform routes and may extend the WASM structure', () => { @@ -53,7 +66,7 @@ test('native sidebars keep unique platform routes and may extend the WASM struct test('keeps relationships beside users and account settings beside user profiles', () => { const navigation = readJson('src/generated/navigation.json'); - for (const platform of ['wasm', 'ios', 'flutter']) { + for (const platform of ['wasm', 'ios', 'flutter', 'android']) { const sidebar = readJson(`data/structure/${platform}-sidebar.json`); const user = sidebar.nodes.find((node) => node.id === 'user'); const relationships = sidebar.nodes.find((node) => node.id === 'relationships'); @@ -66,7 +79,9 @@ test('keeps relationships beside users and account settings beside user profiles const globalReceptionPath = platform === 'wasm' ? '/sdk/wasm/user/profile/set-global-message-reception' - : `/sdk/${platform}/user/retrieving-and-updating-user-information/set-global-message-reception`; + : platform === 'android' + ? '/sdk/android/user/user-profile/set-global-message-reception' + : `/sdk/${platform}/user/retrieving-and-updating-user-information/set-global-message-reception`; const onlineStatusPaths = platform === 'wasm' ? [ @@ -74,11 +89,16 @@ test('keeps relationships beside users and account settings beside user profiles '/sdk/wasm/user/online-status/get-subscribe-users-status', '/sdk/wasm/user/online-status/unsubscribe-users-status', ] - : [ - `/sdk/${platform}/user/retrieving-and-updating-user-information/subscribe-user-status`, - `/sdk/${platform}/user/retrieving-and-updating-user-information/get-subscribed-user-status`, - `/sdk/${platform}/user/retrieving-and-updating-user-information/unsubscribe-user-status`, - ]; + : platform === 'android' + ? [ + '/sdk/android/user/online-status/subscribe-users-online-status', + '/sdk/android/user/online-status/get-subscribe-online-users-status', + ] + : [ + `/sdk/${platform}/user/retrieving-and-updating-user-information/subscribe-user-status`, + `/sdk/${platform}/user/retrieving-and-updating-user-information/get-subscribed-user-status`, + `/sdk/${platform}/user/retrieving-and-updating-user-information/unsubscribe-user-status`, + ]; assert.ok(profile, platform); assert.ok(onlineStatus, platform); diff --git a/scripts/__tests__/search-index-contract.test.mjs b/scripts/__tests__/search-index-contract.test.mjs index 2f54a220ed..21336ca9f4 100644 --- a/scripts/__tests__/search-index-contract.test.mjs +++ b/scripts/__tests__/search-index-contract.test.mjs @@ -14,11 +14,12 @@ function page(path, en, zh) { } test('expects non-client routes and only locale-published client SDK routes', () => { - const nonWasm = { path: '/sdk/android/overview', contextKey: 'chat/sdk/android' }; + const android = { path: '/sdk/android/overview', contextKey: 'chat/sdk/android' }; const pending = { path: '/sdk/wasm/pending', contextKey: 'chat/sdk/wasm' }; const enOnly = { path: '/sdk/wasm/en', contextKey: 'chat/sdk/wasm' }; const zhOnly = { path: '/sdk/wasm/zh', contextKey: 'chat/sdk/wasm' }; const auditPages = new Map([ + [android.path, page(android.path, 'published', 'published')], [pending.path, page(pending.path, 'deferred', 'written')], [enOnly.path, page(enOnly.path, 'published', 'deferred')], [zhOnly.path, page(zhOnly.path, 'deferred', 'published')], @@ -26,11 +27,11 @@ test('expects non-client routes and only locale-published client SDK routes', () assert.deepEqual( validateSearchIndexPaths({ - routes: [nonWasm, pending, enOnly, zhOnly], + routes: [android, pending, enOnly, zhOnly], auditPages, indexes: { - en: [{ path: nonWasm.path }, { path: enOnly.path }], - zh: [{ path: nonWasm.path }, { path: zhOnly.path }], + en: [{ path: android.path }, { path: enOnly.path }], + zh: [{ path: android.path }, { path: zhOnly.path }], }, }), [], diff --git a/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs b/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs index 90b591dfa3..8bd14b6654 100644 --- a/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs +++ b/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs @@ -63,12 +63,14 @@ test('replaces legacy platform route records with the reviewed active tree', () test('resolves every active native suffix against the current WASM routes', () => { const routes = readJson('src/generated/routes.json'); - for (const platformId of ['ios', 'flutter']) { + for (const platformId of ['android', 'ios', 'flutter']) { const sidebar = readJson(`data/structure/${platformId}-sidebar.json`); const resolved = resolveClientSdkSkeletonRoutes({ platformId, sidebar, routes }); assert.equal(resolved.length, getSidebarPathCount(sidebar)); assert.equal(resolved[0].path, `/sdk/${platformId}/overview`); - assert.equal(resolved[0].title, `OpenIM SDK for ${platformId === 'ios' ? 'iOS' : 'Flutter'}`); + const displayName = + platformId === 'ios' ? 'iOS' : platformId === 'android' ? 'Android' : 'Flutter'; + assert.equal(resolved[0].title, `OpenIM SDK for ${displayName}`); } }); @@ -93,6 +95,29 @@ test('uses each native SDK method name while preserving the shared WASM route su ); }); +test('supports reviewed Android extension routes outside the WASM tree', () => { + const routes = readJson('src/generated/routes.json'); + const sidebar = readJson('data/structure/android-sidebar.json'); + const resolved = resolveClientSdkSkeletonRoutes({ platformId: 'android', sidebar, routes }); + assert.ok( + resolved.some( + (route) => + route.path === '/sdk/android/user/user-profile/get-self-local-user-info' && + route.title === 'Get the current user profile', + ), + ); + + const next = replaceClientSdkRouteRecords({ platformId: 'android', sidebar, routes }); + const extension = next.find( + (route) => route.path === '/sdk/android/user/online-status/subscribe-users-online-status', + ); + assert.equal(extension?.template, 'guide'); + assert.equal( + extension?.contentFile, + 'content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx', + ); +}); + function getSidebarPathCount(sidebar) { const count = (nodes) => nodes.reduce( diff --git a/scripts/__tests__/wasm-commercial.test.mjs b/scripts/__tests__/wasm-commercial.test.mjs index 2e0fed8525..c6575d761e 100644 --- a/scripts/__tests__/wasm-commercial.test.mjs +++ b/scripts/__tests__/wasm-commercial.test.mjs @@ -3,6 +3,7 @@ import { readFileSync } from 'node:fs'; import test from 'node:test'; const ownership = JSON.parse(readFileSync('data/structure/wasm-api-ownership.json', 'utf8')); +const androidAudit = JSON.parse(readFileSync('data/structure/android-content-audit.json', 'utf8')); const flutterAudit = JSON.parse(readFileSync('data/structure/flutter-content-audit.json', 'utf8')); const iosAudit = JSON.parse(readFileSync('data/structure/ios-content-audit.json', 'utf8')); @@ -82,6 +83,7 @@ const nonCommercialEvents = [ ]; const platformSymbolAliases = { + android: {}, flutter: { getConversationGroupByConversationID: 'getConversationGroupIDsByConversationID', onHangup: 'OnHangUp', @@ -143,6 +145,9 @@ const fullCommercialConceptPages = new Set([ '/sdk/ios/conversation/managing-conversations/set-message-destruct', '/sdk/ios/conversation/managing-conversations/set-message-destruct-time', '/sdk/ios/message/composing-messages/save-local-transcript', + '/sdk/android/conversation/managing-conversations/set-private-chat', + '/sdk/android/conversation/managing-conversations/set-burn-duration', + '/sdk/android/conversation/managing-conversations/set-message-destruct', ]); function applyCommercialConceptOverride(pagePath, info) { @@ -202,7 +207,7 @@ function getPageCommercialInfo(pagePath) { }; } - const match = pagePath.match(/^\/sdk\/(wasm|flutter|ios)(\/.*)$/); + const match = pagePath.match(/^\/sdk\/(android|wasm|flutter|ios)(\/.*)$/); if (!match) return { kind: 'none', methods: [], openSourceMethods: [], events: [] }; const platform = match[1]; @@ -211,7 +216,8 @@ function getPageCommercialInfo(pagePath) { return applyCommercialConceptOverride(pagePath, getWasmPageCommercialInfo(wasmPath)); } - const audit = platform === 'flutter' ? flutterAudit : iosAudit; + const audit = + platform === 'android' ? androidAudit : platform === 'flutter' ? flutterAudit : iosAudit; const page = audit.pages.find( (entry) => entry.currentPath === pagePath && entry.disposition !== 'omit', ); diff --git a/scripts/build-client-sdk-zh-content.mjs b/scripts/build-client-sdk-zh-content.mjs index 79331aea48..ab8744aca0 100644 --- a/scripts/build-client-sdk-zh-content.mjs +++ b/scripts/build-client-sdk-zh-content.mjs @@ -142,7 +142,7 @@ export function resolvePlatformRoutes({ platform, routesData, sidebar }) { suffix === 'overview' ? platform.id === 'wasm' ? structuralRoute.title - : `OpenIM SDK for ${platform.id === 'ios' ? 'iOS' : 'Flutter'}` + : `OpenIM SDK for ${platform.id === 'ios' ? 'iOS' : platform.id === 'android' ? 'Android' : 'Flutter'}` : structuralRoute.title, }; }); @@ -150,7 +150,7 @@ export function resolvePlatformRoutes({ platform, routesData, sidebar }) { async function main() { const requested = process.argv.slice(2).filter((value) => !value.startsWith('-')); - const platformIds = requested.length > 0 ? requested : ['ios', 'flutter', 'wasm']; + const platformIds = requested.length > 0 ? requested : ['android', 'ios', 'flutter', 'wasm']; for (const platformId of platformIds) { const output = await buildClientSdkLocalizedFile(platformId); console.log( diff --git a/scripts/check-client-sdk-content-audit.mjs b/scripts/check-client-sdk-content-audit.mjs index 22be4be8eb..c01690a538 100644 --- a/scripts/check-client-sdk-content-audit.mjs +++ b/scripts/check-client-sdk-content-audit.mjs @@ -169,6 +169,10 @@ function validateManualPage({ platform, page, path, source, errors }) { ) { errors.push(`${path}: content invents a Flutter listener removal API`); } + } else if (platform.id === 'android') { + if ((page.sdkMethods?.length ?? 0) > 0 && !source.includes('```java')) { + errors.push(`${path}: method page requires a Java example`); + } } } @@ -192,7 +196,7 @@ function extractDartCodeBlocks(source) { async function main() { const requested = process.argv.slice(2).filter((value) => !value.startsWith('-')); - const platformIds = requested.length > 0 ? requested : ['ios', 'flutter']; + const platformIds = requested.length > 0 ? requested : ['android', 'ios', 'flutter']; let failed = false; for (const platformId of platformIds) { const platform = getClientSdkPlatform(platformId); diff --git a/scripts/lib/client-sdk-platforms.mjs b/scripts/lib/client-sdk-platforms.mjs index b326948cdb..724b7d4f2e 100644 --- a/scripts/lib/client-sdk-platforms.mjs +++ b/scripts/lib/client-sdk-platforms.mjs @@ -1,4 +1,17 @@ const clientSdkPlatforms = { + android: { + id: 'android', + contextKey: 'chat/sdk/android', + routePrefix: '/sdk/android', + manualRoot: 'content/zh/docs/chat/sdk/android', + auditPath: 'data/structure/android-content-audit.json', + labelsPath: 'data/structure/android-navigation-labels.json', + sidebarPath: 'data/structure/android-sidebar.json', + localizedOutputPath: 'src/generated/android-sdk-zh-content.json', + sdkSourceKey: 'androidSdk', + sdkTag: 'v3.8.4.0', + sdkCommit: 'f82b142c7d3b4b66ce20586adabc69de9cd61673', + }, ios: { id: 'ios', contextKey: 'chat/sdk/ios', diff --git a/scripts/sync-client-sdk-route-skeletons.mjs b/scripts/sync-client-sdk-route-skeletons.mjs index 3618d34c98..a611e3ac20 100644 --- a/scripts/sync-client-sdk-route-skeletons.mjs +++ b/scripts/sync-client-sdk-route-skeletons.mjs @@ -7,6 +7,35 @@ import { getClientSdkSidebarPaths } from './lib/client-sdk-sidebar.mjs'; const root = process.cwd(); +const androidRouteTitles = { + 'user/overview-user': 'User overview', + 'user/user-profile/get-users-info': 'Get specified user profiles', + 'user/user-profile/get-self-local-user-info': 'Get the current user profile', + 'user/user-profile/set-self-info': 'Update the current user profile', + 'user/user-profile/set-global-message-reception': 'Set global message reception', + 'user/friends/get-friend-list-page': 'Get the friend list by page', + 'user/friends/search-friends': 'Search friends', + 'user/friends/get-friends-info': 'Get specified friend profiles', + 'user/friends/check-friend': 'Check friendship', + 'user/friends/update-friends': 'Update friend profiles', + 'user/friends/delete-friend': 'Delete a friend', + 'user/friend-applications/add-friend': 'Send a friend request', + 'user/friend-applications/get-recv-friend-application-list': 'Get received friend requests', + 'user/friend-applications/get-send-friend-application-list': 'Get sent friend requests', + 'user/friend-applications/accept-friend-application': 'Accept a friend request', + 'user/friend-applications/refuse-friend-application': 'Reject a friend request', + 'user/blacklist/get-blacklist': 'Get the blacklist', + 'user/blacklist/add-blacklist': 'Block a user', + 'user/blacklist/remove-blacklist': 'Unblock a user', + 'user/online-status/subscribe-users-online-status': 'Subscribe to user online status', + 'user/online-status/get-subscribe-online-users-status': 'Get subscribed user online status', + 'group/group-applications/overview-group-applications': 'Group applications overview', + 'group/retrieving-group-members/overview-retrieving-group-members': + 'Group member queries overview', + 'message/sending-messages/set-msg-send-progress-listener': 'Track message sending progress', + 'file-uploads/track-file-upload-progress': 'Track file upload progress', +}; + const conversationGroupTitles = { ios: { 'conversation/managing-conversation-groups/overview-conversation-groups': @@ -55,13 +84,13 @@ const conversationGroupTitles = { }; export function resolveClientSdkRouteTitle({ platformId, suffix, baselineTitle }) { - if (suffix === 'overview') - return `OpenIM SDK for ${platformId === 'ios' ? 'iOS' : 'Flutter'}`; + if (suffix === 'overview') return `OpenIM SDK for ${getPlatformDisplayName(platformId)}`; + if (platformId === 'android' && androidRouteTitles[suffix]) return androidRouteTitles[suffix]; return conversationGroupTitles[platformId]?.[suffix] ?? baselineTitle; } export function buildClientSdkSkeleton({ path, platformId, title }) { - const platformName = platformId === 'ios' ? 'iOS' : 'Flutter'; + const platformName = getPlatformDisplayName(platformId); const template = path === `/sdk/${platformId}/overview` ? 'overview' : 'guide'; return `--- title: '${escapeSingleQuote(title)}' @@ -87,8 +116,10 @@ export function isGeneratedClientSdkSkeleton(source) { return ( /generatedBy:\s*['"]sync-client-sdk-route-skeletons['"]/.test(source) || (/status:\s*['"]draft['"]/.test(source) && - /context:\s*['"]chat\/sdk\/(?:ios|flutter)['"]/.test(source) && - /The English version of this OpenIM (?:iOS|Flutter) SDK guide is deferred/.test(source)) + /context:\s*['"]chat\/sdk\/(?:android|ios|flutter)['"]/.test(source) && + /The English version of this OpenIM (?:Android|iOS|Flutter) SDK guide is deferred/.test( + source, + )) ); } @@ -103,14 +134,15 @@ export function resolveClientSdkSkeletonRoutes({ platformId, sidebar, routes }) const suffix = path.replace(`/sdk/${platformId}/`, ''); const baseline = wasmBySuffix.get(suffix); const existing = routeByPath.get(path); - if (!baseline && !existing) + const extensionTitle = platformId === 'android' ? androidRouteTitles[suffix] : undefined; + if (!baseline && !existing && !extensionTitle) throw new Error(`[${platformId}] missing WASM baseline or platform extension: ${suffix}`); return { path, title: resolveClientSdkRouteTitle({ platformId, suffix, - baselineTitle: existing?.title ?? baseline.title, + baselineTitle: existing?.title ?? baseline?.title ?? extensionTitle, }), }; }); @@ -125,7 +157,8 @@ export function replaceClientSdkRouteRecords({ platformId, sidebar, routes }) { const otherRoutes = routes.filter((route) => route.contextKey !== platform.contextKey); const baseId = Math.max(...otherRoutes.map((route) => route.id)) + 1; const baseSourceIndex = Math.max(...otherRoutes.map((route) => route.sourceIndex)) + 1; - const contextTitle = `SDKs · ${platformId === 'ios' ? 'iOS' : 'Flutter'} · v4`; + const platformName = getPlatformDisplayName(platformId); + const contextTitle = `SDKs · ${platformName} · v4`; const wasmBySuffix = new Map( routes .filter((route) => route.contextKey === 'chat/sdk/wasm') @@ -136,12 +169,13 @@ export function replaceClientSdkRouteRecords({ platformId, sidebar, routes }) { const suffix = path.replace(`${platform.routePrefix}/`, ''); const baseline = wasmBySuffix.get(suffix); const template = baseline ?? existingByPath.get(path); - if (!template) + const extensionTitle = platformId === 'android' ? androidRouteTitles[suffix] : undefined; + if (!template && !extensionTitle) throw new Error(`[${platformId}] missing WASM baseline or platform extension: ${suffix}`); const title = resolveClientSdkRouteTitle({ platformId, suffix, - baselineTitle: template.title, + baselineTitle: template?.title ?? extensionTitle, }); return { ...template, @@ -150,10 +184,14 @@ export function replaceClientSdkRouteRecords({ platformId, sidebar, routes }) { relativePath: `sdk/${platformId}/${suffix}`, sourcePath: path, title, - description: `OpenIM ${platformId === 'ios' ? 'iOS' : 'Flutter'} SDK guide for ${title}.`, + description: `OpenIM ${platformName} SDK guide for ${title}.`, + product: 'sdk', + version: 'v4', platform: platformId, contextKey: platform.contextKey, contextTitle, + template: template?.template ?? 'guide', + status: template?.status ?? 'draft', sourceIndex: baseSourceIndex + index, contentFile: `content/docs/chat/sdk/${platformId}/${suffix}.mdx`, navOrder: baseNavOrder + index, @@ -167,7 +205,7 @@ export function replaceClientSdkRouteRecords({ platformId, sidebar, routes }) { async function main() { const requested = process.argv.slice(2).filter((value) => !value.startsWith('-')); - const platformIds = requested.length > 0 ? requested : ['ios', 'flutter']; + const platformIds = requested.length > 0 ? requested : ['android', 'ios', 'flutter']; let routes = await readJson('src/generated/routes.json'); for (const platformId of platformIds) { @@ -242,6 +280,12 @@ async function readJson(relativePath) { return JSON.parse(await readFile(resolve(root, relativePath), 'utf8')); } +function getPlatformDisplayName(platformId) { + if (platformId === 'ios') return 'iOS'; + if (platformId === 'android') return 'Android'; + return 'Flutter'; +} + function escapeSingleQuote(value) { return value.replaceAll("'", "''"); } diff --git a/scripts/sync-content-metadata.mjs b/scripts/sync-content-metadata.mjs index 67a9b43679..a67ed1c988 100644 --- a/scripts/sync-content-metadata.mjs +++ b/scripts/sync-content-metadata.mjs @@ -10,6 +10,7 @@ import { const root = process.cwd(); const routesPath = resolve(root, 'src/generated/routes.json'); const navigationPath = resolve(root, 'src/generated/navigation.json'); +const structurePath = resolve(root, 'data/structure/chat-pages.json'); const routes = JSON.parse(await readFile(routesPath, 'utf8')); const navigation = JSON.parse(await readFile(navigationPath, 'utf8')); const clientSdkSidebars = new Map( @@ -92,7 +93,8 @@ for (const context of navigation.contexts) { for (const platformId of clientSdkPlatformIds) { if (sidebarDecisions.get(platformId).mode === 'skip') { const pageCount = getClientSdkSidebarPaths(clientSdkSidebars.get(platformId)).length; - const platformName = platformId === 'ios' ? 'iOS' : 'Flutter'; + const platformName = + platformId === 'ios' ? 'iOS' : platformId === 'android' ? 'Android' : 'Flutter'; console.log( `Skipped ${platformName} client SDK sidebar sync: native route tree has not migrated to all ${pageCount} reviewed paths.`, ); @@ -102,6 +104,22 @@ for (const platformId of clientSdkPlatformIds) { await Promise.all([ writeFile(routesPath, `${JSON.stringify(routes, null, 2)}\n`, 'utf8'), writeFile(navigationPath, `${JSON.stringify(navigation, null, 2)}\n`, 'utf8'), + writeFile( + structurePath, + `${JSON.stringify( + routes.map((route) => ({ + sourcePath: route.sourcePath, + openimPath: route.path, + title: route.title, + context: route.contextKey, + template: route.template, + contentFile: route.contentFile, + })), + null, + 2, + )}\n`, + 'utf8', + ), ]); console.log(`Synchronized content metadata (${changed.toLocaleString()} changed fields).`); diff --git a/src/components/docs/documentation-page.tsx b/src/components/docs/documentation-page.tsx index 460333bc88..1e16f03ed2 100644 --- a/src/components/docs/documentation-page.tsx +++ b/src/components/docs/documentation-page.tsx @@ -291,6 +291,7 @@ export async function renderDocumentationPage( function getSdkOverviewPlatform(path: string): SdkOverviewPlatform | undefined { const overviewPaths: Record = { + '/sdk/android/overview': 'android', '/sdk/flutter/overview': 'flutter', '/sdk/ios/overview': 'ios', '/sdk/wasm/overview': 'wasm', diff --git a/src/components/docs/sdk-overview-page.tsx b/src/components/docs/sdk-overview-page.tsx index 8463905f94..f51dabfc25 100644 --- a/src/components/docs/sdk-overview-page.tsx +++ b/src/components/docs/sdk-overview-page.tsx @@ -24,7 +24,7 @@ type ResourceLink = { title: string; }; -export type SdkOverviewPlatform = 'flutter' | 'ios' | 'wasm'; +export type SdkOverviewPlatform = 'android' | 'flutter' | 'ios' | 'wasm'; type OverviewCopy = { eyebrow: string; @@ -211,6 +211,54 @@ const copy = { } satisfies Record; const mobileCopy = { + android: { + eyebrow: 'Version 4', + intro: + 'OpenIM Android SDK 为原生 Android 应用提供用户、会话、群组、消息、实时事件和本地存储能力。先完成 Android 工程配置与登录,再通过各 manager 的 API 和 listener 把业务数据接入应用状态。', + mostPopular: '热门主题', + recommended: '推荐功能', + resources: '资源', + popular: createMobilePopularCards('android'), + features: [ + { + title: '用户认证', + description: '使用后端签发的 Token 登录,并处理连接、过期和被踢下线事件。', + href: '/sdk/android/getting-started/authenticate-and-manage-session', + }, + { + title: '群组', + description: '管理群资料、群成员、入群申请、权限和群组事件。', + href: '/sdk/android/group/overview-group', + }, + { + title: '事件', + description: '注册各 manager 的 listener,并按稳定标识合并增量数据。', + href: '/sdk/android/events/overview-events', + }, + ], + links: [ + { + title: '发送第一条消息', + description: '完成接入、初始化、登录、选择目标并发送消息。', + href: '/sdk/android/getting-started/send-first-message', + }, + { + title: 'Android 环境接入', + description: '配置 Android 工程、SDK 初始化、网络权限和应用数据目录。', + href: '/sdk/android/getting-started/environment-specific-implementation', + }, + { + title: '日志与诊断', + description: '配置 SDK 日志,并保留错误码和错误信息用于诊断。', + href: '/sdk/android/logger', + }, + { + title: '客户端 SDK 错误码', + description: '查询通用客户端错误码,并按错误来源选择处理方式。', + href: '/sdk/error-codes', + }, + ], + }, flutter: { eyebrow: 'Version 4', intro: diff --git a/src/config/docs.ts b/src/config/docs.ts index afa31f2c3c..5910c84e39 100644 --- a/src/config/docs.ts +++ b/src/config/docs.ts @@ -26,7 +26,7 @@ export const platformLabels: Record = { export const webCompatibleSdkPlatforms = ['wasm', 'electron', 'miniprogram'] as const; /** Temporarily hidden from SDK nav, home cards, and platform switcher. Routes remain. */ -export const hiddenSdkPlatforms = ['android', 'uniapp', 'react-native'] as const; +export const hiddenSdkPlatforms = ['uniapp', 'react-native'] as const; export function isSdkPlatformVisible(platform?: string | null): boolean { if (!platform) return true; @@ -52,6 +52,7 @@ export const sdkPlatformSections: SdkPlatformSection[] = [ { items: [ { label: 'iOS', platform: 'ios', href: '/sdk/ios/overview' }, + { label: 'Android', platform: 'android', href: '/sdk/android/overview' }, { label: 'Flutter', platform: 'flutter', href: '/sdk/flutter/overview' }, ], }, diff --git a/src/generated/android-sdk-zh-content.json b/src/generated/android-sdk-zh-content.json new file mode 100644 index 0000000000..93cc315043 --- /dev/null +++ b/src/generated/android-sdk-zh-content.json @@ -0,0 +1,1765 @@ +{ + "sourceContext": "chat/sdk/android", + "sourceRoot": "content/zh/docs/chat/sdk/android", + "pageCount": 134, + "manualPageCount": 134, + "pendingPaths": [], + "reviewStates": { + "/sdk/android/overview": "published", + "/sdk/android/getting-started/before-you-start": "published", + "/sdk/android/getting-started/environment-specific-implementation": "published", + "/sdk/android/getting-started/authenticate-and-manage-session": "published", + "/sdk/android/getting-started/send-first-message": "published", + "/sdk/android/user/overview-user": "published", + "/sdk/android/user/user-profile/get-users-info": "published", + "/sdk/android/user/user-profile/get-self-local-user-info": "published", + "/sdk/android/user/user-profile/set-self-info": "published", + "/sdk/android/user/user-profile/set-global-message-reception": "published", + "/sdk/android/user/online-status/subscribe-users-online-status": "published", + "/sdk/android/user/online-status/get-subscribe-online-users-status": "published", + "/sdk/android/user/friends/get-friend-list-page": "published", + "/sdk/android/user/friends/search-friends": "published", + "/sdk/android/user/friends/get-friends-info": "published", + "/sdk/android/user/friends/check-friend": "published", + "/sdk/android/user/friends/update-friends": "published", + "/sdk/android/user/friends/delete-friend": "published", + "/sdk/android/user/friend-applications/add-friend": "published", + "/sdk/android/user/friend-applications/get-recv-friend-application-list": "published", + "/sdk/android/user/friend-applications/get-send-friend-application-list": "published", + "/sdk/android/user/friend-applications/accept-friend-application": "published", + "/sdk/android/user/friend-applications/refuse-friend-application": "published", + "/sdk/android/user/blacklist/get-blacklist": "published", + "/sdk/android/user/blacklist/add-blacklist": "published", + "/sdk/android/user/blacklist/remove-blacklist": "published", + "/sdk/android/conversation/overview-conversation": "published", + "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target": "published", + "/sdk/android/conversation/retrieving-conversations/get-conversation-id": "published", + "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id": "published", + "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list": "published", + "/sdk/android/conversation/managing-conversations/pin-conversation": "published", + "/sdk/android/conversation/managing-conversations/set-conversation-extension": "published", + "/sdk/android/conversation/managing-conversations/set-conversation-draft": "published", + "/sdk/android/conversation/managing-conversations/set-message-receive-option": "published", + "/sdk/android/conversation/managing-conversations/clear-group-mentions": "published", + "/sdk/android/conversation/managing-conversations/mark-conversation-read": "published", + "/sdk/android/conversation/managing-conversations/get-total-unread-count": "published", + "/sdk/android/conversation/managing-conversations/set-private-chat": "published", + "/sdk/android/conversation/managing-conversations/set-burn-duration": "published", + "/sdk/android/conversation/managing-conversations/set-message-destruct": "published", + "/sdk/android/conversation/managing-conversations/hide-a-conversation": "published", + "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages": "published", + "/sdk/android/conversation/managing-conversations/clear-conversation-messages": "published", + "/sdk/android/group/overview-group": "published", + "/sdk/android/group/create-group": "published", + "/sdk/android/group/update-group-profile": "published", + "/sdk/android/group/set-group-announcement": "published", + "/sdk/android/group/set-group-extension": "published", + "/sdk/android/group/set-group-join-verification": "published", + "/sdk/android/group/set-group-member-profile-access": "published", + "/sdk/android/group/set-group-member-friend-permission": "published", + "/sdk/android/group/change-group-mute": "published", + "/sdk/android/group/join-group": "published", + "/sdk/android/group/quit-group": "published", + "/sdk/android/group/dismiss-group": "published", + "/sdk/android/group/retrieving-groups/get-specified-groups-info": "published", + "/sdk/android/group/retrieving-groups/get-joined-group-list-page": "published", + "/sdk/android/group/retrieving-groups/is-join-group": "published", + "/sdk/android/group/retrieving-groups/search-groups": "published", + "/sdk/android/group/group-applications/overview-group-applications": "published", + "/sdk/android/group/group-applications/get-group-application-list-as-recipient": "published", + "/sdk/android/group/group-applications/get-group-application-list-as-applicant": "published", + "/sdk/android/group/group-applications/accept-group-application": "published", + "/sdk/android/group/group-applications/refuse-group-application": "published", + "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members": "published", + "/sdk/android/group/retrieving-group-members/get-group-member-list": "published", + "/sdk/android/group/retrieving-group-members/get-specified-group-members-info": "published", + "/sdk/android/group/retrieving-group-members/get-users-in-group": "published", + "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin": "published", + "/sdk/android/group/retrieving-group-members/search-group-members": "published", + "/sdk/android/group/managing-group-members/invite-user-to-group": "published", + "/sdk/android/group/managing-group-members/kick-group-member": "published", + "/sdk/android/group/managing-group-members/set-group-member-nickname": "published", + "/sdk/android/group/managing-group-members/set-group-member-role-level": "published", + "/sdk/android/group/managing-group-members/set-group-member-avatar": "published", + "/sdk/android/group/managing-group-members/set-group-member-extension": "published", + "/sdk/android/group/managing-group-members/transfer-group-owner": "published", + "/sdk/android/group/managing-group-members/change-group-member-mute": "published", + "/sdk/android/message/overview-message": "published", + "/sdk/android/message/creating-messages/create-text-message": "published", + "/sdk/android/message/creating-messages/create-text-at-message": "published", + "/sdk/android/message/creating-messages/create-custom-message": "published", + "/sdk/android/message/creating-messages/create-image-message-by-file": "published", + "/sdk/android/message/creating-messages/create-image-message-by-url": "published", + "/sdk/android/message/creating-messages/create-sound-message-by-file": "published", + "/sdk/android/message/creating-messages/create-sound-message-by-url": "published", + "/sdk/android/message/creating-messages/create-video-message-by-file": "published", + "/sdk/android/message/creating-messages/create-video-message-by-url": "published", + "/sdk/android/message/creating-messages/create-file-message-by-file": "published", + "/sdk/android/message/creating-messages/create-file-message-by-url": "published", + "/sdk/android/message/creating-messages/create-card-message": "published", + "/sdk/android/message/creating-messages/create-location-message": "published", + "/sdk/android/message/creating-messages/create-face-message": "published", + "/sdk/android/message/creating-messages/create-quote-message": "published", + "/sdk/android/message/creating-messages/create-forward-message": "published", + "/sdk/android/message/creating-messages/create-merger-message": "published", + "/sdk/android/message/sending-messages/send-message": "published", + "/sdk/android/message/sending-messages/send-message-not-oss": "published", + "/sdk/android/message/sending-messages/set-msg-send-progress-listener": "published", + "/sdk/android/message/receiving-messages/receive-messages": "published", + "/sdk/android/message/receiving-messages/receive-custom-business-messages": "published", + "/sdk/android/message/retrieving-messages/load-older-messages": "published", + "/sdk/android/message/retrieving-messages/load-newer-messages": "published", + "/sdk/android/message/retrieving-messages/find-messages-by-id": "published", + "/sdk/android/message/searching-messages/search-messages": "published", + "/sdk/android/message/composing-messages/update-typing-status": "published", + "/sdk/android/message/managing-messages/delete-local-message": "published", + "/sdk/android/message/managing-messages/delete-saved-messages": "published", + "/sdk/android/message/managing-messages/revoke-a-message": "published", + "/sdk/android/message/managing-messages/modify-a-message": "published", + "/sdk/android/message/managing-messages/get-pinned-messages": "published", + "/sdk/android/message/managing-messages/set-message-pinned": "published", + "/sdk/android/message/managing-messages/insert-local-single-message": "published", + "/sdk/android/message/managing-messages/insert-local-group-message": "published", + "/sdk/android/message/managing-messages/clear-all-local-messages": "published", + "/sdk/android/message/managing-messages/clear-all-messages": "published", + "/sdk/android/message/managing-messages/set-message-local-ex": "published", + "/sdk/android/file-uploads/track-file-upload-progress": "published", + "/sdk/android/file-uploads/upload-file": "published", + "/sdk/android/calling/overview-calling": "published", + "/sdk/android/calling/managing-calls/start-single-call": "published", + "/sdk/android/calling/managing-calls/start-group-call": "published", + "/sdk/android/calling/managing-calls/accept-call": "published", + "/sdk/android/calling/managing-calls/reject-call": "published", + "/sdk/android/calling/managing-calls/cancel-call": "published", + "/sdk/android/calling/managing-calls/hang-up-call": "published", + "/sdk/android/calling/managing-calls/handle-call-events": "published", + "/sdk/android/calling/retrieving-call-information/restore-pending-invitation": "published", + "/sdk/android/calling/retrieving-call-information/get-room-by-group-id": "published", + "/sdk/android/calling/retrieving-call-information/get-token-by-room-id": "published", + "/sdk/android/calling/sending-custom-signals/send-a-custom-signal": "published", + "/sdk/android/events/overview-events": "published", + "/sdk/android/logger": "published" + }, + "navigationLabels": { + "OpenIM SDK for Android": "OpenIM Android SDK 概览", + "Overview": "概览", + "overview": "概览", + "Getting started": "快速开始", + "getting-started": "快速开始", + "Before you start": "开始之前", + "before-you-start": "开始之前", + "Integrate for Android": "按 Android 环境接入", + "Environment-specific implementation": "按 Android 环境接入", + "environment-specific-implementation": "按 Android 环境接入", + "Authenticate and manage a session": "认证与管理登录会话", + "authenticate-and-manage-session": "认证与管理登录会话", + "Send your first message": "发送第一条消息", + "send-first-message": "发送第一条消息", + "Users": "用户", + "User": "用户", + "user": "用户", + "User overview": "用户概览", + "overview-user": "用户概览", + "User profiles": "用户资料", + "User profile": "用户资料", + "user-profile": "用户资料", + "user/user-profile": "用户资料", + "Get specified user profiles": "获取指定用户资料", + "get-users-info": "获取指定用户资料", + "Get the current user profile": "获取当前用户资料", + "get-self-local-user-info": "获取当前用户资料", + "Update the current user profile": "更新当前用户资料", + "set-self-info": "更新当前用户资料", + "Set global message reception": "设置全局消息接收方式", + "set-global-message-reception": "设置全局消息接收方式", + "Relationships": "关系链", + "relationships": "关系链", + "Friends": "好友", + "friends": "好友", + "user/friends": "好友", + "Get the friend list by page": "分页获取好友列表", + "Get the friend list": "分页获取好友列表", + "get-friend-list-page": "分页获取好友列表", + "Search friends": "搜索好友", + "search-friends": "搜索好友", + "Get specified friend profiles": "查询指定好友资料", + "Get friend profiles": "查询指定好友资料", + "get-friends-info": "查询指定好友资料", + "Check friendship": "检查好友关系", + "Check friendship status": "检查好友关系", + "check-friend": "检查好友关系", + "Update friend profiles": "更新好友资料", + "Update friend information": "更新好友资料", + "update-friends": "更新好友资料", + "Delete a friend": "删除好友", + "delete-friend": "删除好友", + "Friend requests": "好友申请", + "Friend applications": "好友申请", + "friend-applications": "好友申请", + "user/friend-applications": "好友申请", + "Send a friend request": "发送好友申请", + "Send a friend application": "发送好友申请", + "add-friend": "发送好友申请", + "Get received friend requests": "获取收到的好友申请", + "Get received friend applications": "获取收到的好友申请", + "get-recv-friend-application-list": "获取收到的好友申请", + "Get sent friend requests": "获取发出的好友申请", + "Get sent friend applications": "获取发出的好友申请", + "get-send-friend-application-list": "获取发出的好友申请", + "Accept a friend request": "接受好友申请", + "Accept a friend application": "接受好友申请", + "accept-friend-application": "接受好友申请", + "Reject a friend request": "拒绝好友申请", + "Reject a friend application": "拒绝好友申请", + "refuse-friend-application": "拒绝好友申请", + "Blacklist": "黑名单", + "blacklist": "黑名单", + "user/blacklist": "黑名单", + "Get the blacklist": "获取黑名单列表", + "get-blacklist": "获取黑名单列表", + "Block a user": "拉黑用户", + "add-blacklist": "拉黑用户", + "Unblock a user": "取消拉黑用户", + "remove-blacklist": "取消拉黑用户", + "Online status": "在线状态", + "online-status": "在线状态", + "user/online-status": "在线状态", + "Subscribe to user online status": "订阅用户在线状态", + "Subscribe to user status": "订阅用户在线状态", + "subscribe-users-online-status": "订阅用户在线状态", + "Get subscribed user online status": "查询已订阅用户状态", + "Refresh subscribed user status": "查询已订阅用户状态", + "get-subscribe-online-users-status": "查询已订阅用户状态", + "Conversation": "会话", + "conversation": "会话", + "Conversation overview": "会话概览", + "overview-conversation": "会话概览", + "Retrieving conversations": "查询会话", + "retrieving-conversations": "查询会话", + "Open a conversation": "查询指定会话", + "get-conversation-by-target": "查询指定会话", + "Resolve a conversation ID": "生成会话 ID", + "get-conversation-id": "生成会话 ID", + "Get conversations by ID": "按 ID 批量获取会话", + "get-conversations-by-id": "按 ID 批量获取会话", + "Get the conversation list": "获取会话列表", + "retrieve-conversation-list": "获取会话列表", + "Conversation organization": "会话整理", + "conversation-list-and-drafts": "会话整理", + "Pin or unpin a conversation": "置顶或取消置顶会话", + "pin-conversation": "置顶或取消置顶会话", + "Set conversation extra data": "设置会话扩展字段", + "set-conversation-extension": "设置会话扩展字段", + "Set a conversation draft": "设置会话草稿", + "set-conversation-draft": "设置会话草稿", + "Unread status and notifications": "未读与消息提醒", + "message-reception-and-reminders": "未读与消息提醒", + "Set conversation message reception": "设置会话消息接收方式", + "set-message-receive-option": "设置会话消息接收方式", + "Reset group mention status": "重置群聊 @ 状态", + "clear-group-mentions": "重置群聊 @ 状态", + "Mark a conversation as read": "标记会话已读", + "mark-conversation-read": "标记会话已读", + "Track the total unread count": "获取消息总未读数", + "get-total-unread-count": "获取消息总未读数", + "Message retention and privacy": "消息保留与隐私", + "message-retention-and-privacy": "消息保留与隐私", + "Enable or disable burn after reading": "开启或关闭阅后即焚", + "set-private-chat": "开启或关闭阅后即焚", + "Set the burn duration": "设置阅后即焚时长", + "set-burn-duration": "设置阅后即焚时长", + "Schedule server message deletion": "定期删除服务端消息", + "set-message-destruct": "定期删除服务端消息", + "Hiding and deleting conversations": "隐藏与删除会话", + "hiding-and-deleting-conversations": "隐藏与删除会话", + "Hide a conversation": "隐藏会话", + "hide-a-conversation": "隐藏会话", + "Delete a conversation and its messages": "删除会话及消息", + "delete-conversation-with-messages": "删除会话及消息", + "Clear messages in a conversation": "清空会话消息", + "clear-conversation-messages": "清空会话消息", + "Group": "群组", + "group": "群组", + "Group overview": "群组概览", + "overview-group": "群组概览", + "Group profile and settings": "群资料与设置", + "profile-and-settings": "群资料与设置", + "Create a group": "创建群组", + "create-group": "创建群组", + "Update group profile": "更新群资料", + "update-group-profile": "更新群资料", + "Publish a group announcement": "发布群公告", + "set-group-announcement": "发布群公告", + "Set group extra data": "设置群扩展字段", + "set-group-extension": "设置群扩展字段", + "Group permissions": "群权限", + "permissions": "群权限", + "Set group join verification": "设置入群验证方式", + "set-group-join-verification": "设置入群验证方式", + "Set member profile access": "设置成员资料查看权限", + "set-group-member-profile-access": "设置成员资料查看权限", + "Set member friend request permission": "设置成员好友申请权限", + "set-group-member-friend-permission": "设置成员好友申请权限", + "Change group mute status": "设置全员禁言", + "change-group-mute": "设置全员禁言", + "Joining and leaving groups": "加入与退出群组", + "joining-and-leaving": "加入与退出群组", + "Apply to join a group": "申请加入群组", + "join-group": "申请加入群组", + "Leave a group": "退出群组", + "quit-group": "退出群组", + "Dismiss a group": "解散群组", + "dismiss-group": "解散群组", + "Retrieving groups": "查询群组", + "retrieving-groups": "查询群组", + "Get group information": "获取群资料", + "get-specified-groups-info": "获取群资料", + "Get joined groups by page": "分页获取已加入群组", + "get-joined-group-list-page": "分页获取已加入群组", + "Check group membership": "检查是否加入群组", + "is-join-group": "检查是否加入群组", + "Search groups": "搜索群组", + "search-groups": "搜索群组", + "Group applications": "群申请", + "group-applications": "群申请", + "Group applications overview": "群申请概览", + "overview-group-applications": "群申请概览", + "Get received group applications": "获取收到的群申请", + "get-group-application-list-as-recipient": "获取收到的群申请", + "Get sent group applications": "获取发出的群申请", + "get-group-application-list-as-applicant": "获取发出的群申请", + "Accept a group application": "同意群申请", + "accept-group-application": "同意群申请", + "Reject a group application": "拒绝群申请", + "refuse-group-application": "拒绝群申请", + "Retrieving group members": "查询群成员", + "retrieving-group-members": "查询群成员", + "Group member queries overview": "群成员查询概览", + "overview-retrieving-group-members": "群成员查询概览", + "Get group members": "获取群成员列表", + "get-group-member-list": "获取群成员列表", + "Get group member profiles": "获取群成员资料", + "get-specified-group-members-info": "获取群成员资料", + "Check users in a group": "检查用户是否在群内", + "get-users-in-group": "检查用户是否在群内", + "Get group owners and admins": "获取群主和管理员", + "get-group-member-owner-and-admin": "获取群主和管理员", + "Search group members": "搜索群成员", + "search-group-members": "搜索群成员", + "Managing group members": "管理群成员", + "managing-group-members": "管理群成员", + "Invite users to a group": "邀请用户入群", + "invite-user-to-group": "邀请用户入群", + "Remove group members": "移除群成员", + "kick-group-member": "移除群成员", + "Update a group nickname": "更新群昵称", + "set-group-member-nickname": "更新群昵称", + "Manage group administrators": "管理群管理员", + "set-group-member-role-level": "管理群管理员", + "Update a group member avatar": "更新群成员头像", + "set-group-member-avatar": "更新群成员头像", + "Set group member extra data": "设置群成员扩展字段", + "set-group-member-extension": "设置群成员扩展字段", + "Transfer group ownership": "转让群主", + "transfer-group-owner": "转让群主", + "Mute or unmute a group member": "禁言或解除禁言群成员", + "change-group-member-mute": "禁言或解除禁言群成员", + "Message": "消息", + "message": "消息", + "Message overview": "消息概览", + "overview-message": "消息概览", + "Creating messages": "创建消息", + "creating-messages": "创建消息", + "Create a text message": "创建文本消息", + "create-text-message": "创建文本消息", + "Create a mention message": "创建 @ 消息", + "create-text-at-message": "创建 @ 消息", + "Create a custom message": "创建自定义消息", + "create-custom-message": "创建自定义消息", + "Create an image message from a file": "从文件创建图片消息", + "create-image-message-by-file": "从文件创建图片消息", + "Create an image message from a URL": "从 URL 创建图片消息", + "create-image-message-by-url": "从 URL 创建图片消息", + "Create an audio message from a file": "从文件创建音频消息", + "create-sound-message-by-file": "从文件创建音频消息", + "Create an audio message from a URL": "从 URL 创建音频消息", + "create-sound-message-by-url": "从 URL 创建音频消息", + "Create a video message from a file": "从文件创建视频消息", + "create-video-message-by-file": "从文件创建视频消息", + "Create a video message from a URL": "从 URL 创建视频消息", + "create-video-message-by-url": "从 URL 创建视频消息", + "Create a file message from a file": "从文件创建文件消息", + "create-file-message-by-file": "从文件创建文件消息", + "Create a file message from a URL": "从 URL 创建文件消息", + "create-file-message-by-url": "从 URL 创建文件消息", + "Create a contact card message": "创建名片消息", + "create-card-message": "创建名片消息", + "Create a location message": "创建位置消息", + "create-location-message": "创建位置消息", + "Create an emoji message": "创建表情消息", + "create-face-message": "创建表情消息", + "Create a reply message": "创建引用消息", + "create-quote-message": "创建引用消息", + "Create a forwarded message": "创建转发消息", + "create-forward-message": "创建转发消息", + "Create a merged message": "创建合并消息", + "create-merger-message": "创建合并消息", + "Sending messages": "发送消息", + "sending-messages": "发送消息", + "Send a message": "发送消息", + "send-message": "发送消息", + "Send a message without OSS": "发送非 OSS 消息", + "send-message-not-oss": "发送非 OSS 消息", + "Track message sending progress": "跟踪消息发送进度", + "set-msg-send-progress-listener": "跟踪消息发送进度", + "Receiving messages": "接收消息", + "receiving-messages": "接收消息", + "Receive messages": "接收消息", + "receive-messages": "接收消息", + "Receive custom business messages": "接收自定义业务消息", + "receive-custom-business-messages": "接收自定义业务消息", + "Retrieving messages": "查询消息", + "retrieving-messages": "查询消息", + "Load older messages": "加载更早消息", + "load-older-messages": "加载更早消息", + "Load newer messages": "加载更新消息", + "load-newer-messages": "加载更新消息", + "Find messages by ID": "按 ID 查询消息", + "find-messages-by-id": "按 ID 查询消息", + "Search messages": "搜索消息", + "search-messages": "搜索消息", + "Composing messages": "编辑消息", + "composing-messages": "编辑消息", + "Update typing status": "更新输入状态", + "update-typing-status": "更新输入状态", + "Managing messages": "管理消息", + "managing-messages": "管理消息", + "Delete a local message": "删除本地消息", + "delete-local-message": "删除本地消息", + "Delete saved messages": "删除已保存消息", + "delete-saved-messages": "删除已保存消息", + "Revoke a message": "撤回消息", + "revoke-a-message": "撤回消息", + "Modify a message": "修改消息", + "modify-a-message": "修改消息", + "View pinned messages": "查看置顶消息", + "get-pinned-messages": "查看置顶消息", + "Pin or unpin a message": "置顶或取消置顶消息", + "set-message-pinned": "置顶或取消置顶消息", + "Insert a local direct message": "插入本地单聊消息", + "insert-local-single-message": "插入本地单聊消息", + "Insert a local group message": "插入本地群聊消息", + "insert-local-group-message": "插入本地群聊消息", + "Clear all local messages": "清空全部本地消息", + "clear-all-local-messages": "清空全部本地消息", + "Clear all saved messages": "清空全部已保存消息", + "clear-all-messages": "清空全部已保存消息", + "Set local message extensions": "设置消息本地扩展字段", + "set-message-local-ex": "设置消息本地扩展字段", + "Create an @ message": "创建 @ 消息", + "Create a video message from files": "从文件创建视频消息", + "Create a video message from URLs": "从 URL 创建视频消息", + "Create a merged forward message": "创建合并转发消息", + "Send an uploaded media message": "发送已上传媒体消息", + "Load message history": "加载历史消息", + "Load message history in reverse": "逆序加载历史消息", + "Report typing status": "上报输入状态", + "Delete messages in a batch": "批量删除消息", + "Get pinned messages in a conversation": "获取会话置顶消息", + "Insert a local one-to-one message": "插入本地单聊消息", + "Clear local and server messages": "清空本地和服务端消息", + "Set a local message extension": "设置消息本地扩展字段", + "File uploads": "文件上传", + "file-uploads": "文件上传", + "Track file upload progress": "跟踪文件上传进度", + "track-file-upload-progress": "跟踪文件上传进度", + "Upload a file": "上传文件", + "upload-file": "上传文件", + "Calling": "音视频通话", + "calling": "音视频通话", + "Audio and video calling overview": "音视频通话概览", + "Calling overview": "音视频通话概览", + "overview-calling": "音视频通话概览", + "Managing calls": "管理通话", + "managing-calls": "管理通话", + "Start a one-to-one call": "发起单聊通话", + "start-single-call": "发起单聊通话", + "Start a group call": "发起群聊通话", + "start-group-call": "发起群聊通话", + "Accept a call": "接受通话", + "accept-call": "接受通话", + "Reject a call": "拒绝通话", + "reject-call": "拒绝通话", + "Cancel a call invitation": "取消通话邀请", + "cancel-call": "取消通话邀请", + "Hang up a call": "挂断通话", + "hang-up-call": "挂断通话", + "Handle call events": "处理通话事件", + "handle-call-events": "处理通话事件", + "Retrieving call information": "通话恢复与房间信息", + "retrieving-call-information": "通话恢复与房间信息", + "Restore a pending invitation": "恢复启动前收到的通话邀请", + "restore-pending-invitation": "恢复启动前收到的通话邀请", + "Get a group call room": "查询群组通话房间", + "get-room-by-group-id": "查询群组通话房间", + "Get room credentials": "获取通话房间 Token", + "get-token-by-room-id": "获取通话房间 Token", + "Sending custom signals": "发送自定义信令", + "sending-custom-signals": "发送自定义信令", + "Send a custom signal": "发送自定义信令", + "send-a-custom-signal": "发送自定义信令", + "Events": "事件", + "events": "事件", + "Events overview": "事件概览", + "overview-events": "事件概览", + "Logging": "日志", + "Logger": "日志", + "logger": "日志" + }, + "pages": { + "/sdk/android/overview": { + "body": "OpenIM Android SDK 用于在原生 Android 应用中接入 OpenIMSDK。选择下方领域进入对应章节。\n\n## 文档导航\n\n| 领域 | 内容 |\n| --- | --- |\n| [快速开始](/sdk/android/getting-started/environment-specific-implementation) | 接入 SDK、配置 Android 工程、认证、连接生命周期和发送第一条消息。 |\n| [用户与关系链](/sdk/android/user/overview-user) | 用户资料、在线状态、好友、好友申请和黑名单。 |\n| [会话](/sdk/android/conversation/overview-conversation) | 会话查询、草稿、未读数、接收选项、阅后即焚、隐藏和删除。 |\n| [群组](/sdk/android/group/overview-group) | 群资料、群成员、入群申请、权限、禁言和群组事件。 |\n| [消息](/sdk/android/message/overview-message) | 消息创建、发送、接收、历史记录、搜索、删除、撤回和已读回执。 |\n| [文件上传](/sdk/android/file-uploads/upload-file) | 独立文件上传和上传进度。 |\n| [音视频通话](/sdk/android/calling/overview-calling) | 通话邀请、接受、拒绝、取消、挂断、房间凭据和自定义信令。 |\n| [事件](/sdk/android/events/overview-events) | 各 manager 的 listener、连接状态和数据事件。 |\n| [日志](/sdk/android/logger) | SDK 日志配置和排查。 |", + "description": "在原生 Android 应用中使用 OpenIM Android SDK 接入用户、会话、群组、消息、通话信令和事件能力。", + "headings": [ + { + "depth": 2, + "title": "文档导航", + "url": "#文档导航" + } + ], + "sourcePath": "/sdk/android/overview", + "title": "OpenIM Android SDK 概览" + }, + "/sdk/android/getting-started/before-you-start": { + "body": "在原生 Android 应用中接入 OpenIMClientSDK 前,需要准备可访问的 OpenIMServer、可信的用户认证流程,以及满足 SDK 构建要求的 Android 工程。这些条件同时适用于[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)和[发送第一条消息](/sdk/android/getting-started/send-first-message)。\n\n## 准备 OpenIMServer\n\n如果还没有可用的 OpenIMServer,先按 [Docker 部署指南](/docs/guides/quick-deployment/docker)完成部署,并确认 Android 真机和模拟器均可访问以下地址:\n\n| 字段 | 说明 |\n| --------- | ------------------------------------------------------ |\n| `apiAddr` | OpenIMServer HTTP API 地址,用于登录、同步和资源请求。 |\n| `wsAddr` | OpenIMServer WebSocket 地址,用于长连接和实时事件。 |\n\n不要只在开发电脑上验证地址。Android 模拟器中的 `localhost` 指向模拟器自身,不能直接访问开发电脑上的本地服务。如果 OpenIMServer 运行在开发电脑上,先将 API 和 WebSocket 端口映射到模拟器:\n\n```bash\nadb reverse tcp:10002 tcp:10002\nadb reverse tcp:10001 tcp:10001\n```\n\n映射后,模拟器中的应用可以使用 `http://127.0.0.1:10002` 作为 `apiAddr`,使用 `ws://127.0.0.1:10001` 作为 `wsAddr`。端口号应替换为开发电脑上实际监听的端口;执行命令前确认 `adb` 已连接到目标模拟器。生产环境应使用 HTTPS 与 WSS,并从真机检查 DNS、TLS 证书、防火墙、反向代理和 WebSocket 升级。\n\n## 准备用户和 Token\n\n`userID` 标识 OpenIMSDK 用户,Token 用于认证该用户。创建或绑定用户、签发 Token 和校验业务权限都应由可信后端完成。Android 应用不能保存管理员 Token、secret 或其他服务端凭据。\n\n后端接入 OpenIMServer REST API 前,可阅读[准备使用 Platform API](/platform-api/prepare-to-use-api)和[签发会话 Token](/platform-api/user/managing-session-tokens/issue-a-session-token)。业务后端完成自身账号认证后,只向客户端返回 SDK 登录所需的以下数据:\n\n| 数据 | 说明 |\n| --- | --- |\n| `userID` | 当前登录用户的 OpenIM 用户 ID。 |\n| `token` | 与该用户对应的登录 Token。 |\n| `apiAddr` | OpenIMServer HTTP API 地址。 |\n| `wsAddr` | OpenIMServer WebSocket 地址。 |\n\n`userID` 必须与 Token 对应。客户端不得接受任意用户 ID 后自行签发、拼装或交换管理员 Token。\n\n## 准备 Android 工程\n\n接入前,确认 Android 工程具备以下条件:\n\n- 应用的 `minSdk` 不低于 `21`,使用 Java 8 编译选项,并将 `compileSdk` 设置为 `36` 或更高。\n- 应用 Manifest 声明 `android.permission.INTERNET`,并允许 SDK 读取网络状态。\n- 已准备应用私有且可持久化的数据目录,例如 `Application.getFilesDir()` 下的独立子目录;不要把 SDK 数据库放在临时缓存或共享存储中。\n- 真机能够访问 `apiAddr`、`wsAddr` 以及消息媒体资源域名。\n- 发布包覆盖目标设备 ABI;接入交付包时应核对实际包含的 native ABI。\n- 产品已经定义断网恢复、前后台切换、Token 失效、账号被踢下线和多端登录的处理方式。\n\n具体依赖和 Manifest 配置见[按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation);SDK 初始化和认证流程见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。\n\n## 继续接入\n\n准备完成后,先完成[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。确认登录 callback 成功且 `OnConnListener.onConnectSuccess()` 已到达,再按照[发送第一条消息](/sdk/android/getting-started/send-first-message)验证消息链路。", + "description": "准备 OpenIMServer、用户登录信息和 Android 工程环境,再开始初始化、认证或发送消息。", + "headings": [ + { + "depth": 2, + "title": "准备 OpenIMServer", + "url": "#准备-openimserver" + }, + { + "depth": 2, + "title": "准备用户和 Token", + "url": "#准备用户和-token" + }, + { + "depth": 2, + "title": "准备 Android 工程", + "url": "#准备-android-工程" + }, + { + "depth": 2, + "title": "继续接入", + "url": "#继续接入" + } + ], + "sourcePath": "/sdk/android/getting-started/before-you-start", + "title": "开始之前" + }, + "/sdk/android/getting-started/environment-specific-implementation": { + "body": "本页只说明 Android 工程的依赖和权限配置。SDK 初始化、连接监听和登录流程见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。\n\n## 添加 SDK 依赖\n\n在应用 module 的 `build.gradle` 中添加依赖:\n\n```groovy\ndependencies {\n implementation 'io.openim:android-sdk:latest@aar'\n implementation 'io.openim:core-sdk:latest@aar'\n implementation 'com.google.code.gson:gson:2.9.0'\n}\n```\n\n## 配置 Manifest\n\n应用需要网络访问权限:\n\n```xml\n\n\n```\n\n## 下一步\n\n- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)\n- [发送第一条消息](/sdk/android/getting-started/send-first-message)", + "description": "在 Android 工程中添加 OpenIM Android SDK 依赖并配置网络权限。", + "headings": [ + { + "depth": 2, + "title": "添加 SDK 依赖", + "url": "#添加-sdk-依赖" + }, + { + "depth": 2, + "title": "配置 Manifest", + "url": "#配置-manifest" + }, + { + "depth": 2, + "title": "下一步", + "url": "#下一步" + } + ], + "sourcePath": "/sdk/android/getting-started/environment-specific-implementation", + "title": "按 Android 环境接入" + }, + "/sdk/android/getting-started/authenticate-and-manage-session": { + "body": "OpenIM Android SDK 使用 `initSDK()` 初始化本机运行环境,再使用 `login()` 建立当前用户的登录会话。开始认证前,应先完成[开始之前](/sdk/android/getting-started/before-you-start)列出的服务、用户和 Token 准备,并按[按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation)添加依赖和权限。\n\n完整流程如下:\n\n1. 在应用级会话组件中创建稳定的 `OnConnListener`。\n2. 调用 `initSDK()` 并确认返回 `true`。\n3. 在登录前设置消息、用户、好友、会话、群组和通话信令 listener。\n4. 从可信后端取得对应的 `userID` 与 Token,然后调用 `login()`。\n5. 分别等待登录 callback 成功与 `onConnectSuccess()`,再开放依赖连接的业务操作。\n6. 主动退出或切换账号时调用 `logout()`,完成后清理当前账号的应用状态。\n\n下文中的 `apiAddr`、`wsAddr`、`userID` 和 `token` 均由可信后端提供。\n\n## 初始化并处理连接生命周期\n\n在 `Application` 生命周期内创建数据目录、初始化 SDK,并传入连接 listener。应用应保存连接状态,但不要在 callback 中记录 Token 或完整服务凭据。\n\n```java\nimport android.app.Application;\n\nimport java.io.File;\n\nimport io.openim.android.sdk.OpenIMClient;\nimport io.openim.android.sdk.enums.LogLevel;\nimport io.openim.android.sdk.listener.OnConnListener;\nimport io.openim.android.sdk.models.InitConfig;\n\nFile dataDirectory = new File(application.getFilesDir(), \"openim\");\nif (!dataDirectory.exists() && !dataDirectory.mkdirs()) {\n throw new IllegalStateException(\"Cannot create the OpenIM data directory.\");\n}\n\nInitConfig config = new InitConfig(\n apiAddr,\n wsAddr,\n dataDirectory.getAbsolutePath()\n);\nconfig.logLevel = LogLevel.Info;\nconfig.isLogStandardOutput = false;\n\nOnConnListener connectionListener = new OnConnListener() {\n @Override\n public void onConnecting() {\n sessionState.setConnectionState(\"connecting\");\n }\n\n @Override\n public void onConnectSuccess() {\n sessionState.setConnectionState(\"connected\");\n sessionState.enableConnectedOperations();\n }\n\n @Override\n public void onConnectFailed(long code, String error) {\n sessionState.setConnectionState(\"failed\");\n recordConnectionFailure(code, error);\n }\n\n @Override\n public void onKickedOffline() {\n sessionState.clearCurrentAccount();\n showSignedInElsewhereScreen();\n }\n\n @Override\n public void onUserTokenExpired() {\n requestNewTokenAndRelogin();\n }\n\n @Override\n public void onUserTokenInvalid(String reason) {\n sessionState.clearCurrentAccount();\n showSignInScreen(reason);\n }\n};\n\nboolean initialized = OpenIMClient.getInstance().initSDK(\n application,\n config,\n connectionListener\n);\n\nif (!initialized) {\n throw new IllegalStateException(\"OpenIMClientSDK initialization failed.\");\n}\n```\n\n`initSDK()` 返回 `true` 表示 SDK 本地运行环境初始化成功。`OnConnListener` 的连接 callback 在调用 `login()` 后开始反映长连接状态。\n\n| 字段 | 类型 | 说明 |\n| --------------------- | ------------- | ---------------------------------------------------------- |\n| `application` | `Application` | 应用级 Context,用于持有 SDK 生命周期。 |\n| `apiAddr` | `String` | OpenIMServer HTTP API 地址。 |\n| `wsAddr` | `String` | OpenIMServer WebSocket 地址。 |\n| `dataDirectory` | `File` | SDK 数据库和日志使用的应用私有持久化目录。 |\n| `config.logLevel` | `int` | 使用 `LogLevel` 常量;正式环境应主动收敛日志级别。 |\n| `isLogStandardOutput` | `boolean` | 是否把 SDK Core 日志输出到标准日志流。 |\n\nSDK 只应在 `Application` 或应用级会话组件中初始化一次。当前 Java wrapper 公开 `networkChanged()`,用于通知 Core 重新检查网络;只有在应用已经统一监听系统网络变化时才调用,不能由多个页面重复注册网络 callback。\n\n## 在登录前设置业务 listener\n\nSDK 的 listener 注册方法采用 set 语义,后一次设置会替换前一次设置。应由应用级事件中心创建稳定 listener,再把事件分发给页面状态层。消息 listener 的完整注册与增量合并示例见[发送第一条消息](/sdk/android/getting-started/send-first-message);用户、好友、会话、群组和通话信令 listener 采用相同的集中注册原则。\n\nSDK 没有公开的 remove/unset 方法。退出或切换账号时,应用事件中心应停止向旧账号页面分发 callback,并在下次登录前用新账号对应的完整 listener 组合覆盖设置。\n\n## 登录当前用户\n\n```java\nOpenIMClient.getInstance().login(new OnBase() {\n @Override\n public void onError(int code, String error) {\n sessionState.setLoginState(\"failed\");\n recordLoginFailure(code, error);\n }\n\n @Override\n public void onSuccess(String data) {\n sessionState.setLoginState(\"logged\");\n sessionState.setCurrentUserID(userID);\n }\n}, userID, token);\n```\n\n`login()` 的成功 callback 表示当前登录调用完成;`OnConnListener.onConnectSuccess()` 表示长连接可用。这两个阶段必须分别处理。不要并发调用 `login()`,也不要仅凭某一个 callback 同时推断登录与连接状态。\n\n## 查询登录状态\n\n```java\nint loginStatus = OpenIMClient.getInstance().getLoginStatus();\n\nif (loginStatus == LoginStatus.Logged) {\n String currentUserID = OpenIMClient.getInstance().getLoginUserID();\n restoreSessionFor(currentUserID);\n}\n```\n\n| 状态 | 说明 |\n| --------------------- | ---------------------------------------------------- |\n| `LoginStatus.Logout` | SDK 当前未登录。 |\n| `LoginStatus.Logging` | 登录正在进行,不应再次发起并行登录。 |\n| `LoginStatus.Logged` | SDK 已登录;网络是否连接仍以 `OnConnListener` 为准。 |\n\n`getLoginStatus()` 和 `getLoginUserID()` 返回本地 SDK 状态快照,不会触发连接 callback。切换账号时应先退出旧账号,而不是直接用新参数覆盖当前登录。\n\n## 处理 Token 和强制下线\n\n收到 `onUserTokenExpired()` 或 `onUserTokenInvalid()` 后,应重新向可信后端取得当前用户凭据,再按产品策略重新登录或返回登录页。收到 `onKickedOffline()` 时,应清理当前用户的会话列表、消息视图、未读数和其他业务状态,不能把它当作用户主动退出。\n\n这些 callback 没有业务实体合并键,应按当前 `OpenIMClient` 单例和登录用户隔离状态。旧账号的异步任务和页面订阅必须在新账号登录前停止。\n\n## 主动退出与释放 SDK\n\n```java\nOpenIMClient.getInstance().logout(new OnBase() {\n @Override\n public void onError(int code, String error) {\n recordLogoutFailure(code, error);\n }\n\n @Override\n public void onSuccess(String data) {\n sessionState.clearCurrentAccount();\n }\n});\n```\n\n`logout()` 成功表示当前 SDK 登录会话已退出。应用状态清理应在成功 callback 后执行;切换账号时,等待旧账号退出完成后再调用新账号的 `login()`。\n\n应用最终不再使用 SDK 时可以调用:\n\n```java\nOpenIMClient.getInstance().unInit();\n```\n\n`unInit()` 用于释放 SDK 运行环境,不是 `logout()` 的替代品,也不应在普通页面销毁时调用。\n\n## 下一步\n\n- [开始之前](/sdk/android/getting-started/before-you-start)\n- [按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation)\n- [发送第一条消息](/sdk/android/getting-started/send-first-message)", + "description": "使用 OpenIM Android SDK 初始化、登录、查询登录状态、处理连接 callback 并退出当前账号。", + "headings": [ + { + "depth": 2, + "title": "初始化并处理连接生命周期", + "url": "#初始化并处理连接生命周期" + }, + { + "depth": 2, + "title": "在登录前设置业务 listener", + "url": "#在登录前设置业务-listener" + }, + { + "depth": 2, + "title": "登录当前用户", + "url": "#登录当前用户" + }, + { + "depth": 2, + "title": "查询登录状态", + "url": "#查询登录状态" + }, + { + "depth": 2, + "title": "处理 Token 和强制下线", + "url": "#处理-token-和强制下线" + }, + { + "depth": 2, + "title": "主动退出与释放 SDK", + "url": "#主动退出与释放-sdk" + }, + { + "depth": 2, + "title": "下一步", + "url": "#下一步" + } + ], + "sourcePath": "/sdk/android/getting-started/authenticate-and-manage-session", + "title": "认证与管理登录会话" + }, + "/sdk/android/getting-started/send-first-message": { + "body": "本页用一条单聊文本消息验证 OpenIM 已接入成功。开始前,先按[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)完成 SDK 初始化和登录。\n\n## 开始前准备\n\n- 为发送方和接收方各准备一个测试账号。\n- 两个账号都需要按[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)完成 SDK 初始化;接收方需要在登录前设置下面的消息 listener。\n- 将示例中的 `user_b` 替换为接收方的真实 `userID`。\n\n## 第 1 步:让接收方监听新消息\n\n接收方在登录前设置消息 listener。收到消息后,将它加入页面消息列表或刷新界面即可。\n\n```java\nOpenIMClient.getInstance()\n .messageManager\n .setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override\n public void onRecvNewMessage(Message message) {\n // 将 message 显示在聊天界面中。\n }\n });\n```\n\n## 第 2 步:确认可以发送\n\n两个账号登录后,发送方的登录 callback 成功且 `OnConnListener.onConnectSuccess()` 已到达,即可发送消息。接收方也应保持连接,以便收到新消息。连接尚未成功时,先等待连接恢复,不要重复调用 `login()`。\n\n## 第 3 步:发送文本消息\n\n### 发送单聊文本消息\n\n先创建消息,再发送它。第三个目标参数填写接收方 `userID`,群组目标参数保持空字符串。\n\n```java\nMessage message = OpenIMClient.getInstance()\n .messageManager\n .createTextMessage(\"你好,OpenIMSDK\");\n\nOnMsgSendCallback sendCallback = new OnMsgSendCallback() {\n @Override\n public void onProgress(long progress) {\n // 文本消息通常不需要处理进度。\n }\n\n @Override\n public void onError(int code, String error) {\n // 提示发送失败,并允许用户重试。\n }\n\n @Override\n public void onSuccess(Message sentMessage) {\n // 将 sentMessage 更新到发送方的聊天界面。\n }\n};\n\nOpenIMClient.getInstance().messageManager.sendMessage(\n sendCallback,\n message,\n \"user_b\",\n \"\",\n new OfflinePushInfo()\n);\n```\n\n`OfflinePushInfo` 用于配置离线推送内容。首次验证时可以传入空对象,后续再按产品需要设置标题、摘要和扩展数据。\n\n`onSuccess()` 表示发送方已成功发送消息;接收方的 `onRecvNewMessage()` 表示另一端已收到消息。这两个回调都会到达,才说明这次单聊验证完成。\n\n### 发送群聊文本消息\n\n发送群消息时,将接收方 `userID` 改为空字符串,并填写群组的 `groupID`:\n\n```java\nMessage groupMessage = OpenIMClient.getInstance()\n .messageManager\n .createTextMessage(\"大家好,OpenIMSDK\");\n\nOpenIMClient.getInstance().messageManager.sendMessage(\n sendCallback,\n groupMessage,\n \"\",\n \"group_123\",\n new OfflinePushInfo()\n);\n```\n\n一次调用只能填写 `userID` 或 `groupID` 其中之一。\n\n## 验证成功\n\n- 发送方进入 `onSuccess()`。\n- 接收方进入 `onRecvNewMessage()`,并看到文本消息。\n- 单聊只填写接收方 `userID`;群聊只填写 `groupID`。\n\n## 下一步\n\n- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)\n- [OpenIM Android SDK 概览](/sdk/android/overview)", + "description": "在 Android 应用中发送并验证第一条单聊文本消息。", + "headings": [ + { + "depth": 2, + "title": "开始前准备", + "url": "#开始前准备" + }, + { + "depth": 2, + "title": "第 1 步:让接收方监听新消息", + "url": "#第-1-步-让接收方监听新消息" + }, + { + "depth": 2, + "title": "第 2 步:确认可以发送", + "url": "#第-2-步-确认可以发送" + }, + { + "depth": 2, + "title": "第 3 步:发送文本消息", + "url": "#第-3-步-发送文本消息" + }, + { + "depth": 3, + "title": "发送单聊文本消息", + "url": "#发送单聊文本消息" + }, + { + "depth": 3, + "title": "发送群聊文本消息", + "url": "#发送群聊文本消息" + }, + { + "depth": 2, + "title": "验证成功", + "url": "#验证成功" + }, + { + "depth": 2, + "title": "下一步", + "url": "#下一步" + } + ], + "sourcePath": "/sdk/android/getting-started/send-first-message", + "title": "发送第一条消息" + }, + "/sdk/android/user/overview-user": { + "body": "OpenIM Android SDK 使用 `userID` 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。\n\n群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。\n\n## 用户类型\n\nAndroid SDK 会根据使用场景返回不同的用户对象:\n\n| 类型 | 适用场景 | 主要 API |\n| ----------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------- |\n| `LocalUser` | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | `getSelfLocalUserInfo()`、`setSelfInfo()` |\n| `PublicUserInfo` | 查询应用用户、查找好友候选人和展示陌生人资料卡 | `getUsersInfo()` |\n| `UserInfo` | Android wrapper 返回的组合对象,可承载公开资料、好友资料或黑名单资料 | `getFriendListPage()`、`getFriendsInfo()`、`getBlacklist()` |\n| `FriendInfo` | 当前用户的好友列表、好友备注和关系扩展字段 | `searchFriends()`、`getFriendListPage()` |\n| `FriendApplicationInfo` | 好友申请双方、处理状态和附言 | 好友申请查询与 listener |\n| `BlacklistInfo` | 当前用户拉黑的用户及黑名单关系字段 | `getBlacklist()`、`addBlacklist()`、`removeBlacklist()` |\n| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()` |\n\n同一个 `userID` 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 `UserInfo.getFriendInfo()`;只需要账号公开资料时使用 `PublicUserInfo`;黑名单页面使用 `UserInfo.getBlackInfo()`。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。\n\n所有列表和事件都应使用 `userID` 作为稳定标识。好友申请同时包含申请方和接收方,应使用 `fromUserID:toUserID` 标识一条申请。\n\n## 功能入口\n\n下表列出了用户相关的常见需求和对应页面:\n\n| 需求 | 推荐页面 |\n| -------------------------------------------------------- | -------------------------------------------------------------------------------------------- |\n| 按 `userID` 查询公开资料,用于查找好友候选人或展示资料卡 | [获取指定用户资料](/sdk/android/user/user-profile/get-users-info) |\n| 分页、搜索或按 ID 查询好友关系 | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) |\n| 发送、查询、接受或拒绝好友申请 | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) |\n| 修改好友资料 | [更新好友资料](/sdk/android/user/friends/update-friends) |\n| 删除好友关系 | [删除好友](/sdk/android/user/friends/delete-friend) |\n| 查看和维护当前用户黑名单 | [获取黑名单列表](/sdk/android/user/blacklist/get-blacklist) |\n| 读取或更新当前用户的昵称、头像和扩展资料 | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) |\n| 设置账号级消息接收和通知策略 | [设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception) |\n| 订阅和读取在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) |\n\n## 状态更新\n\n用户相关事件由对应能力页负责监听和合并:\n\n- 当前用户资料变化:见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。\n- 好友申请变化:见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。\n- 好友关系和好友资料变化:见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。\n- 黑名单变化:见[拉黑用户](/sdk/android/user/blacklist/add-blacklist)。\n- 在线状态变化:见[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。\n\nAndroid SDK 的 `UserInfoManager` 和 `FriendshipManager` 各保存一个 listener,`setOnUserListener()` 和 `setOnFriendshipListener()` 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。", + "description": "了解 Android SDK 中的用户资料、好友关系、好友申请、黑名单和在线状态 API。", + "headings": [ + { + "depth": 2, + "title": "用户类型", + "url": "#用户类型" + }, + { + "depth": 2, + "title": "功能入口", + "url": "#功能入口" + }, + { + "depth": 2, + "title": "状态更新", + "url": "#状态更新" + } + ], + "sourcePath": "/sdk/android/user/overview-user", + "title": "用户概览" + }, + "/sdk/android/user/user-profile/get-users-info": { + "body": "`getUsersInfo()` 根据 `userID` 列表返回用户的公开资料,适合展示好友候选人或陌生人资料卡。该方法只读取公开资料,不返回当前账号为好友设置的备注等关系字段。\n\n```java\nList userIDs = Arrays.asList(\"user_a\", \"user_b\");\n\nOpenIMClient.getInstance().userInfoManager.getUsersInfo(\n new OnBase>() {\n @Override\n public void onSuccess(List users) {\n for (PublicUserInfo user : users) {\n publicUserStore.put(user.getUserID(), user);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordUserQueryFailure(code, error);\n }\n },\n userIDs\n);\n```\n\n调用前应去除空值和重复 ID,并控制单次请求的数量。成功 callback 返回 `List`,主要字段包括 `userID`、`nickname`、`faceURL`、`ex` 和 `createTime`。查询不会触发 `OnUserListener`,需要刷新资料时应重新调用并按 `userID` 合并结果。\n\n## 返回结果\n\n| 字段 | 说明 |\n| ------------ | ---------------------------------------- |\n| `userID` | OpenIM 用户 ID,也是本地缓存的稳定 key。 |\n| `nickname` | 账号级公开昵称。 |\n| `faceURL` | 账号级公开头像地址。 |\n| `ex` | 账号级公开扩展字符串,格式由业务约定。 |\n| `createTime` | 用户资料创建时间。 |\n\n`PublicUserInfo` 中的资料不能用于覆盖好友备注、置顶状态或群内昵称。展示好友时应使用 `FriendInfo`,展示群成员时应使用群成员模型。\n\n按昵称、手机号或邮箱搜索用户属于业务服务能力,应由可信后端完成搜索和权限校验,再把候选 `userID` 交给客户端查询公开资料。\n\n## 资料刷新\n\n查询成功后,以返回结果更新公开资料快照。打开资料卡、用户主动刷新、断线重连或业务后端通知资料变化时,可以重新调用该方法校准数据。`OnUserListener.onSelfInfoUpdated` 只表示当前登录用户资料变化,不能作为其他用户资料变化事件。", + "description": "使用 getUsersInfo() 按 userID 批量查询用户公开资料。", + "headings": [ + { + "depth": 2, + "title": "返回结果", + "url": "#返回结果" + }, + { + "depth": 2, + "title": "资料刷新", + "url": "#资料刷新" + } + ], + "sourcePath": "/sdk/android/user/user-profile/get-users-info", + "title": "获取指定用户资料" + }, + "/sdk/android/user/user-profile/get-self-local-user-info": { + "body": "```java\nOpenIMClient.getInstance().userInfoManager.getSelfLocalUserInfo(\n new OnBase() {\n @Override\n public void onSuccess(LocalUser user) {\n currentUserStore.set(user);\n }\n\n @Override\n public void onError(int code, String error) {\n recordSelfProfileFailure(code, error);\n }\n }\n);\n```\n\n完成初始化并登录后调用该方法获取当前账号的本地资料。成功 callback 返回 `LocalUser`,包含 `userID`、`nickname`、`faceURL`、`ex`、`attachedInfo`、`globalRecvMsgOpt` 和 `addFriendPermission` 等字段。\n\n## 返回结果\n\n| 字段 | 说明 |\n| --------------------- | -------------------------------------------------------------- |\n| `userID` | 当前登录用户 ID。 |\n| `nickname` | 当前账号昵称。 |\n| `faceURL` | 当前账号头像地址。 |\n| `ex` | 当前账号扩展字符串。 |\n| `attachedInfo` | SDK 附加信息,只按业务约定解析。 |\n| `globalRecvMsgOpt` | 全局消息接收方式:`0` 正常接收,`1` 不接收,`2` 接收但不提示。 |\n| `addFriendPermission` | 添加好友权限值,具体含义由服务端契约定义。 |\n\n查询不会触发资料变更 callback。退出或切换账号时应清理旧账号快照,避免把上一个账号的资料显示在当前页面。\n\n`getSelfUserInfo()` 已废弃,不作为推荐用法。", + "description": "使用 getSelfLocalUserInfo() 获取当前登录用户的本地资料。", + "headings": [ + { + "depth": 2, + "title": "返回结果", + "url": "#返回结果" + } + ], + "sourcePath": "/sdk/android/user/user-profile/get-self-local-user-info", + "title": "获取当前用户资料" + }, + "/sdk/android/user/user-profile/set-self-info": { + "body": "使用 `UserInfoReq` 只设置实际需要修改的字段。SDK 序列化请求时会忽略 `null` 字段。\n\n```java\nUserInfoReq request = new UserInfoReq();\nrequest.setNickname(displayName.trim());\nrequest.setFaceURL(avatarURL);\nrequest.setEx(mergedExtra);\n\nOpenIMClient.getInstance().userInfoManager.setSelfInfo(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markProfileUpdateSubmitted();\n }\n\n @Override\n public void onError(int code, String error) {\n recordProfileUpdateFailure(code, error);\n }\n },\n request\n);\n```\n\n`UserInfoReq` 支持 `nickname`、`faceURL`、`ex` 和 `addFriendPermission` 等字段。`ex` 是完整字符串,更新前应读取、解析并合并业务自己的命名空间;不要把部分 JSON 直接覆盖到服务端。\n\n成功 callback 表示更新请求完成;当前账号资料的最终增量通过 `onSelfInfoUpdated(UserInfo info)` 到达,或重新调用 `getSelfLocalUserInfo()` 校准。\n\n## 更新字段\n\n| 字段 | 说明 |\n| --------------------- | ------------------ |\n| `nickname` | 要更新的昵称。 |\n| `faceURL` | 要更新的头像地址。 |\n| `ex` | 完整扩展字符串。 |\n| `addFriendPermission` | 添加好友权限值。 |\n\n一次请求只写入需要变更的字段。全局消息接收策略虽然也由 `setSelfInfo()` 写入,但应使用独立入口,见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。\n\n`onSelfInfoUpdated` 由本页归属,应组合进应用唯一的 `OnUserListener`:\n\n```java\n@Override\npublic void onSelfInfoUpdated(UserInfo info) {\n currentUserStore.merge(info.getUserID(), info);\n}\n```\n\n账号级消息接收策略也通过 `UserInfoReq` 更新,但应使用独立入口,见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。", + "description": "使用 setSelfInfo() 更新当前用户的昵称、头像或扩展资料。", + "headings": [ + { + "depth": 2, + "title": "更新字段", + "url": "#更新字段" + } + ], + "sourcePath": "/sdk/android/user/user-profile/set-self-info", + "title": "更新当前用户资料" + }, + "/sdk/android/user/user-profile/set-global-message-reception": { + "body": "使用独立的 `UserInfoReq` 写入 `globalRecvMsgOpt`,避免在更新昵称或头像时意外覆盖账号级消息策略。\n\n```java\nUserInfoReq request = new UserInfoReq();\nrequest.setGlobalRecvMsgOpt(2);\n\nOpenIMClient.getInstance().userInfoManager.setSelfInfo(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markGlobalReceiveOptionSubmitted();\n }\n\n @Override\n public void onError(int code, String error) {\n recordGlobalReceiveOptionFailure(code, error);\n }\n },\n request\n);\n```\n\n| 数值 | 含义 |\n| ---- | ------------------------ |\n| `0` | 正常接收消息并允许通知。 |\n| `1` | 屏蔽消息。 |\n| `2` | 接收消息但不提示。 |\n\n如果产品只提供“全局免打扰”开关,通常在 `0` 和 `2` 之间切换;`1` 会停止接收消息,应单独展示。单个会话的接收方式由会话 API 管理,不受本设置替代。\n\n成功 callback 表示请求完成。最终账号快照通过 `onSelfInfoUpdated` 或 `getSelfLocalUserInfo()` 校准,事件处理见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。", + "description": "通过 setSelfInfo() 设置当前账号的全局消息接收与通知策略。", + "headings": [], + "sourcePath": "/sdk/android/user/user-profile/set-global-message-reception", + "title": "设置全局消息接收方式" + }, + "/sdk/android/user/online-status/subscribe-users-online-status": { + "body": "```java\nList userIDs = Arrays.asList(\"user_a\", \"user_b\");\n\nOpenIMClient.getInstance().userInfoManager.subscribeUsersOnlineStatus(\n new OnBase>() {\n @Override\n public void onSuccess(List states) {\n mergeOnlineStates(states);\n }\n\n @Override\n public void onError(int code, String error) {\n recordStatusSubscriptionFailure(code, error);\n }\n },\n userIDs\n);\n```\n\n调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 `List` 快照,每项包含 `userID`、`status` 和 `platformIDs`。重复订阅同一个用户时,应由应用层去重并保留一份状态。\n\n## 状态字段\n\n| 字段 | 说明 |\n| ------------- | ------------------------------------------ |\n| `userID` | 目标用户 ID。 |\n| `status` | 在线状态值,具体枚举含义以服务端契约为准。 |\n| `platformIDs` | 当前在线的平台 ID 列表。 |\n\n`onUserStatusChanged` 由本页归属,应组合进应用唯一的 `OnUserListener`,并按 `userID` 合并:\n\n```java\n@Override\npublic void onUserStatusChanged(UsersOnlineStatus status) {\n onlineStatusStore.put(status.getUserID(), status);\n}\n```\n\n订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合;Android API 未提供可验证的取消订阅入口,因此不在文档中记录取消订阅调用。", + "description": "使用 subscribeUsersOnlineStatus() 订阅指定用户的在线状态。", + "headings": [ + { + "depth": 2, + "title": "状态字段", + "url": "#状态字段" + } + ], + "sourcePath": "/sdk/android/user/online-status/subscribe-users-online-status", + "title": "订阅用户在线状态" + }, + "/sdk/android/user/online-status/get-subscribe-online-users-status": { + "body": "```java\nOpenIMClient.getInstance().userInfoManager.getSubscribeOnlineUsersStatus(\n new OnBase>() {\n @Override\n public void onSuccess(List states) {\n mergeOnlineStates(states);\n }\n\n @Override\n public void onError(int code, String error) {\n recordStatusQueryFailure(code, error);\n }\n }\n);\n```\n\n该方法不接收用户 ID,也不改变订阅集合。成功 callback 返回当前已订阅用户的 `List` 状态快照,适合在重连或重新进入页面时按 `userID` 校准状态。\n\n查询本身不会触发 `onUserStatusChanged`。状态快照只应覆盖在线状态存储,不要覆盖用户昵称、头像等资料字段;需要资料时分别调用用户资料 API。", + "description": "使用 getSubscribeOnlineUsersStatus() 获取已订阅用户的在线状态快照。", + "headings": [], + "sourcePath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "title": "查询已订阅用户状态" + }, + "/sdk/android/user/friends/get-friend-list-page": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.getFriendListPage(\n new OnBase>() {\n @Override\n public void onSuccess(List friends) {\n for (UserInfo friend : friends) {\n friendStore.put(friend.getUserID(), friend);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendListFailure(code, error);\n }\n },\n 0,\n 40,\n true\n);\n```\n\n参数依次为 `offset`、`count` 和 `filterBlack`。`offset` 从 `0` 开始,`count` 是页大小,`filterBlack` 为 `true` 时过滤黑名单用户。成功 callback 返回当前页 `List`,好友关系详情可通过 `getFriendInfo()` 读取。继续加载下一页时按实际请求数量增加 `offset`;返回数量小于 `count` 时通常表示到达末页。\n\n只使用分页 API,不使用非分页的 `getFriendList()`。快照和增量都应按 `userID` 合并。\n\n## 好友资料字段\n\n`UserInfo` 是 Android wrapper 的组合对象。好友列表中的 `getFriendInfo()` 返回 `FriendInfo`,常用字段如下:\n\n| 字段 | 说明 |\n| ---------------- | ------------------------------------- |\n| `userID` | 好友用户 ID,也是好友列表的稳定标识。 |\n| `nickname` | 好友账号昵称。 |\n| `faceURL` | 好友账号头像地址。 |\n| `remark` | 当前账号设置的好友备注。 |\n| `ex` | 好友关系扩展字符串。 |\n| `addSource` | 好友关系添加来源。 |\n| `operatorUserID` | 建立或更新关系的操作用户 ID。 |\n| `createTime` | 好友关系创建时间。 |\n\n`nickname` 和 `faceURL` 是账号资料,`remark` 和 `ex` 属于好友关系。`UpdateFriendsReq` 支持提交 `isPinned`,但当前 Android `FriendInfo` 模型不提供对应读取字段,置顶状态应由业务层单独维护。不要用好友对象覆盖陌生人的 `PublicUserInfo`,也不要把好友备注写回账号昵称。\n\n本页归属好友新增、资料变化和删除事件。以下 callback 应组合进应用唯一的 `OnFriendshipListener`:\n\n```java\n@Override\npublic void onFriendAdded(FriendInfo friend) {\n friendStore.put(friend.getUserID(), friend);\n}\n\n@Override\npublic void onFriendInfoChanged(FriendInfo friend) {\n friendStore.put(friend.getUserID(), friend);\n}\n\n@Override\npublic void onFriendDeleted(FriendInfo friend) {\n friendStore.remove(friend.getUserID());\n}\n```", + "description": "使用 getFriendListPage() 分页获取当前用户的好友列表。", + "headings": [ + { + "depth": 2, + "title": "好友资料字段", + "url": "#好友资料字段" + } + ], + "sourcePath": "/sdk/android/user/friends/get-friend-list-page", + "title": "分页获取好友列表" + }, + "/sdk/android/user/friends/search-friends": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.searchFriends(\n new OnBase>() {\n @Override\n public void onSuccess(List results) {\n showFriendSearchResults(results);\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendSearchFailure(code, error);\n }\n },\n Collections.singletonList(keyword.trim()),\n true,\n true,\n true\n);\n```\n\n`keywordList` 当前只传一个非空关键词。后面的三个布尔值依次控制是否匹配用户 ID、昵称和好友备注,至少应启用一种匹配方式。需要同时搜索多个字段时,将对应开关设为 `true`;不支持把多个关键词作为同一请求的独立搜索条件。\n\n成功 callback 返回 `List`。搜索结果只属于当前搜索视图,不应覆盖完整好友列表,也不会触发好友 listener。", + "description": "使用 searchFriends() 搜索当前用户的好友。", + "headings": [], + "sourcePath": "/sdk/android/user/friends/search-friends", + "title": "搜索好友" + }, + "/sdk/android/user/friends/get-friends-info": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.getFriendsInfo(\n new OnBase>() {\n @Override\n public void onSuccess(List friends) {\n for (UserInfo friend : friends) {\n friendStore.put(friend.getUserID(), friend);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendInfoFailure(code, error);\n }\n },\n Arrays.asList(\"user_a\", \"user_b\"),\n true\n);\n```\n\n第二个参数是目标用户 ID 列表,`filterBlack` 决定是否过滤黑名单用户。成功 callback 返回 `List`;通过 `getFriendInfo()` 读取好友备注和关系字段,并按 `userID` 合并。调用前应去除空值和重复 ID。\n\n当目标用户不是好友,或目标用户因 `filterBlack == true` 被过滤时,返回结果中可能没有对应记录。需要同时展示账号公开资料时,应再调用[获取指定用户资料](/sdk/android/user/user-profile/get-users-info),并按 `userID` 合并两类数据。\n\n该查询不会触发好友 listener。只需要判断好友关系时使用 [`checkFriend()`](/sdk/android/user/friends/check-friend)。", + "description": "使用 getFriendsInfo() 查询指定用户的好友关系资料。", + "headings": [], + "sourcePath": "/sdk/android/user/friends/get-friends-info", + "title": "查询指定好友资料" + }, + "/sdk/android/user/friends/check-friend": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.checkFriend(\n new OnBase>() {\n @Override\n public void onSuccess(List relations) {\n showFriendshipStates(relations);\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendshipCheckFailure(code, error);\n }\n },\n Arrays.asList(\"user_a\", \"user_b\")\n);\n```\n\n成功 callback 返回 `List`。每项的 `userID` 标识目标用户,`result == 1` 表示目标是好友且不在黑名单中。`result` 以服务端返回值为准,不应在客户端扩展未声明的状态枚举。\n\n该方法只建立关系快照,不触发好友 listener。需要昵称、头像或好友备注时使用 [`getFriendsInfo()`](/sdk/android/user/friends/get-friends-info)。", + "description": "使用 checkFriend() 检查指定用户是否为当前用户的好友。", + "headings": [], + "sourcePath": "/sdk/android/user/friends/check-friend", + "title": "检查好友关系" + }, + "/sdk/android/user/friends/update-friends": { + "body": "```java\nUpdateFriendsReq request = new UpdateFriendsReq();\nrequest.setFriendUserIDs(new String[] { friendUserID });\nrequest.setRemark(remark.trim());\n\nOpenIMClient.getInstance().friendshipManager.updateFriendsReq(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markFriendUpdateSubmitted();\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendUpdateFailure(code, error);\n }\n },\n request\n);\n```\n\n`UpdateFriendsReq` 可设置 `friendUserIDs`、`remark`、`isPinned` 和 `ex`。一次调用会把同一字段值应用到全部目标好友;不同好友需要不同值时应分别调用。`ex` 是完整字符串。\n\n| 字段 | 说明 |\n| --------------- | ---------------------------------- |\n| `friendUserIDs` | 待更新的好友 ID 数组。 |\n| `remark` | 当前账号设置的好友备注。 |\n| `isPinned` | 是否置顶好友。 |\n| `ex` | 好友关系扩展字符串,按完整值覆盖。 |\n\n成功 callback 表示更新请求完成。好友资料增量通过 `onFriendInfoChanged` 合并,事件处理见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。", + "description": "使用 updateFriendsReq() 更新好友备注、置顶状态或扩展字段。", + "headings": [], + "sourcePath": "/sdk/android/user/friends/update-friends", + "title": "更新好友资料" + }, + "/sdk/android/user/friends/delete-friend": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.deleteFriend(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markFriendDeletionSubmitted(friendUserID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendDeletionFailure(code, error);\n }\n },\n friendUserID\n);\n```\n\n成功 callback 表示删除请求完成。`onFriendDeleted` 到达后再按 `userID` 从好友状态中移除记录,事件处理见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。", + "description": "使用 deleteFriend() 删除当前用户的一条好友关系。", + "headings": [], + "sourcePath": "/sdk/android/user/friends/delete-friend", + "title": "删除好友" + }, + "/sdk/android/user/friend-applications/add-friend": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.addFriend(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markFriendApplicationSubmitted();\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendApplicationFailure(code, error);\n }\n },\n \"user_b\",\n \"你好,我是 Alex\"\n);\n```\n\n第二个参数是申请接收方的 `userID`,第三个参数是申请附言。成功 callback 表示服务端已收到申请,不表示对方已经同意。目标用户 ID 不能为空;按昵称、手机号等字段搜索目标用户应先由业务后端完成。\n\n好友申请状态变化通过 `OnFriendshipListener` 合并,见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。", + "description": "使用 addFriend() 向指定用户发送好友申请。", + "headings": [], + "sourcePath": "/sdk/android/user/friend-applications/add-friend", + "title": "发送好友申请" + }, + "/sdk/android/user/friend-applications/get-recv-friend-application-list": { + "body": "```java\nGetFriendApplicationListAsRecipientReq request =\n new GetFriendApplicationListAsRecipientReq(0, 20);\n\nOpenIMClient.getInstance().friendshipManager.getRecvFriendApplicationList(\n new OnBase>() {\n @Override\n public void onSuccess(List applications) {\n replaceReceivedApplications(applications);\n }\n\n @Override\n public void onError(int code, String error) {\n recordReceivedApplicationFailure(code, error);\n }\n },\n request\n);\n```\n\n`offset` 从 `0` 开始,`count` 是页大小。需要筛选处理状态时可通过 `setHandleResults(int[])` 设置服务端约定的状态值。成功 callback 返回当前页 `List`。\n\n| 字段 | 说明 |\n| --------------------------------------------- | ---------------------------------------------- |\n| `fromUserID` / `fromNickname` / `fromFaceURL` | 申请发起人的 ID、昵称和头像快照。 |\n| `toUserID` / `toNickname` / `toFaceURL` | 申请接收人的 ID、昵称和头像快照。 |\n| `reqMsg` | 申请附言。 |\n| `handleResult` | 处理结果:`0` 待处理,`1` 已同意,`2` 已拒绝。 |\n| `handlerUserID` | 执行处理的用户 ID,待处理时可能为空。 |\n| `handleMsg` | 处理附言。 |\n| `handleTime` | 处理时间,待处理时不应作为有效时间使用。 |\n| `createTime` | 申请记录创建时间。 |\n| `ex` | 申请记录扩展字符串。 |\n\n好友申请使用 `fromUserID:toUserID` 作为稳定标识。本页归属好友申请新增、接受、拒绝和删除事件,以下 callback 应组合进应用唯一的 `OnFriendshipListener`:\n\n```java\n@Override\npublic void onFriendApplicationAdded(FriendApplicationInfo application) {\n friendApplicationStore.merge(application);\n}\n\n@Override\npublic void onFriendApplicationAccepted(FriendApplicationInfo application) {\n friendApplicationStore.merge(application);\n}\n\n@Override\npublic void onFriendApplicationRejected(FriendApplicationInfo application) {\n friendApplicationStore.merge(application);\n}\n\n@Override\npublic void onFriendApplicationDeleted(FriendApplicationInfo application) {\n friendApplicationStore.remove(\n application.getFromUserID(),\n application.getToUserID()\n );\n}\n```\n\n按 `toUserID` 是否等于当前登录用户 ID,将记录分流到收到或发出的列表。申请被接受后,新好友关系由[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)归属的 `onFriendAdded` 合并。", + "description": "使用 getRecvFriendApplicationList() 分页查询当前用户收到的好友申请。", + "headings": [], + "sourcePath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "title": "获取收到的好友申请" + }, + "/sdk/android/user/friend-applications/get-send-friend-application-list": { + "body": "```java\nGetFriendApplicationListAsApplicantReq request =\n new GetFriendApplicationListAsApplicantReq(0, 20);\n\nOpenIMClient.getInstance().friendshipManager.getSendFriendApplicationList(\n new OnBase>() {\n @Override\n public void onSuccess(List applications) {\n replaceSentApplications(applications);\n }\n\n @Override\n public void onError(int code, String error) {\n recordSentApplicationFailure(code, error);\n }\n },\n request\n);\n```\n\n`offset` 从 `0` 开始,`count` 是页大小。成功 callback 返回当前页 `List`;按 `fromUserID:toUserID` 合并。查询只建立快照,不触发好友申请事件。\n\n发出的申请中,当前用户通常是 `fromUserID`。列表字段和处理结果含义与[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)相同;申请处理状态使用 Android 服务端约定的 `0`(待处理)、`1`(已同意)和 `2`(已拒绝)。", + "description": "使用 getSendFriendApplicationList() 分页查询当前用户发出的好友申请。", + "headings": [], + "sourcePath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "title": "获取发出的好友申请" + }, + "/sdk/android/user/friend-applications/accept-friend-application": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.acceptFriendApplication(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markApplicationAccepted(applicantUserID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordApplicationAcceptFailure(code, error);\n }\n },\n applicantUserID,\n \"已通过\"\n);\n```\n\n`applicantUserID` 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示接受请求完成;好友申请状态和新增好友关系可能通过不同 callback 到达,应分别合并。申请状态由 `onFriendApplicationAccepted` 更新,新好友关系由 `onFriendAdded` 更新。", + "description": "使用 acceptFriendApplication() 接受好友申请。", + "headings": [], + "sourcePath": "/sdk/android/user/friend-applications/accept-friend-application", + "title": "接受好友申请" + }, + "/sdk/android/user/friend-applications/refuse-friend-application": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.refuseFriendApplication(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markApplicationRejected(applicantUserID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordApplicationRejectFailure(code, error);\n }\n },\n applicantUserID,\n \"暂不添加\"\n);\n```\n\n`applicantUserID` 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示拒绝请求完成;申请状态通过统一好友申请 listener 合并,并最终以 `handleResult == 2` 表示已拒绝。", + "description": "使用 refuseFriendApplication() 拒绝好友申请。", + "headings": [], + "sourcePath": "/sdk/android/user/friend-applications/refuse-friend-application", + "title": "拒绝好友申请" + }, + "/sdk/android/user/blacklist/get-blacklist": { + "body": "黑名单记录当前用户主动拉黑的用户,可用于黑名单设置页、资料卡中的关系状态和聊天入口限制。黑名单与群成员管理是独立能力;禁言、移除群成员或调整群角色时,应使用群组 API。\n\n## 获取黑名单\n\n完成 SDK 初始化并登录后,调用 `getBlacklist()` 获取当前账号的完整黑名单。返回空列表表示当前没有黑名单用户。\n\n```java\nOpenIMClient.getInstance().friendshipManager.getBlacklist(\n new OnBase>() {\n @Override\n public void onSuccess(List users) {\n blacklistStore.replace(users);\n }\n\n @Override\n public void onError(int code, String error) {\n recordBlacklistFailure(code, error);\n }\n }\n);\n```\n\n成功 callback 返回 `List`;通过 `UserInfo.getBlackInfo()` 读取黑名单关系对象。\n\n## 黑名单记录字段\n\n`BlacklistInfo` 的常用字段如下:\n\n| 字段 | 说明 |\n| ---------------- | ------------------------------------------------- |\n| `userID` | 被当前用户拉黑的目标用户 ID,也是列表的稳定 key。 |\n| `nickname` | 目标用户昵称快照。 |\n| `faceURL` | 目标用户头像地址。 |\n| `gender` | 目标用户性别值。 |\n| `operatorUserID` | 执行拉黑操作的用户 ID。 |\n| `createTime` | 黑名单关系创建时间。 |\n| `addSource` | 黑名单关系的添加来源。 |\n| `ex` | 黑名单关系扩展字符串。 |\n\n如果页面还要展示好友备注或最新公开资料,应按 `userID` 额外合并 `FriendInfo` 或 `PublicUserInfo`,不能把黑名单字段当作好友资料。\n\n黑名单状态统一按 `userID` 合并。查询本身不会触发黑名单新增或删除事件。\n\n首次进入页面、重连或用户主动刷新时,使用返回的完整列表替换本地快照;增量变化由[拉黑用户](/sdk/android/user/blacklist/add-blacklist)和[取消拉黑用户](/sdk/android/user/blacklist/remove-blacklist)页面归属的 listener 处理。", + "description": "使用 getBlacklist() 获取当前用户的黑名单。", + "headings": [ + { + "depth": 2, + "title": "获取黑名单", + "url": "#获取黑名单" + }, + { + "depth": 2, + "title": "黑名单记录字段", + "url": "#黑名单记录字段" + } + ], + "sourcePath": "/sdk/android/user/blacklist/get-blacklist", + "title": "获取黑名单列表" + }, + "/sdk/android/user/blacklist/add-blacklist": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.addBlacklist(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markBlacklistRequestSubmitted(targetUserID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordBlacklistAddFailure(code, error);\n }\n },\n targetUserID,\n \"{\\\"source\\\":\\\"profile-menu\\\"}\"\n);\n```\n\n第二个参数是目标 `userID`,第三个参数是可选扩展字符串。无需扩展信息时可使用不带 `ex` 的重载。成功 callback 表示拉黑请求完成,不表示事件已经到达。\n\n黑名单是单向关系:被拉黑用户不能向当前用户发送消息,但当前用户是否允许继续向对方发送消息由业务层决定。`ex` 是完整字符串,更新前应合并业务自己的扩展字段。\n\n`onBlacklistAdded` 由本页归属,应组合进应用唯一的 `OnFriendshipListener`:\n\n```java\n@Override\npublic void onBlacklistAdded(BlacklistInfo user) {\n blacklistStore.put(user.getUserID(), user);\n}\n```", + "description": "使用 addBlacklist() 将用户加入当前账号黑名单。", + "headings": [], + "sourcePath": "/sdk/android/user/blacklist/add-blacklist", + "title": "拉黑用户" + }, + "/sdk/android/user/blacklist/remove-blacklist": { + "body": "```java\nOpenIMClient.getInstance().friendshipManager.removeBlacklist(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markBlacklistRemovalSubmitted(targetUserID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordBlacklistRemovalFailure(code, error);\n }\n },\n targetUserID\n);\n```\n\n成功 callback 表示移除请求完成,不表示事件已经到达。黑名单快照应在 `onBlacklistDeleted` 到达后按 `userID` 删除;如果事件丢失,可重新调用[获取黑名单列表](/sdk/android/user/blacklist/get-blacklist)校准。\n\n`onBlacklistDeleted` 由本页归属,应按 `userID` 删除本地记录:\n\n```java\n@Override\npublic void onBlacklistDeleted(BlacklistInfo user) {\n blacklistStore.remove(user.getUserID());\n}\n```", + "description": "使用 removeBlacklist() 将用户移出当前账号黑名单。", + "headings": [], + "sourcePath": "/sdk/android/user/blacklist/remove-blacklist", + "title": "取消拉黑用户" + }, + "/sdk/android/conversation/overview-conversation": { + "body": "会话是当前登录用户围绕一次单聊或群聊维护的聊天列表状态,由一条 `ConversationInfo` 记录表示。它保存未读数、最后一条消息、置顶、草稿、消息接收方式和扩展字段。`conversationID` 用于定位当前账号的会话状态;单聊目标使用对方 `userID`,群聊目标使用 `groupID`。\n\n群资料、成员关系和群权限属于群组能力。群聊页面使用 `groupID` 调用群组 API,使用 `conversationID` 处理会话设置、未读数、草稿和消息清理。\n\n## 会话标识\n\n| 标识 | 用途 |\n| ---------------- | ----------------------------------------------------------------------------- |\n| `conversationID` | 当前账号的会话记录 ID,用于会话设置、未读状态和消息历史。 |\n| `userID` | 单聊对方的用户 ID。 |\n| `groupID` | 群聊对应的群组 ID,也是群组 API 的目标标识。 |\n| `sourceId` | 按会话类型查询或生成 ID 时传入的聊天目标:单聊为 `userID`,群聊为 `groupID`。 |\n\n单聊使用 `ConversationType.SINGLE_CHAT`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`;不要在应用层自行拼接 `conversationID`。\n\n## ConversationInfo\n\n| 字段 | 说明 |\n| ----------------------------------- | ------------------------------------ |\n| `conversationID` | 会话 ID。 |\n| `conversationType` | 会话类型。 |\n| `userID` / `groupID` | 单聊目标用户或群聊目标群组。 |\n| `showName` / `faceURL` | 会话列表显示名称和头像。 |\n| `unreadCount` | 当前会话未读数。 |\n| `latestMsg` / `latestMsgSendTime` | 最后一条消息 JSON 字符串及发送时间。 |\n| `recvMsgOpt` | 当前会话消息接收方式。 |\n| `groupAtType` | 群聊 @ 提醒状态。 |\n| `draftText` / `draftTextTime` | 会话草稿及更新时间。 |\n| `isPinned` | 是否置顶。 |\n| `isPrivateChat` / `burnDuration` | 阅后即焚开关和保留时长。 |\n| `isMsgDestruct` / `msgDestructTime` | 服务端消息定期删除设置。 |\n| `ex` | 业务约定的会话扩展字符串。 |\n\n## 查询和设置\n\n- [查询指定会话](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target)\n- [生成会话 ID](/sdk/android/conversation/retrieving-conversations/get-conversation-id)\n- [按 ID 批量获取会话](/sdk/android/conversation/retrieving-conversations/get-conversations-by-id)\n- [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)\n- [置顶或取消置顶会话](/sdk/android/conversation/managing-conversations/pin-conversation)\n- [设置会话扩展字段](/sdk/android/conversation/managing-conversations/set-conversation-extension)\n- [设置会话草稿](/sdk/android/conversation/managing-conversations/set-conversation-draft)\n- [设置会话消息接收方式](/sdk/android/conversation/managing-conversations/set-message-receive-option)\n- [重置群聊 @ 状态](/sdk/android/conversation/managing-conversations/clear-group-mentions)\n- [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read)\n- [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count)\n- [开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat)\n- [定期删除服务端消息](/sdk/android/conversation/managing-conversations/set-message-destruct)\n\n## 状态更新\n\n查询方法建立会话快照,事件负责合并后续增量:\n\n- 新会话和会话属性变化由[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)归属的 `onNewConversation` 与 `onConversationChanged` 处理。\n- 当前账号总未读数由[获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count)归属的 `onTotalUnreadMessageCountChanged` 处理。\n\n`ConversationManager` 只保存一个 `OnConversationListener`,`setOnConversationListener()` 会替换当前 listener。应用应在统一状态层组合所有 callback 并设置一次;请求成功、事件到达和重新查询校准是三个独立阶段。", + "description": "了解 Android SDK 中 ConversationInfo、conversationID、会话设置和会话事件的职责。", + "headings": [ + { + "depth": 2, + "title": "会话标识", + "url": "#会话标识" + }, + { + "depth": 2, + "title": "ConversationInfo", + "url": "#conversationinfo" + }, + { + "depth": 2, + "title": "查询和设置", + "url": "#查询和设置" + }, + { + "depth": 2, + "title": "状态更新", + "url": "#状态更新" + } + ], + "sourcePath": "/sdk/android/conversation/overview-conversation", + "title": "会话概览" + }, + "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target": { + "body": "从通讯录、用户资料或群资料进入聊天页时,使用 `getOneConversation()`。单聊传对方用户 ID,群聊传群组 ID;即使还没有消息,也不要自行构造 `ConversationInfo`。\n\n```java\nOpenIMClient.getInstance().conversationManager.getOneConversation(\n new OnBase() {\n @Override\n public void onSuccess(ConversationInfo conversation) {\n openChatPage(conversation);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationOpenFailure(code, error);\n }\n },\n targetUserID,\n ConversationType.SINGLE_CHAT\n);\n```\n\n参数 `sourceId` 在单聊中是对方 `userID`,在群聊中是 `groupID`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。\n\n成功 callback 返回 `ConversationInfo`。查询本身不触发会话 listener;后续变化由[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)统一按 `conversationID` 合并。", + "description": "使用 getOneConversation() 按用户或群组获取一个 Android 会话。", + "headings": [], + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "title": "查询指定会话" + }, + "/sdk/android/conversation/retrieving-conversations/get-conversation-id": { + "body": "只需要会话 ID 时,调用 `getConversationIDBySessionType()`,不要在应用层自行拼接。\n\n```java\nString conversationID = OpenIMClient.getInstance().conversationManager\n .getConversationIDBySessionType(\n targetUserID,\n ConversationType.SINGLE_CHAT\n );\n```\n\n`sourceId` 在单聊中是对方 `userID`,在群聊中是 `groupID`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。\n\n该方法同步返回 `String` 类型的 `conversationID`,不返回完整 `ConversationInfo`,也不触发会话 listener。需要会话资料时调用[查询指定会话](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target)。", + "description": "使用 getConversationIDBySessionType() 按聊天目标计算 Android 会话 ID。", + "headings": [], + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "title": "生成会话 ID" + }, + "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id": { + "body": "已经持有一组 `conversationID` 时,使用 `getMultipleConversation()` 读取最新会话快照。\n\n```java\nOpenIMClient.getInstance().conversationManager.getMultipleConversation(\n new OnBase>() {\n @Override\n public void onSuccess(List conversations) {\n for (ConversationInfo item : conversations) {\n conversationStore.put(item.getConversationID(), item);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationQueryFailure(code, error);\n }\n },\n conversationIDs\n);\n```\n\n调用前去除空值和重复 ID。成功 callback 返回 `List`;某个 ID 没有结果时按缺失记录处理,不要依赖响应与请求列表的位置完全一一对应。\n\n查询本身不触发会话 listener。会话列表的持续同步见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 getMultipleConversation() 按 conversationID 批量获取 Android 会话。", + "headings": [], + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "title": "按 ID 批量获取会话" + }, + "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list": { + "body": "会话列表属于当前登录用户。每条 `ConversationInfo` 包含会话标识、未读数、最后一条消息、置顶和草稿等状态。使用分页接口读取会话,不使用一次加载完整列表的 `getAllConversationList()`。\n\n## 分页获取会话\n\n```java\nOpenIMClient.getInstance().conversationManager.getConversationListSplit(\n new OnBase>() {\n @Override\n public void onSuccess(List conversations) {\n mergeConversations(conversations);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationListFailure(code, error);\n }\n },\n 0,\n 50\n);\n```\n\n| 参数 | 类型 | 说明 |\n| -------- | ------ | ------------------------------------------- |\n| `offset` | `long` | 从 `0` 开始的分页偏移量;刷新时重置为 `0`。 |\n| `count` | `long` | 本页期望返回的会话数量。 |\n\n成功 callback 返回当前页 `List`。继续加载时按已经请求的条目数量推进 `offset`,并按 `conversationID` 去重;返回数量小于 `count` 时通常表示到达末页。主动刷新时清空分页状态后从 `0` 重载。\n\n## 保持列表同步\n\n`getConversationListSplit()` 只建立快照,不触发会话 callback。以下 callback 应组合进应用唯一的 `OnConversationListener`:\n\n```java\n@Override\npublic void onNewConversation(List conversations) {\n mergeConversations(conversations);\n}\n\n@Override\npublic void onConversationChanged(List conversations) {\n mergeConversations(conversations);\n}\n```\n\n两个事件都携带 `List`,按 `conversationID` 幂等合并。`setOnConversationListener()` 采用替换语义,应由应用级状态层设置一次。用户加入群组但尚未产生消息时不一定有会话;退出群组后也可能保留历史会话记录,不能用已加入群组列表替代会话列表。", + "description": "使用 getConversationListSplit() 分页获取当前 Android 账号的会话列表。", + "headings": [ + { + "depth": 2, + "title": "分页获取会话", + "url": "#分页获取会话" + }, + { + "depth": 2, + "title": "保持列表同步", + "url": "#保持列表同步" + } + ], + "sourcePath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "获取会话列表" + }, + "/sdk/android/conversation/managing-conversations/pin-conversation": { + "body": "```java\nOpenIMClient.getInstance().conversationManager.pinConversation(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markPinRequestSubmitted(conversationID, true);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationPinFailure(code, error);\n }\n },\n conversationID,\n true\n);\n```\n\n最后一个参数为 `true` 时置顶,传 `false` 时取消置顶。该状态只影响当前账号的会话列表。\n\n成功 callback 不等于 `onConversationChanged` 已经到达。后续按 `conversationID` 合并最新会话,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 pinConversation() 设置 Android 指定会话的置顶状态。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "title": "置顶或取消置顶会话" + }, + "/sdk/android/conversation/managing-conversations/set-conversation-extension": { + "body": "`ex` 是完整字符串,SDK 不会自动合并 JSON。更新前应读取旧值并保留其他业务模块的命名空间。\n\n```java\nOpenIMClient.getInstance().conversationManager.setConversationEx(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markConversationExtensionSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationExtensionFailure(code, error);\n }\n },\n conversationID,\n mergedExtensionJSON\n);\n```\n\n成功 callback 表示设置请求完成。通过 `onConversationChanged` 按 `conversationID` 合并最新会话;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 setConversationEx() 设置 Android 指定会话的业务扩展字符串。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "title": "设置会话扩展字段" + }, + "/sdk/android/conversation/managing-conversations/set-conversation-draft": { + "body": "用户离开聊天页、切换会话或输入框内容变化时,可以使用 `setConversationDraft()` 保存草稿。输入过程中先维护编辑器状态并对保存调用做防抖;离开页面前再提交一次最新文本。\n\n```java\nOpenIMClient.getInstance().conversationManager.setConversationDraft(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markDraftSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordDraftSaveFailure(code, error);\n }\n },\n conversationID,\n editorValue\n);\n```\n\n清空草稿时传空字符串。成功 callback 只表示保存请求已经完成,不等同于会话变化回调已经到达;SDK 后续通过 `onConversationChanged` 同步 `draftText` 和 `draftTextTime`,需要校准时重新查询会话。退出登录或切换账号时清理编辑器内存状态。", + "description": "使用 setConversationDraft() 保存 Android 会话草稿。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "title": "设置会话草稿" + }, + "/sdk/android/conversation/managing-conversations/set-message-receive-option": { + "body": "```java\nOpenIMClient.getInstance().conversationManager.setConversationRecvMessageOpt(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markReceiveOptionSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordReceiveOptionFailure(code, error);\n }\n },\n conversationID,\n 2\n);\n```\n\n| 数值 | 含义 |\n| ---- | ---------------------------- |\n| `0` | 正常接收消息并允许通知。 |\n| `1` | 不接收该会话消息,也不通知。 |\n| `2` | 接收该会话消息,但不通知。 |\n\n账号级默认策略见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。成功 callback 后通过 `onConversationChanged` 按 `conversationID` 合并最新会话。", + "description": "使用 setConversationRecvMessageOpt() 设置 Android 单个会话的消息接收与通知方式。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "title": "设置会话消息接收方式" + }, + "/sdk/android/conversation/managing-conversations/clear-group-mentions": { + "body": "用户处理完群聊中的 @ 消息后,调用 `resetConversationGroupAtType()` 将 `groupAtType` 重置为普通状态。\n\n```java\nOpenIMClient.getInstance().conversationManager.resetConversationGroupAtType(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markGroupMentionStateReset(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordGroupMentionResetFailure(code, error);\n }\n },\n conversationID\n);\n```\n\n本操作只负责重置为普通状态,不应用于主动写入 `atMe`、`atAll` 等状态。群聊 @ 状态与消息已读状态不同。\n\n成功 callback 后通过 `onConversationChanged` 按 `conversationID` 合并该会话;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 resetConversationGroupAtType() 将 Android 指定会话的群聊 @ 状态重置为普通状态。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "title": "重置群聊 @ 状态" + }, + "/sdk/android/conversation/managing-conversations/mark-conversation-read": { + "body": "用户打开会话并阅读完当前可见消息后,调用 `messageManager.markConversationMessageAsRead()`。不要在仅预览通知或后台收到消息时提前标记。\n\n```java\nOpenIMClient.getInstance().messageManager.markConversationMessageAsRead(\n conversationID,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markConversationReadSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordMarkReadFailure(code, error);\n }\n }\n);\n```\n\n成功 callback 表示请求完成,不等于 `onConversationChanged` 已到达。随后按 `conversationID` 合并最新 `ConversationInfo`;需要立即确认时重新查询该会话。\n\n对于单聊,当前用户标记会话已读后,对端可通过 `OnAdvanceMsgListener.onRecvC2CReadReceipt` 收到已读回执。对每个 `C2CReadReceiptInfo` 先验证 `sessionType == ConversationType.SINGLE_CHAT` 和非空 `userID`,再按 `msgIDList` 更新对应消息的已读状态。`MessageManager` 同样只保存一个高级消息 listener,应在应用级消息状态层统一设置。", + "description": "使用 messageManager.markConversationMessageAsRead() 将 Android 指定会话的消息标记为已读。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "title": "标记会话已读" + }, + "/sdk/android/conversation/managing-conversations/get-total-unread-count": { + "body": "`getTotalUnreadMsgCount()` 返回当前账号所有会话的总未读快照,不要把当前已加载分页中的 `unreadCount` 简单相加。\n\n```java\nOpenIMClient.getInstance().conversationManager.getTotalUnreadMsgCount(\n new OnBase() {\n @Override\n public void onSuccess(String value) {\n int totalUnread = Integer.parseInt(value);\n updateApplicationBadge(totalUnread);\n }\n\n @Override\n public void onError(int code, String error) {\n recordTotalUnreadFailure(code, error);\n }\n }\n);\n```\n\n回调值是 `String`,解析失败时应按业务错误处理,不能将其默认为会话列表分页的局部总数。查询本身不触发 callback。\n\n本页归属 `OnConversationListener.onTotalUnreadMessageCountChanged(int count)`。在应用唯一的 `OnConversationListener` 中按该值更新应用角标;会话 listener 的集中设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 getTotalUnreadMsgCount() 获取 Android 当前账号的总未读数。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "title": "获取消息总未读数" + }, + "/sdk/android/conversation/managing-conversations/set-private-chat": { + "body": "```java\nOpenIMClient.getInstance().conversationManager.setOneConversationPrivateChat(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markPrivateChatSubmitted(conversationID, true);\n }\n\n @Override\n public void onError(int code, String error) {\n recordPrivateChatFailure(code, error);\n }\n },\n conversationID,\n true\n);\n```\n\n传入 `false` 关闭阅后即焚。具体保留时长由 `burnDuration` 单独设置,见[设置阅后即焚时长](/sdk/android/conversation/managing-conversations/set-burn-duration)。该能力与定期删除服务端消息不同。\n\n成功 callback 只表示设置请求完成;最新状态通过 `onConversationChanged` 按 `conversationID` 合并,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 setOneConversationPrivateChat() 设置 Android 会话的阅后即焚模式。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "title": "开启或关闭阅后即焚" + }, + "/sdk/android/conversation/managing-conversations/set-burn-duration": { + "body": "```java\nOpenIMClient.getInstance().conversationManager.setConversationBurnDuration(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markBurnDurationSubmitted(conversationID, 30);\n }\n\n @Override\n public void onError(int code, String error) {\n recordBurnDurationFailure(code, error);\n }\n },\n conversationID,\n 30\n);\n```\n\n`burnDuration` 的单位为秒。启用或关闭阅后即焚需要设置 `isPrivateChat`,见[开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat)。不要把它与服务端消息定期删除周期 `msgDestructTime` 混用。\n\n成功 callback 后,通过 `onConversationChanged` 合并最新 `burnDuration`;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 setConversationBurnDuration() 设置 Android 阅后即焚模式的消息保留时长。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "title": "设置阅后即焚时长" + }, + "/sdk/android/conversation/managing-conversations/set-message-destruct": { + "body": "`isMsgDestruct` 与 `msgDestructTime` 共同构成服务端消息定期删除设置,可以在一次 `ConversationReq` 中提交。\n\n```java\nConversationReq request = new ConversationReq();\nrequest.setMsgDestruct(true);\nrequest.setMsgDestructTime(3600);\n\nOpenIMClient.getInstance().conversationManager.setConversation(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markMessageDestructSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordMessageDestructFailure(code, error);\n }\n },\n conversationID,\n request\n);\n```\n\n`msgDestructTime` 的单位为秒。关闭时只传 `request.setMsgDestruct(false)`;该能力用于定期删除服务端消息,不是阅后即焚。\n\n成功 callback 表示设置请求完成。最新开关和周期通过 `onConversationChanged` 按 `conversationID` 合并,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 setConversation() 启用、关闭并配置 Android 会话的服务端消息定期删除策略。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "title": "定期删除服务端消息" + }, + "/sdk/android/conversation/managing-conversations/hide-a-conversation": { + "body": "`hideConversation()` 只隐藏当前登录用户的会话入口,不会删除单聊关系、退出群组或影响其他用户。\n\n```java\nOpenIMClient.getInstance().conversationManager.hideConversation(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n conversationStore.remove(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationHideFailure(code, error);\n }\n },\n conversationID\n);\n```\n\n该方法适合临时从聊天列表移除入口。收到新消息或重新同步后,隐藏的会话可能再次出现。\n\n成功 callback 表示隐藏请求已完成,调用端可以从当前列表移除该 `conversationID`。后续收到 `onConversationChanged` 时仍应按 `conversationID` 幂等合并;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 hideConversation() 从 Android 当前账号的会话列表隐藏入口。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "title": "隐藏会话" + }, + "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages": { + "body": "产品语义为“删除此聊天”时,调用 `deleteConversationAndDeleteAllMsg()`。\n\n```java\nOpenIMClient.getInstance().conversationManager.deleteConversationAndDeleteAllMsg(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n messageStore.clearConversation(conversationID);\n conversationStore.remove(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationDeleteFailure(code, error);\n }\n },\n conversationID\n);\n```\n\n成功 callback 后清理当前消息列表和会话行。该操作不删除好友关系,也不退出或解散群组;聊天目标仍存在时,会话可能由新消息或同步重新生成。\n\n后续通过 `onConversationChanged` 或重新查询校准会话列表,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 deleteConversationAndDeleteAllMsg() 删除 Android 指定会话及其全部消息。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "title": "删除会话及消息" + }, + "/sdk/android/conversation/managing-conversations/clear-conversation-messages": { + "body": "产品语义为“清空聊天记录”时,调用 `messageManager.clearConversationAndDeleteAllMsg()`。\n\n```java\nOpenIMClient.getInstance().messageManager.clearConversationAndDeleteAllMsg(\n conversationID,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n messageStore.clearConversation(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationClearFailure(code, error);\n }\n }\n);\n```\n\n成功 callback 后保留会话入口,但清除当前账号下的消息和摘要状态。立即清理当前消息列表,再通过 `onConversationChanged` 或重新查询校准最后一条消息、摘要和未读状态。", + "description": "使用 messageManager.clearConversationAndDeleteAllMsg() 保留 Android 会话入口并清空其消息。", + "headings": [], + "sourcePath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "title": "清空会话消息" + }, + "/sdk/android/group/overview-group": { + "body": "群组由 `GroupInfo` 表示,`groupID` 是群资料、成员、申请和权限设置的唯一目标标识。`GroupMembersInfo` 表示成员在某个群内的昵称、角色、禁言结束时间和扩展字段;单聊关系和会话未读数不属于群组 API。\n\n`GroupManager` 将群资料变化、成员增删改、入群申请处理和加入群组变化统一发送到一个 `OnGroupListener`。在共享状态层设置一次 listener,并按 `groupID` 或 `userID` 合并事件。\n\n```java\nOpenIMClient.getInstance().groupManager.setOnGroupListener(new OnGroupListener() {\n @Override public void onGroupInfoChanged(GroupInfo group) {\n groupStore.put(group.getGroupID(), group);\n }\n\n @Override public void onGroupMemberInfoChanged(GroupMembersInfo member) {\n memberStore.put(member.getGroupID() + member.getUserID(), member);\n }\n});\n```\n\n群资料或成员操作的成功 callback 只表示该请求完成;状态以对应群组事件或重新查询结果为准。\n\n## 主要能力\n\n- [群资料与设置](/sdk/android/group/create-group)\n- [群权限](/sdk/android/group/set-group-join-verification)\n- [加入与退出群组](/sdk/android/group/join-group)\n- [查询群组](/sdk/android/group/retrieving-groups/get-specified-groups-info)\n- [群申请](/sdk/android/group/group-applications/overview-group-applications)\n- [查询群成员](/sdk/android/group/retrieving-group-members/overview-retrieving-group-members)\n- [管理群成员](/sdk/android/group/managing-group-members/invite-user-to-group)", + "description": "了解 Android SDK 中群资料、成员、申请和群组事件的职责。", + "headings": [ + { + "depth": 2, + "title": "主要能力", + "url": "#主要能力" + } + ], + "sourcePath": "/sdk/android/group/overview-group", + "title": "群组概览" + }, + "/sdk/android/group/create-group": { + "body": "使用 `createGroup()` 创建群组。`GroupInfo` 填写群资料;初始普通成员、管理员和群主分别通过独立参数传入。成功回调返回创建后的完整 `GroupInfo`,应保存服务端确定的 `groupID`。\n\n```java\nGroupInfo info = new GroupInfo();\ninfo.setGroupName(\"项目讨论\");\ninfo.setIntroduction(\"仅限项目成员\");\n\nOpenIMClient.getInstance().groupManager.createGroup(\n memberUserIDs, adminUserIDs, info, ownerUserID,\n new OnBase() {\n @Override public void onSuccess(GroupInfo group) { openGroup(group.getGroupID()); }\n @Override public void onError(int code, String error) { showCreateError(error); }\n }\n);\n```\n\n群主和管理员必须由业务侧按权限选择。不要在客户端根据本地用户列表推导群主身份。", + "description": "使用 createGroup 创建群资料并指定初始成员、管理员和群主。", + "headings": [], + "sourcePath": "/sdk/android/group/create-group", + "title": "创建群组" + }, + "/sdk/android/group/update-group-profile": { + "body": "使用 `setGroupInfo()` 更新群资料。请求对象至少应包含 `groupID` 和需要修改的字段;不要用不完整的本地缓存覆盖未参与本次编辑的字段。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setGroupName(\"移动端项目组\");\nupdate.setIntroduction(\"Android 与 iOS 协作群\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markGroupUpdateSubmitted(groupID); }\n @Override public void onError(int code, String error) { showGroupUpdateError(error); }\n});\n```\n\n最新群资料通过 `onGroupInfoChanged` 合并。群公告和扩展字段使用相同接口,分别见相关页面。", + "description": "使用 setGroupInfo 更新群名称、头像、简介和其他群资料字段。", + "headings": [], + "sourcePath": "/sdk/android/group/update-group-profile", + "title": "更新群资料" + }, + "/sdk/android/group/set-group-announcement": { + "body": "Android SDK 没有独立的公告方法。构造包含 `groupID` 与 `notification` 的 `GroupInfo`,再调用 `setGroupInfo()`。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setNotification(\"今晚 20:00 进行版本发布确认。\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { refreshAnnouncement(groupID); }\n @Override public void onError(int code, String error) { showAnnouncementError(error); }\n});\n```\n\n公告的更新时间和更新人由返回的 `GroupInfo` 中 `notificationUpdateTime`、`notificationUserID` 表示。权限由服务端校验。", + "description": "通过 GroupInfo.notification 发布或更新群公告。", + "headings": [], + "sourcePath": "/sdk/android/group/set-group-announcement", + "title": "发布群公告" + }, + "/sdk/android/group/set-group-extension": { + "body": "`GroupInfo.ex` 是完整字符串,SDK 不会合并 JSON。多个业务模块共用该字段时,应由应用读取旧值、合并自己的命名空间后再提交。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setEx(\"{\\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false}\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markExtensionSubmitted(groupID); }\n @Override public void onError(int code, String error) { showExtensionError(error); }\n});\n```\n\n不要将访问令牌、密钥或仅适合本机的 UI 状态写入群扩展字段。", + "description": "通过 GroupInfo.ex 保存应用定义的群组扩展数据。", + "headings": [], + "sourcePath": "/sdk/android/group/set-group-extension", + "title": "设置群扩展字段" + }, + "/sdk/android/group/set-group-join-verification": { + "body": "入群验证写入 `GroupInfo.needVerification`,再调用 `setGroupInfo()`。可使用 `GroupVerification` 常量:`APPLY_NEED_VERIFICATION_INVITE_DIRECTLY`、`ALL_NEED_VERIFICATION` 和 `DIRECTLY`。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setNeedVerification(GroupVerification.ALL_NEED_VERIFICATION);\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markVerificationSubmitted(groupID); }\n @Override public void onError(int code, String error) { showVerificationError(error); }\n});\n```\n\n该设置影响后续入群请求,不替代对已存在申请的同意或拒绝处理。", + "description": "通过 GroupInfo.needVerification 配置申请和邀请的入群验证规则。", + "headings": [], + "sourcePath": "/sdk/android/group/set-group-join-verification", + "title": "设置入群验证方式" + }, + "/sdk/android/group/set-group-member-profile-access": { + "body": "`lookMemberInfo` 使用整数开关:`0` 关闭,`1` 打开。更新时只提交该权限字段和 `groupID`。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setLookMemberInfo(1);\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markMemberInfoAccessSubmitted(groupID); }\n @Override public void onError(int code, String error) { showPermissionError(error); }\n});\n```\n\n此开关约束通过群组入口获取成员资料的权限,不改变成员已经拥有的用户资料。", + "description": "通过 GroupInfo.lookMemberInfo 设置是否允许通过群组查看成员资料。", + "headings": [], + "sourcePath": "/sdk/android/group/set-group-member-profile-access", + "title": "设置成员资料查看权限" + }, + "/sdk/android/group/set-group-member-friend-permission": { + "body": "`applyMemberFriend` 使用整数开关:`0` 关闭,`1` 打开。该规则只影响从该群成员关系入口发起的好友申请。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setApplyMemberFriend(0);\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markFriendPermissionSubmitted(groupID); }\n @Override public void onError(int code, String error) { showPermissionError(error); }\n});\n```\n\n更新后以 `onGroupInfoChanged` 或重新读取的 `GroupInfo` 为准。", + "description": "通过 GroupInfo.applyMemberFriend 设置是否允许从群成员发起好友申请。", + "headings": [], + "sourcePath": "/sdk/android/group/set-group-member-friend-permission", + "title": "设置成员好友申请权限" + }, + "/sdk/android/group/change-group-mute": { + "body": "使用 `changeGroupMute()` 切换全员禁言。`true` 开启,`false` 关闭;成员级禁言见“禁言或解除禁言群成员”。\n\n```java\nOpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() {\n @Override public void onSuccess(String data) { markGroupMuteSubmitted(groupID, true); }\n @Override public void onError(int code, String error) { showGroupMuteError(error); }\n}, groupID, true);\n```\n\n群主和管理员的实际发言权限以及服务端权限校验以部署策略为准。", + "description": "使用 changeGroupMute 开启或关闭群组全员禁言。", + "headings": [], + "sourcePath": "/sdk/android/group/change-group-mute", + "title": "设置全员禁言" + }, + "/sdk/android/group/join-group": { + "body": "使用 `joinGroup()` 提交入群请求。`joinSource` 使用群组来源值,例如邀请、搜索或二维码;带扩展数据时使用五参数重载。\n\n```java\nOpenIMClient.getInstance().groupManager.joinGroup(new OnBase() {\n @Override public void onSuccess(String data) { markJoinSubmitted(groupID); }\n @Override public void onError(int code, String error) { showJoinError(error); }\n}, groupID, \"希望加入项目讨论\", 3, \"{\\\"from\\\":\\\"search\\\"}\");\n```\n\n验证方式决定请求是否立即加入。后续通过 `onJoinedGroupAdded` 或群申请事件更新本地状态。", + "description": "使用 joinGroup 提交入群申请或加入请求。", + "headings": [], + "sourcePath": "/sdk/android/group/join-group", + "title": "申请加入群组" + }, + "/sdk/android/group/quit-group": { + "body": "`quitGroup()` 仅作用于当前登录用户,不会解散群组或移除其他成员。\n\n```java\nOpenIMClient.getInstance().groupManager.quitGroup(new OnBase() {\n @Override public void onSuccess(String data) { removeJoinedGroup(groupID); }\n @Override public void onError(int code, String error) { showQuitError(error); }\n}, groupID);\n```\n\n请求成功后仍应处理 `onJoinedGroupDeleted`,并清理该群的成员列表、群会话入口等应用缓存。", + "description": "使用 quitGroup 让当前登录用户退出指定群组。", + "headings": [], + "sourcePath": "/sdk/android/group/quit-group", + "title": "退出群组" + }, + "/sdk/android/group/dismiss-group": { + "body": "`dismissGroup()` 解散指定群组,通常仅群主可执行。调用前应在产品层提供明确确认,避免将“退出群组”误实现为解散。\n\n```java\nOpenIMClient.getInstance().groupManager.dismissGroup(new OnBase() {\n @Override public void onSuccess(String data) { markDismissSubmitted(groupID); }\n @Override public void onError(int code, String error) { showDismissError(error); }\n}, groupID);\n```\n\n最终状态通过 `onGroupDismissed` 合并;收到事件后移除群资料、成员和群会话相关缓存。", + "description": "使用 dismissGroup 解散当前用户有权限管理的群组。", + "headings": [], + "sourcePath": "/sdk/android/group/dismiss-group", + "title": "解散群组" + }, + "/sdk/android/group/retrieving-groups/get-specified-groups-info": { + "body": "已持有一组 `groupID` 时,使用 `getGroupsInfo()` 查询群资料。结果是 `GroupInfo` 列表,不能依赖响应顺序与请求列表完全一致。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupsInfo(new OnBase>() {\n @Override public void onSuccess(List groups) { mergeGroups(groups); }\n @Override public void onError(int code, String error) { showGroupQueryError(error); }\n}, groupIDs);\n```\n\n先移除空值和重复 ID;权限不足或群组不存在的 ID 应按缺失结果处理。", + "description": "使用 getGroupsInfo 批量查询指定群组的最新资料。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "title": "获取群资料" + }, + "/sdk/android/group/retrieving-groups/get-joined-group-list-page": { + "body": "Android SDK 仅提供分页版本。`offset` 从 `0` 开始,后续页按已经成功合并的条目数推进;返回为空时停止加载。\n\n```java\nOpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() {\n @Override public void onSuccess(List groups) { appendJoinedGroups(groups); }\n @Override public void onError(int code, String error) { showPageError(error); }\n}, offset, 20);\n```\n\n使用 `onJoinedGroupAdded` 与 `onJoinedGroupDeleted` 合并增量,不要仅依赖已加载分页作为完整群列表。", + "description": "使用 getJoinedGroupListPage 分页读取当前账号已加入的群组。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "title": "分页获取已加入群组" + }, + "/sdk/android/group/retrieving-groups/is-join-group": { + "body": "`isJoinGroup()` 仅检查当前登录用户与目标 `groupID` 的成员关系。\n\n```java\nOpenIMClient.getInstance().groupManager.isJoinGroup(groupID, new OnBase() {\n @Override public void onSuccess(Boolean joined) { updateJoinAction(Boolean.TRUE.equals(joined)); }\n @Override public void onError(int code, String error) { showMembershipError(error); }\n});\n```\n\n该结果不替代群资料查询,也不能用于判断其他用户是否在群内。", + "description": "使用 isJoinGroup 查询当前登录用户是否已经加入指定群组。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", + "title": "检查是否加入群组" + }, + "/sdk/android/group/retrieving-groups/search-groups": { + "body": "`searchGroups()` 接收关键词列表,并分别指定是否搜索群 ID、群名称。两个开关都关闭时没有有效搜索范围。\n\n```java\nOpenIMClient.getInstance().groupManager.searchGroups(new OnBase>() {\n @Override public void onSuccess(List groups) { showSearchResults(groups); }\n @Override public void onError(int code, String error) { showSearchError(error); }\n}, Collections.singletonList(keyword), true, true);\n```\n\n搜索结果不是成员资格证明。进入群组前可使用“检查是否加入群组”确认当前状态。", + "description": "使用 searchGroups 按群 ID 或群名称搜索本地可查询的群组。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-groups/search-groups", + "title": "搜索群组" + }, + "/sdk/android/group/group-applications/overview-group-applications": { + "body": "群申请记录使用 `GroupApplicationInfo` 表示。收到的申请面向群管理者,发出的申请面向当前用户;`handleResult`、`reqMsg`、`handledMsg` 和处理时间用于展示申请状态。\n\nAndroid SDK 提供收到与发出申请的分页查询,以及同意、拒绝操作;不提供 Flutter 菜单中的“待处理申请数量”接口。申请新增、同意、拒绝和删除事件由[群组概览](/sdk/android/group/overview-group)的统一 listener 负责合并。", + "description": "说明 Android SDK 中收到和发出的群申请、处理结果及状态事件。", + "headings": [], + "sourcePath": "/sdk/android/group/group-applications/overview-group-applications", + "title": "群申请概览" + }, + "/sdk/android/group/group-applications/get-group-application-list-as-recipient": { + "body": "使用非废弃重载并传入 `GetGroupApplicationListAsRecipientReq`。可设置 `offset`、`count`、`groupIDs` 和 `handleResults` 筛选条件。\n\n```java\nGetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq(0, 20);\nOpenIMClient.getInstance().groupManager.getRecvGroupApplicationList(\n new OnBase>() {\n @Override public void onSuccess(List items) { mergeReceivedApplications(items); }\n @Override public void onError(int code, String error) { showApplicationError(error); }\n }, request);\n```\n\n收到事件后按申请中的 `groupID` 和 `userID` 合并,不要把列表下标作为申请标识。", + "description": "使用 getRecvGroupApplicationList 分页读取当前用户可处理的入群申请。", + "headings": [], + "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "title": "获取收到的群申请" + }, + "/sdk/android/group/group-applications/get-group-application-list-as-applicant": { + "body": "使用 `GetGroupApplicationListAsApplicantReq` 设置分页和筛选条件,再调用 `getSendGroupApplicationList()`。\n\n```java\nGetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq(0, 20);\nOpenIMClient.getInstance().groupManager.getSendGroupApplicationList(\n new OnBase>() {\n @Override public void onSuccess(List items) { mergeSentApplications(items); }\n @Override public void onError(int code, String error) { showApplicationError(error); }\n }, request);\n```\n\n申请被同意后,群列表变化以 `onJoinedGroupAdded` 为准。", + "description": "使用 getSendGroupApplicationList 分页读取当前用户发出的入群申请。", + "headings": [], + "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "title": "获取发出的群申请" + }, + "/sdk/android/group/group-applications/accept-group-application": { + "body": "调用时同时传入申请的 `groupID`、申请人 `userID` 和处理说明。服务端负责校验当前用户是否有审批权限。\n\n```java\nOpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() {\n @Override public void onSuccess(String data) { markApplicationHandled(groupID, applicantUserID); }\n @Override public void onError(int code, String error) { showHandleError(error); }\n}, groupID, applicantUserID, \"欢迎加入\");\n```\n\n同意后通过群申请事件与 `onGroupMemberAdded` 更新申请列表和成员列表。", + "description": "使用 acceptGroupApplication 同意指定用户的入群申请。", + "headings": [], + "sourcePath": "/sdk/android/group/group-applications/accept-group-application", + "title": "同意群申请" + }, + "/sdk/android/group/group-applications/refuse-group-application": { + "body": "拒绝操作同样使用申请所属 `groupID`、申请人 `userID` 和处理说明。\n\n```java\nOpenIMClient.getInstance().groupManager.refuseGroupApplication(new OnBase() {\n @Override public void onSuccess(String data) { markApplicationRejected(groupID, applicantUserID); }\n @Override public void onError(int code, String error) { showHandleError(error); }\n}, groupID, applicantUserID, \"当前群组人数已满\");\n```\n\n成功 callback 后不要直接删除本地申请记录;以 `onGroupApplicationRejected` 或重新查询结果更新。", + "description": "使用 refuseGroupApplication 拒绝指定用户的入群申请。", + "headings": [], + "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", + "title": "拒绝群申请" + }, + "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members": { + "body": "成员查询使用 `groupID` 限定范围,结果为 `GroupMembersInfo` 或用户 ID 列表。成员列表提供角色过滤和 offset 分页;指定成员资料、在群检查、群主管理员和关键词搜索各有独立接口。\n\n成员增删和资料变化由[群组概览](/sdk/android/group/overview-group)归属的 `OnGroupListener` 统一合并。查询只建立快照,不能替代事件处理。", + "description": "说明 Android SDK 中群成员列表、指定成员资料和成员状态查询。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "title": "群成员查询概览" + }, + "/sdk/android/group/retrieving-group-members/get-group-member-list": { + "body": "`filter` 传 `0` 查询全部成员,`1` 普通成员,`2` 群主,`3` 管理员。`offset` 与 `count` 控制分页。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMemberList(\n new OnBase>() {\n @Override public void onSuccess(List members) { appendMembers(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID, 0, offset, 50);\n```\n\n分页期间仍应接受成员事件,合并键使用 `groupID` 与 `userID`。", + "description": "使用 getGroupMemberList 按角色和分页条件读取群成员。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "title": "获取群成员列表" + }, + "/sdk/android/group/retrieving-group-members/get-specified-group-members-info": { + "body": "`getGroupMembersInfo()` 接收一个 `groupID` 和目标用户 ID 列表,返回这些用户在群内的 `GroupMembersInfo`。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMembersInfo(\n new OnBase>() {\n @Override public void onSuccess(List members) { mergeMembers(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID, userIDs);\n```\n\n返回空列表可能表示目标未在群内或无读取权限,应按业务需求处理。", + "description": "使用 getGroupMembersInfo 批量读取指定成员在群内的资料。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "title": "获取群成员资料" + }, + "/sdk/android/group/retrieving-group-members/get-users-in-group": { + "body": "`getUsersInGroup()` 返回传入用户中已在指定群内的 ID 列表,不返回成员资料。\n\n```java\nOpenIMClient.getInstance().groupManager.getUsersInGroup(new OnBase>() {\n @Override public void onSuccess(List joinedUserIDs) { updateMembership(joinedUserIDs); }\n @Override public void onError(int code, String error) { showMembershipError(error); }\n}, groupID, candidateUserIDs);\n```\n\n需要昵称、角色或禁言状态时,再调用“获取群成员资料”。", + "description": "使用 getUsersInGroup 从候选用户中筛出当前在群内的用户 ID。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "title": "检查用户是否在群内" + }, + "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin": { + "body": "使用 `getGroupMemberOwnerAndAdmin()` 获取需要展示或校验管理身份的成员记录。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMemberOwnerAndAdmin(\n new OnBase>() {\n @Override public void onSuccess(List members) { showModerators(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID);\n```\n\n`roleLevel` 的群主、管理员和普通成员常量见 `GroupRole`;实际操作权限仍由服务端决定。", + "description": "使用 getGroupMemberOwnerAndAdmin 查询群主和管理员成员资料。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "获取群主和管理员" + }, + "/sdk/android/group/retrieving-group-members/search-group-members": { + "body": "指定关键词列表、用户 ID 与群昵称两个搜索开关,以及分页条件。\n\n```java\nOpenIMClient.getInstance().groupManager.searchGroupMembers(\n new OnBase>() {\n @Override public void onSuccess(List members) { showMemberSearch(members); }\n @Override public void onError(int code, String error) { showSearchError(error); }\n }, groupID, Collections.singletonList(keyword), true, true, 0, 20);\n```\n\n搜索仅限目标群组;空关键词或两个搜索开关均关闭时不应发起请求。", + "description": "使用 searchGroupMembers 按用户 ID 或群昵称搜索群成员。", + "headings": [], + "sourcePath": "/sdk/android/group/retrieving-group-members/search-group-members", + "title": "搜索群成员" + }, + "/sdk/android/group/managing-group-members/invite-user-to-group": { + "body": "传入群 ID、待邀请用户 ID 列表和邀请说明。服务端根据群设置和当前用户权限决定是否立即加入。\n\n```java\nOpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() {\n @Override public void onSuccess(String data) { markInviteSubmitted(groupID); }\n @Override public void onError(int code, String error) { showInviteError(error); }\n}, groupID, inviteeUserIDs, \"邀请加入项目讨论\");\n```\n\n成员实际加入后以 `onGroupMemberAdded` 合并,不能仅以提交成功显示为已加入。", + "description": "使用 inviteUserToGroup 邀请一组用户加入指定群组。", + "headings": [], + "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "title": "邀请用户入群" + }, + "/sdk/android/group/managing-group-members/kick-group-member": { + "body": "`kickGroupMember()` 接收成员 ID 列表和移除说明。产品层应先防止当前用户误移除自身,并遵守群主、管理员权限边界。\n\n```java\nOpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() {\n @Override public void onSuccess(String data) { markRemovalSubmitted(groupID); }\n @Override public void onError(int code, String error) { showRemovalError(error); }\n}, groupID, memberUserIDs, \"已不再参与该项目\");\n```\n\n收到 `onGroupMemberDeleted` 后再从成员缓存中移除目标成员。", + "description": "使用 kickGroupMember 将指定成员移出群组。", + "headings": [], + "sourcePath": "/sdk/android/group/managing-group-members/kick-group-member", + "title": "移除群成员" + }, + "/sdk/android/group/managing-group-members/set-group-member-nickname": { + "body": "成员资料修改统一使用 `setGroupMemberInfo()`。请求中填写 `groupID`、`userID` 和 `nickname`。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setNickname(\"小林\");\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markNicknameSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberUpdateError(error); }\n});\n```\n\n以 `onGroupMemberInfoChanged` 返回的 `GroupMembersInfo.nickname` 更新显示。", + "description": "使用 SetGroupMemberInfo.nickname 更新成员在指定群中的显示昵称。", + "headings": [], + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "title": "更新群昵称" + }, + "/sdk/android/group/managing-group-members/set-group-member-role-level": { + "body": "`roleLevel` 使用 `GroupRole` 常量:`OWNER`、`ADMIN` 和 `MEMBER`。群主转让使用独立接口,不应通过本接口推测转让流程。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setRoleLevel(GroupRole.ADMIN);\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markRoleSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showRoleError(error); }\n});\n```\n\n实际角色变更和权限由服务端校验,以成员资料变化事件为准。", + "description": "使用 SetGroupMemberInfo.roleLevel 设置成员的群内角色。", + "headings": [], + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "title": "管理群管理员" + }, + "/sdk/android/group/managing-group-members/set-group-member-avatar": { + "body": "群成员头像是群内资料字段,不修改用户全局头像。传入已可访问的头像 URL。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setFaceURL(avatarURL);\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markAvatarSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberUpdateError(error); }\n});\n```\n\n事件到达前保留原头像或使用本地乐观状态,并按最新成员资料校准。", + "description": "使用 SetGroupMemberInfo.faceURL 更新成员在群内展示的头像。", + "headings": [], + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "title": "更新群成员头像" + }, + "/sdk/android/group/managing-group-members/set-group-member-extension": { + "body": "`SetGroupMemberInfo.ex` 是完整字符串,不会自动合并 JSON。多个业务模块共享时应先读取、合并并保留其他命名空间。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setEx(\"{\\\"duty\\\":\\\"reviewer\\\"}\");\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markMemberExtensionSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberUpdateError(error); }\n});\n```\n\n不要将凭据、令牌或仅限本机的显示状态写入该字段。", + "description": "使用 SetGroupMemberInfo.ex 保存应用定义的群成员扩展数据。", + "headings": [], + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "title": "设置群成员扩展字段" + }, + "/sdk/android/group/managing-group-members/transfer-group-owner": { + "body": "目标用户必须是该群成员。转让前应在产品层要求明确确认,并在完成后重新查询群主和管理员资料。\n\n```java\nOpenIMClient.getInstance().groupManager.transferGroupOwner(new OnBase() {\n @Override public void onSuccess(String data) { markOwnershipTransferSubmitted(groupID); }\n @Override public void onError(int code, String error) { showTransferError(error); }\n}, groupID, newOwnerUserID);\n```\n\n`onGroupMemberInfoChanged` 和群资料变化可能异步到达;不要在成功 callback 中假定本地角色已完成更新。", + "description": "使用 transferGroupOwner 将群主身份转让给指定群成员。", + "headings": [], + "sourcePath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "title": "转让群主" + }, + "/sdk/android/group/managing-group-members/change-group-member-mute": { + "body": "`seconds` 为禁言时长,单位为秒;传 `0` 解除成员禁言。该操作与全员禁言相互独立。\n\n```java\nOpenIMClient.getInstance().groupManager.changeGroupMemberMute(new OnBase() {\n @Override public void onSuccess(String data) { markMemberMuteSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberMuteError(error); }\n}, groupID, userID, 3600L);\n```\n\n在 `onGroupMemberInfoChanged` 中读取 `muteEndTime` 更新成员状态;不要用本机时间和请求时长长期推算最终禁言状态。", + "description": "使用 changeGroupMemberMute 设置指定成员的禁言时长。", + "headings": [], + "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "title": "禁言或解除禁言群成员" + }, + "/sdk/android/message/overview-message": { + "body": "Android 消息以 `Message` 表示,使用 `clientMsgID` 去重,使用 `sessionType`、`recvID` 和 `groupID` 区分单聊与群聊。消息内容由对应的 element 字段承载,发送、接收、撤回和删除是不同的状态变化。\n\n```java\nOpenIMClient.getInstance().messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); }\n});\n```\n\n查询建立快照,`OnAdvanceMsgListener` 合并增量;`MessageManager` 的 listener 设置会替换当前 listener。", + "description": "了解 Android SDK 的 Message 模型、消息生命周期和消息监听。", + "headings": [], + "sourcePath": "/sdk/android/message/overview-message", + "title": "消息概览" + }, + "/sdk/android/message/creating-messages/create-text-message": { + "body": "`createTextMessage()` 只创建本地消息对象,不发送消息。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createTextMessage(text);\n```", + "description": "使用 createTextMessage 创建文本 Message。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-text-message", + "title": "创建文本消息" + }, + "/sdk/android/message/creating-messages/create-text-at-message": { + "body": "传入文本、被提醒用户 ID、`AtUserInfo` 列表和可选引用消息。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createTextAtMessage(\n text, userIDs, atUserInfos, quoteMessage);\n```", + "description": "使用 createTextAtMessage 创建带成员提醒的文本消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-text-at-message", + "title": "创建 @ 消息" + }, + "/sdk/android/message/creating-messages/create-custom-message": { + "body": "`data`、`extension` 和 `description` 由业务定义,接收端应按自己的协议解析。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createCustomMessage(\n dataJson, extensionJson, description);\n```", + "description": "使用 createCustomMessage 承载业务定义的 JSON 消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-custom-message", + "title": "创建自定义消息" + }, + "/sdk/android/message/creating-messages/create-image-message-by-file": { + "body": "缓存目录内使用 `createImageMessage()`,绝对路径使用 `createImageMessageFromFullPath()`。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createImageMessageFromFullPath(filePath);\n```", + "description": "使用相对路径或绝对路径创建图片消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "title": "从文件创建图片消息" + }, + "/sdk/android/message/creating-messages/create-image-message-by-url": { + "body": "准备 `PictureInfo` 的原图、大图和缩略图信息后创建消息。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createImageMessageByURL(\n sourceURL, sourcePicture, bigPicture, snapshotPicture);\n```", + "description": "使用 createImageMessageByURL 创建已上传资源的图片消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "title": "从 URL 创建图片消息" + }, + "/sdk/android/message/creating-messages/create-sound-message-by-file": { + "body": "音频时长单位为秒;根据文件位置选择相对路径或绝对路径方法。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createSoundMessageFromFullPath(soundPath, durationSeconds);\n```", + "description": "使用相对路径或绝对路径创建音频消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "title": "从文件创建音频消息" + }, + "/sdk/android/message/creating-messages/create-sound-message-by-url": { + "body": "`createSoundMessageByURL()` 接收已经包含 URL、时长和大小的 `SoundElem`。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createSoundMessageByURL(soundElem);\n```", + "description": "使用 SoundElem 创建已上传资源的音频消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "title": "从 URL 创建音频消息" + }, + "/sdk/android/message/creating-messages/create-video-message-by-file": { + "body": "视频方法需要 MIME 类型、时长和缩略图路径。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createVideoMessageFromFullPath(\n videoPath, mimeType, durationSeconds, snapshotPath);\n```", + "description": "使用相对路径或绝对路径创建视频消息及缩略图。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "title": "从文件创建视频消息" + }, + "/sdk/android/message/creating-messages/create-video-message-by-url": { + "body": "将远端视频及缩略图信息填入 `VideoElem` 后创建消息。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createVideoMessageByURL(videoElem);\n```", + "description": "使用 VideoElem 创建已上传资源的视频消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "title": "从 URL 创建视频消息" + }, + "/sdk/android/message/creating-messages/create-file-message-by-file": { + "body": "文件名与路径分别传入;相对路径相对于 SDK 初始化时配置的缓存目录。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createFileMessageFromFullPath(filePath, fileName);\n```", + "description": "使用相对路径或绝对路径创建文件消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "title": "从文件创建文件消息" + }, + "/sdk/android/message/creating-messages/create-file-message-by-url": { + "body": "`FileElem` 应包含远端 URL、文件名和文件大小。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createFileMessageByURL(fileElem);\n```", + "description": "使用 FileElem 创建已上传资源的文件消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "title": "从 URL 创建文件消息" + }, + "/sdk/android/message/creating-messages/create-card-message": { + "body": "`CardElem` 保存名片用户的展示资料。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createCardMessage(cardElem);\n```", + "description": "使用 createCardMessage 创建联系人名片消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-card-message", + "title": "创建名片消息" + }, + "/sdk/android/message/creating-messages/create-location-message": { + "body": "经纬度使用十进制度数,描述用于地图或列表展示。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createLocationMessage(latitude, longitude, description);\n```", + "description": "使用 createLocationMessage 创建经纬度和描述位置消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-location-message", + "title": "创建位置消息" + }, + "/sdk/android/message/creating-messages/create-face-message": { + "body": "`index` 表示表情位置,`data` 保存表情 URL 等 JSON 数据。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createFaceMessage(index, dataJson);\n```", + "description": "使用 createFaceMessage 创建自定义表情消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-face-message", + "title": "创建表情消息" + }, + "/sdk/android/message/creating-messages/create-quote-message": { + "body": "引用消息保存被引用的完整 `Message`,发送前应确保引用对象包含稳定的 `clientMsgID`。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createQuoteMessage(replyText, quotedMessage);\n```", + "description": "使用 createQuoteMessage 创建引用已有消息的回复。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-quote-message", + "title": "创建引用消息" + }, + "/sdk/android/message/creating-messages/create-forward-message": { + "body": "传入待转发的 `Message`,创建结果仍需通过发送方法投递到目标会话。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createForwardMessage(sourceMessage);\n```", + "description": "使用 createForwardMessage 创建转发消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-forward-message", + "title": "创建转发消息" + }, + "/sdk/android/message/creating-messages/create-merger-message": { + "body": "传入消息列表、标题和摘要列表;摘要顺序应与展示协议保持一致。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createMergerMessage(\n messages, title, summaries);\n```", + "description": "使用 createMergerMessage 将多条消息合并为一条摘要消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-merger-message", + "title": "创建合并消息" + }, + "/sdk/android/message/sending-messages/send-message": { + "body": "单聊填写 `recvUid`,群聊填写 `recvGid`,另一个目标参数传 `null`。`OnMsgSendCallback` 同时承载成功、失败和媒体进度。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onSuccess(String id) { mergeSentMessage(message); }\n @Override public void onError(int code, String error) { showSendError(error); }\n}, message, peerUserID, null, offlinePushInfo);\n```", + "description": "使用 sendMessage 将 Message 发送到单聊或群聊。", + "headings": [], + "sourcePath": "/sdk/android/message/sending-messages/send-message", + "title": "发送消息" + }, + "/sdk/android/message/sending-messages/send-message-not-oss": { + "body": "消息中的媒体 URL 已准备好时使用该方法,避免 SDK 再次进入内置上传流程。\n\n```java\nmessageManager.sendMessageNotOss(callback, message, peerUserID, null, offlinePushInfo);\n```", + "description": "使用 sendMessageNotOss 发送已经由业务上传资源的媒体消息。", + "headings": [], + "sourcePath": "/sdk/android/message/sending-messages/send-message-not-oss", + "title": "发送非 OSS 消息" + }, + "/sdk/android/message/sending-messages/set-msg-send-progress-listener": { + "body": "Android 没有独立的全局发送进度 listener;进度随每次 `sendMessage()` 或 `sendMessageNotOss()` 传入的 `OnMsgSendCallback` 返回。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onProgress(long progress) { updateProgress(progress); }\n @Override public void onSuccess(String id) { finishProgress(); }\n @Override public void onError(int code, String error) { failProgress(error); }\n}, message, peerUserID, null, offlinePushInfo);\n```", + "description": "通过 OnMsgSendCallback 的进度回调更新媒体发送进度。", + "headings": [], + "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "title": "跟踪消息发送进度" + }, + "/sdk/android/message/receiving-messages/receive-messages": { + "body": "设置 `setAdvancedMsgListener()` 后,`onRecvNewMessage` 接收实时消息,`onRecvOfflineNewMessage` 接收离线批次,`onRecvOnlineOnlyMessage` 接收在线消息字符串。所有消息都按 `clientMsgID` 幂等合并。\n\n```java\nmessageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); }\n @Override public void onRecvOfflineNewMessage(List messages) { messageStore.mergeAll(messages); }\n});\n```", + "description": "使用 OnAdvanceMsgListener 接收新消息、离线消息和在线消息。", + "headings": [], + "sourcePath": "/sdk/android/message/receiving-messages/receive-messages", + "title": "接收消息" + }, + "/sdk/android/message/receiving-messages/receive-custom-business-messages": { + "body": "自定义业务回调携带字符串,业务侧应按协议校验来源和 JSON 结构,不要将其直接当作 `Message` 渲染。\n\n```java\nmessageManager.setCustomBusinessListener(new OnCustomBusinessListener() {\n @Override public void onRecvCustomBusinessMessage(String payload) { handleBusiness(payload); }\n});\n```\n\n本页是 `onRecvCustomBusinessMessage` 的完整处理归属页。载荷应包含业务协议版本和稳定幂等 ID,并按该 ID 去重;不要依赖回调顺序,也不要使用自定义业务消息授予客户端权限。\n\n`MessageManager` 只保存一个自定义业务 listener,后一次设置会替换前一次。应在应用级事件中心设置一次,并在退出或切换账号时停止向旧账号状态分发。", + "description": "使用 setCustomBusinessListener 接收独立于普通聊天消息的业务回调。", + "headings": [], + "sourcePath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "title": "接收自定义业务消息" + }, + "/sdk/android/message/retrieving-messages/load-older-messages": { + "body": "首次查询传 `startMsg` 为 `null`,后续将上一页边界消息作为起点。按返回的 `clientMsgID` 去重。\n\n```java\nmessageManager.getAdvancedHistoryMessageList(callback, conversationID, startMessage, 20, ViewType.NORMAL);\n```", + "description": "使用 getAdvancedHistoryMessageList 分页加载会话历史消息。", + "headings": [], + "sourcePath": "/sdk/android/message/retrieving-messages/load-older-messages", + "title": "加载更早消息" + }, + "/sdk/android/message/retrieving-messages/load-newer-messages": { + "body": "该方法用于从消息定位点向后读取,适合搜索定位或上下文分页。\n\n```java\nmessageManager.getAdvancedHistoryMessageListReverse(callback, conversationID, startMessage, 20, ViewType.NORMAL);\n```", + "description": "使用 getAdvancedHistoryMessageListReverse 加载起点之后的消息。", + "headings": [], + "sourcePath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "title": "加载更新消息" + }, + "/sdk/android/message/retrieving-messages/find-messages-by-id": { + "body": "构造 `SearchParams` 列表查询消息。返回结果应按消息 ID 合并,不要用列表位置作为稳定标识。\n\n```java\nmessageManager.findMessageList(new OnBase() {\n @Override public void onSuccess(SearchResult result) { showFoundMessages(result); }\n @Override public void onError(int code, String error) { showQueryError(error); }\n}, searchParams);\n```", + "description": "使用 findMessageList 按 SearchParams 查询消息记录。", + "headings": [], + "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "title": "按 ID 查询消息" + }, + "/sdk/android/message/searching-messages/search-messages": { + "body": "可按会话、关键词、发送者、消息类型、时间范围和分页参数搜索。`conversationID` 传 `null` 表示全局搜索。\n\n```java\nmessageManager.searchLocalMessages(callback, conversationID, keywords, 1,\n senderIDs, messageTypes, 0, 0, 0, 20);\n```", + "description": "使用 searchLocalMessages 搜索当前账号已同步到本地的消息。", + "headings": [], + "sourcePath": "/sdk/android/message/searching-messages/search-messages", + "title": "搜索消息" + }, + "/sdk/android/message/composing-messages/update-typing-status": { + "body": "输入框变化时传入对方用户 ID 和业务约定的提示字符串。调用侧应防抖,避免每次按键都发送请求。\n\n```java\nmessageManager.typingStatusUpdate(callback, peerUserID, \"typing\");\n```\n\n成功 callback 表示输入状态上报请求完成,不表示对端已经处理。对端通过应用级 `OnConversationListener.onConversationUserInputStatusChanged` 接收字符串载荷;Android wrapper 不会自动把它转换为模型,应在校验 JSON 后再解析:\n\n```java\n@Override\npublic void onConversationUserInputStatusChanged(String payload) {\n InputStatesChangedData state = JsonUtil.toObj(\n payload,\n InputStatesChangedData.class\n );\n if (state == null || state.getConversationID() == null) {\n return;\n }\n updateTypingState(\n state.getConversationID(),\n state.getUserID(),\n state.getPlatformIDs()\n );\n}\n```\n\n输入状态按 `conversationID:userID` 合并,并设置业务侧超时自动清除。`ConversationManager` 只保存一个会话 listener,本回调必须与会话列表、总未读数和同步事件组合后统一设置,不能在输入框页面单独覆盖。", + "description": "使用 typingStatusUpdate 提示单聊对方当前正在输入。", + "headings": [], + "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", + "title": "更新输入状态" + }, + "/sdk/android/message/managing-messages/delete-local-message": { + "body": "该操作不影响其他设备和其他用户的消息记录。\n\n```java\nmessageManager.deleteMessageFromLocalStorage(conversationID, clientMsgID, callback);\n```", + "description": "使用 deleteMessageFromLocalStorage 仅删除当前设备的消息副本。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/delete-local-message", + "title": "删除本地消息" + }, + "/sdk/android/message/managing-messages/delete-saved-messages": { + "body": "删除结果通过消息事件同步,调用成功不代表所有端已经刷新。\n\n```java\nmessageManager.deleteMessageFromLocalAndSvr(conversationID, clientMsgID, callback);\n```", + "description": "使用 deleteMessageFromLocalAndSvr 删除本地和服务端的一条消息。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/delete-saved-messages", + "title": "删除已保存消息" + }, + "/sdk/android/message/managing-messages/revoke-a-message": { + "body": "Android 的撤回方法为 `revokeMessageV2()`,撤回详情通过 `onRecvMessageRevokedV2` 返回。\n\n```java\nmessageManager.revokeMessageV2(callback, conversationID, clientMsgID);\n```", + "description": "使用 revokeMessageV2 撤回已发送消息。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", + "title": "撤回消息" + }, + "/sdk/android/message/managing-messages/modify-a-message": { + "body": "请求对象中填写会话 ID、客户端消息 ID 和新的消息内容,修改结果通过 `onMessageModified` 同步。\n\n```java\nmessageManager.modifyMessage(callback, modifyRequest);\n```", + "description": "使用 ModifyMessageReq 修改支持修改的消息内容。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", + "title": "修改消息" + }, + "/sdk/android/message/managing-messages/get-pinned-messages": { + "body": "查询结果是指定会话当前的置顶消息快照。\n\n```java\nmessageManager.getConversationPinnedMsgs(new OnBase>() {\n @Override public void onSuccess(List messages) { showPinned(messages); }\n @Override public void onError(int code, String error) { showPinnedError(error); }\n}, conversationID);\n```", + "description": "使用 getConversationPinnedMsgs 查询会话中的置顶消息。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", + "title": "查看置顶消息" + }, + "/sdk/android/message/managing-messages/set-message-pinned": { + "body": "最后一个参数为 `true` 置顶,`false` 取消置顶;变化通过 `onChangedPinnedMsg` 同步。\n\n```java\nmessageManager.setConversationPinnedMsg(callback, conversationID, clientMsgID, true);\n```", + "description": "使用 setConversationPinnedMsg 设置会话消息的置顶状态。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", + "title": "置顶或取消置顶消息" + }, + "/sdk/android/message/managing-messages/insert-local-single-message": { + "body": "该方法不向服务器发送消息,`receiver` 和 `sender` 用于建立本地消息归属。\n\n```java\nmessageManager.insertSingleMessageToLocalStorage(callback, message, receiverUserID, senderUserID);\n```", + "description": "使用 insertSingleMessageToLocalStorage 插入仅当前设备可见的单聊消息。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/insert-local-single-message", + "title": "插入本地单聊消息" + }, + "/sdk/android/message/managing-messages/insert-local-group-message": { + "body": "传入群 ID 与发送者 ID,消息不会同步到其他设备。\n\n```java\nmessageManager.insertGroupMessageToLocalStorage(callback, message, groupID, senderUserID);\n```", + "description": "使用 insertGroupMessageToLocalStorage 插入仅当前设备可见的群聊消息。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/insert-local-group-message", + "title": "插入本地群聊消息" + }, + "/sdk/android/message/managing-messages/clear-all-local-messages": { + "body": "该操作只清理当前设备本地缓存,不删除服务端记录。\n\n```java\nmessageManager.deleteAllMsgFromLocal(callback);\n```", + "description": "使用 deleteAllMsgFromLocal 清理当前设备的全部消息。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "title": "清空全部本地消息" + }, + "/sdk/android/message/managing-messages/clear-all-messages": { + "body": "这是高影响操作,产品层应二次确认,并在完成后清理本地会话展示。\n\n```java\nmessageManager.deleteAllMsgFromLocalAndSvr(callback);\n```", + "description": "使用 deleteAllMsgFromLocalAndSvr 清理本地和服务端消息。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/clear-all-messages", + "title": "清空全部已保存消息" + }, + "/sdk/android/message/managing-messages/set-message-local-ex": { + "body": "`localEx` 适合保存下载路径、播放状态等本地信息,不会同步给其他用户。\n\n```java\nmessageManager.setMessageLocalEx(callback, conversationID, clientMsgID, localExJson);\n```", + "description": "使用 setMessageLocalEx 保存仅当前设备使用的消息扩展数据。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/set-message-local-ex", + "title": "设置消息本地扩展字段" + }, + "/sdk/android/file-uploads/track-file-upload-progress": { + "body": "Android SDK 不设置全局文件上传 listener。每次调用 `uploadFile()` 时传入一个 `OnPutFileListener`,由该 listener 接收当前上传任务的进度、分片状态和完成信息。\n\n```java\nOnPutFileListener uploadListener = new OnPutFileListener() {\n @Override\n public void open(long size) {\n initializeUploadProgress(uploadTaskID, size);\n }\n\n @Override\n public void uploadID(String id) {\n bindSdkUploadID(uploadTaskID, id);\n }\n\n @Override\n public void uploadComplete(long fileSize, long uploadedSize, long storageSize) {\n updateUploadProgress(uploadTaskID, uploadedSize, fileSize);\n }\n\n @Override\n public void uploadPartComplete(long partNumber, long partSize, String partHash) {\n markPartComplete(uploadTaskID, partNumber, partSize, partHash);\n }\n\n @Override\n public void complete(long size, String url, long type) {\n completeUpload(uploadTaskID, size, url, type);\n }\n};\n\nOpenIMClient.getInstance().uploadFile(resultCallback, uploadListener, putArgs);\n```\n\n`open()` 可用于初始化总大小,`uploadID()` 返回 SDK 上传任务标识,`uploadComplete()` 提供上传过程数据,`uploadPartComplete()` 表示一个分片已经完成,`complete()` 返回最终大小、远端 URL 和资源类型。只有业务需要展示分片细节时才处理分片回调;普通进度条通常只需要过程回调和最终完成回调。\n\n业务层仍应生成自己的稳定 `uploadTaskID`,并在 listener 闭包中关联界面状态。SDK 上传 ID、文件名和数组位置都不应代替业务任务主键。每个上传任务使用独立 listener;页面或账号状态销毁后应停止向旧状态分发回调。\n\n完整的参数构造和错误处理见[上传文件](/sdk/android/file-uploads/upload-file)。", + "description": "使用 Android SDK 的 OnPutFileListener 跟踪单次文件上传任务。", + "headings": [], + "sourcePath": "/sdk/android/file-uploads/track-file-upload-progress", + "title": "跟踪文件上传进度" + }, + "/sdk/android/file-uploads/upload-file": { + "body": "`uploadFile()` 是独立文件上传能力,可用于头像、群头像、资料附件或其他业务文件。上传过程不从属于消息,也不会自动创建消息或更新用户资料。\n\n## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `base` | `OnBase` | 是 | 接收上传请求的最终成功或失败结果。 |\n| `listener` | `OnPutFileListener` | 是 | 接收当前任务的上传进度、分片状态和完成信息。 |\n| `putArgs.filepath` | `String` | 是 | Android 应用可读取的本地文件路径。 |\n| `putArgs.name` | `String` | 是 | 上传使用的文件名;`PutArgs` 默认使用传入路径,可按业务需要改为原始文件名。 |\n| `putArgs.cuase` | `String` | 否 | 业务约定的上传原因。字段名以 Android SDK 的 `PutArgs` 声明为准。 |\n\n```java\nFile file = new File(localPath);\nPutArgs args = new PutArgs(file.getAbsolutePath());\nargs.name = file.getName();\nargs.cuase = \"user-avatar\";\n\nOpenIMClient.getInstance().uploadFile(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n finishUploadRequest(result);\n }\n\n @Override\n public void onError(int code, String error) {\n showUploadError(code, error);\n }\n },\n new OnPutFileListener() {\n @Override\n public void uploadComplete(long fileSize, long uploadedSize, long storageSize) {\n updateUploadProgress(uploadTaskID, uploadedSize, fileSize);\n }\n\n @Override\n public void complete(long size, String url, long type) {\n completeUpload(uploadTaskID, size, url, type);\n }\n },\n args\n);\n```\n\n每次调用都传入独立的 `OnPutFileListener`,因此无需设置全局上传 listener。并行上传时应由业务层为任务生成稳定 ID,并在回调闭包中关联对应任务,不要使用文件名或列表位置作为唯一标识。各回调的职责见[跟踪文件上传进度](/sdk/android/file-uploads/track-file-upload-progress)。\n\n`complete()` 返回的 URL 可用于后续更新头像、保存附件地址或创建 URL 类型的媒体消息。上传成功只表示文件资源已经写入远端;资料更新、消息创建和消息发送仍需分别调用对应 API。", + "description": "使用 Android SDK 独立上传文件并获取远端资源地址。", + "headings": [ + { + "depth": 2, + "title": "参数说明", + "url": "#参数说明" + } + ], + "sourcePath": "/sdk/android/file-uploads/upload-file", + "title": "上传文件" + }, + "/sdk/android/calling/overview-calling": { + "body": "Android SDK 的 `SignalingManager` 提供发起邀请、接受、拒绝、取消、挂断、查询房间和同步通话状态所需的信令 API。它负责协调通话参与者、房间信息和通话生命周期,不负责采集摄像头画面、播放远端媒体流或渲染通话界面。\n\n应用需要把 SDK 返回的 `roomID`、`token` 和 `liveURL` 交给所选的实时音视频媒体引擎,并自行处理 Android 权限、音视频设备、媒体轨道、弱网策略和界面状态。信令 API 不是一套完整的实时音视频媒体 SDK。\n\n## 通话流程\n\n1. 调用 `signalingInvite()` 发起单聊通话,或调用 `signalingInviteInGroup()` 发起群聊通话。\n2. 被邀请方从 `onReceiveNewInvitation` 获取 `SignalingInfo`,选择接受或拒绝。\n3. 接受方调用 `signalingAccept()`,双方使用返回的房间凭据接入媒体引擎。\n4. 通话过程中根据参与者、媒体流和自定义信令回调更新本地状态。\n5. 发起方可以取消尚未接通的邀请;任一通话参与者都可以挂断已经建立的通话。\n\n## 核心数据\n\n| 数据 | 说明 |\n| --- | --- |\n| `SignalingInvitationInfo` | 邀请人、被邀请人、群组、房间、媒体类型、超时时间、会话类型和业务扩展数据。 |\n| `SignalingInfo` | 当前操作用户、原始邀请、参与者资料和可选的离线推送信息。 |\n| `SignalingCertificate` | OpenIMServer 返回的 `roomID`、`token`、`liveURL` 和忙线用户列表。 |\n| `RoomCallingInfo` | 按群组查询到的房间、邀请、参与者、群组和入会凭据快照。 |\n\n`customData` 和自定义信令只适合传递业务协商信息。长期凭据、管理员密钥和其他敏感数据不应写入这些字段。\n\n## 状态更新与事件归属\n\n发起、接受、拒绝、取消和挂断等写操作需要分别处理 API 回调与通话 listener。API 成功回调表示当前信令请求已经完成;listener 反映邀请方、被邀请方、其他设备或房间参与者看到的增量状态,两者不是同一个完成信号。\n\n邀请生命周期、参与者进出房间、挂断和媒体流变化的完整 listener 统一见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events);自定义信令见[发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal)。房间、凭据和待处理邀请查询只返回调用时的状态快照。\n\n概览页不设置 listener。通话状态以 `roomID` 为主键;参与者状态还需要结合用户 ID。需要恢复或校准当前房间状态时,再调用对应查询 API。\n\n## 按任务查找页面\n\n| 任务 | 页面 |\n| --- | --- |\n| 发起单聊或群聊通话 | [发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)、[发起群聊通话](/sdk/android/calling/managing-calls/start-group-call) |\n| 接受或拒绝邀请 | [接受通话](/sdk/android/calling/managing-calls/accept-call)、[拒绝通话](/sdk/android/calling/managing-calls/reject-call) |\n| 取消邀请或挂断通话 | [取消通话邀请](/sdk/android/calling/managing-calls/cancel-call)、[挂断通话](/sdk/android/calling/managing-calls/hang-up-call) |\n| 恢复房间或待处理邀请 | [查询群组通话房间](/sdk/android/calling/retrieving-call-information/get-room-by-group-id)、[获取通话房间 Token](/sdk/android/calling/retrieving-call-information/get-token-by-room-id)、[恢复启动前收到的通话邀请](/sdk/android/calling/retrieving-call-information/restore-pending-invitation) |\n| 处理通话事件和业务协商 | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)、[发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) |", + "description": "了解 Android SDK 的音视频通话信令、房间信息和事件边界。", + "headings": [ + { + "depth": 2, + "title": "通话流程", + "url": "#通话流程" + }, + { + "depth": 2, + "title": "核心数据", + "url": "#核心数据" + }, + { + "depth": 2, + "title": "状态更新与事件归属", + "url": "#状态更新与事件归属" + }, + { + "depth": 2, + "title": "按任务查找页面", + "url": "#按任务查找页面" + } + ], + "sourcePath": "/sdk/android/calling/overview-calling", + "title": "音视频通话概览" + }, + "/sdk/android/calling/managing-calls/start-single-call": { + "body": "`signalingInvite()` 发起单聊通话。Android SDK 负责通话信令,应用仍需使用返回的房间凭据接入实时音视频媒体引擎。\n\n## 参数说明\n\n| 字段 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `userID` | `String` | 是 | 执行邀请操作的当前登录用户 ID。 |\n| `inviterUserID` | `String` | 是 | 邀请方用户 ID,通常与当前登录用户一致。 |\n| `inviteeUserIDList` | `List` | 是 | 被邀请用户列表;单聊只填写对方一个用户。 |\n| `groupID` | `String` | 是 | 单聊固定传空字符串。 |\n| `roomID` | `String` | 是 | 本次通话的唯一房间标识,后续状态按它合并。 |\n| `timeout` | `long` | 是 | 邀请等待时长,单位为秒。 |\n| `mediaType` | `String` | 是 | 媒体类型,业务通常约定为 `audio` 或 `video`。 |\n| `sessionType` | `int` | 是 | 单聊使用 `ConversationType.SINGLE_CHAT`。 |\n| `platformID` | `int` | 是 | Android 手机端使用 `Platform.ANDROID`。 |\n| `customData` | `String` | 否 | 随邀请携带的业务扩展字符串。 |\n| `offlinePushInfo` | `OfflinePushInfo` | 否 | 被邀请人离线时使用的推送内容。 |\n\n```java\nSignalingInvitationInfo invitation = new SignalingInvitationInfo();\ninvitation.setInviterUserID(currentUserID);\ninvitation.setInviteeUserIDList(Collections.singletonList(peerUserID));\ninvitation.setGroupID(\"\");\ninvitation.setRoomID(roomID);\ninvitation.setTimeout(30);\ninvitation.setMediaType(\"video\");\ninvitation.setSessionType(ConversationType.SINGLE_CHAT);\ninvitation.setPlatformID(Platform.ANDROID);\ninvitation.setCustomData(\"{\\\"source\\\":\\\"contact-card\\\"}\");\n\nSignalingInfo info = new SignalingInfo();\ninfo.setUserID(currentUserID);\ninfo.setInvitation(invitation);\ninfo.setOfflinePushInfo(offlinePushInfo);\n\nOpenIMClient.getInstance().signalingManager.signalingInvite(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n joinMediaRoom(\n credentials.getRoomID(),\n credentials.getToken(),\n credentials.getLiveURL()\n );\n }\n\n @Override\n public void onError(int code, String error) {\n showCallError(code, error);\n }\n },\n info\n);\n```\n\n成功回调返回 `SignalingCertificate`。其中 `roomID` 是媒体房间 ID,`token` 是加入房间使用的短期凭据,`liveURL` 是媒体服务提供的连接地址,`busyLineUserIDList` 是忙线用户列表。\n\n只有取得有效的 `token` 和 `roomID` 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态由[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)合并。", + "description": "使用 Android SDK 发起单聊音视频通话。", + "headings": [ + { + "depth": 2, + "title": "参数说明", + "url": "#参数说明" + } + ], + "sourcePath": "/sdk/android/calling/managing-calls/start-single-call", + "title": "发起单聊通话" + }, + "/sdk/android/calling/managing-calls/start-group-call": { + "body": "`signalingInviteInGroup()` 发起群聊通话,只邀请 `inviteeUserIDList` 明确列出的群成员,不会因为填写 `groupID` 自动邀请全群。\n\n```java\nSignalingInvitationInfo invitation = new SignalingInvitationInfo();\ninvitation.setInviterUserID(currentUserID);\ninvitation.setInviteeUserIDList(selectedGroupMemberIDs);\ninvitation.setGroupID(groupID);\ninvitation.setRoomID(groupID);\ninvitation.setTimeout(30);\ninvitation.setMediaType(\"video\");\ninvitation.setSessionType(ConversationType.GROUP_CHAT);\ninvitation.setPlatformID(Platform.ANDROID);\ninvitation.setCustomData(\"{\\\"source\\\":\\\"group-call\\\"}\");\n\nSignalingInfo info = new SignalingInfo();\ninfo.setUserID(currentUserID);\ninfo.setInvitation(invitation);\ninfo.setOfflinePushInfo(offlinePushInfo);\n\nOpenIMClient.getInstance().signalingManager.signalingInviteInGroup(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n startGroupCall(credentials);\n }\n\n @Override\n public void onError(int code, String error) {\n showCallError(code, error);\n }\n },\n info\n);\n```\n\n`groupID` 不能为空,`inviteeUserIDList` 应排除当前用户、空值和重复成员。示例沿用群组 ID 作为房间 ID;若业务自行生成 `roomID`,所有参与端必须使用同一个值。\n\n成功回调返回 `SignalingCertificate`,字段含义见[发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)。`busyLineUserIDList` 只表示部分成员忙线,不应中止其他成员的邀请流程;成功也不表示其他成员已经接听。", + "description": "使用 Android SDK 发起群聊音视频通话。", + "headings": [], + "sourcePath": "/sdk/android/calling/managing-calls/start-group-call", + "title": "发起群聊通话" + }, + "/sdk/android/calling/managing-calls/accept-call": { + "body": "从 `onReceiveNewInvitation` 取得原始 `SignalingInfo` 后,使用 `signalingAccept()` 接受邀请:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingAccept(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n joinMediaRoom(\n credentials.getRoomID(),\n credentials.getToken(),\n credentials.getLiveURL()\n );\n }\n\n @Override\n public void onError(int code, String error) {\n showAcceptError(code, error);\n }\n },\n receivedInfo\n);\n```\n\n`receivedInfo` 必须保留收到的原始 `roomID`、邀请人、被邀请人和会话类型,不能重新构造为只包含 `roomID` 的对象。\n\n成功回调返回 `SignalingCertificate`。取得有效的 `token` 和 `roomID` 后再连接媒体房间;远端状态由[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)继续合并。", + "description": "使用 Android SDK 接受通话邀请并获取房间凭据。", + "headings": [], + "sourcePath": "/sdk/android/calling/managing-calls/accept-call", + "title": "接受通话" + }, + "/sdk/android/calling/managing-calls/reject-call": { + "body": "用户拒绝来电时,将收到的原始 `SignalingInfo` 交给 `signalingReject()`:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingReject(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n closeIncomingCallUI();\n }\n\n @Override\n public void onError(int code, String error) {\n showRejectError(code, error);\n }\n },\n receivedInfo\n);\n```\n\n成功回调只表示拒绝信令请求完成。发起端随后通过 `onInviteeRejected` 更新界面;完整处理见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。", + "description": "使用 Android SDK 拒绝通话邀请。", + "headings": [], + "sourcePath": "/sdk/android/calling/managing-calls/reject-call", + "title": "拒绝通话" + }, + "/sdk/android/calling/managing-calls/cancel-call": { + "body": "邀请尚未接通时,发起方调用 `signalingCancel()`:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingCancel(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n stopWaitingForAnswer(activeInfo.getInvitation().getRoomID());\n }\n\n @Override\n public void onError(int code, String error) {\n showCancelError(code, error);\n }\n },\n activeInfo\n);\n```\n\n必须传入发起时保存的完整 `SignalingInfo`,不能只构造一个 `roomID`。成功回调表示取消信令请求完成;应用还应结束本地等待接听状态,并释放尚未使用的媒体资源。远端通过 `onInvitationCancelled` 更新。", + "description": "使用 Android SDK 取消尚未接通的通话邀请。", + "headings": [], + "sourcePath": "/sdk/android/calling/managing-calls/cancel-call", + "title": "取消通话邀请" + }, + "/sdk/android/calling/managing-calls/hang-up-call": { + "body": "通话已经建立后,参与者调用 `signalingHungUp()`。传入的 `SignalingInfo` 应保留本次通话的完整邀请信息,其中 `roomID` 必须与当前媒体房间一致。\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingHungUp(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n releaseCallResources(activeInfo.getInvitation().getRoomID());\n }\n\n @Override\n public void onError(int code, String error) {\n showHangUpError(code, error);\n }\n },\n activeInfo\n);\n```\n\n成功回调只表示挂断信令请求完成。应用还需要停止本地采集、断开媒体房间,并释放摄像头和麦克风。取消、拒绝、超时和挂断应进入同一套按 `roomID` 幂等执行的清理流程。", + "description": "使用 Android SDK 挂断已经建立的通话。", + "headings": [], + "sourcePath": "/sdk/android/calling/managing-calls/hang-up-call", + "title": "挂断通话" + }, + "/sdk/android/calling/managing-calls/handle-call-events": { + "body": "通话状态层应集中设置一次 `OnSignalingListener`,并按 `roomID` 合并邀请生命周期、参与者连接状态和媒体流变化。\n\n```java\nOpenIMClient.getInstance().signalingManager.setSignalingListener(\n new OnSignalingListener() {\n @Override\n public void onReceiveNewInvitation(SignalingInfo info) {\n upsertCall(info, \"ringing\");\n }\n\n @Override\n public void onInviteeAccepted(SignalingInfo info) {\n mergeCallEvent(\"accepted\", info);\n }\n\n @Override\n public void onInviteeRejected(SignalingInfo info) {\n mergeCallEvent(\"rejected\", info);\n }\n\n @Override\n public void onInvitationCancelled(SignalingInfo info) {\n mergeCallEvent(\"cancelled\", info);\n }\n\n @Override\n public void onInvitationTimeout(SignalingInfo info) {\n mergeCallEvent(\"timeout\", info);\n }\n\n @Override\n public void onInviteeAcceptedByOtherDevice(SignalingInfo info) {\n mergeCallEvent(\"accepted-by-other-device\", info);\n }\n\n @Override\n public void onInviteeRejectedByOtherDevice(SignalingInfo info) {\n mergeCallEvent(\"rejected-by-other-device\", info);\n }\n\n @Override\n public void onHangup(SignalingInfo info) {\n finishCall(info.getInvitation().getRoomID());\n }\n\n @Override\n public void onRoomParticipantConnected(RoomCallingInfo room) {\n mergeConnectedParticipants(room.getRoomID(), room.getParticipant());\n }\n\n @Override\n public void onRoomParticipantDisconnected(RoomCallingInfo room) {\n mergeDisconnectedParticipants(room.getRoomID(), room.getParticipant());\n }\n\n @Override\n public void onStreamChange(String streamInfo) {\n mergeStreamChange(streamInfo);\n }\n }\n);\n```\n\n本页是除 `onReceiveCustomSignal` 外 11 个已接入 Android 适配层的通话回调的完整归属页。自定义信令的处理边界见[发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal)。\n\n邀请事件使用 `SignalingInfo.invitation.roomID` 合并。参与者状态使用 `RoomCallingInfo.roomID`,并结合参与者的用户 ID 更新;不要按事件顺序、展示名称或数组位置合并。`onStreamChange` 当前提供字符串载荷,应由接入层按服务端实际协议解析并校验。\n\n`SignalingManager` 只设置一个 listener,后一次设置会替换先前实例,并且没有公开移除方法。自定义信令回调必须与本页的其他回调组合在同一个应用级 listener 中。退出登录或切换账号时,应停止向旧账号状态写入,并用新账号的完整 listener 覆盖。", + "description": "集中设置 Android SDK 的通话邀请、参与者和媒体流 listener。", + "headings": [], + "sourcePath": "/sdk/android/calling/managing-calls/handle-call-events", + "title": "处理通话事件" + }, + "/sdk/android/calling/retrieving-call-information/restore-pending-invitation": { + "body": "`getSignalingInvitationInfoStartApp()` 不接收业务参数,返回应用启动或恢复时需要处理的邀请快照:\n\n```java\nOpenIMClient.getInstance().signalingManager.getSignalingInvitationInfoStartApp(\n new OnBase() {\n @Override\n public void onSuccess(SignalingInfo info) {\n if (info != null\n && info.getInvitation() != null\n && info.getInvitation().getRoomID() != null\n && !info.getInvitation().getRoomID().isEmpty()) {\n restoreIncomingCall(info);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n clearExpiredIncomingCall();\n }\n }\n);\n```\n\n成功回调只表示取得当前快照,不会替代通话 listener。仅在 `invitation` 和 `roomID` 有效时恢复来电界面;随后仍需处理取消、超时、接受和挂断,完整处理见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。", + "description": "使用 Android SDK 恢复应用启动时尚未处理的通话邀请。", + "headings": [], + "sourcePath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "title": "恢复启动前收到的通话邀请" + }, + "/sdk/android/calling/retrieving-call-information/get-room-by-group-id": { + "body": "`signalingGetRoomByGroupID()` 的参数是群组 ID,不是自定义 `roomID`:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID(\n new OnBase() {\n @Override\n public void onSuccess(RoomCallingInfo room) {\n if (room.getRoomID() != null && !room.getRoomID().isEmpty()) {\n renderParticipants(room.getParticipant());\n }\n }\n\n @Override\n public void onError(int code, String error) {\n showNoActiveGroupCall();\n }\n },\n groupID\n);\n```\n\n成功回调返回 `RoomCallingInfo` 快照,其中包含房间 ID、原始邀请、参与者、群组 ID、Token 和连接地址。参与者资料中的账号资料、群内资料和群资料属于不同数据源,不应相互覆盖。\n\n没有进行中的群通话时,应把错误或空房间视为“当前没有可恢复的通话”,不要继续使用旧凭据。即使业务为群通话使用自定义房间 ID,本方法仍然传入 `groupID`。", + "description": "使用 Android SDK 按群组 ID 查询进行中的通话房间。", + "headings": [], + "sourcePath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "title": "查询群组通话房间" + }, + "/sdk/android/calling/retrieving-call-information/get-token-by-room-id": { + "body": "已经知道 `roomID`、但需要重新获取入会凭据时,调用 `signalingGetTokenByRoomID()`:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingGetTokenByRoomID(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n if (credentials.getToken() != null\n && credentials.getRoomID() != null) {\n joinMediaRoom(\n credentials.getRoomID(),\n credentials.getToken(),\n credentials.getLiveURL()\n );\n }\n }\n\n @Override\n public void onError(int code, String error) {\n showCredentialError(code, error);\n }\n },\n roomID\n);\n```\n\n成功回调返回 `SignalingCertificate`,字段含义见[发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)。只有取得有效的 `token` 和 `roomID` 后才能连接媒体引擎。\n\n房间 Token 是短期敏感凭据,只在内存中使用,不要写入日志、URL、分析事件或持久化存储。", + "description": "使用 Android SDK 按房间 ID 重新获取入会凭据。", + "headings": [], + "sourcePath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "title": "获取通话房间 Token" + }, + "/sdk/android/calling/sending-custom-signals/send-a-custom-signal": { + "body": "`signalingSendCustomSignal()` 用于向指定通话房间发送轻量级业务协商数据,例如举手、切换布局提示或业务侧状态同步。它不是聊天消息接口,也不能替代媒体引擎的数据通道。\n\n## 发送信令\n\n`roomID` 与 `customInfo` 都是必填字符串。需要传递结构化数据时,应定义稳定的数据格式并序列化为 JSON。\n\n```java\nJSONObject signal = new JSONObject();\nsignal.put(\"version\", 1);\nsignal.put(\"eventID\", eventID);\nsignal.put(\"type\", \"hand-raised\");\nsignal.put(\"userID\", currentUserID);\nsignal.put(\"sentAt\", System.currentTimeMillis());\n\nOpenIMClient.getInstance().signalingManager.signalingSendCustomSignal(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n markSignalSent(eventID);\n }\n\n @Override\n public void onError(int code, String error) {\n showSignalError(code, error);\n }\n },\n roomID,\n signal.toString()\n);\n```\n\n成功回调表示本次自定义信令发送请求已经完成,不等于其他参与者已经处理。自定义信令应保持精简,并包含协议版本和业务幂等 ID。大文件、聊天记录、长期状态和敏感凭据不应放入 `customInfo`。\n\n## 接收信令\n\n`OnSignalingListener.onReceiveCustomSignal` 返回 `CustomSignalingInfo`。应用应先校验房间和自有业务协议,再更新界面:\n\n```java\n@Override\npublic void onReceiveCustomSignal(CustomSignalingInfo info) {\n if (info == null || !activeRoomID.equals(info.getRoomID())) {\n return;\n }\n\n CallSignal signal = parseAndValidateCallSignal(info.getCustomInfo());\n String mergeID = info.getRoomID() + \":\" + signal.getEventID();\n if (hasAppliedSignal(mergeID)) {\n return;\n }\n applyCallSignal(signal);\n}\n```\n\n本页是 `onReceiveCustomSignal` 的完整处理归属页。`parseAndValidateCallSignal()` 应检查 JSON 结构、协议版本、`eventID`、`type` 和业务字段。按 `roomID:eventID` 幂等处理,不要依赖事件顺序。\n\n`SignalingManager` 只设置一个 listener。接收自定义信令的回调应合并到[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)所示的应用级 listener 中,不能为本页单独设置一个新 listener,否则会覆盖其他通话回调。\n\n客户端自定义信令不能用于授予主持人、付费或隐私权限。需要权威校验的状态应由可信后端保存和判断;连接恢复后,通过房间查询或业务后端校准长期状态。", + "description": "使用 Android SDK 在通话房间中发送和接收自定义信令。", + "headings": [ + { + "depth": 2, + "title": "发送信令", + "url": "#发送信令" + }, + { + "depth": 2, + "title": "接收信令", + "url": "#接收信令" + } + ], + "sourcePath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "title": "发送自定义信令" + }, + "/sdk/android/events/overview-events": { + "body": "OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。\n\n连接 listener 是例外:`OnConnListener` 在 `initSDK()` 时传入,其完整处理见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。\n\n## 集中设置 listener\n\n下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。\n\n```java\npublic final class OpenIMEventCenter {\n private final OpenIMClient client = OpenIMClient.getInstance();\n\n private final OnUserListener userListener = buildUserListener();\n private final OnFriendshipListener friendshipListener = buildFriendshipListener();\n private final OnConversationListener conversationListener = buildConversationListener();\n private final OnGroupListener groupListener = buildGroupListener();\n private final OnAdvanceMsgListener messageListener = buildMessageListener();\n private final OnCustomBusinessListener businessListener = buildBusinessListener();\n private final OnSignalingListener signalingListener = buildSignalingListener();\n\n public void registerBeforeLogin() {\n client.userInfoManager.setOnUserListener(userListener);\n client.friendshipManager.setOnFriendshipListener(friendshipListener);\n client.conversationManager.setOnConversationListener(conversationListener);\n client.groupManager.setOnGroupListener(groupListener);\n client.messageManager.setAdvancedMsgListener(messageListener);\n client.messageManager.setCustomBusinessListener(businessListener);\n client.signalingManager.setSignalingListener(signalingListener);\n }\n}\n```\n\nAndroid SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。\n\n## 事件归属\n\n| 事件范围 | 合并标识 | 完整处理页面 |\n| --- | --- | --- |\n| 连接、Token 和强制下线 | 当前 SDK 实例与登录用户 | [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) |\n| 当前用户资料 | `userID` | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) |\n| 在线状态 | `userID` | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) |\n| 好友关系与资料 | `userID` | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) |\n| 好友申请 | `fromUserID:toUserID` | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) |\n| 黑名单 | `userID` | [拉黑用户](/sdk/android/user/blacklist/add-blacklist)、[移出黑名单](/sdk/android/user/blacklist/remove-blacklist) |\n| 会话列表 | `conversationID` | [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) |\n| 总未读数 | 当前登录用户 | [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) |\n| 输入状态 | `conversationID:userID` | [更新输入状态](/sdk/android/message/composing-messages/update-typing-status) |\n| 群资料、成员和群申请 | `groupID` 或 `groupID:userID` | [群组概览](/sdk/android/group/overview-group) |\n| 新消息、离线消息和在线消息 | `clientMsgID`,必要时结合 `conversationID` | [接收消息](/sdk/android/message/receiving-messages/receive-messages) |\n| 消息撤回、删除、修改和置顶 | `clientMsgID`,必要时结合 `conversationID` | [消息概览](/sdk/android/message/overview-message) |\n| 单聊已读回执 | `conversationID:clientMsgID` | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) |\n| 自定义业务消息 | 业务协议中的幂等 ID | [接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) |\n| 通话 | `roomID`,参与者结合用户 ID | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events) |\n| 通话自定义信令 | `roomID:eventID` | [发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) |\n| SDK 数据同步 | 当前 SDK 实例与登录用户 | 本页“监听初始化同步” |\n\n查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。\n\n## 监听初始化同步\n\n同步生命周期属于应用级 `OnConversationListener`。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑:\n\n```java\nprivate OnConversationListener buildConversationListener() {\n return new OnConversationListener() {\n @Override\n public void onNewConversation(List conversations) {\n mergeNewConversations(conversations);\n }\n\n @Override\n public void onConversationChanged(List conversations) {\n mergeChangedConversations(conversations);\n }\n\n @Override\n public void onTotalUnreadMessageCountChanged(int total) {\n updateTotalUnreadCount(total);\n }\n\n @Override\n public void onConversationUserInputStatusChanged(String payload) {\n handleInputStatus(payload);\n }\n\n @Override\n public void onSyncServerStart(boolean reinstall) {\n setSyncState(\"syncing\", 0, reinstall);\n }\n\n @Override\n public void onSyncServerProgress(long progress) {\n setSyncProgress(progress);\n }\n\n @Override\n public void onSyncServerFinish(boolean reinstall) {\n setSyncState(\"ready\", 100, reinstall);\n reloadVisibleSnapshots();\n }\n\n @Override\n public void onSyncServerFailed(boolean reinstall) {\n setSyncState(\"failed\", 0, reinstall);\n }\n };\n}\n```\n\n`reinstall` 为 `true` 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。`onSyncServerProgress` 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。\n\n本页是 `onSyncServerStart`、`onSyncServerProgress`、`onSyncServerFinish` 和 `onSyncServerFailed` 的完整处理归属页。同步状态没有业务实体合并键,应按当前 `OpenIMClient` 单例和登录用户隔离。", + "description": "集中设置 Android SDK listener,并按业务领域分发连接、同步和数据事件。", + "headings": [ + { + "depth": 2, + "title": "集中设置 listener", + "url": "#集中设置-listener" + }, + { + "depth": 2, + "title": "事件归属", + "url": "#事件归属" + }, + { + "depth": 2, + "title": "监听初始化同步", + "url": "#监听初始化同步" + } + ], + "sourcePath": "/sdk/android/events/overview-events", + "title": "事件概览" + }, + "/sdk/android/logger": { + "body": "OpenIM Android SDK 日志用于定位初始化、连接和业务 API 调用问题。开发和预发布环境可以输出较详细的信息;生产环境应减少日志量,并避免记录 Token、完整消息正文、原始文件 URL、通话房间凭据和用户隐私字段。\n\n## 初始化日志配置\n\n日志选项属于 `InitConfig`,必须在 `initSDK()` 前设置:\n\n```java\nFile dataDirectory = new File(application.getFilesDir(), \"openim\");\nFile logDirectory = new File(application.getFilesDir(), \"openim-logs\");\n\nInitConfig config = new InitConfig(\n apiAddr,\n wsAddr,\n dataDirectory.getAbsolutePath()\n);\nconfig.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn;\nconfig.isLogStandardOutput = BuildConfig.DEBUG;\nconfig.logFilePath = logDirectory.getAbsolutePath();\n\nboolean initialized = OpenIMClient.getInstance().initSDK(\n application,\n config,\n connectionListener\n);\n```\n\n| 字段 | 说明 |\n| --- | --- |\n| `logLevel` | 使用 `LogLevel` 常量控制详细程度。可选值包括 `DebugWithSQL`、`Debug`、`Info`、`Warn`、`Error`、`Panic` 和 `Fatal`。 |\n| `isLogStandardOutput` | 是否把 SDK 日志输出到 Android 标准日志;开发诊断时开启。 |\n| `logFilePath` | 可选日志目录,应位于应用可写范围并纳入容量与保留期管理。 |\n\n开发诊断可以使用 `Debug`;只有排查数据库问题时才临时启用 `DebugWithSQL`。生产环境通常使用 `Warn` 或 `Error`,并关闭不必要的标准输出。\n\n## 写入应用诊断日志\n\n需要把业务上下文写入 SDK 日志时,使用未废弃的 `logs()` 重载:\n\n```java\nOpenIMClient.getInstance().logs(\n LogLevel.Error,\n ChatRepository.class.getSimpleName(),\n 184,\n \"send_message_failed\",\n errorMessage,\n \"conversationID\", conversationID,\n \"clientMsgID\", clientMsgID\n);\n```\n\n`currentClassName` 和 `currentLineNum` 用于定位调用位置,`msgStr` 是简短动作描述,`errStr` 是错误信息。`Warn`、`Error`、`Panic` 和 `Fatal` 级别必须提供非空错误信息。末尾的 `extra` 按“键、值”成对传入;只记录排查所需的非敏感标识。\n\n旧的带 `OnBase`、`Map` 参数的 `logs()` 重载已经废弃,不应在新代码中使用。\n\n## 上传诊断日志\n\n只在用户明确同意提交诊断信息后调用 `uploadLogs()`。Android API 保留了 `params` 参数;没有额外参数时传空列表。`line` 表示本次上传读取的日志行数配置。\n\n```java\nString uploadID = UUID.randomUUID().toString();\n\nOpenIMClient.getInstance().uploadLogs(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n showLogUploadCompleted();\n }\n\n @Override\n public void onError(int code, String error) {\n showLogUploadError(code, error);\n }\n },\n Collections.emptyList(),\n 2000,\n uploadID,\n \"support-ticket-42\",\n new UploadLogProgress() {\n @Override\n public void onProgress(long current, long total) {\n updateLogUploadProgress(current, total);\n }\n }\n);\n```\n\n| 参数 | 说明 |\n| --- | --- |\n| `line` | 本次上传读取的日志行数配置。 |\n| `cancelID` | 本次上传的稳定标识,可使用业务生成的 UUID。 |\n| `ex` | 附加到上传任务的诊断说明,例如工单 ID;不能包含凭据或隐私数据。 |\n| `UploadLogProgress` | 提供当前进度和总量,用于更新上传界面。 |\n\n成功 callback 表示本次日志上传请求完成,不会修改用户、会话或消息状态,也不会触发业务领域事件。上传失败时记录错误码、当前用户和业务诊断 ID,不要再次输出完整日志内容。\n\n## operationID 与业务追踪\n\nAndroid Java wrapper 的公共业务方法不接收 `operationID`。每次调用时,wrapper 会通过 `ParamsUtil.buildOperationID()` 自动生成并传给 Core,因此应用通常不需要创建或传递该值。\n\n应用日志应另外维护自己的 trace ID,并记录业务动作、错误码以及必要的 `conversationID`、`clientMsgID`、`groupID` 或 `roomID`。应用 trace ID 用于串联多步骤业务流程;SDK 的 `operationID` 用于单次 SDK 调用链路,两者都不是身份凭据或业务幂等键。\n\n## 相关页面\n\n- [按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation)\n- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)\n- [发送消息](/sdk/android/message/sending-messages/send-message)", + "description": "配置 Android SDK 日志、写入应用诊断信息并上传日志。", + "headings": [ + { + "depth": 2, + "title": "初始化日志配置", + "url": "#初始化日志配置" + }, + { + "depth": 2, + "title": "写入应用诊断日志", + "url": "#写入应用诊断日志" + }, + { + "depth": 2, + "title": "上传诊断日志", + "url": "#上传诊断日志" + }, + { + "depth": 2, + "title": "operationID 与业务追踪", + "url": "#operationid-与业务追踪" + }, + { + "depth": 2, + "title": "相关页面", + "url": "#相关页面" + } + ], + "sourcePath": "/sdk/android/logger", + "title": "日志" + } + } +} diff --git a/src/generated/navigation.json b/src/generated/navigation.json index 82f0673107..89d21f5af0 100644 --- a/src/generated/navigation.json +++ b/src/generated/navigation.json @@ -4302,6 +4302,16 @@ "version": "v4", "platform": "android", "nodes": [ + { + "id": "overview", + "segment": "overview", + "title": "OpenIM Android SDK overview", + "href": "/sdk/android/overview", + "type": "page", + "children": [], + "minIndex": 129, + "navigationTitle": "Overview" + }, { "id": "getting-started", "segment": "getting-started", @@ -4310,31 +4320,31 @@ "type": "folder", "children": [ { - "id": "getting-started/kotlin-extension", - "segment": "kotlin-extension", - "title": "Kotlin extension (KTX)", - "href": "/sdk/android/getting-started/kotlin-extension", + "id": "getting-started/before-you-start", + "segment": "before-you-start", + "title": "Before you start", + "href": "/sdk/android/getting-started/before-you-start", "type": "page", "children": [], - "minIndex": 186 + "minIndex": 130 }, { - "id": "getting-started/migration-guide", - "segment": "migration-guide", - "title": "Migration guide", - "href": "/sdk/android/getting-started/migration-guide", + "id": "getting-started/environment-specific-implementation", + "segment": "environment-specific-implementation", + "title": "Integrate for Android", + "href": "/sdk/android/getting-started/environment-specific-implementation", "type": "page", "children": [], - "minIndex": 187 + "minIndex": 131 }, { - "id": "getting-started/collection-migration-guide", - "segment": "collection-migration-guide", - "title": "Collection migration guide", - "href": "/sdk/android/getting-started/collection-migration-guide", + "id": "getting-started/authenticate-and-manage-session", + "segment": "authenticate-and-manage-session", + "title": "Authenticate and manage a session", + "href": "/sdk/android/getting-started/authenticate-and-manage-session", "type": "page", "children": [], - "minIndex": 185 + "minIndex": 132 }, { "id": "getting-started/send-first-message", @@ -4343,10 +4353,10 @@ "href": "/sdk/android/getting-started/send-first-message", "type": "page", "children": [], - "minIndex": 131 + "minIndex": 133 } ], - "minIndex": 131 + "minIndex": 130 }, { "id": "user", @@ -4358,1613 +4368,1526 @@ { "id": "user/overview-user", "segment": "overview-user", - "title": "Overview", + "title": "User overview", "href": "/sdk/android/user/overview-user", "type": "page", "children": [], - "minIndex": 252 + "minIndex": 134 }, { - "id": "user/retrieving-users", - "segment": "retrieving-users", - "title": "Retrieving users", + "id": "user/user-profile", + "segment": "user-profile", + "title": "User profile", "href": null, "type": "folder", "children": [ { - "id": "user/retrieving-users/retrieve-a-list-of-users-in-an-application", - "segment": "retrieve-a-list-of-users-in-an-application", - "title": "Retrieve a list of users in an application", - "href": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application", + "id": "user/user-profile/get-users-info", + "segment": "get-users-info", + "title": "Get specified user profiles", + "href": "/sdk/android/user/user-profile/get-users-info", "type": "page", "children": [], - "minIndex": 258 + "minIndex": 135 }, { - "id": "user/retrieving-users/retrieve-a-list-of-users-in-a-channel", - "segment": "retrieve-a-list-of-users-in-a-channel", - "title": "Retrieve a list of users in a channel", - "href": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel", + "id": "user/user-profile/get-self-local-user-info", + "segment": "get-self-local-user-info", + "title": "Get the current user profile", + "href": "/sdk/android/user/user-profile/get-self-local-user-info", "type": "page", "children": [], - "minIndex": 257 + "minIndex": 136 }, { - "id": "user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", - "segment": "retrieve-a-list-of-members-and-operators-in-a-specific-order", - "title": "Retrieve a list of members and operators in a specific order", - "href": "/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", + "id": "user/user-profile/set-self-info", + "segment": "set-self-info", + "title": "Update the current user profile", + "href": "/sdk/android/user/user-profile/set-self-info", "type": "page", "children": [], - "minIndex": 255 - }, + "minIndex": 137 + } + ], + "minIndex": 135 + }, + { + "id": "user/user-profile/set-global-message-reception", + "segment": "set-global-message-reception", + "title": "Set global message reception", + "href": "/sdk/android/user/user-profile/set-global-message-reception", + "type": "page", + "children": [], + "minIndex": 138, + "navigationTitle": "Set global message reception" + }, + { + "id": "user/online-status", + "segment": "online-status", + "title": "Online status", + "href": null, + "type": "folder", + "children": [ { - "id": "user/retrieving-users/retrieve-members-who-have-read-a-message", - "segment": "retrieve-members-who-have-read-a-message", - "title": "Retrieve members who have read a message", - "href": "/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message", + "id": "user/online-status/subscribe-users-online-status", + "segment": "subscribe-users-online-status", + "title": "Subscribe to user online status", + "href": "/sdk/android/user/online-status/subscribe-users-online-status", "type": "page", "children": [], - "minIndex": 158 + "minIndex": 139, + "navigationTitle": "Subscribe to user status" }, { - "id": "user/retrieving-users/retrieve-a-list-of-operators", - "segment": "retrieve-a-list-of-operators", - "title": "Retrieve a list of operators", - "href": "/sdk/android/user/retrieving-users/retrieve-a-list-of-operators", + "id": "user/online-status/get-subscribe-online-users-status", + "segment": "get-subscribe-online-users-status", + "title": "Get subscribed user online status", + "href": "/sdk/android/user/online-status/get-subscribe-online-users-status", "type": "page", "children": [], - "minIndex": 256 + "minIndex": 140, + "navigationTitle": "Refresh subscribed user status" } ], - "minIndex": 158 - }, + "minIndex": 139 + } + ], + "minIndex": 134 + }, + { + "id": "relationships", + "segment": "relationships", + "title": "Relationships", + "href": null, + "type": "folder", + "children": [ { - "id": "user/moderating-a-user", - "segment": "moderating-a-user", - "title": "Moderating a user", + "id": "user/friends", + "segment": "friends", + "title": "Friends", "href": null, "type": "folder", "children": [ { - "id": "user/moderating-a-user/retrieve-a-list-of-blocked-users", - "segment": "retrieve-a-list-of-blocked-users", - "title": "Retrieve a list of blocked users", - "href": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users", + "id": "user/friends/get-friend-list-page", + "segment": "get-friend-list-page", + "title": "Get the friend list by page", + "href": "/sdk/android/user/friends/get-friend-list-page", "type": "page", "children": [], - "minIndex": 250 + "minIndex": 141, + "navigationTitle": "Get the friend list" }, { - "id": "user/moderating-a-user/retrieve-a-list-of-muted-users", - "segment": "retrieve-a-list-of-muted-users", - "title": "Retrieve a list of muted users", - "href": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users", + "id": "user/friends/search-friends", + "segment": "search-friends", + "title": "Search friends", + "href": "/sdk/android/user/friends/search-friends", "type": "page", "children": [], - "minIndex": 251 + "minIndex": 142, + "navigationTitle": "Search friends" }, { - "id": "user/moderating-a-user/block-and-unblock-other-members", - "segment": "block-and-unblock-other-members", - "title": "Block and unblock other members", - "href": "/sdk/android/user/moderating-a-user/block-and-unblock-other-members", + "id": "user/friends/get-friends-info", + "segment": "get-friends-info", + "title": "Get specified friend profiles", + "href": "/sdk/android/user/friends/get-friends-info", "type": "page", "children": [], - "minIndex": 155 + "minIndex": 143, + "navigationTitle": "Get friend profiles" }, { - "id": "user/moderating-a-user/mute-and-unmute-a-user", - "segment": "mute-and-unmute-a-user", - "title": "Mute and unmute a user", - "href": "/sdk/android/user/moderating-a-user/mute-and-unmute-a-user", + "id": "user/friends/check-friend", + "segment": "check-friend", + "title": "Check friendship", + "href": "/sdk/android/user/friends/check-friend", "type": "page", "children": [], - "minIndex": 156 - } - ], - "minIndex": 155 - }, - { - "id": "user/retrieving-and-updating-user-information", - "segment": "retrieving-and-updating-user-information", - "title": "Retrieving and updating user information", - "href": null, - "type": "folder", - "children": [ + "minIndex": 144, + "navigationTitle": "Check friendship status" + }, { - "id": "user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", - "segment": "retrieve-the-online-status-of-a-user", - "title": "Retrieve the online status of a user", - "href": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", + "id": "user/friends/update-friends", + "segment": "update-friends", + "title": "Update friend profiles", + "href": "/sdk/android/user/friends/update-friends", "type": "page", "children": [], - "minIndex": 157 + "minIndex": 145, + "navigationTitle": "Update friend information" }, { - "id": "user/retrieving-and-updating-user-information/update-user-profile", - "segment": "update-user-profile", - "title": "Update user profile", - "href": "/sdk/android/user/retrieving-and-updating-user-information/update-user-profile", + "id": "user/friends/delete-friend", + "segment": "delete-friend", + "title": "Delete a friend", + "href": "/sdk/android/user/friends/delete-friend", "type": "page", "children": [], - "minIndex": 254 + "minIndex": 146, + "navigationTitle": "Delete a friend" }, { - "id": "user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "segment": "retrieve-the-latest-information-on-participants", - "title": "Retrieve the latest information on participants", - "href": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "type": "page", - "children": [], - "minIndex": 253 + "id": "user/friend-applications", + "segment": "friend-applications", + "title": "Friend applications", + "href": null, + "type": "folder", + "children": [ + { + "id": "user/friend-applications/add-friend", + "segment": "add-friend", + "title": "Send a friend request", + "href": "/sdk/android/user/friend-applications/add-friend", + "type": "page", + "children": [], + "minIndex": 147, + "navigationTitle": "Send a friend application" + }, + { + "id": "user/friend-applications/get-recv-friend-application-list", + "segment": "get-recv-friend-application-list", + "title": "Get received friend requests", + "href": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "type": "page", + "children": [], + "minIndex": 148, + "navigationTitle": "Get received friend applications" + }, + { + "id": "user/friend-applications/get-send-friend-application-list", + "segment": "get-send-friend-application-list", + "title": "Get sent friend requests", + "href": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "type": "page", + "children": [], + "minIndex": 149, + "navigationTitle": "Get sent friend applications" + }, + { + "id": "user/friend-applications/accept-friend-application", + "segment": "accept-friend-application", + "title": "Accept a friend request", + "href": "/sdk/android/user/friend-applications/accept-friend-application", + "type": "page", + "children": [], + "minIndex": 150, + "navigationTitle": "Accept a friend application" + }, + { + "id": "user/friend-applications/refuse-friend-application", + "segment": "refuse-friend-application", + "title": "Reject a friend request", + "href": "/sdk/android/user/friend-applications/refuse-friend-application", + "type": "page", + "children": [], + "minIndex": 151, + "navigationTitle": "Reject a friend application" + } + ], + "minIndex": 147 } ], - "minIndex": 157 + "minIndex": 141 }, { - "id": "user/managing-user-metadata", - "segment": "managing-user-metadata", - "title": "Managing user metadata", + "id": "user/blacklist", + "segment": "blacklist", + "title": "Blacklist", "href": null, "type": "folder", "children": [ { - "id": "user/managing-user-metadata/manage-user-metadata", - "segment": "manage-user-metadata", - "title": "Manage user metadata", - "href": "/sdk/android/user/managing-user-metadata/manage-user-metadata", + "id": "user/blacklist/get-blacklist", + "segment": "get-blacklist", + "title": "Get the blacklist", + "href": "/sdk/android/user/blacklist/get-blacklist", + "type": "page", + "children": [], + "minIndex": 152 + }, + { + "id": "user/blacklist/add-blacklist", + "segment": "add-blacklist", + "title": "Block a user", + "href": "/sdk/android/user/blacklist/add-blacklist", + "type": "page", + "children": [], + "minIndex": 153, + "navigationTitle": "Block a user" + }, + { + "id": "user/blacklist/remove-blacklist", + "segment": "remove-blacklist", + "title": "Unblock a user", + "href": "/sdk/android/user/blacklist/remove-blacklist", "type": "page", "children": [], - "minIndex": 248 + "minIndex": 154, + "navigationTitle": "Unblock a user" } ], - "minIndex": 248 + "minIndex": 152 } ], - "minIndex": 155 + "minIndex": 141 }, { - "id": "channel", - "segment": "channel", - "title": "Channel", + "id": "conversation", + "segment": "conversation", + "title": "Conversation", "href": null, "type": "folder", "children": [ { - "id": "channel/overview-channel", - "segment": "overview-channel", - "title": "Overview", - "href": "/sdk/android/channel/overview-channel", + "id": "conversation/overview-conversation", + "segment": "overview-conversation", + "title": "Conversation overview", + "href": "/sdk/android/conversation/overview-conversation", "type": "page", "children": [], - "minIndex": 130 + "minIndex": 155 }, { - "id": "channel/creating-a-channel", - "segment": "creating-a-channel", - "title": "Creating a channel", + "id": "conversation/retrieving-conversations", + "segment": "retrieving-conversations", + "title": "Retrieving conversations", "href": null, "type": "folder", "children": [ { - "id": "channel/creating-a-channel/create-a-channel", - "segment": "create-a-channel", - "title": "Create a channel", - "href": "/sdk/android/channel/creating-a-channel/create-a-channel", + "id": "conversation/retrieving-conversations/get-conversation-by-target", + "segment": "get-conversation-by-target", + "title": "Open a conversation", + "href": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", "type": "page", "children": [], - "minIndex": 163 - } - ], - "minIndex": 163 - }, - { - "id": "channel/managing-operators", - "segment": "managing-operators", - "title": "Managing operators", - "href": null, - "type": "folder", - "children": [ + "minIndex": 156, + "navigationTitle": "Open a conversation" + }, { - "id": "channel/managing-operators/register-and-remove-operators", - "segment": "register-and-remove-operators", - "title": "Register and remove operators", - "href": "/sdk/android/channel/managing-operators/register-and-remove-operators", + "id": "conversation/retrieving-conversations/get-conversation-id", + "segment": "get-conversation-id", + "title": "Resolve a conversation ID", + "href": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", "type": "page", "children": [], - "minIndex": 173 - } - ], - "minIndex": 173 - }, - { - "id": "channel/joining-and-leaving-a-channel", - "segment": "joining-and-leaving-a-channel", - "title": "Joining and leaving a channel", - "href": null, - "type": "folder", - "children": [ + "minIndex": 157, + "navigationTitle": "Resolve a conversation ID" + }, { - "id": "channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", - "segment": "enter-and-exit-an-open-channel", - "title": "Enter and exit an open channel", - "href": "/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", + "id": "conversation/retrieving-conversations/get-conversations-by-id", + "segment": "get-conversations-by-id", + "title": "Get conversations by ID", + "href": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", "type": "page", "children": [], - "minIndex": 166 + "minIndex": 158, + "navigationTitle": "Get conversations by ID" }, { - "id": "channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", - "segment": "join-and-leave-a-group-channel", - "title": "Join and leave a group channel", - "href": "/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", + "id": "conversation/retrieving-conversations/retrieve-conversation-list", + "segment": "retrieve-conversation-list", + "title": "Get the conversation list", + "href": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", "type": "page", "children": [], - "minIndex": 167 + "minIndex": 159 } ], - "minIndex": 166 + "minIndex": 156 }, { - "id": "channel/retrieving-channels", - "segment": "retrieving-channels", - "title": "Retrieving channels", + "id": "conversation/conversation-list-and-drafts", + "segment": "conversation-list-and-drafts", + "title": "Conversation organization", "href": null, "type": "folder", "children": [ { - "id": "channel/retrieving-channels/retrieve-a-list-of-channels", - "segment": "retrieve-a-list-of-channels", - "title": "Retrieve a list of channels", - "href": "/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels", + "id": "conversation/managing-conversations/pin-conversation", + "segment": "pin-conversation", + "title": "Pin or unpin a conversation", + "href": "/sdk/android/conversation/managing-conversations/pin-conversation", "type": "page", "children": [], - "minIndex": 175 + "minIndex": 160, + "navigationTitle": "Pin or unpin a conversation" }, { - "id": "channel/retrieving-channels/retrieve-a-channel-by-url", - "segment": "retrieve-a-channel-by-url", - "title": "Retrieve a channel by URL", - "href": "/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url", - "type": "page", - "children": [], - "minIndex": 174 - } - ], - "minIndex": 174 - }, - { - "id": "channel/inviting-users-to-a-group-channel", - "segment": "inviting-users-to-a-group-channel", - "title": "Inviting users to a group channel", - "href": null, - "type": "folder", - "children": [ - { - "id": "channel/inviting-users-to-a-group-channel/invite-users-as-members", - "segment": "invite-users-as-members", - "title": "Invite users as members", - "href": "/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members", + "id": "conversation/managing-conversations/set-conversation-extension", + "segment": "set-conversation-extension", + "title": "Set conversation extra data", + "href": "/sdk/android/conversation/managing-conversations/set-conversation-extension", "type": "page", "children": [], - "minIndex": 165 + "minIndex": 161, + "navigationTitle": "Set conversation extra data" }, { - "id": "channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", - "segment": "accept-or-decline-an-invitation", - "title": "Accept or decline an invitation", - "href": "/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", + "id": "conversation/managing-conversations/set-conversation-draft", + "segment": "set-conversation-draft", + "title": "Set a conversation draft", + "href": "/sdk/android/conversation/managing-conversations/set-conversation-draft", "type": "page", "children": [], - "minIndex": 164 + "minIndex": 162 } ], - "minIndex": 164 + "minIndex": 160 }, { - "id": "channel/searching-channels", - "segment": "searching-channels", - "title": "Searching channels", + "id": "conversation/message-reception-and-reminders", + "segment": "message-reception-and-reminders", + "title": "Unread status and notifications", "href": null, "type": "folder", "children": [ { - "id": "channel/searching-channels/search-group-channels-by-name-url-or-other-filters", - "segment": "search-group-channels-by-name-url-or-other-filters", - "title": "Search group channels by name, URL, or other filters", - "href": "/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters", + "id": "conversation/managing-conversations/set-message-receive-option", + "segment": "set-message-receive-option", + "title": "Set conversation message reception", + "href": "/sdk/android/conversation/managing-conversations/set-message-receive-option", "type": "page", "children": [], - "minIndex": 177 + "minIndex": 163, + "navigationTitle": "Set conversation message reception" }, { - "id": "channel/searching-channels/filter-group-channels-by-user-ids", - "segment": "filter-group-channels-by-user-ids", - "title": "Filter group channels by user IDs", - "href": "/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids", - "type": "page", - "children": [], - "minIndex": 176 + "id": "conversation/managing-conversations/clear-group-mentions", + "segment": "clear-group-mentions", + "title": "Reset group mention status", + "href": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "type": "page", + "children": [], + "minIndex": 164, + "navigationTitle": "Reset group mention status" }, { - "id": "channel/searching-channels/search-open-channels-by-name-url-or-custom-types", - "segment": "search-open-channels-by-name-url-or-custom-types", - "title": "Search open channels by name, URL, or custom type", - "href": "/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types", + "id": "conversation/managing-conversations/mark-conversation-read", + "segment": "mark-conversation-read", + "title": "Mark a conversation as read", + "href": "/sdk/android/conversation/managing-conversations/mark-conversation-read", "type": "page", "children": [], - "minIndex": 178 - } - ], - "minIndex": 176 - }, - { - "id": "channel/categorizing-channels", - "segment": "categorizing-channels", - "title": "Categorizing channels", - "href": null, - "type": "folder", - "children": [ + "minIndex": 165, + "navigationTitle": "Mark a conversation as read" + }, { - "id": "channel/categorizing-channels/categorize-channels-by-custom-type", - "segment": "categorize-channels-by-custom-type", - "title": "Categorize channels by custom type", - "href": "/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type", + "id": "conversation/managing-conversations/get-total-unread-count", + "segment": "get-total-unread-count", + "title": "Track the total unread count", + "href": "/sdk/android/conversation/managing-conversations/get-total-unread-count", "type": "page", "children": [], - "minIndex": 162 + "minIndex": 166, + "navigationTitle": "Track the total unread count" } ], - "minIndex": 162 + "minIndex": 163 }, { - "id": "channel/managing-channels", - "segment": "managing-channels", - "title": "Managing channels", + "id": "conversation/message-retention-and-privacy", + "segment": "message-retention-and-privacy", + "title": "Message retention and privacy", "href": null, "type": "folder", "children": [ { - "id": "channel/managing-channels/delete-a-channel", - "segment": "delete-a-channel", - "title": "Delete a channel", - "href": "/sdk/android/channel/managing-channels/delete-a-channel", + "id": "conversation/managing-conversations/set-private-chat", + "segment": "set-private-chat", + "title": "Enable or disable burn after reading", + "href": "/sdk/android/conversation/managing-conversations/set-private-chat", "type": "page", "children": [], - "minIndex": 170 + "minIndex": 167, + "navigationTitle": "Enable or disable burn after reading" }, { - "id": "channel/managing-channels/hide-or-archive-a-group-channel", - "segment": "hide-or-archive-a-group-channel", - "title": "Hide or archive a group channel", - "href": "/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel", + "id": "conversation/managing-conversations/set-burn-duration", + "segment": "set-burn-duration", + "title": "Set the burn duration", + "href": "/sdk/android/conversation/managing-conversations/set-burn-duration", "type": "page", "children": [], - "minIndex": 171 + "minIndex": 168, + "navigationTitle": "Set the burn duration" }, { - "id": "channel/managing-channels/refresh-all-data-related-to-a-group-channel", - "segment": "refresh-all-data-related-to-a-group-channel", - "title": "Refresh all data related to a group channel", - "href": "/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel", + "id": "conversation/managing-conversations/set-message-destruct", + "segment": "set-message-destruct", + "title": "Schedule server message deletion", + "href": "/sdk/android/conversation/managing-conversations/set-message-destruct", "type": "page", "children": [], - "minIndex": 172 + "minIndex": 169, + "navigationTitle": "Schedule server message deletion" } ], - "minIndex": 170 + "minIndex": 167 }, { - "id": "channel/moderating-a-channel", - "segment": "moderating-a-channel", - "title": "Moderating a channel", + "id": "conversation/hiding-and-deleting-conversations", + "segment": "hiding-and-deleting-conversations", + "title": "Hiding and deleting conversations", "href": null, "type": "folder", "children": [ { - "id": "channel/moderating-a-channel/freeze-and-unfreeze-a-channel", - "segment": "freeze-and-unfreeze-a-channel", - "title": "Freeze and unfreeze a channel", - "href": "/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel", + "id": "conversation/managing-conversations/hide-a-conversation", + "segment": "hide-a-conversation", + "title": "Hide a conversation", + "href": "/sdk/android/conversation/managing-conversations/hide-a-conversation", "type": "page", "children": [], - "minIndex": 129 - } - ], - "minIndex": 129 - }, - { - "id": "channel/managing-channel-metadata", - "segment": "managing-channel-metadata", - "title": "Managing channel metadata", - "href": null, - "type": "folder", - "children": [ + "minIndex": 170 + }, { - "id": "channel/managing-channel-metadata/manage-channel-metadata", - "segment": "manage-channel-metadata", - "title": "Manage channel metadata", - "href": "/sdk/android/channel/managing-channel-metadata/manage-channel-metadata", + "id": "conversation/managing-conversations/delete-conversation-with-messages", + "segment": "delete-conversation-with-messages", + "title": "Delete a conversation and its messages", + "href": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", "type": "page", "children": [], - "minIndex": 169 - } - ], - "minIndex": 169 - }, - { - "id": "channel/managing-channel-metacounters", - "segment": "managing-channel-metacounters", - "title": "Managing channel metacounters", - "href": null, - "type": "folder", - "children": [ + "minIndex": 171, + "navigationTitle": "Delete a conversation and its messages" + }, { - "id": "channel/managing-channel-metacounters/manage-channel-metacounters", - "segment": "manage-channel-metacounters", - "title": "Manage channel metacounters", - "href": "/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters", + "id": "conversation/managing-conversations/clear-conversation-messages", + "segment": "clear-conversation-messages", + "title": "Clear messages in a conversation", + "href": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", "type": "page", "children": [], - "minIndex": 168 + "minIndex": 172, + "navigationTitle": "Clear messages in a conversation" } ], - "minIndex": 168 + "minIndex": 170 } ], - "minIndex": 129 + "minIndex": 155 }, { - "id": "message", - "segment": "message", - "title": "Message", + "id": "group", + "segment": "group", + "title": "Group", "href": null, "type": "folder", "children": [ { - "id": "message/overview-message", - "segment": "overview-message", - "title": "Overview", - "href": "/sdk/android/message/overview-message", + "id": "group/overview-group", + "segment": "overview-group", + "title": "Group overview", + "href": "/sdk/android/group/overview-group", "type": "page", "children": [], - "minIndex": 141 + "minIndex": 173, + "navigationTitle": "Group overview" }, { - "id": "message/sending-a-message", - "segment": "sending-a-message", - "title": "Sending a message", + "id": "group/profile-and-settings", + "segment": "profile-and-settings", + "title": "Group profile and settings", "href": null, "type": "folder", "children": [ { - "id": "message/sending-a-message/send-a-message", - "segment": "send-a-message", - "title": "Send a message", - "href": "/sdk/android/message/sending-a-message/send-a-message", - "type": "page", - "children": [], - "minIndex": 233 - }, - { - "id": "message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "segment": "send-a-critical-alert-message-to-ios-device-users", - "title": "Send a critical alert message to iOS device users", - "href": "/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "type": "page", - "children": [], - "minIndex": 232 - }, - { - "id": "message/sending-a-message/send-an-admin-message", - "segment": "send-an-admin-message", - "title": "Send an admin message", - "href": "/sdk/android/message/sending-a-message/send-an-admin-message", - "type": "page", - "children": [], - "minIndex": 234 - }, - { - "id": "message/sending-a-message/track-file-upload-progress-using-a-handler", - "segment": "track-file-upload-progress-using-a-handler", - "title": "Track file upload progress using a handler", - "href": "/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler", - "type": "page", - "children": [], - "minIndex": 236 - }, - { - "id": "message/sending-a-message/cancel-an-in-progress-file-upload", - "segment": "cancel-an-in-progress-file-upload", - "title": "Cancel an in-progress file upload", - "href": "/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload", + "id": "group/create-group", + "segment": "create-group", + "title": "Create a group", + "href": "/sdk/android/group/create-group", "type": "page", "children": [], - "minIndex": 231 + "minIndex": 174, + "navigationTitle": "Create a group" }, { - "id": "message/sending-a-message/share-an-encrypted-file", - "segment": "share-an-encrypted-file", - "title": "Share an encrypted file", - "href": "/sdk/android/message/sending-a-message/share-an-encrypted-file", + "id": "group/update-group-profile", + "segment": "update-group-profile", + "title": "Update group profile", + "href": "/sdk/android/group/update-group-profile", "type": "page", "children": [], - "minIndex": 144 + "minIndex": 175, + "navigationTitle": "Update group profile" }, { - "id": "message/sending-a-message/spam-flood-protection", - "segment": "spam-flood-protection", - "title": "Spam flood protection", - "href": "/sdk/android/message/sending-a-message/spam-flood-protection", + "id": "group/set-group-announcement", + "segment": "set-group-announcement", + "title": "Publish a group announcement", + "href": "/sdk/android/group/set-group-announcement", "type": "page", "children": [], - "minIndex": 235 + "minIndex": 176, + "navigationTitle": "Publish a group announcement" }, { - "id": "message/sending-a-message/smart-throttling", - "segment": "smart-throttling", - "title": "Smart throttling", - "href": "/sdk/android/message/sending-a-message/smart-throttling", + "id": "group/set-group-extension", + "segment": "set-group-extension", + "title": "Set group extra data", + "href": "/sdk/android/group/set-group-extension", "type": "page", "children": [], - "minIndex": 145 + "minIndex": 177, + "navigationTitle": "Set group extra data" } ], - "minIndex": 144 + "minIndex": 174 }, { - "id": "message/receiving-messages-through-event-handler", - "segment": "receiving-messages-through-event-handler", - "title": "Receiving messages through event handler", + "id": "group/permissions", + "segment": "permissions", + "title": "Group permissions", "href": null, "type": "folder", "children": [ { - "id": "message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", - "segment": "receive-messages-in-an-open-channel", - "title": "Receive messages in an open channel", - "href": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", + "id": "group/set-group-join-verification", + "segment": "set-group-join-verification", + "title": "Set group join verification", + "href": "/sdk/android/group/set-group-join-verification", "type": "page", "children": [], - "minIndex": 223 + "minIndex": 178, + "navigationTitle": "Set group join verification" }, { - "id": "message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", - "segment": "receive-messages-in-a-group-channel", - "title": "Receive messages in a group channel", - "href": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", + "id": "group/set-group-member-profile-access", + "segment": "set-group-member-profile-access", + "title": "Set member profile access", + "href": "/sdk/android/group/set-group-member-profile-access", "type": "page", "children": [], - "minIndex": 222 - } - ], - "minIndex": 222 - }, - { - "id": "message/using-message-threading", - "segment": "using-message-threading", - "title": "Using message threading", - "href": null, - "type": "folder", - "children": [ + "minIndex": 179, + "navigationTitle": "Set member profile access" + }, { - "id": "message/using-message-threading/create-a-message-thread", - "segment": "create-a-message-thread", - "title": "Create a message thread", - "href": "/sdk/android/message/using-message-threading/create-a-message-thread", + "id": "group/set-group-member-friend-permission", + "segment": "set-group-member-friend-permission", + "title": "Set member friend request permission", + "href": "/sdk/android/group/set-group-member-friend-permission", "type": "page", "children": [], - "minIndex": 148 + "minIndex": 180, + "navigationTitle": "Set member friend request permission" }, { - "id": "message/using-message-threading/list-replies-in-a-message-thread", - "segment": "list-replies-in-a-message-thread", - "title": "List replies in a message thread", - "href": "/sdk/android/message/using-message-threading/list-replies-in-a-message-thread", + "id": "group/change-group-mute", + "segment": "change-group-mute", + "title": "Change group mute status", + "href": "/sdk/android/group/change-group-mute", "type": "page", "children": [], - "minIndex": 238 + "minIndex": 181, + "navigationTitle": "Change group mute status" } ], - "minIndex": 148 + "minIndex": 178 }, { - "id": "message/retrieving-messages", - "segment": "retrieving-messages", - "title": "Retrieving messages", + "id": "group/joining-and-leaving", + "segment": "joining-and-leaving", + "title": "Joining and leaving groups", "href": null, "type": "folder", "children": [ { - "id": "message/retrieving-messages/retrieve-a-list-of-messages", - "segment": "retrieve-a-list-of-messages", - "title": "Retrieve a list of messages", - "href": "/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages", + "id": "group/join-group", + "segment": "join-group", + "title": "Apply to join a group", + "href": "/sdk/android/group/join-group", "type": "page", "children": [], - "minIndex": 224 + "minIndex": 182, + "navigationTitle": "Apply to join a group" }, { - "id": "message/retrieving-messages/retrieve-a-message", - "segment": "retrieve-a-message", - "title": "Retrieve a message", - "href": "/sdk/android/message/retrieving-messages/retrieve-a-message", + "id": "group/quit-group", + "segment": "quit-group", + "title": "Leave a group", + "href": "/sdk/android/group/quit-group", "type": "page", "children": [], - "minIndex": 142 - } - ], - "minIndex": 142 - }, - { - "id": "message/searching-messages-in-a-group-channel", - "segment": "searching-messages-in-a-group-channel", - "title": "Searching messages in a group channel", - "href": null, - "type": "folder", - "children": [ + "minIndex": 183, + "navigationTitle": "Leave a group" + }, { - "id": "message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", - "segment": "search-messages-by-a-keyword", - "title": "Search messages by a keyword", - "href": "/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", + "id": "group/dismiss-group", + "segment": "dismiss-group", + "title": "Dismiss a group", + "href": "/sdk/android/group/dismiss-group", "type": "page", "children": [], - "minIndex": 143 + "minIndex": 184, + "navigationTitle": "Dismiss a group" } ], - "minIndex": 143 + "minIndex": 182 }, { - "id": "message/managing-a-message", - "segment": "managing-a-message", - "title": "Managing a message", + "id": "group/retrieving-groups", + "segment": "retrieving-groups", + "title": "Retrieving groups", "href": null, "type": "folder", "children": [ { - "id": "message/managing-a-message/copy-a-message", - "segment": "copy-a-message", - "title": "Copy a message", - "href": "/sdk/android/message/managing-a-message/copy-a-message", + "id": "group/retrieving-groups/get-specified-groups-info", + "segment": "get-specified-groups-info", + "title": "Get group information", + "href": "/sdk/android/group/retrieving-groups/get-specified-groups-info", "type": "page", "children": [], - "minIndex": 195 + "minIndex": 185, + "navigationTitle": "Get group information" }, { - "id": "message/managing-a-message/update-a-message", - "segment": "update-a-message", - "title": "Update a message", - "href": "/sdk/android/message/managing-a-message/update-a-message", + "id": "group/retrieving-groups/get-joined-group-list-page", + "segment": "get-joined-group-list-page", + "title": "Get joined groups by page", + "href": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", "type": "page", "children": [], - "minIndex": 198 + "minIndex": 186, + "navigationTitle": "Get joined groups by page" }, { - "id": "message/managing-a-message/delete-a-message", - "segment": "delete-a-message", - "title": "Delete a message", - "href": "/sdk/android/message/managing-a-message/delete-a-message", + "id": "group/retrieving-groups/is-join-group", + "segment": "is-join-group", + "title": "Check group membership", + "href": "/sdk/android/group/retrieving-groups/is-join-group", "type": "page", "children": [], - "minIndex": 196 + "minIndex": 187, + "navigationTitle": "Check group membership" }, { - "id": "message/managing-a-message/react-to-a-message-in-a-group-channel", - "segment": "react-to-a-message-in-a-group-channel", - "title": "React to a message in a group channel", - "href": "/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel", + "id": "group/retrieving-groups/search-groups", + "segment": "search-groups", + "title": "Search groups", + "href": "/sdk/android/group/retrieving-groups/search-groups", + "type": "page", + "children": [], + "minIndex": 188, + "navigationTitle": "Search groups" + } + ], + "minIndex": 185 + }, + { + "id": "group/group-applications", + "segment": "group-applications", + "title": "Group applications", + "href": null, + "type": "folder", + "children": [ + { + "id": "group/group-applications/overview-group-applications", + "segment": "overview-group-applications", + "title": "Group applications overview", + "href": "/sdk/android/group/group-applications/overview-group-applications", "type": "page", "children": [], - "minIndex": 134 + "minIndex": 189, + "navigationTitle": "Group applications overview" }, { - "id": "message/managing-a-message/clear-the-chat-history-in-a-group-channel", - "segment": "clear-the-chat-history-in-a-group-channel", - "title": "Clear the chat history in a group channel", - "href": "/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel", + "id": "group/group-applications/get-group-application-list-as-recipient", + "segment": "get-group-application-list-as-recipient", + "title": "Get received group applications", + "href": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", "type": "page", "children": [], - "minIndex": 194 + "minIndex": 190, + "navigationTitle": "Get received group applications" }, { - "id": "message/managing-a-message/send-typing-indicators-to-other-members", - "segment": "send-typing-indicators-to-other-members", - "title": "Send typing indicators to other members", - "href": "/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members", + "id": "group/group-applications/get-group-application-list-as-applicant", + "segment": "get-group-application-list-as-applicant", + "title": "Get sent group applications", + "href": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", "type": "page", "children": [], - "minIndex": 135 + "minIndex": 191, + "navigationTitle": "Get sent group applications" }, { - "id": "message/managing-a-message/display-open-graph-tags-in-a-message", - "segment": "display-open-graph-tags-in-a-message", - "title": "Display Open Graph tags in a message", - "href": "/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message", + "id": "group/group-applications/accept-group-application", + "segment": "accept-group-application", + "title": "Accept a group application", + "href": "/sdk/android/group/group-applications/accept-group-application", "type": "page", "children": [], - "minIndex": 197 + "minIndex": 192, + "navigationTitle": "Accept a group application" }, { - "id": "message/managing-a-message/generate-thumbnails-of-a-file-message", - "segment": "generate-thumbnails-of-a-file-message", - "title": "Generate thumbnails of a file message", - "href": "/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message", + "id": "group/group-applications/refuse-group-application", + "segment": "refuse-group-application", + "title": "Reject a group application", + "href": "/sdk/android/group/group-applications/refuse-group-application", "type": "page", "children": [], - "minIndex": 133 + "minIndex": 193, + "navigationTitle": "Reject a group application" } ], - "minIndex": 133 + "minIndex": 189 }, { - "id": "message/managing-scheduled-messages-in-group-channel", - "segment": "managing-scheduled-messages-in-group-channel", - "title": "Managing scheduled messages in group channel", + "id": "group/retrieving-group-members", + "segment": "retrieving-group-members", + "title": "Retrieving group members", "href": null, "type": "folder", "children": [ { - "id": "message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", - "segment": "create-a-scheduled-message", - "title": "Create a scheduled message", - "href": "/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", + "id": "group/retrieving-group-members/overview-retrieving-group-members", + "segment": "overview-retrieving-group-members", + "title": "Group member queries overview", + "href": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", "type": "page", "children": [], - "minIndex": 138 + "minIndex": 194, + "navigationTitle": "Group member queries overview" }, { - "id": "message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "segment": "retrieve-a-scheduled-message", - "title": "Retrieve a scheduled message", - "href": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "type": "page", - "children": [], - "minIndex": 218 - }, - { - "id": "message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", - "segment": "update-a-scheduled-message", - "title": "Update a scheduled message", - "href": "/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", + "id": "group/retrieving-group-members/get-group-member-list", + "segment": "get-group-member-list", + "title": "List group members", + "href": "/sdk/android/group/retrieving-group-members/get-group-member-list", "type": "page", "children": [], - "minIndex": 221 + "minIndex": 195, + "navigationTitle": "Get group members" }, { - "id": "message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", - "segment": "cancel-a-scheduled-message", - "title": "Cancel a scheduled message", - "href": "/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", + "id": "group/retrieving-group-members/get-specified-group-members-info", + "segment": "get-specified-group-members-info", + "title": "Get specified group member profiles", + "href": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", "type": "page", "children": [], - "minIndex": 216 + "minIndex": 196, + "navigationTitle": "Get group member profiles" }, { - "id": "message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", - "segment": "list-all-scheduled-messages", - "title": "List all scheduled messages", - "href": "/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", + "id": "group/retrieving-group-members/get-users-in-group", + "segment": "get-users-in-group", + "title": "Check group membership", + "href": "/sdk/android/group/retrieving-group-members/get-users-in-group", "type": "page", "children": [], - "minIndex": 217 + "minIndex": 197, + "navigationTitle": "Check users in a group" }, { - "id": "message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", - "segment": "retrieve-the-total-number-of-scheduled-messages", - "title": "Retrieve the total number of scheduled messages", - "href": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", + "id": "group/retrieving-group-members/get-group-member-owner-and-admin", + "segment": "get-group-member-owner-and-admin", + "title": "Get the group owner and administrators", + "href": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", "type": "page", "children": [], - "minIndex": 219 + "minIndex": 198, + "navigationTitle": "Get group owners and admins" }, { - "id": "message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", - "segment": "send-a-scheduled-message-immediately", - "title": "Send scheduled message immediately", - "href": "/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", + "id": "group/retrieving-group-members/search-group-members", + "segment": "search-group-members", + "title": "Search group members", + "href": "/sdk/android/group/retrieving-group-members/search-group-members", "type": "page", "children": [], - "minIndex": 220 + "minIndex": 199, + "navigationTitle": "Search group members" } ], - "minIndex": 138 + "minIndex": 194 }, { - "id": "message/managing-pinned-messages-in-group-channels", - "segment": "managing-pinned-messages-in-group-channels", - "title": "Managing pinned messages in group channels", + "id": "group/managing-group-members", + "segment": "managing-group-members", + "title": "Managing group members", "href": null, "type": "folder", "children": [ { - "id": "message/managing-pinned-messages-in-group-channels/pin-a-message", - "segment": "pin-a-message", - "title": "Pin a message", - "href": "/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message", + "id": "group/managing-group-members/invite-user-to-group", + "segment": "invite-user-to-group", + "title": "Invite users to a group", + "href": "/sdk/android/group/managing-group-members/invite-user-to-group", "type": "page", "children": [], - "minIndex": 136 + "minIndex": 200, + "navigationTitle": "Invite users to a group" }, { - "id": "message/managing-pinned-messages-in-group-channels/unpin-a-message", - "segment": "unpin-a-message", - "title": "Unpin a message", - "href": "/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message", + "id": "group/managing-group-members/kick-group-member", + "segment": "kick-group-member", + "title": "Remove group members", + "href": "/sdk/android/group/managing-group-members/kick-group-member", "type": "page", "children": [], - "minIndex": 200 + "minIndex": 201, + "navigationTitle": "Remove group members" }, { - "id": "message/managing-pinned-messages-in-group-channels/list-pinned-messages", - "segment": "list-pinned-messages", - "title": "List pinned messages", - "href": "/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages", + "id": "group/managing-group-members/set-group-member-nickname", + "segment": "set-group-member-nickname", + "title": "Update a member’s group nickname", + "href": "/sdk/android/group/managing-group-members/set-group-member-nickname", "type": "page", "children": [], - "minIndex": 199 - } - ], - "minIndex": 136 - }, - { - "id": "message/listing-changelogs", - "segment": "listing-changelogs", - "title": "Listing changelogs", - "href": null, - "type": "folder", - "children": [ + "minIndex": 202, + "navigationTitle": "Update a group nickname" + }, { - "id": "message/listing-changelogs/list-changelogs-of-messages", - "segment": "list-changelogs-of-messages", - "title": "List changelogs of messages", - "href": "/sdk/android/message/listing-changelogs/list-changelogs-of-messages", + "id": "group/managing-group-members/set-group-member-role-level", + "segment": "set-group-member-role-level", + "title": "Manage group administrators", + "href": "/sdk/android/group/managing-group-members/set-group-member-role-level", "type": "page", "children": [], - "minIndex": 193 - } - ], - "minIndex": 193 - }, - { - "id": "message/managing-read-status-in-a-group-channel", - "segment": "managing-read-status-in-a-group-channel", - "title": "Managing read status in a group channel", - "href": null, - "type": "folder", - "children": [ + "minIndex": 203, + "navigationTitle": "Manage group administrators" + }, { - "id": "message/managing-read-status-in-a-group-channel/mark-messages-as-read", - "segment": "mark-messages-as-read", - "title": "Mark messages as read", - "href": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read", + "id": "group/managing-group-members/set-group-member-avatar", + "segment": "set-group-member-avatar", + "title": "Update a group member’s avatar", + "href": "/sdk/android/group/managing-group-members/set-group-member-avatar", "type": "page", "children": [], - "minIndex": 214 + "minIndex": 204, + "navigationTitle": "Update a group member avatar" }, { - "id": "message/managing-read-status-in-a-group-channel/mark-messages-as-unread", - "segment": "mark-messages-as-unread", - "title": "Mark messages as unread", - "href": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread", + "id": "group/managing-group-members/set-group-member-extension", + "segment": "set-group-member-extension", + "title": "Set a group member extension", + "href": "/sdk/android/group/managing-group-members/set-group-member-extension", "type": "page", "children": [], - "minIndex": 215 + "minIndex": 205, + "navigationTitle": "Set group member extra data" }, { - "id": "message/managing-read-status-in-a-group-channel/get-read-status", - "segment": "get-read-status", - "title": "Get read status of a message", - "href": "/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status", + "id": "group/managing-group-members/transfer-group-owner", + "segment": "transfer-group-owner", + "title": "Transfer group ownership", + "href": "/sdk/android/group/managing-group-members/transfer-group-owner", "type": "page", "children": [], - "minIndex": 213 - } - ], - "minIndex": 213 - }, - { - "id": "message/marking-messages-as-delivered-in-a-group-channel", - "segment": "marking-messages-as-delivered-in-a-group-channel", - "title": "Marking messages as delivered in a group channel", - "href": null, - "type": "folder", - "children": [ + "minIndex": 206, + "navigationTitle": "Transfer group ownership" + }, { - "id": "message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", - "segment": "mark-messages-as-delivered", - "title": "Mark messages as delivered", - "href": "/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", + "id": "group/managing-group-members/change-group-member-mute", + "segment": "change-group-member-mute", + "title": "Mute or unmute a group member", + "href": "/sdk/android/group/managing-group-members/change-group-member-mute", "type": "page", "children": [], - "minIndex": 139 + "minIndex": 207, + "navigationTitle": "Mute or unmute a group member" } ], - "minIndex": 139 - }, + "minIndex": 200 + } + ], + "minIndex": 173 + }, + { + "id": "message", + "segment": "message", + "title": "Message", + "href": null, + "type": "folder", + "children": [ { - "id": "message/mentioning-other-users-in-a-message", - "segment": "mentioning-other-users-in-a-message", - "title": "Mentioning other users in a message", - "href": null, - "type": "folder", - "children": [ - { - "id": "message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "segment": "mention-other-users-in-a-message", - "title": "Mention other users in a message", - "href": "/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "type": "page", - "children": [], - "minIndex": 140 - } - ], - "minIndex": 140 + "id": "message/overview-message", + "segment": "overview-message", + "title": "Overview", + "href": "/sdk/android/message/overview-message", + "type": "page", + "children": [], + "minIndex": 208 }, { - "id": "message/managing-polls", - "segment": "managing-polls", - "title": "Managing polls", + "id": "message/creating-messages", + "segment": "creating-messages", + "title": "Creating messages", "href": null, "type": "folder", "children": [ { - "id": "message/managing-polls/create-a-poll", - "segment": "create-a-poll", - "title": "Create a poll", - "href": "/sdk/android/message/managing-polls/create-a-poll", - "type": "page", - "children": [], - "minIndex": 137 - }, - { - "id": "message/managing-polls/retrieve-a-poll", - "segment": "retrieve-a-poll", - "title": "Retrieve a poll", - "href": "/sdk/android/message/managing-polls/retrieve-a-poll", + "id": "message/creating-messages/create-text-message", + "segment": "create-text-message", + "title": "Create a text message", + "href": "/sdk/android/message/creating-messages/create-text-message", "type": "page", "children": [], "minIndex": 209 }, { - "id": "message/managing-polls/update-a-poll", - "segment": "update-a-poll", - "title": "Update a poll", - "href": "/sdk/android/message/managing-polls/update-a-poll", + "id": "message/creating-messages/create-text-at-message", + "segment": "create-text-at-message", + "title": "Create an @ message", + "href": "/sdk/android/message/creating-messages/create-text-at-message", "type": "page", "children": [], - "minIndex": 211 + "minIndex": 210 }, { - "id": "message/managing-polls/delete-a-poll", - "segment": "delete-a-poll", - "title": "Delete a poll", - "href": "/sdk/android/message/managing-polls/delete-a-poll", + "id": "message/creating-messages/create-custom-message", + "segment": "create-custom-message", + "title": "Create a custom message", + "href": "/sdk/android/message/creating-messages/create-custom-message", "type": "page", "children": [], - "minIndex": 204 + "minIndex": 211 }, { - "id": "message/managing-polls/close-a-poll", - "segment": "close-a-poll", - "title": "Close a poll", - "href": "/sdk/android/message/managing-polls/close-a-poll", + "id": "message/creating-messages/create-image-message-by-file", + "segment": "create-image-message-by-file", + "title": "Create an image message from a file", + "href": "/sdk/android/message/creating-messages/create-image-message-by-file", "type": "page", "children": [], - "minIndex": 203 + "minIndex": 212 }, { - "id": "message/managing-polls/add-a-poll-option", - "segment": "add-a-poll-option", - "title": "Add a poll option", - "href": "/sdk/android/message/managing-polls/add-a-poll-option", + "id": "message/creating-messages/create-image-message-by-url", + "segment": "create-image-message-by-url", + "title": "Create an image message from a URL", + "href": "/sdk/android/message/creating-messages/create-image-message-by-url", "type": "page", "children": [], - "minIndex": 201 + "minIndex": 213 }, { - "id": "message/managing-polls/retrieve-a-poll-option", - "segment": "retrieve-a-poll-option", - "title": "Retrieve a poll option", - "href": "/sdk/android/message/managing-polls/retrieve-a-poll-option", + "id": "message/creating-messages/create-sound-message-by-file", + "segment": "create-sound-message-by-file", + "title": "Create an audio message from a file", + "href": "/sdk/android/message/creating-messages/create-sound-message-by-file", "type": "page", "children": [], - "minIndex": 210 + "minIndex": 214 }, { - "id": "message/managing-polls/update-a-poll-option", - "segment": "update-a-poll-option", - "title": "Update a poll option", - "href": "/sdk/android/message/managing-polls/update-a-poll-option", + "id": "message/creating-messages/create-sound-message-by-url", + "segment": "create-sound-message-by-url", + "title": "Create an audio message from a URL", + "href": "/sdk/android/message/creating-messages/create-sound-message-by-url", "type": "page", "children": [], - "minIndex": 212 + "minIndex": 215 }, { - "id": "message/managing-polls/delete-a-poll-option", - "segment": "delete-a-poll-option", - "title": "Delete a poll option", - "href": "/sdk/android/message/managing-polls/delete-a-poll-option", + "id": "message/creating-messages/create-video-message-by-file", + "segment": "create-video-message-by-file", + "title": "Create a video message from files", + "href": "/sdk/android/message/creating-messages/create-video-message-by-file", "type": "page", "children": [], - "minIndex": 205 + "minIndex": 216 }, { - "id": "message/managing-polls/cast-or-cancel-a-vote", - "segment": "cast-or-cancel-a-vote", - "title": "Cast or cancel a vote", - "href": "/sdk/android/message/managing-polls/cast-or-cancel-a-vote", + "id": "message/creating-messages/create-video-message-by-url", + "segment": "create-video-message-by-url", + "title": "Create a video message from URLs", + "href": "/sdk/android/message/creating-messages/create-video-message-by-url", "type": "page", "children": [], - "minIndex": 202 + "minIndex": 217 }, { - "id": "message/managing-polls/retrieve-a-list-of-polls", - "segment": "retrieve-a-list-of-polls", - "title": "Retrieve a list of polls", - "href": "/sdk/android/message/managing-polls/retrieve-a-list-of-polls", + "id": "message/creating-messages/create-file-message-by-file", + "segment": "create-file-message-by-file", + "title": "Create a file message from a file", + "href": "/sdk/android/message/creating-messages/create-file-message-by-file", "type": "page", "children": [], - "minIndex": 207 + "minIndex": 218 }, { - "id": "message/managing-polls/retrieve-a-list-of-voters", - "segment": "retrieve-a-list-of-voters", - "title": "Retrieve a list of voters", - "href": "/sdk/android/message/managing-polls/retrieve-a-list-of-voters", + "id": "message/creating-messages/create-file-message-by-url", + "segment": "create-file-message-by-url", + "title": "Create a file message from a URL", + "href": "/sdk/android/message/creating-messages/create-file-message-by-url", "type": "page", "children": [], - "minIndex": 208 + "minIndex": 219 }, { - "id": "message/managing-polls/list-changelogs-of-polls", - "segment": "list-changelogs-of-polls", - "title": "List changelogs of polls", - "href": "/sdk/android/message/managing-polls/list-changelogs-of-polls", - "type": "page", - "children": [], - "minIndex": 206 - } - ], - "minIndex": 137 - }, - { - "id": "message/retrieving-unread-count-in-a-group-channel", - "segment": "retrieving-unread-count-in-a-group-channel", - "title": "Retrieving unread count in a group channel", - "href": null, - "type": "folder", - "children": [ - { - "id": "message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", - "segment": "members-who-havent-read-a-message", - "title": "Retrieve number of members who haven't read a message", - "href": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", + "id": "message/creating-messages/create-card-message", + "segment": "create-card-message", + "title": "Create a contact card message", + "href": "/sdk/android/message/creating-messages/create-card-message", "type": "page", "children": [], - "minIndex": 225 + "minIndex": 220 }, { - "id": "message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", - "segment": "members-who-havent-received-a-message", - "title": "Retrieve number of members who haven't received a message", - "href": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", + "id": "message/creating-messages/create-location-message", + "segment": "create-location-message", + "title": "Create a location message", + "href": "/sdk/android/message/creating-messages/create-location-message", "type": "page", "children": [], - "minIndex": 226 + "minIndex": 221 }, { - "id": "message/retrieving-unread-count-in-a-group-channel/unread-channels", - "segment": "unread-channels", - "title": "Retrieve number of channels with unread messages", - "href": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels", + "id": "message/creating-messages/create-face-message", + "segment": "create-face-message", + "title": "Create an emoji message", + "href": "/sdk/android/message/creating-messages/create-face-message", "type": "page", "children": [], - "minIndex": 227 + "minIndex": 222 }, { - "id": "message/retrieving-unread-count-in-a-group-channel/unread-items", - "segment": "unread-items", - "title": "Retrieve number of unread items", - "href": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items", + "id": "message/creating-messages/create-quote-message", + "segment": "create-quote-message", + "title": "Create a reply message", + "href": "/sdk/android/message/creating-messages/create-quote-message", "type": "page", "children": [], - "minIndex": 228 + "minIndex": 223 }, { - "id": "message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", - "segment": "unread-messages-in-a-channel", - "title": "Retrieve number of unread messages in a channel", - "href": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", + "id": "message/creating-messages/create-forward-message", + "segment": "create-forward-message", + "title": "Create a forwarded message", + "href": "/sdk/android/message/creating-messages/create-forward-message", "type": "page", "children": [], - "minIndex": 229 + "minIndex": 224 }, { - "id": "message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "segment": "unread-messages-in-all-channels", - "title": "Retrieve number of unread messages in all channels", - "href": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "type": "page", - "children": [], - "minIndex": 230 - } - ], - "minIndex": 225 - }, - { - "id": "message/categorizing-messages", - "segment": "categorizing-messages", - "title": "Categorizing messages", - "href": null, - "type": "folder", - "children": [ - { - "id": "message/categorizing-messages/categorize-messages-by-custom-type", - "segment": "categorize-messages-by-custom-type", - "title": "Categorize messages by custom type", - "href": "/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type", - "type": "page", - "children": [], - "minIndex": 192 - } - ], - "minIndex": 192 - }, - { - "id": "message/adding-extra-data-to-a-message", - "segment": "adding-extra-data-to-a-message", - "title": "Adding extra data to a message", - "href": null, - "type": "folder", - "children": [ - { - "id": "message/adding-extra-data-to-a-message/add-extra-data-to-a-message", - "segment": "add-extra-data-to-a-message", - "title": "Add extra data to a message", - "href": "/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message", + "id": "message/creating-messages/create-merger-message", + "segment": "create-merger-message", + "title": "Create a merged forward message", + "href": "/sdk/android/message/creating-messages/create-merger-message", "type": "page", "children": [], - "minIndex": 132 + "minIndex": 225 } ], - "minIndex": 132 + "minIndex": 209 }, { - "id": "message/translating-messages", - "segment": "translating-messages", - "title": "Translating messages", + "id": "message/sending-messages", + "segment": "sending-messages", + "title": "Sending messages", "href": null, "type": "folder", "children": [ { - "id": "message/translating-messages/auto-translate-messages", - "segment": "auto-translate-messages", - "title": "Auto-translate messages", - "href": "/sdk/android/message/translating-messages/auto-translate-messages", + "id": "message/sending-messages/send-message", + "segment": "send-message", + "title": "Send a message", + "href": "/sdk/android/message/sending-messages/send-message", "type": "page", "children": [], - "minIndex": 146 + "minIndex": 226 }, { - "id": "message/translating-messages/translate-messages-on-demand", - "segment": "translate-messages-on-demand", - "title": "Translate messages on-demand", - "href": "/sdk/android/message/translating-messages/translate-messages-on-demand", + "id": "message/sending-messages/send-message-not-oss", + "segment": "send-message-not-oss", + "title": "Send an uploaded media message", + "href": "/sdk/android/message/sending-messages/send-message-not-oss", "type": "page", "children": [], - "minIndex": 147 + "minIndex": 227 }, { - "id": "message/translating-messages/translation-engine", - "segment": "translation-engine", - "title": "Translation engine", - "href": "/sdk/android/message/translating-messages/translation-engine", + "id": "message/sending-messages/set-msg-send-progress-listener", + "segment": "set-msg-send-progress-listener", + "title": "Track message sending progress", + "href": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", "type": "page", "children": [], - "minIndex": 237 + "minIndex": 228, + "navigationTitle": "Track message sending progress" } ], - "minIndex": 146 + "minIndex": 226 }, { - "id": "message/marking-messages-as-read-in-a-group-channel", - "segment": "marking-messages-as-read-in-a-group-channel", - "title": "Marking messages as read in a group channel", - "href": null, - "type": "folder", - "children": [ - { - "id": "message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "segment": "mark-messages-as-read", - "title": "Mark messages as read", - "href": "/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "type": "page", - "children": [], - "minIndex": 259 - } - ], - "minIndex": 259 - } - ], - "minIndex": 132 - }, - { - "id": "application", - "segment": "application", - "title": "Application", - "href": null, - "type": "folder", - "children": [ - { - "id": "application/overview-application", - "segment": "overview-application", - "title": "Overview", - "href": "/sdk/android/application/overview-application", + "id": "message/receiving-messages/receive-messages", + "segment": "receive-messages", + "title": "Receive messages", + "href": "/sdk/android/message/receiving-messages/receive-messages", "type": "page", "children": [], - "minIndex": 160 + "minIndex": 229 }, { - "id": "application/authenticating-a-user", - "segment": "authenticating-a-user", - "title": "Authenticating a user", - "href": null, - "type": "folder", - "children": [ - { - "id": "application/authenticating-a-user/authentication", - "segment": "authentication", - "title": "Authentication", - "href": "/sdk/android/application/authenticating-a-user/authentication", - "type": "page", - "children": [], - "minIndex": 159 - } - ], - "minIndex": 159 + "id": "message/receiving-messages/receive-custom-business-messages", + "segment": "receive-custom-business-messages", + "title": "Receive custom business messages", + "href": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "type": "page", + "children": [], + "minIndex": 230 }, { - "id": "application/understanding-rate-limits", - "segment": "understanding-rate-limits", - "title": "Understanding rate limits", + "id": "message/retrieving-messages", + "segment": "retrieving-messages", + "title": "Retrieving messages", "href": null, "type": "folder", "children": [ { - "id": "application/understanding-rate-limits/rate-limits", - "segment": "rate-limits", - "title": "Rate limits", - "href": "/sdk/android/application/understanding-rate-limits/rate-limits", + "id": "message/retrieving-messages/load-older-messages", + "segment": "load-older-messages", + "title": "Load message history", + "href": "/sdk/android/message/retrieving-messages/load-older-messages", "type": "page", "children": [], - "minIndex": 161 - } - ], - "minIndex": 161 - } - ], - "minIndex": 159 - }, - { - "id": "event-handler", - "segment": "event-handler", - "title": "Event handler", - "href": null, - "type": "folder", - "children": [ - { - "id": "event-handler/overview-event-handler", - "segment": "overview-event-handler", - "title": "Event handler", - "href": "/sdk/android/event-handler/overview-event-handler", - "type": "page", - "children": [], - "minIndex": 184 - }, - { - "id": "event-handler/managing-channel-event-handlers", - "segment": "managing-channel-event-handlers", - "title": "Managing channel event handlers", - "href": null, - "type": "folder", - "children": [ + "minIndex": 231 + }, { - "id": "event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", - "segment": "add-or-remove-a-channel-event-handler", - "title": "Add or remove a channel event handler", - "href": "/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", + "id": "message/retrieving-messages/load-newer-messages", + "segment": "load-newer-messages", + "title": "Load message history in reverse", + "href": "/sdk/android/message/retrieving-messages/load-newer-messages", "type": "page", "children": [], - "minIndex": 181 - } - ], - "minIndex": 181 - }, - { - "id": "event-handler/managing-connection-event-handlers", - "segment": "managing-connection-event-handlers", - "title": "Managing connection event handlers", - "href": null, - "type": "folder", - "children": [ + "minIndex": 232 + }, { - "id": "event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", - "segment": "add-or-remove-a-connection-event-handler", - "title": "Add or remove a connection event handler", - "href": "/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", + "id": "message/retrieving-messages/find-messages-by-id", + "segment": "find-messages-by-id", + "title": "Find messages by ID", + "href": "/sdk/android/message/retrieving-messages/find-messages-by-id", "type": "page", "children": [], - "minIndex": 182 - } - ], - "minIndex": 182 - }, - { - "id": "event-handler/managing-user-event-handlers", - "segment": "managing-user-event-handlers", - "title": "Managing user event handlers", - "href": null, - "type": "folder", - "children": [ + "minIndex": 233 + }, { - "id": "event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", - "segment": "add-or-remove-a-user-event-handler", - "title": "Add or remove a user event handler", - "href": "/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", + "id": "message/searching-messages/search-messages", + "segment": "search-messages", + "title": "Search messages", + "href": "/sdk/android/message/searching-messages/search-messages", "type": "page", "children": [], - "minIndex": 183 + "minIndex": 234 } ], - "minIndex": 183 - } - ], - "minIndex": 181 - }, - { - "id": "push-notifications", - "segment": "push-notifications", - "title": "Push notifications", - "href": null, - "type": "folder", - "children": [ + "minIndex": 231 + }, { - "id": "push-notifications/overview-push-notifications", - "segment": "overview-push-notifications", - "title": "Overview", - "href": "/sdk/android/push-notifications/overview-push-notifications", + "id": "message/composing-messages/update-typing-status", + "segment": "update-typing-status", + "title": "Report typing status", + "href": "/sdk/android/message/composing-messages/update-typing-status", "type": "page", "children": [], - "minIndex": 152 + "minIndex": 235 }, { - "id": "push-notifications/managing-push-notifications", - "segment": "managing-push-notifications", - "title": "Managing push notifications", + "id": "message/managing-messages", + "segment": "managing-messages", + "title": "Managing messages", "href": null, "type": "folder", "children": [ { - "id": "push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", - "segment": "set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", - "href": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", + "id": "message/managing-messages/delete-local-message", + "segment": "delete-local-message", + "title": "Delete a local message", + "href": "/sdk/android/message/managing-messages/delete-local-message", "type": "page", "children": [], - "minIndex": 242 + "minIndex": 236 }, { - "id": "push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", - "segment": "set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", - "href": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", + "id": "message/managing-messages/delete-saved-messages", + "segment": "delete-saved-messages", + "title": "Delete messages in a batch", + "href": "/sdk/android/message/managing-messages/delete-saved-messages", "type": "page", "children": [], - "minIndex": 243 + "minIndex": 237 + }, + { + "id": "message/managing-messages/revoke-a-message", + "segment": "revoke-a-message", + "title": "Revoke a message", + "href": "/sdk/android/message/managing-messages/revoke-a-message", + "type": "page", + "children": [], + "minIndex": 238 }, { - "id": "push-notifications/managing-push-notifications/configure-push-notification-preferences", - "segment": "configure-push-notification-preferences", - "title": "Configure push notification preferences", - "href": "/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences", + "id": "message/managing-messages/modify-a-message", + "segment": "modify-a-message", + "title": "Modify a message", + "href": "/sdk/android/message/managing-messages/modify-a-message", "type": "page", "children": [], - "minIndex": 150 + "minIndex": 239 }, { - "id": "push-notifications/managing-push-notifications/push-notification-content-templates", - "segment": "push-notification-content-templates", - "title": "Push notification content templates", - "href": "/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates", + "id": "message/managing-messages/get-pinned-messages", + "segment": "get-pinned-messages", + "title": "Get pinned messages in a conversation", + "href": "/sdk/android/message/managing-messages/get-pinned-messages", "type": "page", "children": [], "minIndex": 240 }, { - "id": "push-notifications/managing-push-notifications/push-notification-tester", - "segment": "push-notification-tester", - "title": "Push notification tester", - "href": "/sdk/android/push-notifications/managing-push-notifications/push-notification-tester", + "id": "message/managing-messages/set-message-pinned", + "segment": "set-message-pinned", + "title": "Pin or unpin a message", + "href": "/sdk/android/message/managing-messages/set-message-pinned", "type": "page", "children": [], "minIndex": 241 }, { - "id": "push-notifications/managing-push-notifications/push-notification-translation", - "segment": "push-notification-translation", - "title": "Push notification translation", - "href": "/sdk/android/push-notifications/managing-push-notifications/push-notification-translation", + "id": "message/managing-messages/insert-local-single-message", + "segment": "insert-local-single-message", + "title": "Insert a local one-to-one message", + "href": "/sdk/android/message/managing-messages/insert-local-single-message", "type": "page", "children": [], - "minIndex": 151 - } - ], - "minIndex": 150 - }, - { - "id": "push-notifications/marking-push-notifications-as-delivered", - "segment": "marking-push-notifications-as-delivered", - "title": "Marking push notifications as delivered", - "href": null, - "type": "folder", - "children": [ + "minIndex": 242 + }, { - "id": "push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", - "segment": "mark-push-notifications-as-delivered", - "title": "Mark push notifications as delivered", - "href": "/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", + "id": "message/managing-messages/insert-local-group-message", + "segment": "insert-local-group-message", + "title": "Insert a local group message", + "href": "/sdk/android/message/managing-messages/insert-local-group-message", + "type": "page", + "children": [], + "minIndex": 243 + }, + { + "id": "message/managing-messages/clear-all-local-messages", + "segment": "clear-all-local-messages", + "title": "Clear all local messages", + "href": "/sdk/android/message/managing-messages/clear-all-local-messages", "type": "page", "children": [], "minIndex": 244 - } - ], - "minIndex": 244 - }, - { - "id": "push-notifications/multi-device-support", - "segment": "multi-device-support", - "title": "Multi device support", - "href": null, - "type": "folder", - "children": [ + }, { - "id": "push-notifications/multi-device-support/set-up-push-notifications-for-fcm", - "segment": "set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", - "href": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm", + "id": "message/managing-messages/clear-all-messages", + "segment": "clear-all-messages", + "title": "Clear local and server messages", + "href": "/sdk/android/message/managing-messages/clear-all-messages", "type": "page", "children": [], "minIndex": 245 }, { - "id": "push-notifications/multi-device-support/set-up-push-notifications-for-hms", - "segment": "set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", - "href": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms", + "id": "message/managing-messages/set-message-local-ex", + "segment": "set-message-local-ex", + "title": "Set a local message extension", + "href": "/sdk/android/message/managing-messages/set-message-local-ex", "type": "page", "children": [], "minIndex": 246 } ], - "minIndex": 245 + "minIndex": 236 } ], - "minIndex": 150 + "minIndex": 208 }, { - "id": "report", - "segment": "report", - "title": "Report", + "id": "file-uploads", + "segment": "file-uploads", + "title": "File uploads", "href": null, "type": "folder", "children": [ { - "id": "report/overview-report", - "segment": "overview-report", - "title": "Overview", - "href": "/sdk/android/report/overview-report", + "id": "file-uploads/track-file-upload-progress", + "segment": "track-file-upload-progress", + "title": "Track file upload progress", + "href": "/sdk/android/file-uploads/track-file-upload-progress", "type": "page", "children": [], - "minIndex": 153 + "minIndex": 247, + "navigationTitle": "Track file upload progress" }, { - "id": "report/creating-a-report", - "segment": "creating-a-report", - "title": "Creating a report", - "href": null, - "type": "folder", - "children": [ - { - "id": "report/creating-a-report/report-a-message-user-or-channel", - "segment": "report-a-message-user-or-channel", - "title": "Report a message, user, or channel", - "href": "/sdk/android/report/creating-a-report/report-a-message-user-or-channel", - "type": "page", - "children": [], - "minIndex": 247 - } - ], - "minIndex": 247 + "id": "file-uploads/upload-file", + "segment": "upload-file", + "title": "Upload a file", + "href": "/sdk/android/file-uploads/upload-file", + "type": "page", + "children": [], + "minIndex": 248, + "navigationTitle": "Upload a file" } ], - "minIndex": 153 + "minIndex": 247 }, { - "id": "local-caching", - "segment": "local-caching", - "title": "Local caching", + "id": "calling", + "segment": "calling", + "title": "Calling", "href": null, "type": "folder", "children": [ { - "id": "local-caching/overview-local-caching", - "segment": "overview-local-caching", - "title": "Local caching", - "href": "/sdk/android/local-caching/overview-local-caching", + "id": "calling/overview-calling", + "segment": "overview-calling", + "title": "Audio and video calling overview", + "href": "/sdk/android/calling/overview-calling", "type": "page", "children": [], - "minIndex": 188 + "minIndex": 249 }, { - "id": "local-caching/using-group-channel-collection", - "segment": "using-group-channel-collection", - "title": "Using group channel collection", + "id": "calling/managing-calls", + "segment": "managing-calls", + "title": "Managing calls", "href": null, "type": "folder", "children": [ { - "id": "local-caching/using-group-channel-collection/group-channel-collection", - "segment": "group-channel-collection", - "title": "Group channel collection", - "href": "/sdk/android/local-caching/using-group-channel-collection/group-channel-collection", + "id": "calling/managing-calls/start-single-call", + "segment": "start-single-call", + "title": "Start a one-to-one call", + "href": "/sdk/android/calling/managing-calls/start-single-call", + "type": "page", + "children": [], + "minIndex": 250, + "navigationTitle": "Start a one-to-one call" + }, + { + "id": "calling/managing-calls/start-group-call", + "segment": "start-group-call", + "title": "Start a group call", + "href": "/sdk/android/calling/managing-calls/start-group-call", + "type": "page", + "children": [], + "minIndex": 251, + "navigationTitle": "Start a group call" + }, + { + "id": "calling/managing-calls/accept-call", + "segment": "accept-call", + "title": "Accept a call", + "href": "/sdk/android/calling/managing-calls/accept-call", + "type": "page", + "children": [], + "minIndex": 252, + "navigationTitle": "Accept a call" + }, + { + "id": "calling/managing-calls/reject-call", + "segment": "reject-call", + "title": "Reject a call", + "href": "/sdk/android/calling/managing-calls/reject-call", + "type": "page", + "children": [], + "minIndex": 253, + "navigationTitle": "Reject a call" + }, + { + "id": "calling/managing-calls/cancel-call", + "segment": "cancel-call", + "title": "Cancel a call invitation", + "href": "/sdk/android/calling/managing-calls/cancel-call", + "type": "page", + "children": [], + "minIndex": 254, + "navigationTitle": "Cancel a call invitation" + }, + { + "id": "calling/managing-calls/hang-up-call", + "segment": "hang-up-call", + "title": "End a call", + "href": "/sdk/android/calling/managing-calls/hang-up-call", + "type": "page", + "children": [], + "minIndex": 255, + "navigationTitle": "Hang up a call" + }, + { + "id": "calling/managing-calls/handle-call-events", + "segment": "handle-call-events", + "title": "Handle call events", + "href": "/sdk/android/calling/managing-calls/handle-call-events", "type": "page", "children": [], - "minIndex": 189 + "minIndex": 256, + "navigationTitle": "Handle call events" } ], - "minIndex": 189 + "minIndex": 250 }, { - "id": "local-caching/using-message-collection", - "segment": "using-message-collection", - "title": "Using message collection", + "id": "calling/retrieving-call-information", + "segment": "retrieving-call-information", + "title": "Retrieving call information", "href": null, "type": "folder", "children": [ { - "id": "local-caching/using-message-collection/message-collection", - "segment": "message-collection", - "title": "Message collection", - "href": "/sdk/android/local-caching/using-message-collection/message-collection", + "id": "calling/retrieving-call-information/restore-pending-invitation", + "segment": "restore-pending-invitation", + "title": "Restore a pending call invitation", + "href": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "type": "page", + "children": [], + "minIndex": 257, + "navigationTitle": "Restore a pending invitation" + }, + { + "id": "calling/retrieving-call-information/get-room-by-group-id", + "segment": "get-room-by-group-id", + "title": "Get a group call room", + "href": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "type": "page", + "children": [], + "minIndex": 258, + "navigationTitle": "Get a group call room" + }, + { + "id": "calling/retrieving-call-information/get-token-by-room-id", + "segment": "get-token-by-room-id", + "title": "Get a call room token", + "href": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", "type": "page", "children": [], - "minIndex": 190 + "minIndex": 259, + "navigationTitle": "Get room credentials" } ], - "minIndex": 190 + "minIndex": 257 + }, + { + "id": "calling/sending-custom-signals/send-a-custom-signal", + "segment": "send-a-custom-signal", + "title": "Send a custom signal", + "href": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "type": "page", + "children": [], + "minIndex": 260 } ], - "minIndex": 188 + "minIndex": 249 }, { - "id": "migrating-to-openim", - "segment": "migrating-to-openim", - "title": "Migrating to OpenIM", - "href": "/sdk/android/migrating-to-openim", - "type": "page", - "children": [], - "minIndex": 239 - }, - { - "id": "deprecated", - "segment": "deprecated", - "title": "Deprecated", - "href": "/sdk/android/deprecated", + "id": "events/overview-events", + "segment": "overview-events", + "title": "Events overview", + "href": "/sdk/android/events/overview-events", "type": "page", "children": [], - "minIndex": 179 + "minIndex": 261, + "navigationTitle": "Events" }, { "id": "logger", @@ -5973,19 +5896,11 @@ "href": "/sdk/android/logger", "type": "page", "children": [], - "minIndex": 191 - }, - { - "id": "overview", - "segment": "overview", - "title": "OpenIM SDK for Android", - "href": "/sdk/android/overview", - "type": "page", - "children": [], - "minIndex": 149 + "minIndex": 262 } ], - "pageCount": 128 + "pageCount": 134, + "sidebarExpansion": "active-path" }, { "key": "chat/sdk/flutter", diff --git a/src/generated/routes.json b/src/generated/routes.json index fd73fe60f8..63039829aa 100644 --- a/src/generated/routes.json +++ b/src/generated/routes.json @@ -4266,1398 +4266,1434 @@ "navOrder": 164 }, { - "id": 134, - "path": "/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel", - "relativePath": "sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel", - "sourcePath": "/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel", - "title": "Freeze and unfreeze a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Freeze and unfreeze a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1352, + "path": "/sdk/android/overview", + "relativePath": "sdk/android/overview", + "sourcePath": "/sdk/android/overview", + "title": "OpenIM Android SDK overview", + "description": "Integrate users, conversations, groups, messages, calling signals, and events into a native Android application with OpenIM Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", - "template": "guide", - "status": "scaffold", - "sourceIndex": 129, - "contentFile": "content/docs/chat/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel.mdx", + "template": "overview", + "status": "published", + "sourceIndex": 2722, + "contentFile": "content/docs/chat/sdk/android/overview.mdx", "navOrder": 129 }, { - "id": 135, - "path": "/sdk/android/channel/overview-channel", - "relativePath": "sdk/android/channel/overview-channel", - "sourcePath": "/sdk/android/channel/overview-channel", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1353, + "path": "/sdk/android/getting-started/before-you-start", + "relativePath": "sdk/android/getting-started/before-you-start", + "sourcePath": "/sdk/android/getting-started/before-you-start", + "title": "Before you start", + "description": "Prepare OpenIMServer, user credentials, and the Android project before initializing, authenticating, or sending messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 130, - "contentFile": "content/docs/chat/sdk/android/channel/overview-channel.mdx", + "status": "published", + "sourceIndex": 2723, + "contentFile": "content/docs/chat/sdk/android/getting-started/before-you-start.mdx", "navOrder": 130 }, { - "id": 136, - "path": "/sdk/android/getting-started/send-first-message", - "relativePath": "sdk/android/getting-started/send-first-message", - "sourcePath": "/sdk/android/getting-started/send-first-message", - "title": "Send your first message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send your first message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1354, + "path": "/sdk/android/getting-started/environment-specific-implementation", + "relativePath": "sdk/android/getting-started/environment-specific-implementation", + "sourcePath": "/sdk/android/getting-started/environment-specific-implementation", + "title": "Integrate for Android", + "description": "Integrate, configure, and initialize OpenIM Android SDK while handling permissions, data storage, and application lifecycle boundaries.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 131, - "contentFile": "content/docs/chat/sdk/android/getting-started/send-first-message.mdx", + "status": "published", + "sourceIndex": 2724, + "contentFile": "content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx", "navOrder": 131 }, { - "id": 137, - "path": "/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message", - "relativePath": "sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message", - "sourcePath": "/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message", - "title": "Add extra data to a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add extra data to a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1355, + "path": "/sdk/android/getting-started/authenticate-and-manage-session", + "relativePath": "sdk/android/getting-started/authenticate-and-manage-session", + "sourcePath": "/sdk/android/getting-started/authenticate-and-manage-session", + "title": "Authenticate and manage a session", + "description": "Initialize OpenIM Android SDK, log in, inspect login state, handle connection callbacks, and sign out the current account.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 132, - "contentFile": "content/docs/chat/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message.mdx", + "status": "published", + "sourceIndex": 2725, + "contentFile": "content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx", "navOrder": 132 }, { - "id": 138, - "path": "/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message", - "relativePath": "sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message", - "sourcePath": "/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message", - "title": "Generate thumbnails of a file message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Generate thumbnails of a file message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1356, + "path": "/sdk/android/getting-started/send-first-message", + "relativePath": "sdk/android/getting-started/send-first-message", + "sourcePath": "/sdk/android/getting-started/send-first-message", + "title": "Send your first message", + "description": "Verify the first one-to-one or group text-message send and receive flow in an Android application.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 133, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message.mdx", + "status": "published", + "sourceIndex": 2726, + "contentFile": "content/docs/chat/sdk/android/getting-started/send-first-message.mdx", "navOrder": 133 }, { - "id": 139, - "path": "/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel", - "relativePath": "sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel", - "sourcePath": "/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel", - "title": "React to a message in a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for React to a message in a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1357, + "path": "/sdk/android/user/overview-user", + "relativePath": "sdk/android/user/overview-user", + "sourcePath": "/sdk/android/user/overview-user", + "title": "User overview", + "description": "Learn about user profiles, friendships, friend requests, blacklists, and online status in the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 134, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel.mdx", + "status": "published", + "sourceIndex": 2727, + "contentFile": "content/docs/chat/sdk/android/user/overview-user.mdx", "navOrder": 134 }, { - "id": 140, - "path": "/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members", - "relativePath": "sdk/android/message/managing-a-message/send-typing-indicators-to-other-members", - "sourcePath": "/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members", - "title": "Send typing indicators to other members", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send typing indicators to other members. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1358, + "path": "/sdk/android/user/user-profile/get-users-info", + "relativePath": "sdk/android/user/user-profile/get-users-info", + "sourcePath": "/sdk/android/user/user-profile/get-users-info", + "title": "Get specified user profiles", + "description": "Use getUsersInfo() to query public profiles by userID.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 135, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members.mdx", + "status": "published", + "sourceIndex": 2728, + "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx", "navOrder": 135 }, { - "id": 141, - "path": "/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message", - "relativePath": "sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message", - "sourcePath": "/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message", - "title": "Pin a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Pin a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1359, + "path": "/sdk/android/user/user-profile/get-self-local-user-info", + "relativePath": "sdk/android/user/user-profile/get-self-local-user-info", + "sourcePath": "/sdk/android/user/user-profile/get-self-local-user-info", + "title": "Get the current user profile", + "description": "Use getSelfLocalUserInfo() to retrieve the local profile for the current user.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 136, - "contentFile": "content/docs/chat/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message.mdx", + "status": "published", + "sourceIndex": 2729, + "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx", "navOrder": 136 }, { - "id": 142, - "path": "/sdk/android/message/managing-polls/create-a-poll", - "relativePath": "sdk/android/message/managing-polls/create-a-poll", - "sourcePath": "/sdk/android/message/managing-polls/create-a-poll", - "title": "Create a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1360, + "path": "/sdk/android/user/user-profile/set-self-info", + "relativePath": "sdk/android/user/user-profile/set-self-info", + "sourcePath": "/sdk/android/user/user-profile/set-self-info", + "title": "Update the current user profile", + "description": "Use setSelfInfo() to update the nickname, avatar, or extension data of the current user.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 137, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/create-a-poll.mdx", + "status": "published", + "sourceIndex": 2730, + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx", "navOrder": 137 }, { - "id": 143, - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", - "relativePath": "sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", - "title": "Create a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1361, + "path": "/sdk/android/user/user-profile/set-global-message-reception", + "relativePath": "sdk/android/user/user-profile/set-global-message-reception", + "sourcePath": "/sdk/android/user/user-profile/set-global-message-reception", + "title": "Set global message reception", + "description": "Use setSelfInfo() to set the account-wide message reception and notification policy.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 138, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message.mdx", + "status": "published", + "sourceIndex": 2731, + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx", "navOrder": 138 }, { - "id": 144, - "path": "/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", - "relativePath": "sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", - "sourcePath": "/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", - "title": "Mark messages as delivered", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as delivered. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1362, + "path": "/sdk/android/user/online-status/subscribe-users-online-status", + "relativePath": "sdk/android/user/online-status/subscribe-users-online-status", + "sourcePath": "/sdk/android/user/online-status/subscribe-users-online-status", + "title": "Subscribe to user online status", + "description": "Use subscribeUsersOnlineStatus() to subscribe to online status for specified users.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 139, - "contentFile": "content/docs/chat/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered.mdx", + "status": "published", + "sourceIndex": 2732, + "contentFile": "content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx", "navOrder": 139 }, { - "id": 145, - "path": "/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "relativePath": "sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "sourcePath": "/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "title": "Mention other users in a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mention other users in a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1363, + "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "relativePath": "sdk/android/user/online-status/get-subscribe-online-users-status", + "sourcePath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "title": "Get subscribed user online status", + "description": "Use getSubscribeOnlineUsersStatus() to retrieve online status for subscribed users.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 140, - "contentFile": "content/docs/chat/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message.mdx", + "status": "published", + "sourceIndex": 2733, + "contentFile": "content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx", "navOrder": 140 }, { - "id": 146, - "path": "/sdk/android/message/overview-message", - "relativePath": "sdk/android/message/overview-message", - "sourcePath": "/sdk/android/message/overview-message", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1364, + "path": "/sdk/android/user/friends/get-friend-list-page", + "relativePath": "sdk/android/user/friends/get-friend-list-page", + "sourcePath": "/sdk/android/user/friends/get-friend-list-page", + "title": "Get the friend list by page", + "description": "Use getFriendListPage() to retrieve the current user friend list by page.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 141, - "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx", + "status": "published", + "sourceIndex": 2734, + "contentFile": "content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx", "navOrder": 141 }, { - "id": 147, - "path": "/sdk/android/message/retrieving-messages/retrieve-a-message", - "relativePath": "sdk/android/message/retrieving-messages/retrieve-a-message", - "sourcePath": "/sdk/android/message/retrieving-messages/retrieve-a-message", - "title": "Retrieve a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1365, + "path": "/sdk/android/user/friends/search-friends", + "relativePath": "sdk/android/user/friends/search-friends", + "sourcePath": "/sdk/android/user/friends/search-friends", + "title": "Search friends", + "description": "Use searchFriends() to search the current user friend list.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 142, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/retrieve-a-message.mdx", + "status": "published", + "sourceIndex": 2735, + "contentFile": "content/docs/chat/sdk/android/user/friends/search-friends.mdx", "navOrder": 142 }, { - "id": 148, - "path": "/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", - "relativePath": "sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", - "sourcePath": "/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", - "title": "Search messages by a keyword", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Search messages by a keyword. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1366, + "path": "/sdk/android/user/friends/get-friends-info", + "relativePath": "sdk/android/user/friends/get-friends-info", + "sourcePath": "/sdk/android/user/friends/get-friends-info", + "title": "Get specified friend profiles", + "description": "Use getFriendsInfo() to query friendship profiles for specified users.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 143, - "contentFile": "content/docs/chat/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword.mdx", + "status": "published", + "sourceIndex": 2736, + "contentFile": "content/docs/chat/sdk/android/user/friends/get-friends-info.mdx", "navOrder": 143 }, { - "id": 149, - "path": "/sdk/android/message/sending-a-message/share-an-encrypted-file", - "relativePath": "sdk/android/message/sending-a-message/share-an-encrypted-file", - "sourcePath": "/sdk/android/message/sending-a-message/share-an-encrypted-file", - "title": "Share an encrypted file", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Share an encrypted file. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1367, + "path": "/sdk/android/user/friends/check-friend", + "relativePath": "sdk/android/user/friends/check-friend", + "sourcePath": "/sdk/android/user/friends/check-friend", + "title": "Check friendship", + "description": "Use checkFriend() to check whether specified users are friends of the current user.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 144, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/share-an-encrypted-file.mdx", + "status": "published", + "sourceIndex": 2737, + "contentFile": "content/docs/chat/sdk/android/user/friends/check-friend.mdx", "navOrder": 144 }, { - "id": 150, - "path": "/sdk/android/message/sending-a-message/smart-throttling", - "relativePath": "sdk/android/message/sending-a-message/smart-throttling", - "sourcePath": "/sdk/android/message/sending-a-message/smart-throttling", - "title": "Smart throttling", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Smart throttling. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1368, + "path": "/sdk/android/user/friends/update-friends", + "relativePath": "sdk/android/user/friends/update-friends", + "sourcePath": "/sdk/android/user/friends/update-friends", + "title": "Update friend profiles", + "description": "Use updateFriendsReq() to update friend remarks, pinned state, or extension data.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 145, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/smart-throttling.mdx", + "status": "published", + "sourceIndex": 2738, + "contentFile": "content/docs/chat/sdk/android/user/friends/update-friends.mdx", "navOrder": 145 }, { - "id": 151, - "path": "/sdk/android/message/translating-messages/auto-translate-messages", - "relativePath": "sdk/android/message/translating-messages/auto-translate-messages", - "sourcePath": "/sdk/android/message/translating-messages/auto-translate-messages", - "title": "Auto-translate messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Auto-translate messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1369, + "path": "/sdk/android/user/friends/delete-friend", + "relativePath": "sdk/android/user/friends/delete-friend", + "sourcePath": "/sdk/android/user/friends/delete-friend", + "title": "Delete a friend", + "description": "Use deleteFriend() to remove one friendship from the current user.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 146, - "contentFile": "content/docs/chat/sdk/android/message/translating-messages/auto-translate-messages.mdx", + "status": "published", + "sourceIndex": 2739, + "contentFile": "content/docs/chat/sdk/android/user/friends/delete-friend.mdx", "navOrder": 146 }, { - "id": 152, - "path": "/sdk/android/message/translating-messages/translate-messages-on-demand", - "relativePath": "sdk/android/message/translating-messages/translate-messages-on-demand", - "sourcePath": "/sdk/android/message/translating-messages/translate-messages-on-demand", - "title": "Translate messages on-demand", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Translate messages on-demand. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1370, + "path": "/sdk/android/user/friend-applications/add-friend", + "relativePath": "sdk/android/user/friend-applications/add-friend", + "sourcePath": "/sdk/android/user/friend-applications/add-friend", + "title": "Send a friend request", + "description": "Use addFriend() to send a friend request to a specified user.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 147, - "contentFile": "content/docs/chat/sdk/android/message/translating-messages/translate-messages-on-demand.mdx", + "status": "published", + "sourceIndex": 2740, + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx", "navOrder": 147 }, { - "id": 153, - "path": "/sdk/android/message/using-message-threading/create-a-message-thread", - "relativePath": "sdk/android/message/using-message-threading/create-a-message-thread", - "sourcePath": "/sdk/android/message/using-message-threading/create-a-message-thread", - "title": "Create a message thread", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a message thread. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1371, + "path": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "relativePath": "sdk/android/user/friend-applications/get-recv-friend-application-list", + "sourcePath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "title": "Get received friend requests", + "description": "Use getRecvFriendApplicationList() to query received friend requests by page.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 148, - "contentFile": "content/docs/chat/sdk/android/message/using-message-threading/create-a-message-thread.mdx", + "status": "published", + "sourceIndex": 2741, + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx", "navOrder": 148 }, { - "id": 154, - "path": "/sdk/android/overview", - "relativePath": "sdk/android/overview", - "sourcePath": "/sdk/android/overview", - "title": "OpenIM SDK for Android", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for OpenIM SDK for Android. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1372, + "path": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "relativePath": "sdk/android/user/friend-applications/get-send-friend-application-list", + "sourcePath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "title": "Get sent friend requests", + "description": "Use getSendFriendApplicationList() to query sent friend requests by page.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", - "template": "overview", - "status": "scaffold", - "sourceIndex": 149, - "contentFile": "content/docs/chat/sdk/android/overview.mdx", + "template": "guide", + "status": "published", + "sourceIndex": 2742, + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx", "navOrder": 149 }, { - "id": 155, - "path": "/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences", - "relativePath": "sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences", - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences", - "title": "Configure push notification preferences", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Configure push notification preferences. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1373, + "path": "/sdk/android/user/friend-applications/accept-friend-application", + "relativePath": "sdk/android/user/friend-applications/accept-friend-application", + "sourcePath": "/sdk/android/user/friend-applications/accept-friend-application", + "title": "Accept a friend request", + "description": "Use acceptFriendApplication() to accept a friend request.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 150, - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences.mdx", + "status": "published", + "sourceIndex": 2743, + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx", "navOrder": 150 }, { - "id": 156, - "path": "/sdk/android/push-notifications/managing-push-notifications/push-notification-translation", - "relativePath": "sdk/android/push-notifications/managing-push-notifications/push-notification-translation", - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-translation", - "title": "Push notification translation", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Push notification translation. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1374, + "path": "/sdk/android/user/friend-applications/refuse-friend-application", + "relativePath": "sdk/android/user/friend-applications/refuse-friend-application", + "sourcePath": "/sdk/android/user/friend-applications/refuse-friend-application", + "title": "Reject a friend request", + "description": "Use refuseFriendApplication() to reject a friend request.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 151, - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/push-notification-translation.mdx", + "status": "published", + "sourceIndex": 2744, + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx", "navOrder": 151 }, { - "id": 157, - "path": "/sdk/android/push-notifications/overview-push-notifications", - "relativePath": "sdk/android/push-notifications/overview-push-notifications", - "sourcePath": "/sdk/android/push-notifications/overview-push-notifications", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1375, + "path": "/sdk/android/user/blacklist/get-blacklist", + "relativePath": "sdk/android/user/blacklist/get-blacklist", + "sourcePath": "/sdk/android/user/blacklist/get-blacklist", + "title": "Get the blacklist", + "description": "Use getBlacklist() to retrieve the current user blacklist.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 152, - "contentFile": "content/docs/chat/sdk/android/push-notifications/overview-push-notifications.mdx", + "status": "published", + "sourceIndex": 2745, + "contentFile": "content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx", "navOrder": 152 }, { - "id": 158, - "path": "/sdk/android/report/overview-report", - "relativePath": "sdk/android/report/overview-report", - "sourcePath": "/sdk/android/report/overview-report", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1376, + "path": "/sdk/android/user/blacklist/add-blacklist", + "relativePath": "sdk/android/user/blacklist/add-blacklist", + "sourcePath": "/sdk/android/user/blacklist/add-blacklist", + "title": "Block a user", + "description": "Use addBlacklist() to add a user to the current account blacklist.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 153, - "contentFile": "content/docs/chat/sdk/android/report/overview-report.mdx", + "status": "published", + "sourceIndex": 2746, + "contentFile": "content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx", "navOrder": 153 }, { - "id": 159, - "path": "/sdk/android/user/moderating-a-user/block-and-unblock-other-members", - "relativePath": "sdk/android/user/moderating-a-user/block-and-unblock-other-members", - "sourcePath": "/sdk/android/user/moderating-a-user/block-and-unblock-other-members", - "title": "Block and unblock other members", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Block and unblock other members. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1377, + "path": "/sdk/android/user/blacklist/remove-blacklist", + "relativePath": "sdk/android/user/blacklist/remove-blacklist", + "sourcePath": "/sdk/android/user/blacklist/remove-blacklist", + "title": "Unblock a user", + "description": "Use removeBlacklist() to remove a user from the current account blacklist.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 155, - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/block-and-unblock-other-members.mdx", + "status": "published", + "sourceIndex": 2747, + "contentFile": "content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx", + "navOrder": 154 + }, + { + "id": 1378, + "path": "/sdk/android/conversation/overview-conversation", + "relativePath": "sdk/android/conversation/overview-conversation", + "sourcePath": "/sdk/android/conversation/overview-conversation", + "title": "Conversation overview", + "description": "Learn about ConversationInfo, conversationID, conversation settings, and conversation events in the Android SDK.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2748, + "contentFile": "content/docs/chat/sdk/android/conversation/overview-conversation.mdx", "navOrder": 155 }, { - "id": 160, - "path": "/sdk/android/user/moderating-a-user/mute-and-unmute-a-user", - "relativePath": "sdk/android/user/moderating-a-user/mute-and-unmute-a-user", - "sourcePath": "/sdk/android/user/moderating-a-user/mute-and-unmute-a-user", - "title": "Mute and unmute a user", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mute and unmute a user. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1379, + "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "relativePath": "sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "title": "Open a conversation", + "description": "Use getOneConversation() to retrieve one Android conversation by user or group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 156, - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/mute-and-unmute-a-user.mdx", + "status": "published", + "sourceIndex": 2749, + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx", "navOrder": 156 }, { - "id": 161, - "path": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", - "relativePath": "sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", - "sourcePath": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", - "title": "Retrieve the online status of a user", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve the online status of a user. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1380, + "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "relativePath": "sdk/android/conversation/retrieving-conversations/get-conversation-id", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", + "description": "Use getConversationIDBySessionType() to resolve an Android conversation ID from a chat target.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 157, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user.mdx", + "status": "published", + "sourceIndex": 2750, + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx", "navOrder": 157 }, { - "id": 162, - "path": "/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message", - "relativePath": "sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message", - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message", - "title": "Retrieve members who have read a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve members who have read a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1381, + "path": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "relativePath": "sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", + "description": "Use getMultipleConversation() to retrieve Android conversations by conversationID.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 158, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message.mdx", + "status": "published", + "sourceIndex": 2751, + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx", "navOrder": 158 }, { - "id": 163, - "path": "/sdk/android/application/authenticating-a-user/authentication", - "relativePath": "sdk/android/application/authenticating-a-user/authentication", - "sourcePath": "/sdk/android/application/authenticating-a-user/authentication", - "title": "Authentication", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Authentication. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1382, + "path": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "relativePath": "sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "Get the conversation list", + "description": "Use getConversationListSplit() to retrieve the current Android account conversation list by page.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 159, - "contentFile": "content/docs/chat/sdk/android/application/authenticating-a-user/authentication.mdx", + "status": "published", + "sourceIndex": 2752, + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx", "navOrder": 159 }, { - "id": 164, - "path": "/sdk/android/application/overview-application", - "relativePath": "sdk/android/application/overview-application", - "sourcePath": "/sdk/android/application/overview-application", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1383, + "path": "/sdk/android/conversation/managing-conversations/pin-conversation", + "relativePath": "sdk/android/conversation/managing-conversations/pin-conversation", + "sourcePath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "title": "Pin or unpin a conversation", + "description": "Use pinConversation() to set the pinned state of an Android conversation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 160, - "contentFile": "content/docs/chat/sdk/android/application/overview-application.mdx", + "status": "published", + "sourceIndex": 2753, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx", "navOrder": 160 }, { - "id": 165, - "path": "/sdk/android/application/understanding-rate-limits/rate-limits", - "relativePath": "sdk/android/application/understanding-rate-limits/rate-limits", - "sourcePath": "/sdk/android/application/understanding-rate-limits/rate-limits", - "title": "Rate limits", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Rate limits. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1384, + "path": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "relativePath": "sdk/android/conversation/managing-conversations/set-conversation-extension", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "title": "Set conversation extra data", + "description": "Use setConversationEx() to set an Android conversation extension string.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 161, - "contentFile": "content/docs/chat/sdk/android/application/understanding-rate-limits/rate-limits.mdx", + "status": "published", + "sourceIndex": 2754, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx", "navOrder": 161 }, { - "id": 166, - "path": "/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type", - "relativePath": "sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type", - "sourcePath": "/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type", - "title": "Categorize channels by custom type", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Categorize channels by custom type. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1385, + "path": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "relativePath": "sdk/android/conversation/managing-conversations/set-conversation-draft", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "title": "Set a conversation draft", + "description": "Use setConversationDraft() to save an Android conversation draft.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 162, - "contentFile": "content/docs/chat/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type.mdx", + "status": "published", + "sourceIndex": 2755, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx", "navOrder": 162 }, { - "id": 167, - "path": "/sdk/android/channel/creating-a-channel/create-a-channel", - "relativePath": "sdk/android/channel/creating-a-channel/create-a-channel", - "sourcePath": "/sdk/android/channel/creating-a-channel/create-a-channel", - "title": "Create a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1386, + "path": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "relativePath": "sdk/android/conversation/managing-conversations/set-message-receive-option", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "title": "Set conversation message reception", + "description": "Use setConversationRecvMessageOpt() to set message reception and notification behavior for one Android conversation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 163, - "contentFile": "content/docs/chat/sdk/android/channel/creating-a-channel/create-a-channel.mdx", + "status": "published", + "sourceIndex": 2756, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx", "navOrder": 163 }, { - "id": 168, - "path": "/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", - "relativePath": "sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", - "sourcePath": "/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", - "title": "Accept or decline an invitation", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Accept or decline an invitation. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1387, + "path": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "relativePath": "sdk/android/conversation/managing-conversations/clear-group-mentions", + "sourcePath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "title": "Reset group mention status", + "description": "Use resetConversationGroupAtType() to reset an Android conversation group mention state.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 164, - "contentFile": "content/docs/chat/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation.mdx", + "status": "published", + "sourceIndex": 2757, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx", "navOrder": 164 }, { - "id": 169, - "path": "/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members", - "relativePath": "sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members", - "sourcePath": "/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members", - "title": "Invite users as members", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Invite users as members. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1388, + "path": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "relativePath": "sdk/android/conversation/managing-conversations/mark-conversation-read", + "sourcePath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "title": "Mark a conversation as read", + "description": "Use messageManager.markConversationMessageAsRead() to mark Android conversation messages as read.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 165, - "contentFile": "content/docs/chat/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members.mdx", + "status": "published", + "sourceIndex": 2758, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx", "navOrder": 165 }, { - "id": 170, - "path": "/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", - "relativePath": "sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", - "sourcePath": "/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", - "title": "Enter and exit an open channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Enter and exit an open channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1389, + "path": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "relativePath": "sdk/android/conversation/managing-conversations/get-total-unread-count", + "sourcePath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "title": "Track the total unread count", + "description": "Use getTotalUnreadMsgCount() to retrieve the total unread count for the current Android account.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 166, - "contentFile": "content/docs/chat/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel.mdx", + "status": "published", + "sourceIndex": 2759, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx", "navOrder": 166 }, { - "id": 171, - "path": "/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", - "relativePath": "sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", - "sourcePath": "/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", - "title": "Join and leave a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Join and leave a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1390, + "path": "/sdk/android/conversation/managing-conversations/set-private-chat", + "relativePath": "sdk/android/conversation/managing-conversations/set-private-chat", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "title": "Enable or disable burn after reading", + "description": "Use setOneConversationPrivateChat() to configure burn-after-reading mode for an Android conversation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 167, - "contentFile": "content/docs/chat/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel.mdx", + "status": "published", + "sourceIndex": 2760, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx", "navOrder": 167 }, { - "id": 172, - "path": "/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters", - "relativePath": "sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters", - "sourcePath": "/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters", - "title": "Manage channel metacounters", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Manage channel metacounters. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1391, + "path": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "relativePath": "sdk/android/conversation/managing-conversations/set-burn-duration", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", + "description": "Use setConversationBurnDuration() to set the Android burn-after-reading retention duration.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 168, - "contentFile": "content/docs/chat/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters.mdx", + "status": "published", + "sourceIndex": 2761, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx", "navOrder": 168 }, { - "id": 173, - "path": "/sdk/android/channel/managing-channel-metadata/manage-channel-metadata", - "relativePath": "sdk/android/channel/managing-channel-metadata/manage-channel-metadata", - "sourcePath": "/sdk/android/channel/managing-channel-metadata/manage-channel-metadata", - "title": "Manage channel metadata", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Manage channel metadata. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1392, + "path": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "relativePath": "sdk/android/conversation/managing-conversations/set-message-destruct", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", + "description": "Use setConversation() to configure scheduled server message deletion for an Android conversation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 169, - "contentFile": "content/docs/chat/sdk/android/channel/managing-channel-metadata/manage-channel-metadata.mdx", + "status": "published", + "sourceIndex": 2762, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx", "navOrder": 169 }, { - "id": 174, - "path": "/sdk/android/channel/managing-channels/delete-a-channel", - "relativePath": "sdk/android/channel/managing-channels/delete-a-channel", - "sourcePath": "/sdk/android/channel/managing-channels/delete-a-channel", - "title": "Delete a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1393, + "path": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "relativePath": "sdk/android/conversation/managing-conversations/hide-a-conversation", + "sourcePath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", + "description": "Use hideConversation() to hide a conversation entry from the current Android account.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 170, - "contentFile": "content/docs/chat/sdk/android/channel/managing-channels/delete-a-channel.mdx", + "status": "published", + "sourceIndex": 2763, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx", "navOrder": 170 }, { - "id": 175, - "path": "/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel", - "relativePath": "sdk/android/channel/managing-channels/hide-or-archive-a-group-channel", - "sourcePath": "/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel", - "title": "Hide or archive a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Hide or archive a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1394, + "path": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "relativePath": "sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "sourcePath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", + "description": "Use deleteConversationAndDeleteAllMsg() to delete an Android conversation and its messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 171, - "contentFile": "content/docs/chat/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel.mdx", + "status": "published", + "sourceIndex": 2764, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx", "navOrder": 171 }, { - "id": 176, - "path": "/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel", - "relativePath": "sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel", - "sourcePath": "/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel", - "title": "Refresh all data related to a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Refresh all data related to a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1395, + "path": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "relativePath": "sdk/android/conversation/managing-conversations/clear-conversation-messages", + "sourcePath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", + "description": "Use messageManager.clearConversationAndDeleteAllMsg() to keep an Android conversation entry while clearing its messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 172, - "contentFile": "content/docs/chat/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel.mdx", + "status": "published", + "sourceIndex": 2765, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx", "navOrder": 172 }, { - "id": 177, - "path": "/sdk/android/channel/managing-operators/register-and-remove-operators", - "relativePath": "sdk/android/channel/managing-operators/register-and-remove-operators", - "sourcePath": "/sdk/android/channel/managing-operators/register-and-remove-operators", - "title": "Register and remove operators", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Register and remove operators. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1396, + "path": "/sdk/android/group/overview-group", + "relativePath": "sdk/android/group/overview-group", + "sourcePath": "/sdk/android/group/overview-group", + "title": "Group overview", + "description": "OpenIM Android SDK guide for Group overview.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 173, - "contentFile": "content/docs/chat/sdk/android/channel/managing-operators/register-and-remove-operators.mdx", + "status": "draft", + "sourceIndex": 2766, + "contentFile": "content/docs/chat/sdk/android/group/overview-group.mdx", "navOrder": 173 }, { - "id": 178, - "path": "/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url", - "relativePath": "sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url", - "sourcePath": "/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url", - "title": "Retrieve a channel by URL", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a channel by URL. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1397, + "path": "/sdk/android/group/create-group", + "relativePath": "sdk/android/group/create-group", + "sourcePath": "/sdk/android/group/create-group", + "title": "Create a group", + "description": "OpenIM Android SDK guide for Create a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 174, - "contentFile": "content/docs/chat/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url.mdx", + "status": "draft", + "sourceIndex": 2767, + "contentFile": "content/docs/chat/sdk/android/group/create-group.mdx", "navOrder": 174 }, { - "id": 179, - "path": "/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels", - "relativePath": "sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels", - "sourcePath": "/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels", - "title": "Retrieve a list of channels", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of channels. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1398, + "path": "/sdk/android/group/update-group-profile", + "relativePath": "sdk/android/group/update-group-profile", + "sourcePath": "/sdk/android/group/update-group-profile", + "title": "Update group profile", + "description": "OpenIM Android SDK guide for Update group profile.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 175, - "contentFile": "content/docs/chat/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels.mdx", + "status": "draft", + "sourceIndex": 2768, + "contentFile": "content/docs/chat/sdk/android/group/update-group-profile.mdx", "navOrder": 175 }, { - "id": 180, - "path": "/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids", - "relativePath": "sdk/android/channel/searching-channels/filter-group-channels-by-user-ids", - "sourcePath": "/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids", - "title": "Filter group channels by user IDs", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Filter group channels by user IDs. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1399, + "path": "/sdk/android/group/set-group-announcement", + "relativePath": "sdk/android/group/set-group-announcement", + "sourcePath": "/sdk/android/group/set-group-announcement", + "title": "Publish a group announcement", + "description": "OpenIM Android SDK guide for Publish a group announcement.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 176, - "contentFile": "content/docs/chat/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids.mdx", + "status": "draft", + "sourceIndex": 2769, + "contentFile": "content/docs/chat/sdk/android/group/set-group-announcement.mdx", "navOrder": 176 }, { - "id": 181, - "path": "/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters", - "relativePath": "sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters", - "sourcePath": "/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters", - "title": "Search group channels by name, URL, or other filters", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Search group channels by name, URL, or other filters. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1400, + "path": "/sdk/android/group/set-group-extension", + "relativePath": "sdk/android/group/set-group-extension", + "sourcePath": "/sdk/android/group/set-group-extension", + "title": "Set group extra data", + "description": "OpenIM Android SDK guide for Set group extra data.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 177, - "contentFile": "content/docs/chat/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters.mdx", + "status": "draft", + "sourceIndex": 2770, + "contentFile": "content/docs/chat/sdk/android/group/set-group-extension.mdx", "navOrder": 177 }, { - "id": 182, - "path": "/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types", - "relativePath": "sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types", - "sourcePath": "/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types", - "title": "Search open channels by name, URL, or custom type", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Search open channels by name, URL, or custom type. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1401, + "path": "/sdk/android/group/set-group-join-verification", + "relativePath": "sdk/android/group/set-group-join-verification", + "sourcePath": "/sdk/android/group/set-group-join-verification", + "title": "Set group join verification", + "description": "OpenIM Android SDK guide for Set group join verification.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 178, - "contentFile": "content/docs/chat/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types.mdx", + "status": "draft", + "sourceIndex": 2771, + "contentFile": "content/docs/chat/sdk/android/group/set-group-join-verification.mdx", "navOrder": 178 }, { - "id": 183, - "path": "/sdk/android/deprecated", - "relativePath": "sdk/android/deprecated", - "sourcePath": "/sdk/android/deprecated", - "title": "Deprecated", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Deprecated. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1402, + "path": "/sdk/android/group/set-group-member-profile-access", + "relativePath": "sdk/android/group/set-group-member-profile-access", + "sourcePath": "/sdk/android/group/set-group-member-profile-access", + "title": "Set member profile access", + "description": "OpenIM Android SDK guide for Set member profile access.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 179, - "contentFile": "content/docs/chat/sdk/android/deprecated.mdx", + "status": "draft", + "sourceIndex": 2772, + "contentFile": "content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx", "navOrder": 179 }, { - "id": 185, - "path": "/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", - "relativePath": "sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", - "sourcePath": "/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", - "title": "Add or remove a channel event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add or remove a channel event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1403, + "path": "/sdk/android/group/set-group-member-friend-permission", + "relativePath": "sdk/android/group/set-group-member-friend-permission", + "sourcePath": "/sdk/android/group/set-group-member-friend-permission", + "title": "Set member friend request permission", + "description": "OpenIM Android SDK guide for Set member friend request permission.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 181, - "contentFile": "content/docs/chat/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler.mdx", + "status": "draft", + "sourceIndex": 2773, + "contentFile": "content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx", + "navOrder": 180 + }, + { + "id": 1404, + "path": "/sdk/android/group/change-group-mute", + "relativePath": "sdk/android/group/change-group-mute", + "sourcePath": "/sdk/android/group/change-group-mute", + "title": "Change group mute status", + "description": "OpenIM Android SDK guide for Change group mute status.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "draft", + "sourceIndex": 2774, + "contentFile": "content/docs/chat/sdk/android/group/change-group-mute.mdx", "navOrder": 181 }, { - "id": 186, - "path": "/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", - "relativePath": "sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", - "sourcePath": "/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", - "title": "Add or remove a connection event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add or remove a connection event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1405, + "path": "/sdk/android/group/join-group", + "relativePath": "sdk/android/group/join-group", + "sourcePath": "/sdk/android/group/join-group", + "title": "Apply to join a group", + "description": "OpenIM Android SDK guide for Apply to join a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 182, - "contentFile": "content/docs/chat/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler.mdx", + "status": "draft", + "sourceIndex": 2775, + "contentFile": "content/docs/chat/sdk/android/group/join-group.mdx", "navOrder": 182 }, { - "id": 187, - "path": "/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", - "relativePath": "sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", - "sourcePath": "/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", - "title": "Add or remove a user event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add or remove a user event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1406, + "path": "/sdk/android/group/quit-group", + "relativePath": "sdk/android/group/quit-group", + "sourcePath": "/sdk/android/group/quit-group", + "title": "Leave a group", + "description": "OpenIM Android SDK guide for Leave a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 183, - "contentFile": "content/docs/chat/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler.mdx", + "status": "draft", + "sourceIndex": 2776, + "contentFile": "content/docs/chat/sdk/android/group/quit-group.mdx", "navOrder": 183 }, { - "id": 188, - "path": "/sdk/android/event-handler/overview-event-handler", - "relativePath": "sdk/android/event-handler/overview-event-handler", - "sourcePath": "/sdk/android/event-handler/overview-event-handler", - "title": "Event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1407, + "path": "/sdk/android/group/dismiss-group", + "relativePath": "sdk/android/group/dismiss-group", + "sourcePath": "/sdk/android/group/dismiss-group", + "title": "Dismiss a group", + "description": "OpenIM Android SDK guide for Dismiss a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 184, - "contentFile": "content/docs/chat/sdk/android/event-handler/overview-event-handler.mdx", + "status": "draft", + "sourceIndex": 2777, + "contentFile": "content/docs/chat/sdk/android/group/dismiss-group.mdx", "navOrder": 184 }, { - "id": 189, - "path": "/sdk/android/getting-started/collection-migration-guide", - "relativePath": "sdk/android/getting-started/collection-migration-guide", - "sourcePath": "/sdk/android/getting-started/collection-migration-guide", - "title": "Collection migration guide", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Collection migration guide. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1408, + "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "relativePath": "sdk/android/group/retrieving-groups/get-specified-groups-info", + "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "title": "Get group information", + "description": "OpenIM Android SDK guide for Get group information.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 185, - "contentFile": "content/docs/chat/sdk/android/getting-started/collection-migration-guide.mdx", + "status": "draft", + "sourceIndex": 2778, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx", "navOrder": 185 }, { - "id": 190, - "path": "/sdk/android/getting-started/kotlin-extension", - "relativePath": "sdk/android/getting-started/kotlin-extension", - "sourcePath": "/sdk/android/getting-started/kotlin-extension", - "title": "Kotlin extension (KTX)", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Kotlin extension (KTX). Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1409, + "path": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "relativePath": "sdk/android/group/retrieving-groups/get-joined-group-list-page", + "sourcePath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "title": "Get joined groups by page", + "description": "OpenIM Android SDK guide for Get joined groups by page.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 186, - "contentFile": "content/docs/chat/sdk/android/getting-started/kotlin-extension.mdx", + "status": "draft", + "sourceIndex": 2779, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx", "navOrder": 186 }, { - "id": 191, - "path": "/sdk/android/getting-started/migration-guide", - "relativePath": "sdk/android/getting-started/migration-guide", - "sourcePath": "/sdk/android/getting-started/migration-guide", - "title": "Migration guide", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Migration guide. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1410, + "path": "/sdk/android/group/retrieving-groups/is-join-group", + "relativePath": "sdk/android/group/retrieving-groups/is-join-group", + "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", + "title": "Check group membership", + "description": "OpenIM Android SDK guide for Check group membership.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 187, - "contentFile": "content/docs/chat/sdk/android/getting-started/migration-guide.mdx", + "status": "draft", + "sourceIndex": 2780, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx", "navOrder": 187 }, { - "id": 192, - "path": "/sdk/android/local-caching/overview-local-caching", - "relativePath": "sdk/android/local-caching/overview-local-caching", - "sourcePath": "/sdk/android/local-caching/overview-local-caching", - "title": "Local caching", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Local caching. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1411, + "path": "/sdk/android/group/retrieving-groups/search-groups", + "relativePath": "sdk/android/group/retrieving-groups/search-groups", + "sourcePath": "/sdk/android/group/retrieving-groups/search-groups", + "title": "Search groups", + "description": "OpenIM Android SDK guide for Search groups.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 188, - "contentFile": "content/docs/chat/sdk/android/local-caching/overview-local-caching.mdx", + "status": "draft", + "sourceIndex": 2781, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx", "navOrder": 188 }, { - "id": 193, - "path": "/sdk/android/local-caching/using-group-channel-collection/group-channel-collection", - "relativePath": "sdk/android/local-caching/using-group-channel-collection/group-channel-collection", - "sourcePath": "/sdk/android/local-caching/using-group-channel-collection/group-channel-collection", - "title": "Group channel collection", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Group channel collection. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1412, + "path": "/sdk/android/group/group-applications/overview-group-applications", + "relativePath": "sdk/android/group/group-applications/overview-group-applications", + "sourcePath": "/sdk/android/group/group-applications/overview-group-applications", + "title": "Group applications overview", + "description": "OpenIM Android SDK guide for Group applications overview.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 189, - "contentFile": "content/docs/chat/sdk/android/local-caching/using-group-channel-collection/group-channel-collection.mdx", + "status": "draft", + "sourceIndex": 2782, + "contentFile": "content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx", "navOrder": 189 }, { - "id": 194, - "path": "/sdk/android/local-caching/using-message-collection/message-collection", - "relativePath": "sdk/android/local-caching/using-message-collection/message-collection", - "sourcePath": "/sdk/android/local-caching/using-message-collection/message-collection", - "title": "Message collection", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Message collection. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1413, + "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "relativePath": "sdk/android/group/group-applications/get-group-application-list-as-recipient", + "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "title": "Get received group applications", + "description": "OpenIM Android SDK guide for Get received group applications.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 190, - "contentFile": "content/docs/chat/sdk/android/local-caching/using-message-collection/message-collection.mdx", + "status": "draft", + "sourceIndex": 2783, + "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx", "navOrder": 190 }, { - "id": 195, - "path": "/sdk/android/logger", - "relativePath": "sdk/android/logger", - "sourcePath": "/sdk/android/logger", - "title": "Logger", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Logger. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1414, + "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "relativePath": "sdk/android/group/group-applications/get-group-application-list-as-applicant", + "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "title": "Get sent group applications", + "description": "OpenIM Android SDK guide for Get sent group applications.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 191, - "contentFile": "content/docs/chat/sdk/android/logger.mdx", + "status": "draft", + "sourceIndex": 2784, + "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx", "navOrder": 191 }, { - "id": 196, - "path": "/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type", - "relativePath": "sdk/android/message/categorizing-messages/categorize-messages-by-custom-type", - "sourcePath": "/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type", - "title": "Categorize messages by custom type", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Categorize messages by custom type. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1415, + "path": "/sdk/android/group/group-applications/accept-group-application", + "relativePath": "sdk/android/group/group-applications/accept-group-application", + "sourcePath": "/sdk/android/group/group-applications/accept-group-application", + "title": "Accept a group application", + "description": "OpenIM Android SDK guide for Accept a group application.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 192, - "contentFile": "content/docs/chat/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type.mdx", + "status": "draft", + "sourceIndex": 2785, + "contentFile": "content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx", "navOrder": 192 }, { - "id": 197, - "path": "/sdk/android/message/listing-changelogs/list-changelogs-of-messages", - "relativePath": "sdk/android/message/listing-changelogs/list-changelogs-of-messages", - "sourcePath": "/sdk/android/message/listing-changelogs/list-changelogs-of-messages", - "title": "List changelogs of messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List changelogs of messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1416, + "path": "/sdk/android/group/group-applications/refuse-group-application", + "relativePath": "sdk/android/group/group-applications/refuse-group-application", + "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", + "title": "Reject a group application", + "description": "OpenIM Android SDK guide for Reject a group application.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 193, - "contentFile": "content/docs/chat/sdk/android/message/listing-changelogs/list-changelogs-of-messages.mdx", + "status": "draft", + "sourceIndex": 2786, + "contentFile": "content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx", "navOrder": 193 }, { - "id": 198, - "path": "/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel", - "relativePath": "sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel", - "sourcePath": "/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel", - "title": "Clear the chat history in a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Clear the chat history in a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1417, + "path": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "relativePath": "sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "sourcePath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "title": "Group member queries overview", + "description": "OpenIM Android SDK guide for Group member queries overview.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 194, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel.mdx", + "status": "draft", + "sourceIndex": 2787, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx", "navOrder": 194 }, { - "id": 199, - "path": "/sdk/android/message/managing-a-message/copy-a-message", - "relativePath": "sdk/android/message/managing-a-message/copy-a-message", - "sourcePath": "/sdk/android/message/managing-a-message/copy-a-message", - "title": "Copy a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Copy a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1418, + "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "relativePath": "sdk/android/group/retrieving-group-members/get-group-member-list", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "title": "List group members", + "description": "OpenIM Android SDK guide for List group members.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 195, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/copy-a-message.mdx", + "status": "draft", + "sourceIndex": 2788, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx", "navOrder": 195 }, { - "id": 200, - "path": "/sdk/android/message/managing-a-message/delete-a-message", - "relativePath": "sdk/android/message/managing-a-message/delete-a-message", - "sourcePath": "/sdk/android/message/managing-a-message/delete-a-message", - "title": "Delete a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1419, + "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "relativePath": "sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "title": "Get specified group member profiles", + "description": "OpenIM Android SDK guide for Get specified group member profiles.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 196, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/delete-a-message.mdx", + "status": "draft", + "sourceIndex": 2789, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx", "navOrder": 196 }, { - "id": 201, - "path": "/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message", - "relativePath": "sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message", - "sourcePath": "/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message", - "title": "Display Open Graph tags in a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Display Open Graph tags in a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1420, + "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "relativePath": "sdk/android/group/retrieving-group-members/get-users-in-group", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "title": "Check group membership", + "description": "OpenIM Android SDK guide for Check group membership.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 197, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message.mdx", + "status": "draft", + "sourceIndex": 2790, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx", "navOrder": 197 }, { - "id": 202, - "path": "/sdk/android/message/managing-a-message/update-a-message", - "relativePath": "sdk/android/message/managing-a-message/update-a-message", - "sourcePath": "/sdk/android/message/managing-a-message/update-a-message", - "title": "Update a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1421, + "path": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "relativePath": "sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "Get the group owner and administrators", + "description": "OpenIM Android SDK guide for Get the group owner and administrators.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 198, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/update-a-message.mdx", + "status": "draft", + "sourceIndex": 2791, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx", "navOrder": 198 }, { - "id": 203, - "path": "/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages", - "relativePath": "sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages", - "sourcePath": "/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages", - "title": "List pinned messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List pinned messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1422, + "path": "/sdk/android/group/retrieving-group-members/search-group-members", + "relativePath": "sdk/android/group/retrieving-group-members/search-group-members", + "sourcePath": "/sdk/android/group/retrieving-group-members/search-group-members", + "title": "Search group members", + "description": "OpenIM Android SDK guide for Search group members.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 199, - "contentFile": "content/docs/chat/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages.mdx", + "status": "draft", + "sourceIndex": 2792, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx", "navOrder": 199 }, { - "id": 204, - "path": "/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message", - "relativePath": "sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message", - "sourcePath": "/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message", - "title": "Unpin a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Unpin a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1423, + "path": "/sdk/android/group/managing-group-members/invite-user-to-group", + "relativePath": "sdk/android/group/managing-group-members/invite-user-to-group", + "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "title": "Invite users to a group", + "description": "OpenIM Android SDK guide for Invite users to a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 200, - "contentFile": "content/docs/chat/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message.mdx", + "status": "draft", + "sourceIndex": 2793, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx", "navOrder": 200 }, { - "id": 205, - "path": "/sdk/android/message/managing-polls/add-a-poll-option", - "relativePath": "sdk/android/message/managing-polls/add-a-poll-option", - "sourcePath": "/sdk/android/message/managing-polls/add-a-poll-option", - "title": "Add a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1424, + "path": "/sdk/android/group/managing-group-members/kick-group-member", + "relativePath": "sdk/android/group/managing-group-members/kick-group-member", + "sourcePath": "/sdk/android/group/managing-group-members/kick-group-member", + "title": "Remove group members", + "description": "OpenIM Android SDK guide for Remove group members.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 201, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/add-a-poll-option.mdx", + "status": "draft", + "sourceIndex": 2794, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx", "navOrder": 201 }, { - "id": 206, - "path": "/sdk/android/message/managing-polls/cast-or-cancel-a-vote", - "relativePath": "sdk/android/message/managing-polls/cast-or-cancel-a-vote", - "sourcePath": "/sdk/android/message/managing-polls/cast-or-cancel-a-vote", - "title": "Cast or cancel a vote", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Cast or cancel a vote. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1425, + "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "relativePath": "sdk/android/group/managing-group-members/set-group-member-nickname", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "title": "Update a member’s group nickname", + "description": "OpenIM Android SDK guide for Update a member’s group nickname.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 202, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/cast-or-cancel-a-vote.mdx", + "status": "draft", + "sourceIndex": 2795, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx", "navOrder": 202 }, { - "id": 207, - "path": "/sdk/android/message/managing-polls/close-a-poll", - "relativePath": "sdk/android/message/managing-polls/close-a-poll", - "sourcePath": "/sdk/android/message/managing-polls/close-a-poll", - "title": "Close a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Close a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1426, + "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "relativePath": "sdk/android/group/managing-group-members/set-group-member-role-level", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "title": "Manage group administrators", + "description": "OpenIM Android SDK guide for Manage group administrators.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 203, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/close-a-poll.mdx", + "status": "draft", + "sourceIndex": 2796, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx", "navOrder": 203 }, { - "id": 208, - "path": "/sdk/android/message/managing-polls/delete-a-poll", - "relativePath": "sdk/android/message/managing-polls/delete-a-poll", - "sourcePath": "/sdk/android/message/managing-polls/delete-a-poll", - "title": "Delete a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1427, + "path": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "relativePath": "sdk/android/group/managing-group-members/set-group-member-avatar", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "title": "Update a group member’s avatar", + "description": "OpenIM Android SDK guide for Update a group member’s avatar.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 204, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/delete-a-poll.mdx", + "status": "draft", + "sourceIndex": 2797, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx", "navOrder": 204 }, { - "id": 209, - "path": "/sdk/android/message/managing-polls/delete-a-poll-option", - "relativePath": "sdk/android/message/managing-polls/delete-a-poll-option", - "sourcePath": "/sdk/android/message/managing-polls/delete-a-poll-option", - "title": "Delete a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1428, + "path": "/sdk/android/group/managing-group-members/set-group-member-extension", + "relativePath": "sdk/android/group/managing-group-members/set-group-member-extension", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "title": "Set a group member extension", + "description": "OpenIM Android SDK guide for Set a group member extension.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 205, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/delete-a-poll-option.mdx", + "status": "draft", + "sourceIndex": 2798, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx", "navOrder": 205 }, { - "id": 210, - "path": "/sdk/android/message/managing-polls/list-changelogs-of-polls", - "relativePath": "sdk/android/message/managing-polls/list-changelogs-of-polls", - "sourcePath": "/sdk/android/message/managing-polls/list-changelogs-of-polls", - "title": "List changelogs of polls", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List changelogs of polls. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1429, + "path": "/sdk/android/group/managing-group-members/transfer-group-owner", + "relativePath": "sdk/android/group/managing-group-members/transfer-group-owner", + "sourcePath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "title": "Transfer group ownership", + "description": "OpenIM Android SDK guide for Transfer group ownership.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 206, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/list-changelogs-of-polls.mdx", + "status": "draft", + "sourceIndex": 2799, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx", "navOrder": 206 }, { - "id": 211, - "path": "/sdk/android/message/managing-polls/retrieve-a-list-of-polls", - "relativePath": "sdk/android/message/managing-polls/retrieve-a-list-of-polls", - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-list-of-polls", - "title": "Retrieve a list of polls", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of polls. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1430, + "path": "/sdk/android/group/managing-group-members/change-group-member-mute", + "relativePath": "sdk/android/group/managing-group-members/change-group-member-mute", + "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "title": "Mute or unmute a group member", + "description": "OpenIM Android SDK guide for Mute or unmute a group member.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 207, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-list-of-polls.mdx", + "status": "draft", + "sourceIndex": 2800, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx", "navOrder": 207 }, { - "id": 212, - "path": "/sdk/android/message/managing-polls/retrieve-a-list-of-voters", - "relativePath": "sdk/android/message/managing-polls/retrieve-a-list-of-voters", - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-list-of-voters", - "title": "Retrieve a list of voters", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of voters. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1431, + "path": "/sdk/android/message/overview-message", + "relativePath": "sdk/android/message/overview-message", + "sourcePath": "/sdk/android/message/overview-message", + "title": "Overview", + "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", "product": "sdk", "version": "v4", "platform": "android", @@ -5665,910 +5701,982 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "scaffold", - "sourceIndex": 208, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-list-of-voters.mdx", + "sourceIndex": 2801, + "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx", "navOrder": 208 }, { - "id": 213, - "path": "/sdk/android/message/managing-polls/retrieve-a-poll", - "relativePath": "sdk/android/message/managing-polls/retrieve-a-poll", - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-poll", - "title": "Retrieve a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1432, + "path": "/sdk/android/message/creating-messages/create-text-message", + "relativePath": "sdk/android/message/creating-messages/create-text-message", + "sourcePath": "/sdk/android/message/creating-messages/create-text-message", + "title": "Create a text message", + "description": "OpenIM Android SDK guide for Create a text message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 209, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-poll.mdx", + "status": "draft", + "sourceIndex": 2802, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx", "navOrder": 209 }, { - "id": 214, - "path": "/sdk/android/message/managing-polls/retrieve-a-poll-option", - "relativePath": "sdk/android/message/managing-polls/retrieve-a-poll-option", - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-poll-option", - "title": "Retrieve a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1433, + "path": "/sdk/android/message/creating-messages/create-text-at-message", + "relativePath": "sdk/android/message/creating-messages/create-text-at-message", + "sourcePath": "/sdk/android/message/creating-messages/create-text-at-message", + "title": "Create an @ message", + "description": "OpenIM Android SDK guide for Create an @ message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 210, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-poll-option.mdx", + "status": "draft", + "sourceIndex": 2803, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx", "navOrder": 210 }, { - "id": 215, - "path": "/sdk/android/message/managing-polls/update-a-poll", - "relativePath": "sdk/android/message/managing-polls/update-a-poll", - "sourcePath": "/sdk/android/message/managing-polls/update-a-poll", - "title": "Update a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1434, + "path": "/sdk/android/message/creating-messages/create-custom-message", + "relativePath": "sdk/android/message/creating-messages/create-custom-message", + "sourcePath": "/sdk/android/message/creating-messages/create-custom-message", + "title": "Create a custom message", + "description": "OpenIM Android SDK guide for Create a custom message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 211, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/update-a-poll.mdx", + "status": "draft", + "sourceIndex": 2804, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx", "navOrder": 211 }, { - "id": 216, - "path": "/sdk/android/message/managing-polls/update-a-poll-option", - "relativePath": "sdk/android/message/managing-polls/update-a-poll-option", - "sourcePath": "/sdk/android/message/managing-polls/update-a-poll-option", - "title": "Update a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1435, + "path": "/sdk/android/message/creating-messages/create-image-message-by-file", + "relativePath": "sdk/android/message/creating-messages/create-image-message-by-file", + "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "title": "Create an image message from a file", + "description": "OpenIM Android SDK guide for Create an image message from a file.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 212, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/update-a-poll-option.mdx", + "status": "draft", + "sourceIndex": 2805, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx", "navOrder": 212 }, { - "id": 217, - "path": "/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status", - "relativePath": "sdk/android/message/managing-read-status-in-a-group-channel/get-read-status", - "sourcePath": "/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status", - "title": "Get read status of a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Get read status of a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1436, + "path": "/sdk/android/message/creating-messages/create-image-message-by-url", + "relativePath": "sdk/android/message/creating-messages/create-image-message-by-url", + "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "title": "Create an image message from a URL", + "description": "OpenIM Android SDK guide for Create an image message from a URL.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 213, - "contentFile": "content/docs/chat/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status.mdx", + "status": "draft", + "sourceIndex": 2806, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx", "navOrder": 213 }, { - "id": 218, - "path": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read", - "relativePath": "sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read", - "sourcePath": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read", - "title": "Mark messages as read", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as read. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1437, + "path": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "relativePath": "sdk/android/message/creating-messages/create-sound-message-by-file", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "title": "Create an audio message from a file", + "description": "OpenIM Android SDK guide for Create an audio message from a file.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 214, - "contentFile": "content/docs/chat/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read.mdx", + "status": "draft", + "sourceIndex": 2807, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx", "navOrder": 214 }, { - "id": 219, - "path": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread", - "relativePath": "sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread", - "sourcePath": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread", - "title": "Mark messages as unread", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as unread. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1438, + "path": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "relativePath": "sdk/android/message/creating-messages/create-sound-message-by-url", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "title": "Create an audio message from a URL", + "description": "OpenIM Android SDK guide for Create an audio message from a URL.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 215, - "contentFile": "content/docs/chat/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread.mdx", + "status": "draft", + "sourceIndex": 2808, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx", "navOrder": 215 }, { - "id": 220, - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", - "relativePath": "sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", - "title": "Cancel a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Cancel a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1439, + "path": "/sdk/android/message/creating-messages/create-video-message-by-file", + "relativePath": "sdk/android/message/creating-messages/create-video-message-by-file", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "title": "Create a video message from files", + "description": "OpenIM Android SDK guide for Create a video message from files.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 216, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message.mdx", + "status": "draft", + "sourceIndex": 2809, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx", "navOrder": 216 }, { - "id": 221, - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", - "relativePath": "sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", - "title": "List all scheduled messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List all scheduled messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1440, + "path": "/sdk/android/message/creating-messages/create-video-message-by-url", + "relativePath": "sdk/android/message/creating-messages/create-video-message-by-url", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "title": "Create a video message from URLs", + "description": "OpenIM Android SDK guide for Create a video message from URLs.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 217, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages.mdx", + "status": "draft", + "sourceIndex": 2810, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx", "navOrder": 217 }, { - "id": 222, - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "relativePath": "sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "title": "Retrieve a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1441, + "path": "/sdk/android/message/creating-messages/create-file-message-by-file", + "relativePath": "sdk/android/message/creating-messages/create-file-message-by-file", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "title": "Create a file message from a file", + "description": "OpenIM Android SDK guide for Create a file message from a file.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 218, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message.mdx", + "status": "draft", + "sourceIndex": 2811, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx", "navOrder": 218 }, { - "id": 223, - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", - "relativePath": "sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", - "title": "Retrieve the total number of scheduled messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve the total number of scheduled messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1442, + "path": "/sdk/android/message/creating-messages/create-file-message-by-url", + "relativePath": "sdk/android/message/creating-messages/create-file-message-by-url", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "title": "Create a file message from a URL", + "description": "OpenIM Android SDK guide for Create a file message from a URL.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 219, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages.mdx", + "status": "draft", + "sourceIndex": 2812, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx", "navOrder": 219 }, { - "id": 224, - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", - "relativePath": "sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", - "title": "Send scheduled message immediately", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send scheduled message immediately. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1443, + "path": "/sdk/android/message/creating-messages/create-card-message", + "relativePath": "sdk/android/message/creating-messages/create-card-message", + "sourcePath": "/sdk/android/message/creating-messages/create-card-message", + "title": "Create a contact card message", + "description": "OpenIM Android SDK guide for Create a contact card message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 220, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately.mdx", + "status": "draft", + "sourceIndex": 2813, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx", "navOrder": 220 }, { - "id": 225, - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", - "relativePath": "sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", - "title": "Update a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1444, + "path": "/sdk/android/message/creating-messages/create-location-message", + "relativePath": "sdk/android/message/creating-messages/create-location-message", + "sourcePath": "/sdk/android/message/creating-messages/create-location-message", + "title": "Create a location message", + "description": "OpenIM Android SDK guide for Create a location message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 221, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message.mdx", + "status": "draft", + "sourceIndex": 2814, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx", "navOrder": 221 }, { - "id": 226, - "path": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", - "relativePath": "sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", - "sourcePath": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", - "title": "Receive messages in a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Receive messages in a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1445, + "path": "/sdk/android/message/creating-messages/create-face-message", + "relativePath": "sdk/android/message/creating-messages/create-face-message", + "sourcePath": "/sdk/android/message/creating-messages/create-face-message", + "title": "Create an emoji message", + "description": "OpenIM Android SDK guide for Create an emoji message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 222, - "contentFile": "content/docs/chat/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel.mdx", + "status": "draft", + "sourceIndex": 2815, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx", "navOrder": 222 }, { - "id": 227, - "path": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", - "relativePath": "sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", - "sourcePath": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", - "title": "Receive messages in an open channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Receive messages in an open channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1446, + "path": "/sdk/android/message/creating-messages/create-quote-message", + "relativePath": "sdk/android/message/creating-messages/create-quote-message", + "sourcePath": "/sdk/android/message/creating-messages/create-quote-message", + "title": "Create a reply message", + "description": "OpenIM Android SDK guide for Create a reply message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 223, - "contentFile": "content/docs/chat/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel.mdx", + "status": "draft", + "sourceIndex": 2816, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx", "navOrder": 223 }, { - "id": 228, - "path": "/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages", - "relativePath": "sdk/android/message/retrieving-messages/retrieve-a-list-of-messages", - "sourcePath": "/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages", - "title": "Retrieve a list of messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1447, + "path": "/sdk/android/message/creating-messages/create-forward-message", + "relativePath": "sdk/android/message/creating-messages/create-forward-message", + "sourcePath": "/sdk/android/message/creating-messages/create-forward-message", + "title": "Create a forwarded message", + "description": "OpenIM Android SDK guide for Create a forwarded message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 224, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages.mdx", + "status": "draft", + "sourceIndex": 2817, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx", "navOrder": 224 }, { - "id": 229, - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", - "relativePath": "sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", - "title": "Retrieve number of members who haven't read a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of members who haven't read a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1448, + "path": "/sdk/android/message/creating-messages/create-merger-message", + "relativePath": "sdk/android/message/creating-messages/create-merger-message", + "sourcePath": "/sdk/android/message/creating-messages/create-merger-message", + "title": "Create a merged forward message", + "description": "OpenIM Android SDK guide for Create a merged forward message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 225, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message.mdx", + "status": "draft", + "sourceIndex": 2818, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx", "navOrder": 225 }, { - "id": 230, - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", - "relativePath": "sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", - "title": "Retrieve number of members who haven't received a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of members who haven't received a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1449, + "path": "/sdk/android/message/sending-messages/send-message", + "relativePath": "sdk/android/message/sending-messages/send-message", + "sourcePath": "/sdk/android/message/sending-messages/send-message", + "title": "Send a message", + "description": "OpenIM Android SDK guide for Send a message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 226, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message.mdx", + "status": "draft", + "sourceIndex": 2819, + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message.mdx", "navOrder": 226 }, { - "id": 231, - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels", - "relativePath": "sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels", - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels", - "title": "Retrieve number of channels with unread messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of channels with unread messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1450, + "path": "/sdk/android/message/sending-messages/send-message-not-oss", + "relativePath": "sdk/android/message/sending-messages/send-message-not-oss", + "sourcePath": "/sdk/android/message/sending-messages/send-message-not-oss", + "title": "Send an uploaded media message", + "description": "OpenIM Android SDK guide for Send an uploaded media message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 227, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels.mdx", + "status": "draft", + "sourceIndex": 2820, + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx", "navOrder": 227 }, { - "id": 232, - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items", - "relativePath": "sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items", - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items", - "title": "Retrieve number of unread items", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of unread items. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1451, + "path": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "relativePath": "sdk/android/message/sending-messages/set-msg-send-progress-listener", + "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "title": "Track message sending progress", + "description": "OpenIM Android SDK guide for Track message sending progress.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 228, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items.mdx", + "status": "draft", + "sourceIndex": 2821, + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx", "navOrder": 228 }, { - "id": 233, - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", - "relativePath": "sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", - "title": "Retrieve number of unread messages in a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of unread messages in a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1452, + "path": "/sdk/android/message/receiving-messages/receive-messages", + "relativePath": "sdk/android/message/receiving-messages/receive-messages", + "sourcePath": "/sdk/android/message/receiving-messages/receive-messages", + "title": "Receive messages", + "description": "OpenIM Android SDK guide for Receive messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 229, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel.mdx", + "status": "draft", + "sourceIndex": 2822, + "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx", "navOrder": 229 }, { - "id": 234, - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "relativePath": "sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "title": "Retrieve number of unread messages in all channels", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of unread messages in all channels. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1453, + "path": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "relativePath": "sdk/android/message/receiving-messages/receive-custom-business-messages", + "sourcePath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "title": "Receive custom business messages", + "description": "OpenIM Android SDK guide for Receive custom business messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 230, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels.mdx", + "status": "draft", + "sourceIndex": 2823, + "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx", "navOrder": 230 }, { - "id": 235, - "path": "/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload", - "relativePath": "sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload", - "sourcePath": "/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload", - "title": "Cancel an in-progress file upload", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Cancel an in-progress file upload. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1454, + "path": "/sdk/android/message/retrieving-messages/load-older-messages", + "relativePath": "sdk/android/message/retrieving-messages/load-older-messages", + "sourcePath": "/sdk/android/message/retrieving-messages/load-older-messages", + "title": "Load message history", + "description": "OpenIM Android SDK guide for Load message history.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 231, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload.mdx", + "status": "draft", + "sourceIndex": 2824, + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx", "navOrder": 231 }, { - "id": 236, - "path": "/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "relativePath": "sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "sourcePath": "/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "title": "Send a critical alert message to iOS device users", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send a critical alert message to iOS device users. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1455, + "path": "/sdk/android/message/retrieving-messages/load-newer-messages", + "relativePath": "sdk/android/message/retrieving-messages/load-newer-messages", + "sourcePath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "title": "Load message history in reverse", + "description": "OpenIM Android SDK guide for Load message history in reverse.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 232, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users.mdx", + "status": "draft", + "sourceIndex": 2825, + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx", "navOrder": 232 }, { - "id": 237, - "path": "/sdk/android/message/sending-a-message/send-a-message", - "relativePath": "sdk/android/message/sending-a-message/send-a-message", - "sourcePath": "/sdk/android/message/sending-a-message/send-a-message", - "title": "Send a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1456, + "path": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "relativePath": "sdk/android/message/retrieving-messages/find-messages-by-id", + "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "title": "Find messages by ID", + "description": "OpenIM Android SDK guide for Find messages by ID.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 233, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/send-a-message.mdx", + "status": "draft", + "sourceIndex": 2826, + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx", "navOrder": 233 }, { - "id": 238, - "path": "/sdk/android/message/sending-a-message/send-an-admin-message", - "relativePath": "sdk/android/message/sending-a-message/send-an-admin-message", - "sourcePath": "/sdk/android/message/sending-a-message/send-an-admin-message", - "title": "Send an admin message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send an admin message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1457, + "path": "/sdk/android/message/searching-messages/search-messages", + "relativePath": "sdk/android/message/searching-messages/search-messages", + "sourcePath": "/sdk/android/message/searching-messages/search-messages", + "title": "Search messages", + "description": "OpenIM Android SDK guide for Search messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 234, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/send-an-admin-message.mdx", + "status": "draft", + "sourceIndex": 2827, + "contentFile": "content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx", "navOrder": 234 }, { - "id": 239, - "path": "/sdk/android/message/sending-a-message/spam-flood-protection", - "relativePath": "sdk/android/message/sending-a-message/spam-flood-protection", - "sourcePath": "/sdk/android/message/sending-a-message/spam-flood-protection", - "title": "Spam flood protection", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Spam flood protection. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1458, + "path": "/sdk/android/message/composing-messages/update-typing-status", + "relativePath": "sdk/android/message/composing-messages/update-typing-status", + "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", + "title": "Report typing status", + "description": "OpenIM Android SDK guide for Report typing status.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 235, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/spam-flood-protection.mdx", + "status": "draft", + "sourceIndex": 2828, + "contentFile": "content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx", "navOrder": 235 }, { - "id": 240, - "path": "/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler", - "relativePath": "sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler", - "sourcePath": "/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler", - "title": "Track file upload progress using a handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Track file upload progress using a handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1459, + "path": "/sdk/android/message/managing-messages/delete-local-message", + "relativePath": "sdk/android/message/managing-messages/delete-local-message", + "sourcePath": "/sdk/android/message/managing-messages/delete-local-message", + "title": "Delete a local message", + "description": "OpenIM Android SDK guide for Delete a local message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 236, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler.mdx", + "status": "draft", + "sourceIndex": 2829, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx", "navOrder": 236 }, { - "id": 241, - "path": "/sdk/android/message/translating-messages/translation-engine", - "relativePath": "sdk/android/message/translating-messages/translation-engine", - "sourcePath": "/sdk/android/message/translating-messages/translation-engine", - "title": "Translation engine", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Translation engine. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1460, + "path": "/sdk/android/message/managing-messages/delete-saved-messages", + "relativePath": "sdk/android/message/managing-messages/delete-saved-messages", + "sourcePath": "/sdk/android/message/managing-messages/delete-saved-messages", + "title": "Delete messages in a batch", + "description": "OpenIM Android SDK guide for Delete messages in a batch.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 237, - "contentFile": "content/docs/chat/sdk/android/message/translating-messages/translation-engine.mdx", + "status": "draft", + "sourceIndex": 2830, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx", "navOrder": 237 }, { - "id": 242, - "path": "/sdk/android/message/using-message-threading/list-replies-in-a-message-thread", - "relativePath": "sdk/android/message/using-message-threading/list-replies-in-a-message-thread", - "sourcePath": "/sdk/android/message/using-message-threading/list-replies-in-a-message-thread", - "title": "List replies in a message thread", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List replies in a message thread. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1461, + "path": "/sdk/android/message/managing-messages/revoke-a-message", + "relativePath": "sdk/android/message/managing-messages/revoke-a-message", + "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", + "title": "Revoke a message", + "description": "OpenIM Android SDK guide for Revoke a message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 238, - "contentFile": "content/docs/chat/sdk/android/message/using-message-threading/list-replies-in-a-message-thread.mdx", + "status": "draft", + "sourceIndex": 2831, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx", "navOrder": 238 }, { - "id": 243, - "path": "/sdk/android/migrating-to-openim", - "relativePath": "sdk/android/migrating-to-openim", - "sourcePath": "/sdk/android/migrating-to-openim", - "title": "Migrating to OpenIM", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Migrating to OpenIM. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1462, + "path": "/sdk/android/message/managing-messages/modify-a-message", + "relativePath": "sdk/android/message/managing-messages/modify-a-message", + "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", + "title": "Modify a message", + "description": "OpenIM Android SDK guide for Modify a message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 239, - "contentFile": "content/docs/chat/sdk/android/migrating-to-openim.mdx", + "status": "draft", + "sourceIndex": 2832, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx", "navOrder": 239 }, { - "id": 244, - "path": "/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates", - "relativePath": "sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates", - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates", - "title": "Push notification content templates", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Push notification content templates. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1463, + "path": "/sdk/android/message/managing-messages/get-pinned-messages", + "relativePath": "sdk/android/message/managing-messages/get-pinned-messages", + "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", + "title": "Get pinned messages in a conversation", + "description": "OpenIM Android SDK guide for Get pinned messages in a conversation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 240, - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates.mdx", + "status": "draft", + "sourceIndex": 2833, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx", "navOrder": 240 }, { - "id": 245, - "path": "/sdk/android/push-notifications/managing-push-notifications/push-notification-tester", - "relativePath": "sdk/android/push-notifications/managing-push-notifications/push-notification-tester", - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-tester", - "title": "Push notification tester", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Push notification tester. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1464, + "path": "/sdk/android/message/managing-messages/set-message-pinned", + "relativePath": "sdk/android/message/managing-messages/set-message-pinned", + "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", + "title": "Pin or unpin a message", + "description": "OpenIM Android SDK guide for Pin or unpin a message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 241, - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/push-notification-tester.mdx", + "status": "draft", + "sourceIndex": 2834, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx", "navOrder": 241 }, { - "id": 246, - "path": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", - "relativePath": "sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for FCM. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1465, + "path": "/sdk/android/message/managing-messages/insert-local-single-message", + "relativePath": "sdk/android/message/managing-messages/insert-local-single-message", + "sourcePath": "/sdk/android/message/managing-messages/insert-local-single-message", + "title": "Insert a local one-to-one message", + "description": "OpenIM Android SDK guide for Insert a local one-to-one message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 242, - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm.mdx", + "status": "draft", + "sourceIndex": 2835, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx", "navOrder": 242 }, { - "id": 247, - "path": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", - "relativePath": "sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for HMS. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1466, + "path": "/sdk/android/message/managing-messages/insert-local-group-message", + "relativePath": "sdk/android/message/managing-messages/insert-local-group-message", + "sourcePath": "/sdk/android/message/managing-messages/insert-local-group-message", + "title": "Insert a local group message", + "description": "OpenIM Android SDK guide for Insert a local group message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 243, - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms.mdx", + "status": "draft", + "sourceIndex": 2836, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx", "navOrder": 243 }, { - "id": 248, - "path": "/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", - "relativePath": "sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", - "sourcePath": "/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", - "title": "Mark push notifications as delivered", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark push notifications as delivered. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1467, + "path": "/sdk/android/message/managing-messages/clear-all-local-messages", + "relativePath": "sdk/android/message/managing-messages/clear-all-local-messages", + "sourcePath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "title": "Clear all local messages", + "description": "OpenIM Android SDK guide for Clear all local messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 244, - "contentFile": "content/docs/chat/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered.mdx", + "status": "draft", + "sourceIndex": 2837, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx", "navOrder": 244 }, { - "id": 249, - "path": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm", - "relativePath": "sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm", - "sourcePath": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for FCM. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1468, + "path": "/sdk/android/message/managing-messages/clear-all-messages", + "relativePath": "sdk/android/message/managing-messages/clear-all-messages", + "sourcePath": "/sdk/android/message/managing-messages/clear-all-messages", + "title": "Clear local and server messages", + "description": "OpenIM Android SDK guide for Clear local and server messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 245, - "contentFile": "content/docs/chat/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm.mdx", + "status": "draft", + "sourceIndex": 2838, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx", "navOrder": 245 }, { - "id": 250, - "path": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms", - "relativePath": "sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms", - "sourcePath": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for HMS. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1469, + "path": "/sdk/android/message/managing-messages/set-message-local-ex", + "relativePath": "sdk/android/message/managing-messages/set-message-local-ex", + "sourcePath": "/sdk/android/message/managing-messages/set-message-local-ex", + "title": "Set a local message extension", + "description": "OpenIM Android SDK guide for Set a local message extension.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 246, - "contentFile": "content/docs/chat/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms.mdx", + "status": "draft", + "sourceIndex": 2839, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx", "navOrder": 246 }, { - "id": 251, - "path": "/sdk/android/report/creating-a-report/report-a-message-user-or-channel", - "relativePath": "sdk/android/report/creating-a-report/report-a-message-user-or-channel", - "sourcePath": "/sdk/android/report/creating-a-report/report-a-message-user-or-channel", - "title": "Report a message, user, or channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Report a message, user, or channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1470, + "path": "/sdk/android/file-uploads/track-file-upload-progress", + "relativePath": "sdk/android/file-uploads/track-file-upload-progress", + "sourcePath": "/sdk/android/file-uploads/track-file-upload-progress", + "title": "Track file upload progress", + "description": "OpenIM Android SDK guide for Track file upload progress.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 247, - "contentFile": "content/docs/chat/sdk/android/report/creating-a-report/report-a-message-user-or-channel.mdx", + "status": "draft", + "sourceIndex": 2840, + "contentFile": "content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx", "navOrder": 247 }, { - "id": 252, - "path": "/sdk/android/user/managing-user-metadata/manage-user-metadata", - "relativePath": "sdk/android/user/managing-user-metadata/manage-user-metadata", - "sourcePath": "/sdk/android/user/managing-user-metadata/manage-user-metadata", - "title": "Manage user metadata", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Manage user metadata. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1471, + "path": "/sdk/android/file-uploads/upload-file", + "relativePath": "sdk/android/file-uploads/upload-file", + "sourcePath": "/sdk/android/file-uploads/upload-file", + "title": "Upload a file", + "description": "OpenIM Android SDK guide for Upload a file.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 248, - "contentFile": "content/docs/chat/sdk/android/user/managing-user-metadata/manage-user-metadata.mdx", + "status": "draft", + "sourceIndex": 2841, + "contentFile": "content/docs/chat/sdk/android/file-uploads/upload-file.mdx", "navOrder": 248 }, { - "id": 253, - "path": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "relativePath": "sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "sourcePath": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "title": "Retrieve a list of blocked users", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of blocked users. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1472, + "path": "/sdk/android/calling/overview-calling", + "relativePath": "sdk/android/calling/overview-calling", + "sourcePath": "/sdk/android/calling/overview-calling", + "title": "Audio and video calling overview", + "description": "OpenIM Android SDK guide for Audio and video calling overview.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 250, - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx", + "status": "draft", + "sourceIndex": 2842, + "contentFile": "content/docs/chat/sdk/android/calling/overview-calling.mdx", + "navOrder": 249 + }, + { + "id": 1473, + "path": "/sdk/android/calling/managing-calls/start-single-call", + "relativePath": "sdk/android/calling/managing-calls/start-single-call", + "sourcePath": "/sdk/android/calling/managing-calls/start-single-call", + "title": "Start a one-to-one call", + "description": "OpenIM Android SDK guide for Start a one-to-one call.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "draft", + "sourceIndex": 2843, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx", "navOrder": 250 }, { - "id": 254, - "path": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users", - "relativePath": "sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users", - "sourcePath": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users", - "title": "Retrieve a list of muted users", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of muted users. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1474, + "path": "/sdk/android/calling/managing-calls/start-group-call", + "relativePath": "sdk/android/calling/managing-calls/start-group-call", + "sourcePath": "/sdk/android/calling/managing-calls/start-group-call", + "title": "Start a group call", + "description": "OpenIM Android SDK guide for Start a group call.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 251, - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users.mdx", + "status": "draft", + "sourceIndex": 2844, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx", "navOrder": 251 }, { - "id": 255, - "path": "/sdk/android/user/overview-user", - "relativePath": "sdk/android/user/overview-user", - "sourcePath": "/sdk/android/user/overview-user", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1475, + "path": "/sdk/android/calling/managing-calls/accept-call", + "relativePath": "sdk/android/calling/managing-calls/accept-call", + "sourcePath": "/sdk/android/calling/managing-calls/accept-call", + "title": "Accept a call", + "description": "OpenIM Android SDK guide for Accept a call.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 252, - "contentFile": "content/docs/chat/sdk/android/user/overview-user.mdx", + "status": "draft", + "sourceIndex": 2845, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx", "navOrder": 252 }, { - "id": 256, - "path": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "relativePath": "sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "sourcePath": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "title": "Retrieve the latest information on participants", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve the latest information on participants. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1476, + "path": "/sdk/android/calling/managing-calls/reject-call", + "relativePath": "sdk/android/calling/managing-calls/reject-call", + "sourcePath": "/sdk/android/calling/managing-calls/reject-call", + "title": "Reject a call", + "description": "OpenIM Android SDK guide for Reject a call.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 253, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants.mdx", + "status": "draft", + "sourceIndex": 2846, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx", "navOrder": 253 }, { - "id": 257, - "path": "/sdk/android/user/retrieving-and-updating-user-information/update-user-profile", - "relativePath": "sdk/android/user/retrieving-and-updating-user-information/update-user-profile", - "sourcePath": "/sdk/android/user/retrieving-and-updating-user-information/update-user-profile", - "title": "Update user profile", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update user profile. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1477, + "path": "/sdk/android/calling/managing-calls/cancel-call", + "relativePath": "sdk/android/calling/managing-calls/cancel-call", + "sourcePath": "/sdk/android/calling/managing-calls/cancel-call", + "title": "Cancel a call invitation", + "description": "OpenIM Android SDK guide for Cancel a call invitation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 254, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-and-updating-user-information/update-user-profile.mdx", + "status": "draft", + "sourceIndex": 2847, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx", "navOrder": 254 }, { - "id": 258, - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", - "relativePath": "sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", - "title": "Retrieve a list of members and operators in a specific order", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of members and operators in a specific order. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1478, + "path": "/sdk/android/calling/managing-calls/hang-up-call", + "relativePath": "sdk/android/calling/managing-calls/hang-up-call", + "sourcePath": "/sdk/android/calling/managing-calls/hang-up-call", + "title": "End a call", + "description": "OpenIM Android SDK guide for End a call.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 255, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order.mdx", + "status": "draft", + "sourceIndex": 2848, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx", "navOrder": 255 }, { - "id": 259, - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-operators", - "relativePath": "sdk/android/user/retrieving-users/retrieve-a-list-of-operators", - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-operators", - "title": "Retrieve a list of operators", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of operators. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1479, + "path": "/sdk/android/calling/managing-calls/handle-call-events", + "relativePath": "sdk/android/calling/managing-calls/handle-call-events", + "sourcePath": "/sdk/android/calling/managing-calls/handle-call-events", + "title": "Handle call events", + "description": "OpenIM Android SDK guide for Handle call events.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 256, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-operators.mdx", + "status": "draft", + "sourceIndex": 2849, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx", "navOrder": 256 }, { - "id": 260, - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel", - "relativePath": "sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel", - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel", - "title": "Retrieve a list of users in a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of users in a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1480, + "path": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "relativePath": "sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "sourcePath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "title": "Restore a pending call invitation", + "description": "OpenIM Android SDK guide for Restore a pending call invitation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 257, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel.mdx", + "status": "draft", + "sourceIndex": 2850, + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx", "navOrder": 257 }, { - "id": 261, - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application", - "relativePath": "sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application", - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application", - "title": "Retrieve a list of users in an application", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of users in an application. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1481, + "path": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "relativePath": "sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "sourcePath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "title": "Get a group call room", + "description": "OpenIM Android SDK guide for Get a group call room.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 258, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application.mdx", + "status": "draft", + "sourceIndex": 2851, + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx", "navOrder": 258 }, { - "id": 262, - "path": "/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "relativePath": "sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "sourcePath": "/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "title": "Mark messages as read", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as read. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "id": 1482, + "path": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "relativePath": "sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "sourcePath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "title": "Get a call room token", + "description": "OpenIM Android SDK guide for Get a call room token.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 259, - "contentFile": "content/docs/chat/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read.mdx", + "status": "draft", + "sourceIndex": 2852, + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx", "navOrder": 259 }, + { + "id": 1483, + "path": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "relativePath": "sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "sourcePath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "title": "Send a custom signal", + "description": "OpenIM Android SDK guide for Send a custom signal.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "draft", + "sourceIndex": 2853, + "contentFile": "content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx", + "navOrder": 260 + }, + { + "id": 1484, + "path": "/sdk/android/events/overview-events", + "relativePath": "sdk/android/events/overview-events", + "sourcePath": "/sdk/android/events/overview-events", + "title": "Events overview", + "description": "OpenIM Android SDK guide for Events overview.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "draft", + "sourceIndex": 2854, + "contentFile": "content/docs/chat/sdk/android/events/overview-events.mdx", + "navOrder": 261 + }, + { + "id": 1485, + "path": "/sdk/android/logger", + "relativePath": "sdk/android/logger", + "sourcePath": "/sdk/android/logger", + "title": "Logger", + "description": "OpenIM · SDK · Android · v4 documentation scaffold for Logger. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "scaffold", + "sourceIndex": 2855, + "contentFile": "content/docs/chat/sdk/android/logger.mdx", + "navOrder": 262 + }, { "id": 864, "path": "/sdk/flutter/overview", diff --git a/src/generated/search-index-zh.json b/src/generated/search-index-zh.json index 7a8bb02473..dec2b5e736 100644 --- a/src/generated/search-index-zh.json +++ b/src/generated/search-index-zh.json @@ -1896,1028 +1896,1076 @@ "content": "OpenIM iOS SDK 的日志用于定位初始化、连接和业务 API 调用问题。开发环境可以输出较详细的信息;生产环境应减少日志量,并避免记录 token、消息正文、文件 URL 和用户隐私字段。 初始化日志配置 日志选项属于 OIMInitConfig ,必须在 initSDKWithConfig:... 前设置: OIMInitConfig config = OIMInitConfig new ; config.platform = iPhone; config.apiAddr = apiAddress; config.wsAddr = websocketAddress; config.dataDir = dataDirectory; config.logLevel = 4; config.isLogStandardOutput = YES; config.logFilePath = logDirectory; config.systemType = @\"ios\"; 参数说明 | 字段 | 类型 | 说明 | | | | | | logLevel | NSInteger | SDK 日志级别;默认值为 6 ,实际级别约定以当前 SDK 版本为准。 | | isLogStandardOutput | BOOL | 是否输出 SDK 标准日志。 | | logFilePath | NSString | 可选的日志文件目录。 | | systemType | NSString | 日志中的系统类型标识。 | 生产环境不要长期启用最详细日志。日志目录应位于应用可写范围,并纳入容量、保留期和隐私策略。 写入应用诊断日志 需要把应用业务上下文写入 SDK 日志时,可调用: OIMManager manager logs: NSString stringWithUTF8String: FILE .lastPathComponent line: LINE msgs:@\"send message failed\" err:errorMessage keyAndValues:@ @\"conversationID\", conversationID, @\"clientMsgID\", clientMsgID logLevel:2 ; keyAndValues 应只包含排查所需的非敏感标识。不要写入访问 token、完整消息内容或原始文件地址。 使用 operationID 定位调用 Objective C 公共业务 selector 不要求应用传入 operationID 。SDK 会为调用链生成标识;需要在应用诊断中取得新的链路 ID 时,可调用: NSString operationID = OIMManager manager operationId ; operationID 只用于日志关联,不是用户身份、权限凭据、业务幂等键、 conversationID 或 clientMsgID 。每条独立调用链使用新的值;多步骤业务流程另用应用自己的 trace ID 串联。 上传日志 用户明确同意提交诊断信息后,可以上传 SDK 日志: OIMManager manager uploadLogsWithProgress:^ NSInteger saveBytes, NSInteger currentBytes, NSInteger totalBytes self updateLogUploadCurrentBytes:currentBytes totalBytes:totalBytes ; line:2000 ex:@\"support ticket 42\" onSuccess:^ NSString Nullable data self showLogUploadCompleted ; onFailure:^ NSInteger code, NSString message self showLogUploadError:code message:message ; ; 上传进度 callback 依次提供已保存、当前处理和总字节数。上传前应说明收集范围,并遵守产品的隐私、用户同意和资料保留规范。" }, { - "path": "/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel", - "title": "Freeze and unfreeze a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Freeze and unfreeze a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/overview", + "title": "OpenIM Android SDK 概览", + "description": "在原生 Android 应用中使用 OpenIM Android SDK 接入用户、会话、群组、消息、通话信令和事件能力。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel moderating-a-channel freeze-and-unfreeze-a-channel", - "content": "" + "keywords": "sdk android v4 sdk android overview", + "content": "OpenIM Android SDK 用于在原生 Android 应用中接入 OpenIMSDK。选择下方领域进入对应章节。 文档导航 | 领域 | 内容 | | | | | 快速开始 /sdk/android/getting started/environment specific implementation | 接入 SDK、配置 Android 工程、认证、连接生命周期和发送第一条消息。 | | 用户与关系链 /sdk/android/user/overview user | 用户资料、在线状态、好友、好友申请和黑名单。 | | 会话 /sdk/android/conversation/overview conversation | 会话查询、草稿、未读数、接收选项、阅后即焚、隐藏和删除。 | | 群组 /sdk/android/group/overview group | 群资料、群成员、入群申请、权限、禁言和群组事件。 | | 消息 /sdk/android/message/overview message | 消息创建、发送、接收、历史记录、搜索、删除、撤回和已读回执。 | | 文件上传 /sdk/android/file uploads/upload file | 独立文件上传和上传进度。 | | 音视频通话 /sdk/android/calling/overview calling | 通话邀请、接受、拒绝、取消、挂断、房间凭据和自定义信令。 | | 事件 /sdk/android/events/overview events | 各 manager 的 listener、连接状态和数据事件。 | | 日志 /sdk/android/logger | SDK 日志配置和排查。 |" }, { - "path": "/sdk/android/channel/overview-channel", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/getting-started/before-you-start", + "title": "开始之前", + "description": "准备 OpenIMServer、用户登录信息和 Android 工程环境,再开始初始化、认证或发送消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel overview-channel", - "content": "" + "keywords": "sdk android v4 sdk android getting-started before-you-start", + "content": "在原生 Android 应用中接入 OpenIMClientSDK 前,需要准备可访问的 OpenIMServer、可信的用户认证流程,以及满足 SDK 构建要求的 Android 工程。这些条件同时适用于 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 和 发送第一条消息 /sdk/android/getting started/send first message 。 准备 OpenIMServer 如果还没有可用的 OpenIMServer,先按 Docker 部署指南 /docs/guides/quick deployment/docker 完成部署,并确认 Android 真机和模拟器均可访问以下地址: | 字段 | 说明 | | | | | apiAddr | OpenIMServer HTTP API 地址,用于登录、同步和资源请求。 | | wsAddr | OpenIMServer WebSocket 地址,用于长连接和实时事件。 | 不要只在开发电脑上验证地址。Android 模拟器中的 localhost 指向模拟器自身,不能直接访问开发电脑上的本地服务。如果 OpenIMServer 运行在开发电脑上,先将 API 和 WebSocket 端口映射到模拟器: adb reverse tcp:10002 tcp:10002 adb reverse tcp:10001 tcp:10001 映射后,模拟器中的应用可以使用 http://127.0.0.1:10002 作为 apiAddr ,使用 ws://127.0.0.1:10001 作为 wsAddr 。端口号应替换为开发电脑上实际监听的端口;执行命令前确认 adb 已连接到目标模拟器。生产环境应使用 HTTPS 与 WSS,并从真机检查 DNS、TLS 证书、防火墙、反向代理和 WebSocket 升级。 准备用户和 Token userID 标识 OpenIMSDK 用户,Token 用于认证该用户。创建或绑定用户、签发 Token 和校验业务权限都应由可信后端完成。Android 应用不能保存管理员 Token、secret 或其他服务端凭据。 后端接入 OpenIMServer REST API 前,可阅读 准备使用 Platform API /platform api/prepare to use api 和 签发会话 Token /platform api/user/managing session tokens/issue a session token 。业务后端完成自身账号认证后,只向客户端返回 SDK 登录所需的以下数据: | 数据 | 说明 | | | | | userID | 当前登录用户的 OpenIM 用户 ID。 | | token | 与该用户对应的登录 Token。 | | apiAddr | OpenIMServer HTTP API 地址。 | | wsAddr | OpenIMServer WebSocket 地址。 | userID 必须与 Token 对应。客户端不得接受任意用户 ID 后自行签发、拼装或交换管理员 Token。 准备 Android 工程 接入前,确认 Android 工程具备以下条件: 应用的 minSdk 不低于 21 ,使用 Java 8 编译选项,并将 compileSdk 设置为 36 或更高。 应用 Manifest 声明 android.permission.INTERNET ,并允许 SDK 读取网络状态。 已准备应用私有且可持久化的数据目录,例如 Application.getFilesDir 下的独立子目录;不要把 SDK 数据库放在临时缓存或共享存储中。 真机能够访问 apiAddr 、 wsAddr 以及消息媒体资源域名。 发布包覆盖目标设备 ABI;接入交付包时应核对实际包含的 native ABI。 产品已经定义断网恢复、前后台切换、Token 失效、账号被踢下线和多端登录的处理方式。 具体依赖和 Manifest 配置见 按 Android 环境接入 /sdk/android/getting started/environment specific implementation ;SDK 初始化和认证流程见 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。 继续接入 准备完成后,先完成 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。确认登录 callback 成功且 OnConnListener.onConnectSuccess 已到达,再按照 发送第一条消息 /sdk/android/getting started/send first message 验证消息链路。" + }, + { + "path": "/sdk/android/getting-started/environment-specific-implementation", + "title": "按 Android 环境接入", + "description": "在 Android 工程中添加 OpenIM Android SDK 依赖并配置网络权限。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android getting-started environment-specific-implementation", + "content": "本页只说明 Android 工程的依赖和权限配置。SDK 初始化、连接监听和登录流程见 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。 添加 SDK 依赖 在应用 module 的 build.gradle 中添加依赖: dependencies implementation 'io.openim:android sdk:latest@aar' implementation 'io.openim:core sdk:latest@aar' implementation 'com.google.code.gson:gson:2.9.0' 配置 Manifest 应用需要网络访问权限: 下一步 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 发送第一条消息 /sdk/android/getting started/send first message" + }, + { + "path": "/sdk/android/getting-started/authenticate-and-manage-session", + "title": "认证与管理登录会话", + "description": "使用 OpenIM Android SDK 初始化、登录、查询登录状态、处理连接 callback 并退出当前账号。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android getting-started authenticate-and-manage-session", + "content": "OpenIM Android SDK 使用 initSDK 初始化本机运行环境,再使用 login 建立当前用户的登录会话。开始认证前,应先完成 开始之前 /sdk/android/getting started/before you start 列出的服务、用户和 Token 准备,并按 按 Android 环境接入 /sdk/android/getting started/environment specific implementation 添加依赖和权限。 完整流程如下: 1. 在应用级会话组件中创建稳定的 OnConnListener 。 2. 调用 initSDK 并确认返回 true 。 3. 在登录前设置消息、用户、好友、会话、群组和通话信令 listener。 4. 从可信后端取得对应的 userID 与 Token,然后调用 login 。 5. 分别等待登录 callback 成功与 onConnectSuccess ,再开放依赖连接的业务操作。 6. 主动退出或切换账号时调用 logout ,完成后清理当前账号的应用状态。 下文中的 apiAddr 、 wsAddr 、 userID 和 token 均由可信后端提供。 初始化并处理连接生命周期 在 Application 生命周期内创建数据目录、初始化 SDK,并传入连接 listener。应用应保存连接状态,但不要在 callback 中记录 Token 或完整服务凭据。 import android.app.Application; import java.io.File; import io.openim.android.sdk.OpenIMClient; import io.openim.android.sdk.enums.LogLevel; import io.openim.android.sdk.listener.OnConnListener; import io.openim.android.sdk.models.InitConfig; File dataDirectory = new File application.getFilesDir , \"openim\" ; if dataDirectory.exists && dataDirectory.mkdirs throw new IllegalStateException \"Cannot create the OpenIM data directory.\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = LogLevel.Info; config.isLogStandardOutput = false; OnConnListener connectionListener = new OnConnListener @Override public void onConnecting sessionState.setConnectionState \"connecting\" ; @Override public void onConnectSuccess sessionState.setConnectionState \"connected\" ; sessionState.enableConnectedOperations ; @Override public void onConnectFailed long code, String error sessionState.setConnectionState \"failed\" ; recordConnectionFailure code, error ; @Override public void onKickedOffline sessionState.clearCurrentAccount ; showSignedInElsewhereScreen ; @Override public void onUserTokenExpired requestNewTokenAndRelogin ; @Override public void onUserTokenInvalid String reason sessionState.clearCurrentAccount ; showSignInScreen reason ; ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; if initialized throw new IllegalStateException \"OpenIMClientSDK initialization failed.\" ; initSDK 返回 true 表示 SDK 本地运行环境初始化成功。 OnConnListener 的连接 callback 在调用 login 后开始反映长连接状态。 | 字段 | 类型 | 说明 | | | | | | application | Application | 应用级 Context,用于持有 SDK 生命周期。 | | apiAddr | String | OpenIMServer HTTP API 地址。 | | wsAddr | String | OpenIMServer WebSocket 地址。 | | dataDirectory | File | SDK 数据库和日志使用的应用私有持久化目录。 | | config.logLevel | int | 使用 LogLevel 常量;正式环境应主动收敛日志级别。 | | isLogStandardOutput | boolean | 是否把 SDK Core 日志输出到标准日志流。 | SDK 只应在 Application 或应用级会话组件中初始化一次。当前 Java wrapper 公开 networkChanged ,用于通知 Core 重新检查网络;只有在应用已经统一监听系统网络变化时才调用,不能由多个页面重复注册网络 callback。 在登录前设置业务 listener SDK 的 listener 注册方法采用 set 语义,后一次设置会替换前一次设置。应由应用级事件中心创建稳定 listener,再把事件分发给页面状态层。消息 listener 的完整注册与增量合并示例见 发送第一条消息 /sdk/android/getting started/send first message ;用户、好友、会话、群组和通话信令 listener 采用相同的集中注册原则。 SDK 没有公开的 remove/unset 方法。退出或切换账号时,应用事件中心应停止向旧账号页面分发 callback,并在下次登录前用新账号对应的完整 listener 组合覆盖设置。 登录当前用户 OpenIMClient.getInstance .login new OnBase @Override public void onError int code, String error sessionState.setLoginState \"failed\" ; recordLoginFailure code, error ; @Override public void onSuccess String data sessionState.setLoginState \"logged\" ; sessionState.setCurrentUserID userID ; , userID, token ; login 的成功 callback 表示当前登录调用完成; OnConnListener.onConnectSuccess 表示长连接可用。这两个阶段必须分别处理。不要并发调用 login ,也不要仅凭某一个 callback 同时推断登录与连接状态。 查询登录状态 int loginStatus = OpenIMClient.getInstance .getLoginStatus ; if loginStatus == LoginStatus.Logged String currentUserID = OpenIMClient.getInstance .getLoginUserID ; restoreSessionFor currentUserID ; | 状态 | 说明 | | | | | LoginStatus.Logout | SDK 当前未登录。 | | LoginStatus.Logging | 登录正在进行,不应再次发起并行登录。 | | LoginStatus.Logged | SDK 已登录;网络是否连接仍以 OnConnListener 为准。 | getLoginStatus 和 getLoginUserID 返回本地 SDK 状态快照,不会触发连接 callback。切换账号时应先退出旧账号,而不是直接用新参数覆盖当前登录。 处理 Token 和强制下线 收到 onUserTokenExpired 或 onUserTokenInvalid 后,应重新向可信后端取得当前用户凭据,再按产品策略重新登录或返回登录页。收到 onKickedOffline 时,应清理当前用户的会话列表、消息视图、未读数和其他业务状态,不能把它当作用户主动退出。 这些 callback 没有业务实体合并键,应按当前 OpenIMClient 单例和登录用户隔离状态。旧账号的异步任务和页面订阅必须在新账号登录前停止。 主动退出与释放 SDK OpenIMClient.getInstance .logout new OnBase @Override public void onError int code, String error recordLogoutFailure code, error ; @Override public void onSuccess String data sessionState.clearCurrentAccount ; ; logout 成功表示当前 SDK 登录会话已退出。应用状态清理应在成功 callback 后执行;切换账号时,等待旧账号退出完成后再调用新账号的 login 。 应用最终不再使用 SDK 时可以调用: OpenIMClient.getInstance .unInit ; unInit 用于释放 SDK 运行环境,不是 logout 的替代品,也不应在普通页面销毁时调用。 下一步 开始之前 /sdk/android/getting started/before you start 按 Android 环境接入 /sdk/android/getting started/environment specific implementation 发送第一条消息 /sdk/android/getting started/send first message" }, { "path": "/sdk/android/getting-started/send-first-message", - "title": "Send your first message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send your first message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "title": "发送第一条消息", + "description": "在 Android 应用中发送并验证第一条单聊文本消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android getting-started send-first-message", - "content": "" + "content": "本页用一条单聊文本消息验证 OpenIM 已接入成功。开始前,先按 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 完成 SDK 初始化和登录。 开始前准备 为发送方和接收方各准备一个测试账号。 两个账号都需要按 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 完成 SDK 初始化;接收方需要在登录前设置下面的消息 listener。 将示例中的 user b 替换为接收方的真实 userID 。 第 1 步:让接收方监听新消息 接收方在登录前设置消息 listener。收到消息后,将它加入页面消息列表或刷新界面即可。 OpenIMClient.getInstance .messageManager .setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message // 将 message 显示在聊天界面中。 ; 第 2 步:确认可以发送 两个账号登录后,发送方的登录 callback 成功且 OnConnListener.onConnectSuccess 已到达,即可发送消息。接收方也应保持连接,以便收到新消息。连接尚未成功时,先等待连接恢复,不要重复调用 login 。 第 3 步:发送文本消息 发送单聊文本消息 先创建消息,再发送它。第三个目标参数填写接收方 userID ,群组目标参数保持空字符串。 Message message = OpenIMClient.getInstance .messageManager .createTextMessage \"你好,OpenIMSDK\" ; OnMsgSendCallback sendCallback = new OnMsgSendCallback @Override public void onProgress long progress // 文本消息通常不需要处理进度。 @Override public void onError int code, String error // 提示发送失败,并允许用户重试。 @Override public void onSuccess Message sentMessage // 将 sentMessage 更新到发送方的聊天界面。 ; OpenIMClient.getInstance .messageManager.sendMessage sendCallback, message, \"user b\", \"\", new OfflinePushInfo ; OfflinePushInfo 用于配置离线推送内容。首次验证时可以传入空对象,后续再按产品需要设置标题、摘要和扩展数据。 onSuccess 表示发送方已成功发送消息;接收方的 onRecvNewMessage 表示另一端已收到消息。这两个回调都会到达,才说明这次单聊验证完成。 发送群聊文本消息 发送群消息时,将接收方 userID 改为空字符串,并填写群组的 groupID : Message groupMessage = OpenIMClient.getInstance .messageManager .createTextMessage \"大家好,OpenIMSDK\" ; OpenIMClient.getInstance .messageManager.sendMessage sendCallback, groupMessage, \"\", \"group 123\", new OfflinePushInfo ; 一次调用只能填写 userID 或 groupID 其中之一。 验证成功 发送方进入 onSuccess 。 接收方进入 onRecvNewMessage ,并看到文本消息。 单聊只填写接收方 userID ;群聊只填写 groupID 。 下一步 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session OpenIM Android SDK 概览 /sdk/android/overview" }, { - "path": "/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message", - "title": "Add extra data to a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add extra data to a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/overview-user", + "title": "用户概览", + "description": "了解 Android SDK 中的用户资料、好友关系、好友申请、黑名单和在线状态 API。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message adding-extra-data-to-a-message add-extra-data-to-a-message", - "content": "" + "keywords": "sdk android v4 sdk android user overview-user", + "content": "OpenIM Android SDK 使用 userID 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。 群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。 用户类型 Android SDK 会根据使用场景返回不同的用户对象: | 类型 | 适用场景 | 主要 API | | | | | | LocalUser | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | getSelfLocalUserInfo 、 setSelfInfo | | PublicUserInfo | 查询应用用户、查找好友候选人和展示陌生人资料卡 | getUsersInfo | | UserInfo | Android wrapper 返回的组合对象,可承载公开资料、好友资料或黑名单资料 | getFriendListPage 、 getFriendsInfo 、 getBlacklist | | FriendInfo | 当前用户的好友列表、好友备注和关系扩展字段 | searchFriends 、 getFriendListPage | | FriendApplicationInfo | 好友申请双方、处理状态和附言 | 好友申请查询与 listener | | BlacklistInfo | 当前用户拉黑的用户及黑名单关系字段 | getBlacklist 、 addBlacklist 、 removeBlacklist | | UsersOnlineStatus | 用户在线状态和在线平台列表 | subscribeUsersOnlineStatus 、 getSubscribeOnlineUsersStatus | 同一个 userID 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 UserInfo.getFriendInfo ;只需要账号公开资料时使用 PublicUserInfo ;黑名单页面使用 UserInfo.getBlackInfo 。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。 所有列表和事件都应使用 userID 作为稳定标识。好友申请同时包含申请方和接收方,应使用 fromUserID:toUserID 标识一条申请。 功能入口 下表列出了用户相关的常见需求和对应页面: | 需求 | 推荐页面 | | | | | 按 userID 查询公开资料,用于查找好友候选人或展示资料卡 | 获取指定用户资料 /sdk/android/user/user profile/get users info | | 分页、搜索或按 ID 查询好友关系 | 分页获取好友列表 /sdk/android/user/friends/get friend list page | | 发送、查询、接受或拒绝好友申请 | 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list | | 修改好友资料 | 更新好友资料 /sdk/android/user/friends/update friends | | 删除好友关系 | 删除好友 /sdk/android/user/friends/delete friend | | 查看和维护当前用户黑名单 | 获取黑名单列表 /sdk/android/user/blacklist/get blacklist | | 读取或更新当前用户的昵称、头像和扩展资料 | 更新当前用户资料 /sdk/android/user/user profile/set self info | | 设置账号级消息接收和通知策略 | 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception | | 订阅和读取在线状态 | 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status | 状态更新 用户相关事件由对应能力页负责监听和合并: 当前用户资料变化:见 更新当前用户资料 /sdk/android/user/user profile/set self info 。 好友申请变化:见 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 。 好友关系和好友资料变化:见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。 黑名单变化:见 拉黑用户 /sdk/android/user/blacklist/add blacklist 。 在线状态变化:见 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 。 Android SDK 的 UserInfoManager 和 FriendshipManager 各保存一个 listener, setOnUserListener 和 setOnFriendshipListener 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。" }, { - "path": "/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message", - "title": "Generate thumbnails of a file message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Generate thumbnails of a file message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/user-profile/get-users-info", + "title": "获取指定用户资料", + "description": "使用 getUsersInfo() 按 userID 批量查询用户公开资料。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message generate-thumbnails-of-a-file-message", - "content": "" + "keywords": "sdk android v4 sdk android user user-profile get-users-info", + "content": "getUsersInfo 根据 userID 列表返回用户的公开资料,适合展示好友候选人或陌生人资料卡。该方法只读取公开资料,不返回当前账号为好友设置的备注等关系字段。 List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.getUsersInfo new OnBase @Override public void onSuccess List users for PublicUserInfo user : users publicUserStore.put user.getUserID , user ; @Override public void onError int code, String error recordUserQueryFailure code, error ; , userIDs ; 调用前应去除空值和重复 ID,并控制单次请求的数量。成功 callback 返回 List ,主要字段包括 userID 、 nickname 、 faceURL 、 ex 和 createTime 。查询不会触发 OnUserListener ,需要刷新资料时应重新调用并按 userID 合并结果。 返回结果 | 字段 | 说明 | | | | | userID | OpenIM 用户 ID,也是本地缓存的稳定 key。 | | nickname | 账号级公开昵称。 | | faceURL | 账号级公开头像地址。 | | ex | 账号级公开扩展字符串,格式由业务约定。 | | createTime | 用户资料创建时间。 | PublicUserInfo 中的资料不能用于覆盖好友备注、置顶状态或群内昵称。展示好友时应使用 FriendInfo ,展示群成员时应使用群成员模型。 按昵称、手机号或邮箱搜索用户属于业务服务能力,应由可信后端完成搜索和权限校验,再把候选 userID 交给客户端查询公开资料。 资料刷新 查询成功后,以返回结果更新公开资料快照。打开资料卡、用户主动刷新、断线重连或业务后端通知资料变化时,可以重新调用该方法校准数据。 OnUserListener.onSelfInfoUpdated 只表示当前登录用户资料变化,不能作为其他用户资料变化事件。" }, { - "path": "/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel", - "title": "React to a message in a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for React to a message in a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/user-profile/get-self-local-user-info", + "title": "获取当前用户资料", + "description": "使用 getSelfLocalUserInfo() 获取当前登录用户的本地资料。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message react-to-a-message-in-a-group-channel", - "content": "" + "keywords": "sdk android v4 sdk android user user-profile get-self-local-user-info", + "content": "OpenIMClient.getInstance .userInfoManager.getSelfLocalUserInfo new OnBase @Override public void onSuccess LocalUser user currentUserStore.set user ; @Override public void onError int code, String error recordSelfProfileFailure code, error ; ; 完成初始化并登录后调用该方法获取当前账号的本地资料。成功 callback 返回 LocalUser ,包含 userID 、 nickname 、 faceURL 、 ex 、 attachedInfo 、 globalRecvMsgOpt 和 addFriendPermission 等字段。 返回结果 | 字段 | 说明 | | | | | userID | 当前登录用户 ID。 | | nickname | 当前账号昵称。 | | faceURL | 当前账号头像地址。 | | ex | 当前账号扩展字符串。 | | attachedInfo | SDK 附加信息,只按业务约定解析。 | | globalRecvMsgOpt | 全局消息接收方式: 0 正常接收, 1 不接收, 2 接收但不提示。 | | addFriendPermission | 添加好友权限值,具体含义由服务端契约定义。 | 查询不会触发资料变更 callback。退出或切换账号时应清理旧账号快照,避免把上一个账号的资料显示在当前页面。 getSelfUserInfo 已废弃,不作为推荐用法。" }, { - "path": "/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members", - "title": "Send typing indicators to other members", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send typing indicators to other members. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/user-profile/set-self-info", + "title": "更新当前用户资料", + "description": "使用 setSelfInfo() 更新当前用户的昵称、头像或扩展资料。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message send-typing-indicators-to-other-members", - "content": "" + "keywords": "sdk android v4 sdk android user user-profile set-self-info", + "content": "使用 UserInfoReq 只设置实际需要修改的字段。SDK 序列化请求时会忽略 null 字段。 UserInfoReq request = new UserInfoReq ; request.setNickname displayName.trim ; request.setFaceURL avatarURL ; request.setEx mergedExtra ; OpenIMClient.getInstance .userInfoManager.setSelfInfo new OnBase @Override public void onSuccess String data markProfileUpdateSubmitted ; @Override public void onError int code, String error recordProfileUpdateFailure code, error ; , request ; UserInfoReq 支持 nickname 、 faceURL 、 ex 和 addFriendPermission 等字段。 ex 是完整字符串,更新前应读取、解析并合并业务自己的命名空间;不要把部分 JSON 直接覆盖到服务端。 成功 callback 表示更新请求完成;当前账号资料的最终增量通过 onSelfInfoUpdated UserInfo info 到达,或重新调用 getSelfLocalUserInfo 校准。 更新字段 | 字段 | 说明 | | | | | nickname | 要更新的昵称。 | | faceURL | 要更新的头像地址。 | | ex | 完整扩展字符串。 | | addFriendPermission | 添加好友权限值。 | 一次请求只写入需要变更的字段。全局消息接收策略虽然也由 setSelfInfo 写入,但应使用独立入口,见 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception 。 onSelfInfoUpdated 由本页归属,应组合进应用唯一的 OnUserListener : @Override public void onSelfInfoUpdated UserInfo info currentUserStore.merge info.getUserID , info ; 账号级消息接收策略也通过 UserInfoReq 更新,但应使用独立入口,见 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception 。" }, { - "path": "/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message", - "title": "Pin a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Pin a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/user-profile/set-global-message-reception", + "title": "设置全局消息接收方式", + "description": "通过 setSelfInfo() 设置当前账号的全局消息接收与通知策略。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-pinned-messages-in-group-channels pin-a-message", - "content": "" + "keywords": "sdk android v4 sdk android user user-profile set-global-message-reception", + "content": "使用独立的 UserInfoReq 写入 globalRecvMsgOpt ,避免在更新昵称或头像时意外覆盖账号级消息策略。 UserInfoReq request = new UserInfoReq ; request.setGlobalRecvMsgOpt 2 ; OpenIMClient.getInstance .userInfoManager.setSelfInfo new OnBase @Override public void onSuccess String data markGlobalReceiveOptionSubmitted ; @Override public void onError int code, String error recordGlobalReceiveOptionFailure code, error ; , request ; | 数值 | 含义 | | | | | 0 | 正常接收消息并允许通知。 | | 1 | 屏蔽消息。 | | 2 | 接收消息但不提示。 | 如果产品只提供“全局免打扰”开关,通常在 0 和 2 之间切换; 1 会停止接收消息,应单独展示。单个会话的接收方式由会话 API 管理,不受本设置替代。 成功 callback 表示请求完成。最终账号快照通过 onSelfInfoUpdated 或 getSelfLocalUserInfo 校准,事件处理见 更新当前用户资料 /sdk/android/user/user profile/set self info 。" }, { - "path": "/sdk/android/message/managing-polls/create-a-poll", - "title": "Create a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/online-status/subscribe-users-online-status", + "title": "订阅用户在线状态", + "description": "使用 subscribeUsersOnlineStatus() 订阅指定用户的在线状态。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls create-a-poll", - "content": "" + "keywords": "sdk android v4 sdk android user online-status subscribe-users-online-status", + "content": "List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.subscribeUsersOnlineStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusSubscriptionFailure code, error ; , userIDs ; 调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 List 快照,每项包含 userID 、 status 和 platformIDs 。重复订阅同一个用户时,应由应用层去重并保留一份状态。 状态字段 | 字段 | 说明 | | | | | userID | 目标用户 ID。 | | status | 在线状态值,具体枚举含义以服务端契约为准。 | | platformIDs | 当前在线的平台 ID 列表。 | onUserStatusChanged 由本页归属,应组合进应用唯一的 OnUserListener ,并按 userID 合并: @Override public void onUserStatusChanged UsersOnlineStatus status onlineStatusStore.put status.getUserID , status ; 订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合;Android API 未提供可验证的取消订阅入口,因此不在文档中记录取消订阅调用。" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", - "title": "Create a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "title": "查询已订阅用户状态", + "description": "使用 getSubscribeOnlineUsersStatus() 获取已订阅用户的在线状态快照。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel create-a-scheduled-message", - "content": "" + "keywords": "sdk android v4 sdk android user online-status get-subscribe-online-users-status", + "content": "OpenIMClient.getInstance .userInfoManager.getSubscribeOnlineUsersStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusQueryFailure code, error ; ; 该方法不接收用户 ID,也不改变订阅集合。成功 callback 返回当前已订阅用户的 List 状态快照,适合在重连或重新进入页面时按 userID 校准状态。 查询本身不会触发 onUserStatusChanged 。状态快照只应覆盖在线状态存储,不要覆盖用户昵称、头像等资料字段;需要资料时分别调用用户资料 API。" }, { - "path": "/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", - "title": "Mark messages as delivered", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as delivered. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/get-friend-list-page", + "title": "分页获取好友列表", + "description": "使用 getFriendListPage() 分页获取当前用户的好友列表。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message marking-messages-as-delivered-in-a-group-channel mark-messages-as-delivered", - "content": "" + "keywords": "sdk android v4 sdk android user friends get-friend-list-page", + "content": "OpenIMClient.getInstance .friendshipManager.getFriendListPage new OnBase @Override public void onSuccess List friends for UserInfo friend : friends friendStore.put friend.getUserID , friend ; @Override public void onError int code, String error recordFriendListFailure code, error ; , 0, 40, true ; 参数依次为 offset 、 count 和 filterBlack 。 offset 从 0 开始, count 是页大小, filterBlack 为 true 时过滤黑名单用户。成功 callback 返回当前页 List ,好友关系详情可通过 getFriendInfo 读取。继续加载下一页时按实际请求数量增加 offset ;返回数量小于 count 时通常表示到达末页。 只使用分页 API,不使用非分页的 getFriendList 。快照和增量都应按 userID 合并。 好友资料字段 UserInfo 是 Android wrapper 的组合对象。好友列表中的 getFriendInfo 返回 FriendInfo ,常用字段如下: | 字段 | 说明 | | | | | userID | 好友用户 ID,也是好友列表的稳定标识。 | | nickname | 好友账号昵称。 | | faceURL | 好友账号头像地址。 | | remark | 当前账号设置的好友备注。 | | ex | 好友关系扩展字符串。 | | addSource | 好友关系添加来源。 | | operatorUserID | 建立或更新关系的操作用户 ID。 | | createTime | 好友关系创建时间。 | nickname 和 faceURL 是账号资料, remark 和 ex 属于好友关系。 UpdateFriendsReq 支持提交 isPinned ,但当前 Android FriendInfo 模型不提供对应读取字段,置顶状态应由业务层单独维护。不要用好友对象覆盖陌生人的 PublicUserInfo ,也不要把好友备注写回账号昵称。 本页归属好友新增、资料变化和删除事件。以下 callback 应组合进应用唯一的 OnFriendshipListener : @Override public void onFriendAdded FriendInfo friend friendStore.put friend.getUserID , friend ; @Override public void onFriendInfoChanged FriendInfo friend friendStore.put friend.getUserID , friend ; @Override public void onFriendDeleted FriendInfo friend friendStore.remove friend.getUserID ;" }, { - "path": "/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "title": "Mention other users in a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mention other users in a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/search-friends", + "title": "搜索好友", + "description": "使用 searchFriends() 搜索当前用户的好友。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message mentioning-other-users-in-a-message mention-other-users-in-a-message", - "content": "" + "keywords": "sdk android v4 sdk android user friends search-friends", + "content": "OpenIMClient.getInstance .friendshipManager.searchFriends new OnBase @Override public void onSuccess List results showFriendSearchResults results ; @Override public void onError int code, String error recordFriendSearchFailure code, error ; , Collections.singletonList keyword.trim , true, true, true ; keywordList 当前只传一个非空关键词。后面的三个布尔值依次控制是否匹配用户 ID、昵称和好友备注,至少应启用一种匹配方式。需要同时搜索多个字段时,将对应开关设为 true ;不支持把多个关键词作为同一请求的独立搜索条件。 成功 callback 返回 List 。搜索结果只属于当前搜索视图,不应覆盖完整好友列表,也不会触发好友 listener。" }, { - "path": "/sdk/android/message/overview-message", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/get-friends-info", + "title": "查询指定好友资料", + "description": "使用 getFriendsInfo() 查询指定用户的好友关系资料。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message overview-message", - "content": "" + "keywords": "sdk android v4 sdk android user friends get-friends-info", + "content": "OpenIMClient.getInstance .friendshipManager.getFriendsInfo new OnBase @Override public void onSuccess List friends for UserInfo friend : friends friendStore.put friend.getUserID , friend ; @Override public void onError int code, String error recordFriendInfoFailure code, error ; , Arrays.asList \"user a\", \"user b\" , true ; 第二个参数是目标用户 ID 列表, filterBlack 决定是否过滤黑名单用户。成功 callback 返回 List ;通过 getFriendInfo 读取好友备注和关系字段,并按 userID 合并。调用前应去除空值和重复 ID。 当目标用户不是好友,或目标用户因 filterBlack == true 被过滤时,返回结果中可能没有对应记录。需要同时展示账号公开资料时,应再调用 获取指定用户资料 /sdk/android/user/user profile/get users info ,并按 userID 合并两类数据。 该查询不会触发好友 listener。只需要判断好友关系时使用 checkFriend /sdk/android/user/friends/check friend 。" }, { - "path": "/sdk/android/message/retrieving-messages/retrieve-a-message", - "title": "Retrieve a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/check-friend", + "title": "检查好友关系", + "description": "使用 checkFriend() 检查指定用户是否为当前用户的好友。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-messages retrieve-a-message", - "content": "" + "keywords": "sdk android v4 sdk android user friends check-friend", + "content": "OpenIMClient.getInstance .friendshipManager.checkFriend new OnBase @Override public void onSuccess List relations showFriendshipStates relations ; @Override public void onError int code, String error recordFriendshipCheckFailure code, error ; , Arrays.asList \"user a\", \"user b\" ; 成功 callback 返回 List 。每项的 userID 标识目标用户, result == 1 表示目标是好友且不在黑名单中。 result 以服务端返回值为准,不应在客户端扩展未声明的状态枚举。 该方法只建立关系快照,不触发好友 listener。需要昵称、头像或好友备注时使用 getFriendsInfo /sdk/android/user/friends/get friends info 。" }, { - "path": "/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", - "title": "Search messages by a keyword", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Search messages by a keyword. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/update-friends", + "title": "更新好友资料", + "description": "使用 updateFriendsReq() 更新好友备注、置顶状态或扩展字段。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message searching-messages-in-a-group-channel search-messages-by-a-keyword", - "content": "" + "keywords": "sdk android v4 sdk android user friends update-friends", + "content": "UpdateFriendsReq request = new UpdateFriendsReq ; request.setFriendUserIDs new String friendUserID ; request.setRemark remark.trim ; OpenIMClient.getInstance .friendshipManager.updateFriendsReq new OnBase @Override public void onSuccess String data markFriendUpdateSubmitted ; @Override public void onError int code, String error recordFriendUpdateFailure code, error ; , request ; UpdateFriendsReq 可设置 friendUserIDs 、 remark 、 isPinned 和 ex 。一次调用会把同一字段值应用到全部目标好友;不同好友需要不同值时应分别调用。 ex 是完整字符串。 | 字段 | 说明 | | | | | friendUserIDs | 待更新的好友 ID 数组。 | | remark | 当前账号设置的好友备注。 | | isPinned | 是否置顶好友。 | | ex | 好友关系扩展字符串,按完整值覆盖。 | 成功 callback 表示更新请求完成。好友资料增量通过 onFriendInfoChanged 合并,事件处理见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。" }, { - "path": "/sdk/android/message/sending-a-message/share-an-encrypted-file", - "title": "Share an encrypted file", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Share an encrypted file. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/delete-friend", + "title": "删除好友", + "description": "使用 deleteFriend() 删除当前用户的一条好友关系。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message share-an-encrypted-file", - "content": "" + "keywords": "sdk android v4 sdk android user friends delete-friend", + "content": "OpenIMClient.getInstance .friendshipManager.deleteFriend new OnBase @Override public void onSuccess String data markFriendDeletionSubmitted friendUserID ; @Override public void onError int code, String error recordFriendDeletionFailure code, error ; , friendUserID ; 成功 callback 表示删除请求完成。 onFriendDeleted 到达后再按 userID 从好友状态中移除记录,事件处理见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。" }, { - "path": "/sdk/android/message/sending-a-message/smart-throttling", - "title": "Smart throttling", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Smart throttling. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/add-friend", + "title": "发送好友申请", + "description": "使用 addFriend() 向指定用户发送好友申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message smart-throttling", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications add-friend", + "content": "OpenIMClient.getInstance .friendshipManager.addFriend new OnBase @Override public void onSuccess String data markFriendApplicationSubmitted ; @Override public void onError int code, String error recordFriendApplicationFailure code, error ; , \"user b\", \"你好,我是 Alex\" ; 第二个参数是申请接收方的 userID ,第三个参数是申请附言。成功 callback 表示服务端已收到申请,不表示对方已经同意。目标用户 ID 不能为空;按昵称、手机号等字段搜索目标用户应先由业务后端完成。 好友申请状态变化通过 OnFriendshipListener 合并,见 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 。" }, { - "path": "/sdk/android/message/translating-messages/auto-translate-messages", - "title": "Auto-translate messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Auto-translate messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "title": "获取收到的好友申请", + "description": "使用 getRecvFriendApplicationList() 分页查询当前用户收到的好友申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message translating-messages auto-translate-messages", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications get-recv-friend-application-list", + "content": "GetFriendApplicationListAsRecipientReq request = new GetFriendApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .friendshipManager.getRecvFriendApplicationList new OnBase @Override public void onSuccess List applications replaceReceivedApplications applications ; @Override public void onError int code, String error recordReceivedApplicationFailure code, error ; , request ; offset 从 0 开始, count 是页大小。需要筛选处理状态时可通过 setHandleResults int 设置服务端约定的状态值。成功 callback 返回当前页 List 。 | 字段 | 说明 | | | | | fromUserID / fromNickname / fromFaceURL | 申请发起人的 ID、昵称和头像快照。 | | toUserID / toNickname / toFaceURL | 申请接收人的 ID、昵称和头像快照。 | | reqMsg | 申请附言。 | | handleResult | 处理结果: 0 待处理, 1 已同意, 2 已拒绝。 | | handlerUserID | 执行处理的用户 ID,待处理时可能为空。 | | handleMsg | 处理附言。 | | handleTime | 处理时间,待处理时不应作为有效时间使用。 | | createTime | 申请记录创建时间。 | | ex | 申请记录扩展字符串。 | 好友申请使用 fromUserID:toUserID 作为稳定标识。本页归属好友申请新增、接受、拒绝和删除事件,以下 callback 应组合进应用唯一的 OnFriendshipListener : @Override public void onFriendApplicationAdded FriendApplicationInfo application friendApplicationStore.merge application ; @Override public void onFriendApplicationAccepted FriendApplicationInfo application friendApplicationStore.merge application ; @Override public void onFriendApplicationRejected FriendApplicationInfo application friendApplicationStore.merge application ; @Override public void onFriendApplicationDeleted FriendApplicationInfo application friendApplicationStore.remove application.getFromUserID , application.getToUserID ; 按 toUserID 是否等于当前登录用户 ID,将记录分流到收到或发出的列表。申请被接受后,新好友关系由 分页获取好友列表 /sdk/android/user/friends/get friend list page 归属的 onFriendAdded 合并。" }, { - "path": "/sdk/android/message/translating-messages/translate-messages-on-demand", - "title": "Translate messages on-demand", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Translate messages on-demand. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "title": "获取发出的好友申请", + "description": "使用 getSendFriendApplicationList() 分页查询当前用户发出的好友申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message translating-messages translate-messages-on-demand", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications get-send-friend-application-list", + "content": "GetFriendApplicationListAsApplicantReq request = new GetFriendApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .friendshipManager.getSendFriendApplicationList new OnBase @Override public void onSuccess List applications replaceSentApplications applications ; @Override public void onError int code, String error recordSentApplicationFailure code, error ; , request ; offset 从 0 开始, count 是页大小。成功 callback 返回当前页 List ;按 fromUserID:toUserID 合并。查询只建立快照,不触发好友申请事件。 发出的申请中,当前用户通常是 fromUserID 。列表字段和处理结果含义与 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 相同;申请处理状态使用 Android 服务端约定的 0 (待处理)、 1 (已同意)和 2 (已拒绝)。" }, { - "path": "/sdk/android/message/using-message-threading/create-a-message-thread", - "title": "Create a message thread", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a message thread. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/accept-friend-application", + "title": "接受好友申请", + "description": "使用 acceptFriendApplication() 接受好友申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message using-message-threading create-a-message-thread", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications accept-friend-application", + "content": "OpenIMClient.getInstance .friendshipManager.acceptFriendApplication new OnBase @Override public void onSuccess String data markApplicationAccepted applicantUserID ; @Override public void onError int code, String error recordApplicationAcceptFailure code, error ; , applicantUserID, \"已通过\" ; applicantUserID 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示接受请求完成;好友申请状态和新增好友关系可能通过不同 callback 到达,应分别合并。申请状态由 onFriendApplicationAccepted 更新,新好友关系由 onFriendAdded 更新。" }, { - "path": "/sdk/android/overview", - "title": "OpenIM SDK for Android", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for OpenIM SDK for Android. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/refuse-friend-application", + "title": "拒绝好友申请", + "description": "使用 refuseFriendApplication() 拒绝好友申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android overview", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications refuse-friend-application", + "content": "OpenIMClient.getInstance .friendshipManager.refuseFriendApplication new OnBase @Override public void onSuccess String data markApplicationRejected applicantUserID ; @Override public void onError int code, String error recordApplicationRejectFailure code, error ; , applicantUserID, \"暂不添加\" ; applicantUserID 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示拒绝请求完成;申请状态通过统一好友申请 listener 合并,并最终以 handleResult == 2 表示已拒绝。" }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences", - "title": "Configure push notification preferences", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Configure push notification preferences. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/blacklist/get-blacklist", + "title": "获取黑名单列表", + "description": "使用 getBlacklist() 获取当前用户的黑名单。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications configure-push-notification-preferences", - "content": "" + "keywords": "sdk android v4 sdk android user blacklist get-blacklist", + "content": "黑名单记录当前用户主动拉黑的用户,可用于黑名单设置页、资料卡中的关系状态和聊天入口限制。黑名单与群成员管理是独立能力;禁言、移除群成员或调整群角色时,应使用群组 API。 获取黑名单 完成 SDK 初始化并登录后,调用 getBlacklist 获取当前账号的完整黑名单。返回空列表表示当前没有黑名单用户。 OpenIMClient.getInstance .friendshipManager.getBlacklist new OnBase @Override public void onSuccess List users blacklistStore.replace users ; @Override public void onError int code, String error recordBlacklistFailure code, error ; ; 成功 callback 返回 List ;通过 UserInfo.getBlackInfo 读取黑名单关系对象。 黑名单记录字段 BlacklistInfo 的常用字段如下: | 字段 | 说明 | | | | | userID | 被当前用户拉黑的目标用户 ID,也是列表的稳定 key。 | | nickname | 目标用户昵称快照。 | | faceURL | 目标用户头像地址。 | | gender | 目标用户性别值。 | | operatorUserID | 执行拉黑操作的用户 ID。 | | createTime | 黑名单关系创建时间。 | | addSource | 黑名单关系的添加来源。 | | ex | 黑名单关系扩展字符串。 | 如果页面还要展示好友备注或最新公开资料,应按 userID 额外合并 FriendInfo 或 PublicUserInfo ,不能把黑名单字段当作好友资料。 黑名单状态统一按 userID 合并。查询本身不会触发黑名单新增或删除事件。 首次进入页面、重连或用户主动刷新时,使用返回的完整列表替换本地快照;增量变化由 拉黑用户 /sdk/android/user/blacklist/add blacklist 和 取消拉黑用户 /sdk/android/user/blacklist/remove blacklist 页面归属的 listener 处理。" }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/push-notification-translation", - "title": "Push notification translation", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Push notification translation. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/blacklist/add-blacklist", + "title": "拉黑用户", + "description": "使用 addBlacklist() 将用户加入当前账号黑名单。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications push-notification-translation", - "content": "" + "keywords": "sdk android v4 sdk android user blacklist add-blacklist", + "content": "OpenIMClient.getInstance .friendshipManager.addBlacklist new OnBase @Override public void onSuccess String data markBlacklistRequestSubmitted targetUserID ; @Override public void onError int code, String error recordBlacklistAddFailure code, error ; , targetUserID, \" \\\"source\\\":\\\"profile menu\\\" \" ; 第二个参数是目标 userID ,第三个参数是可选扩展字符串。无需扩展信息时可使用不带 ex 的重载。成功 callback 表示拉黑请求完成,不表示事件已经到达。 黑名单是单向关系:被拉黑用户不能向当前用户发送消息,但当前用户是否允许继续向对方发送消息由业务层决定。 ex 是完整字符串,更新前应合并业务自己的扩展字段。 onBlacklistAdded 由本页归属,应组合进应用唯一的 OnFriendshipListener : @Override public void onBlacklistAdded BlacklistInfo user blacklistStore.put user.getUserID , user ;" }, { - "path": "/sdk/android/push-notifications/overview-push-notifications", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/blacklist/remove-blacklist", + "title": "取消拉黑用户", + "description": "使用 removeBlacklist() 将用户移出当前账号黑名单。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications overview-push-notifications", - "content": "" + "keywords": "sdk android v4 sdk android user blacklist remove-blacklist", + "content": "OpenIMClient.getInstance .friendshipManager.removeBlacklist new OnBase @Override public void onSuccess String data markBlacklistRemovalSubmitted targetUserID ; @Override public void onError int code, String error recordBlacklistRemovalFailure code, error ; , targetUserID ; 成功 callback 表示移除请求完成,不表示事件已经到达。黑名单快照应在 onBlacklistDeleted 到达后按 userID 删除;如果事件丢失,可重新调用 获取黑名单列表 /sdk/android/user/blacklist/get blacklist 校准。 onBlacklistDeleted 由本页归属,应按 userID 删除本地记录: @Override public void onBlacklistDeleted BlacklistInfo user blacklistStore.remove user.getUserID ;" }, { - "path": "/sdk/android/report/overview-report", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/overview-conversation", + "title": "会话概览", + "description": "了解 Android SDK 中 ConversationInfo、conversationID、会话设置和会话事件的职责。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android report overview-report", - "content": "" + "keywords": "sdk android v4 sdk android conversation overview-conversation", + "content": "会话是当前登录用户围绕一次单聊或群聊维护的聊天列表状态,由一条 ConversationInfo 记录表示。它保存未读数、最后一条消息、置顶、草稿、消息接收方式和扩展字段。 conversationID 用于定位当前账号的会话状态;单聊目标使用对方 userID ,群聊目标使用 groupID 。 群资料、成员关系和群权限属于群组能力。群聊页面使用 groupID 调用群组 API,使用 conversationID 处理会话设置、未读数、草稿和消息清理。 会话标识 | 标识 | 用途 | | | | | conversationID | 当前账号的会话记录 ID,用于会话设置、未读状态和消息历史。 | | userID | 单聊对方的用户 ID。 | | groupID | 群聊对应的群组 ID,也是群组 API 的目标标识。 | | sourceId | 按会话类型查询或生成 ID 时传入的聊天目标:单聊为 userID ,群聊为 groupID 。 | 单聊使用 ConversationType.SINGLE CHAT 。群聊根据群类型使用 ConversationType.GROUP CHAT 或 ConversationType.SUPER GROUP CHAT ;不要在应用层自行拼接 conversationID 。 ConversationInfo | 字段 | 说明 | | | | | conversationID | 会话 ID。 | | conversationType | 会话类型。 | | userID / groupID | 单聊目标用户或群聊目标群组。 | | showName / faceURL | 会话列表显示名称和头像。 | | unreadCount | 当前会话未读数。 | | latestMsg / latestMsgSendTime | 最后一条消息 JSON 字符串及发送时间。 | | recvMsgOpt | 当前会话消息接收方式。 | | groupAtType | 群聊 @ 提醒状态。 | | draftText / draftTextTime | 会话草稿及更新时间。 | | isPinned | 是否置顶。 | | isPrivateChat / burnDuration | 阅后即焚开关和保留时长。 | | isMsgDestruct / msgDestructTime | 服务端消息定期删除设置。 | | ex | 业务约定的会话扩展字符串。 | 查询和设置 查询指定会话 /sdk/android/conversation/retrieving conversations/get conversation by target 生成会话 ID /sdk/android/conversation/retrieving conversations/get conversation id 按 ID 批量获取会话 /sdk/android/conversation/retrieving conversations/get conversations by id 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 置顶或取消置顶会话 /sdk/android/conversation/managing conversations/pin conversation 设置会话扩展字段 /sdk/android/conversation/managing conversations/set conversation extension 设置会话草稿 /sdk/android/conversation/managing conversations/set conversation draft 设置会话消息接收方式 /sdk/android/conversation/managing conversations/set message receive option 重置群聊 @ 状态 /sdk/android/conversation/managing conversations/clear group mentions 标记会话已读 /sdk/android/conversation/managing conversations/mark conversation read 获取消息总未读数 /sdk/android/conversation/managing conversations/get total unread count 开启或关闭阅后即焚 /sdk/android/conversation/managing conversations/set private chat 定期删除服务端消息 /sdk/android/conversation/managing conversations/set message destruct 状态更新 查询方法建立会话快照,事件负责合并后续增量: 新会话和会话属性变化由 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 归属的 onNewConversation 与 onConversationChanged 处理。 当前账号总未读数由 获取消息总未读数 /sdk/android/conversation/managing conversations/get total unread count 归属的 onTotalUnreadMessageCountChanged 处理。 ConversationManager 只保存一个 OnConversationListener , setOnConversationListener 会替换当前 listener。应用应在统一状态层组合所有 callback 并设置一次;请求成功、事件到达和重新查询校准是三个独立阶段。" }, { - "path": "/sdk/android/user/moderating-a-user/block-and-unblock-other-members", - "title": "Block and unblock other members", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Block and unblock other members. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "title": "查询指定会话", + "description": "使用 getOneConversation() 按用户或群组获取一个 Android 会话。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user moderating-a-user block-and-unblock-other-members", - "content": "" + "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversation-by-target", + "content": "从通讯录、用户资料或群资料进入聊天页时,使用 getOneConversation 。单聊传对方用户 ID,群聊传群组 ID;即使还没有消息,也不要自行构造 ConversationInfo 。 OpenIMClient.getInstance .conversationManager.getOneConversation new OnBase @Override public void onSuccess ConversationInfo conversation openChatPage conversation ; @Override public void onError int code, String error recordConversationOpenFailure code, error ; , targetUserID, ConversationType.SINGLE CHAT ; 参数 sourceId 在单聊中是对方 userID ,在群聊中是 groupID 。群聊根据群类型使用 ConversationType.GROUP CHAT 或 ConversationType.SUPER GROUP CHAT 。 成功 callback 返回 ConversationInfo 。查询本身不触发会话 listener;后续变化由 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 统一按 conversationID 合并。" }, { - "path": "/sdk/android/user/moderating-a-user/mute-and-unmute-a-user", - "title": "Mute and unmute a user", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mute and unmute a user. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "title": "生成会话 ID", + "description": "使用 getConversationIDBySessionType() 按聊天目标计算 Android 会话 ID。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user moderating-a-user mute-and-unmute-a-user", - "content": "" + "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversation-id", + "content": "只需要会话 ID 时,调用 getConversationIDBySessionType ,不要在应用层自行拼接。 String conversationID = OpenIMClient.getInstance .conversationManager .getConversationIDBySessionType targetUserID, ConversationType.SINGLE CHAT ; sourceId 在单聊中是对方 userID ,在群聊中是 groupID 。群聊根据群类型使用 ConversationType.GROUP CHAT 或 ConversationType.SUPER GROUP CHAT 。 该方法同步返回 String 类型的 conversationID ,不返回完整 ConversationInfo ,也不触发会话 listener。需要会话资料时调用 查询指定会话 /sdk/android/conversation/retrieving conversations/get conversation by target 。" }, { - "path": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", - "title": "Retrieve the online status of a user", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve the online status of a user. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "title": "按 ID 批量获取会话", + "description": "使用 getMultipleConversation() 按 conversationID 批量获取 Android 会话。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-and-updating-user-information retrieve-the-online-status-of-a-user", - "content": "" + "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversations-by-id", + "content": "已经持有一组 conversationID 时,使用 getMultipleConversation 读取最新会话快照。 OpenIMClient.getInstance .conversationManager.getMultipleConversation new OnBase @Override public void onSuccess List conversations for ConversationInfo item : conversations conversationStore.put item.getConversationID , item ; @Override public void onError int code, String error recordConversationQueryFailure code, error ; , conversationIDs ; 调用前去除空值和重复 ID。成功 callback 返回 List ;某个 ID 没有结果时按缺失记录处理,不要依赖响应与请求列表的位置完全一一对应。 查询本身不触发会话 listener。会话列表的持续同步见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message", - "title": "Retrieve members who have read a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve members who have read a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "获取会话列表", + "description": "使用 getConversationListSplit() 分页获取当前 Android 账号的会话列表。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-members-who-have-read-a-message", - "content": "" + "keywords": "sdk android v4 sdk android conversation retrieving-conversations retrieve-conversation-list", + "content": "会话列表属于当前登录用户。每条 ConversationInfo 包含会话标识、未读数、最后一条消息、置顶和草稿等状态。使用分页接口读取会话,不使用一次加载完整列表的 getAllConversationList 。 分页获取会话 OpenIMClient.getInstance .conversationManager.getConversationListSplit new OnBase @Override public void onSuccess List conversations mergeConversations conversations ; @Override public void onError int code, String error recordConversationListFailure code, error ; , 0, 50 ; | 参数 | 类型 | 说明 | | | | | | offset | long | 从 0 开始的分页偏移量;刷新时重置为 0 。 | | count | long | 本页期望返回的会话数量。 | 成功 callback 返回当前页 List 。继续加载时按已经请求的条目数量推进 offset ,并按 conversationID 去重;返回数量小于 count 时通常表示到达末页。主动刷新时清空分页状态后从 0 重载。 保持列表同步 getConversationListSplit 只建立快照,不触发会话 callback。以下 callback 应组合进应用唯一的 OnConversationListener : @Override public void onNewConversation List conversations mergeConversations conversations ; @Override public void onConversationChanged List conversations mergeConversations conversations ; 两个事件都携带 List ,按 conversationID 幂等合并。 setOnConversationListener 采用替换语义,应由应用级状态层设置一次。用户加入群组但尚未产生消息时不一定有会话;退出群组后也可能保留历史会话记录,不能用已加入群组列表替代会话列表。" }, { - "path": "/sdk/android/application/authenticating-a-user/authentication", - "title": "Authentication", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Authentication. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/pin-conversation", + "title": "置顶或取消置顶会话", + "description": "使用 pinConversation() 设置 Android 指定会话的置顶状态。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android application authenticating-a-user authentication", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations pin-conversation", + "content": "OpenIMClient.getInstance .conversationManager.pinConversation new OnBase @Override public void onSuccess String data markPinRequestSubmitted conversationID, true ; @Override public void onError int code, String error recordConversationPinFailure code, error ; , conversationID, true ; 最后一个参数为 true 时置顶,传 false 时取消置顶。该状态只影响当前账号的会话列表。 成功 callback 不等于 onConversationChanged 已经到达。后续按 conversationID 合并最新会话,完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/application/overview-application", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "title": "设置会话扩展字段", + "description": "使用 setConversationEx() 设置 Android 指定会话的业务扩展字符串。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android application overview-application", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-conversation-extension", + "content": "ex 是完整字符串,SDK 不会自动合并 JSON。更新前应读取旧值并保留其他业务模块的命名空间。 OpenIMClient.getInstance .conversationManager.setConversationEx new OnBase @Override public void onSuccess String data markConversationExtensionSubmitted conversationID ; @Override public void onError int code, String error recordConversationExtensionFailure code, error ; , conversationID, mergedExtensionJSON ; 成功 callback 表示设置请求完成。通过 onConversationChanged 按 conversationID 合并最新会话;完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/application/understanding-rate-limits/rate-limits", - "title": "Rate limits", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Rate limits. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "title": "设置会话草稿", + "description": "使用 setConversationDraft() 保存 Android 会话草稿。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android application understanding-rate-limits rate-limits", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-conversation-draft", + "content": "用户离开聊天页、切换会话或输入框内容变化时,可以使用 setConversationDraft 保存草稿。输入过程中先维护编辑器状态并对保存调用做防抖;离开页面前再提交一次最新文本。 OpenIMClient.getInstance .conversationManager.setConversationDraft new OnBase @Override public void onSuccess String data markDraftSubmitted conversationID ; @Override public void onError int code, String error recordDraftSaveFailure code, error ; , conversationID, editorValue ; 清空草稿时传空字符串。成功 callback 只表示保存请求已经完成,不等同于会话变化回调已经到达;SDK 后续通过 onConversationChanged 同步 draftText 和 draftTextTime ,需要校准时重新查询会话。退出登录或切换账号时清理编辑器内存状态。" }, { - "path": "/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type", - "title": "Categorize channels by custom type", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Categorize channels by custom type. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "title": "设置会话消息接收方式", + "description": "使用 setConversationRecvMessageOpt() 设置 Android 单个会话的消息接收与通知方式。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel categorizing-channels categorize-channels-by-custom-type", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-message-receive-option", + "content": "OpenIMClient.getInstance .conversationManager.setConversationRecvMessageOpt new OnBase @Override public void onSuccess String data markReceiveOptionSubmitted conversationID ; @Override public void onError int code, String error recordReceiveOptionFailure code, error ; , conversationID, 2 ; | 数值 | 含义 | | | | | 0 | 正常接收消息并允许通知。 | | 1 | 不接收该会话消息,也不通知。 | | 2 | 接收该会话消息,但不通知。 | 账号级默认策略见 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception 。成功 callback 后通过 onConversationChanged 按 conversationID 合并最新会话。" }, { - "path": "/sdk/android/channel/creating-a-channel/create-a-channel", - "title": "Create a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "title": "重置群聊 @ 状态", + "description": "使用 resetConversationGroupAtType() 将 Android 指定会话的群聊 @ 状态重置为普通状态。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel creating-a-channel create-a-channel", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations clear-group-mentions", + "content": "用户处理完群聊中的 @ 消息后,调用 resetConversationGroupAtType 将 groupAtType 重置为普通状态。 OpenIMClient.getInstance .conversationManager.resetConversationGroupAtType new OnBase @Override public void onSuccess String data markGroupMentionStateReset conversationID ; @Override public void onError int code, String error recordGroupMentionResetFailure code, error ; , conversationID ; 本操作只负责重置为普通状态,不应用于主动写入 atMe 、 atAll 等状态。群聊 @ 状态与消息已读状态不同。 成功 callback 后通过 onConversationChanged 按 conversationID 合并该会话;完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", - "title": "Accept or decline an invitation", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Accept or decline an invitation. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "title": "标记会话已读", + "description": "使用 messageManager.markConversationMessageAsRead() 将 Android 指定会话的消息标记为已读。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel inviting-users-to-a-group-channel accept-or-decline-an-invitation", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations mark-conversation-read", + "content": "用户打开会话并阅读完当前可见消息后,调用 messageManager.markConversationMessageAsRead 。不要在仅预览通知或后台收到消息时提前标记。 OpenIMClient.getInstance .messageManager.markConversationMessageAsRead conversationID, new OnBase @Override public void onSuccess String data markConversationReadSubmitted conversationID ; @Override public void onError int code, String error recordMarkReadFailure code, error ; ; 成功 callback 表示请求完成,不等于 onConversationChanged 已到达。随后按 conversationID 合并最新 ConversationInfo ;需要立即确认时重新查询该会话。 对于单聊,当前用户标记会话已读后,对端可通过 OnAdvanceMsgListener.onRecvC2CReadReceipt 收到已读回执。对每个 C2CReadReceiptInfo 先验证 sessionType == ConversationType.SINGLE CHAT 和非空 userID ,再按 msgIDList 更新对应消息的已读状态。 MessageManager 同样只保存一个高级消息 listener,应在应用级消息状态层统一设置。" }, { - "path": "/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members", - "title": "Invite users as members", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Invite users as members. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "title": "获取消息总未读数", + "description": "使用 getTotalUnreadMsgCount() 获取 Android 当前账号的总未读数。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel inviting-users-to-a-group-channel invite-users-as-members", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations get-total-unread-count", + "content": "getTotalUnreadMsgCount 返回当前账号所有会话的总未读快照,不要把当前已加载分页中的 unreadCount 简单相加。 OpenIMClient.getInstance .conversationManager.getTotalUnreadMsgCount new OnBase @Override public void onSuccess String value int totalUnread = Integer.parseInt value ; updateApplicationBadge totalUnread ; @Override public void onError int code, String error recordTotalUnreadFailure code, error ; ; 回调值是 String ,解析失败时应按业务错误处理,不能将其默认为会话列表分页的局部总数。查询本身不触发 callback。 本页归属 OnConversationListener.onTotalUnreadMessageCountChanged int count 。在应用唯一的 OnConversationListener 中按该值更新应用角标;会话 listener 的集中设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", - "title": "Enter and exit an open channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Enter and exit an open channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-private-chat", + "title": "开启或关闭阅后即焚", + "description": "使用 setOneConversationPrivateChat() 设置 Android 会话的阅后即焚模式。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel joining-and-leaving-a-channel enter-and-exit-an-open-channel", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-private-chat", + "content": "OpenIMClient.getInstance .conversationManager.setOneConversationPrivateChat new OnBase @Override public void onSuccess String data markPrivateChatSubmitted conversationID, true ; @Override public void onError int code, String error recordPrivateChatFailure code, error ; , conversationID, true ; 传入 false 关闭阅后即焚。具体保留时长由 burnDuration 单独设置,见 设置阅后即焚时长 /sdk/android/conversation/managing conversations/set burn duration 。该能力与定期删除服务端消息不同。 成功 callback 只表示设置请求完成;最新状态通过 onConversationChanged 按 conversationID 合并,完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", - "title": "Join and leave a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Join and leave a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "title": "设置阅后即焚时长", + "description": "使用 setConversationBurnDuration() 设置 Android 阅后即焚模式的消息保留时长。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel joining-and-leaving-a-channel join-and-leave-a-group-channel", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-burn-duration", + "content": "OpenIMClient.getInstance .conversationManager.setConversationBurnDuration new OnBase @Override public void onSuccess String data markBurnDurationSubmitted conversationID, 30 ; @Override public void onError int code, String error recordBurnDurationFailure code, error ; , conversationID, 30 ; burnDuration 的单位为秒。启用或关闭阅后即焚需要设置 isPrivateChat ,见 开启或关闭阅后即焚 /sdk/android/conversation/managing conversations/set private chat 。不要把它与服务端消息定期删除周期 msgDestructTime 混用。 成功 callback 后,通过 onConversationChanged 合并最新 burnDuration ;完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters", - "title": "Manage channel metacounters", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Manage channel metacounters. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "title": "定期删除服务端消息", + "description": "使用 setConversation() 启用、关闭并配置 Android 会话的服务端消息定期删除策略。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channel-metacounters manage-channel-metacounters", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-message-destruct", + "content": "isMsgDestruct 与 msgDestructTime 共同构成服务端消息定期删除设置,可以在一次 ConversationReq 中提交。 ConversationReq request = new ConversationReq ; request.setMsgDestruct true ; request.setMsgDestructTime 3600 ; OpenIMClient.getInstance .conversationManager.setConversation new OnBase @Override public void onSuccess String data markMessageDestructSubmitted conversationID ; @Override public void onError int code, String error recordMessageDestructFailure code, error ; , conversationID, request ; msgDestructTime 的单位为秒。关闭时只传 request.setMsgDestruct false ;该能力用于定期删除服务端消息,不是阅后即焚。 成功 callback 表示设置请求完成。最新开关和周期通过 onConversationChanged 按 conversationID 合并,完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/channel/managing-channel-metadata/manage-channel-metadata", - "title": "Manage channel metadata", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Manage channel metadata. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "title": "隐藏会话", + "description": "使用 hideConversation() 从 Android 当前账号的会话列表隐藏入口。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channel-metadata manage-channel-metadata", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations hide-a-conversation", + "content": "hideConversation 只隐藏当前登录用户的会话入口,不会删除单聊关系、退出群组或影响其他用户。 OpenIMClient.getInstance .conversationManager.hideConversation new OnBase @Override public void onSuccess String data conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationHideFailure code, error ; , conversationID ; 该方法适合临时从聊天列表移除入口。收到新消息或重新同步后,隐藏的会话可能再次出现。 成功 callback 表示隐藏请求已完成,调用端可以从当前列表移除该 conversationID 。后续收到 onConversationChanged 时仍应按 conversationID 幂等合并;完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/channel/managing-channels/delete-a-channel", - "title": "Delete a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "title": "删除会话及消息", + "description": "使用 deleteConversationAndDeleteAllMsg() 删除 Android 指定会话及其全部消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channels delete-a-channel", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations delete-conversation-with-messages", + "content": "产品语义为“删除此聊天”时,调用 deleteConversationAndDeleteAllMsg 。 OpenIMClient.getInstance .conversationManager.deleteConversationAndDeleteAllMsg new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationDeleteFailure code, error ; , conversationID ; 成功 callback 后清理当前消息列表和会话行。该操作不删除好友关系,也不退出或解散群组;聊天目标仍存在时,会话可能由新消息或同步重新生成。 后续通过 onConversationChanged 或重新查询校准会话列表,完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "path": "/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel", - "title": "Hide or archive a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Hide or archive a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "title": "清空会话消息", + "description": "使用 messageManager.clearConversationAndDeleteAllMsg() 保留 Android 会话入口并清空其消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channels hide-or-archive-a-group-channel", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations clear-conversation-messages", + "content": "产品语义为“清空聊天记录”时,调用 messageManager.clearConversationAndDeleteAllMsg 。 OpenIMClient.getInstance .messageManager.clearConversationAndDeleteAllMsg conversationID, new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; @Override public void onError int code, String error recordConversationClearFailure code, error ; ; 成功 callback 后保留会话入口,但清除当前账号下的消息和摘要状态。立即清理当前消息列表,再通过 onConversationChanged 或重新查询校准最后一条消息、摘要和未读状态。" }, { - "path": "/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel", - "title": "Refresh all data related to a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Refresh all data related to a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/overview-group", + "title": "群组概览", + "description": "了解 Android SDK 中群资料、成员、申请和群组事件的职责。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channels refresh-all-data-related-to-a-group-channel", - "content": "" + "keywords": "sdk android v4 sdk android group overview-group", + "content": "群组由 GroupInfo 表示, groupID 是群资料、成员、申请和权限设置的唯一目标标识。 GroupMembersInfo 表示成员在某个群内的昵称、角色、禁言结束时间和扩展字段;单聊关系和会话未读数不属于群组 API。 GroupManager 将群资料变化、成员增删改、入群申请处理和加入群组变化统一发送到一个 OnGroupListener 。在共享状态层设置一次 listener,并按 groupID 或 userID 合并事件。 OpenIMClient.getInstance .groupManager.setOnGroupListener new OnGroupListener @Override public void onGroupInfoChanged GroupInfo group groupStore.put group.getGroupID , group ; @Override public void onGroupMemberInfoChanged GroupMembersInfo member memberStore.put member.getGroupID + member.getUserID , member ; ; 群资料或成员操作的成功 callback 只表示该请求完成;状态以对应群组事件或重新查询结果为准。 主要能力 群资料与设置 /sdk/android/group/create group 群权限 /sdk/android/group/set group join verification 加入与退出群组 /sdk/android/group/join group 查询群组 /sdk/android/group/retrieving groups/get specified groups info 群申请 /sdk/android/group/group applications/overview group applications 查询群成员 /sdk/android/group/retrieving group members/overview retrieving group members 管理群成员 /sdk/android/group/managing group members/invite user to group" }, { - "path": "/sdk/android/channel/managing-operators/register-and-remove-operators", - "title": "Register and remove operators", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Register and remove operators. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/create-group", + "title": "创建群组", + "description": "使用 createGroup 创建群资料并指定初始成员、管理员和群主。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-operators register-and-remove-operators", - "content": "" + "keywords": "sdk android v4 sdk android group create-group", + "content": "使用 createGroup 创建群组。 GroupInfo 填写群资料;初始普通成员、管理员和群主分别通过独立参数传入。成功回调返回创建后的完整 GroupInfo ,应保存服务端确定的 groupID 。 GroupInfo info = new GroupInfo ; info.setGroupName \"项目讨论\" ; info.setIntroduction \"仅限项目成员\" ; OpenIMClient.getInstance .groupManager.createGroup memberUserIDs, adminUserIDs, info, ownerUserID, new OnBase @Override public void onSuccess GroupInfo group openGroup group.getGroupID ; @Override public void onError int code, String error showCreateError error ; ; 群主和管理员必须由业务侧按权限选择。不要在客户端根据本地用户列表推导群主身份。" }, { - "path": "/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url", - "title": "Retrieve a channel by URL", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a channel by URL. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/update-group-profile", + "title": "更新群资料", + "description": "使用 setGroupInfo 更新群名称、头像、简介和其他群资料字段。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel retrieving-channels retrieve-a-channel-by-url", - "content": "" + "keywords": "sdk android v4 sdk android group update-group-profile", + "content": "使用 setGroupInfo 更新群资料。请求对象至少应包含 groupID 和需要修改的字段;不要用不完整的本地缓存覆盖未参与本次编辑的字段。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setGroupName \"移动端项目组\" ; update.setIntroduction \"Android 与 iOS 协作群\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markGroupUpdateSubmitted groupID ; @Override public void onError int code, String error showGroupUpdateError error ; ; 最新群资料通过 onGroupInfoChanged 合并。群公告和扩展字段使用相同接口,分别见相关页面。" }, { - "path": "/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels", - "title": "Retrieve a list of channels", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of channels. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/set-group-announcement", + "title": "发布群公告", + "description": "通过 GroupInfo.notification 发布或更新群公告。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel retrieving-channels retrieve-a-list-of-channels", - "content": "" + "keywords": "sdk android v4 sdk android group set-group-announcement", + "content": "Android SDK 没有独立的公告方法。构造包含 groupID 与 notification 的 GroupInfo ,再调用 setGroupInfo 。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNotification \"今晚 20:00 进行版本发布确认。\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data refreshAnnouncement groupID ; @Override public void onError int code, String error showAnnouncementError error ; ; 公告的更新时间和更新人由返回的 GroupInfo 中 notificationUpdateTime 、 notificationUserID 表示。权限由服务端校验。" }, { - "path": "/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids", - "title": "Filter group channels by user IDs", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Filter group channels by user IDs. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/set-group-extension", + "title": "设置群扩展字段", + "description": "通过 GroupInfo.ex 保存应用定义的群组扩展数据。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel searching-channels filter-group-channels-by-user-ids", - "content": "" + "keywords": "sdk android v4 sdk android group set-group-extension", + "content": "GroupInfo.ex 是完整字符串,SDK 不会合并 JSON。多个业务模块共用该字段时,应由应用读取旧值、合并自己的命名空间后再提交。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setEx \" \\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false \" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markExtensionSubmitted groupID ; @Override public void onError int code, String error showExtensionError error ; ; 不要将访问令牌、密钥或仅适合本机的 UI 状态写入群扩展字段。" }, { - "path": "/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters", - "title": "Search group channels by name, URL, or other filters", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Search group channels by name, URL, or other filters. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/set-group-join-verification", + "title": "设置入群验证方式", + "description": "通过 GroupInfo.needVerification 配置申请和邀请的入群验证规则。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel searching-channels search-group-channels-by-name-url-or-other-filters", - "content": "" + "keywords": "sdk android v4 sdk android group set-group-join-verification", + "content": "入群验证写入 GroupInfo.needVerification ,再调用 setGroupInfo 。可使用 GroupVerification 常量: APPLY NEED VERIFICATION INVITE DIRECTLY 、 ALL NEED VERIFICATION 和 DIRECTLY 。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNeedVerification GroupVerification.ALL NEED VERIFICATION ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markVerificationSubmitted groupID ; @Override public void onError int code, String error showVerificationError error ; ; 该设置影响后续入群请求,不替代对已存在申请的同意或拒绝处理。" }, { - "path": "/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types", - "title": "Search open channels by name, URL, or custom type", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Search open channels by name, URL, or custom type. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/set-group-member-profile-access", + "title": "设置成员资料查看权限", + "description": "通过 GroupInfo.lookMemberInfo 设置是否允许通过群组查看成员资料。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel searching-channels search-open-channels-by-name-url-or-custom-types", - "content": "" + "keywords": "sdk android v4 sdk android group set-group-member-profile-access", + "content": "lookMemberInfo 使用整数开关: 0 关闭, 1 打开。更新时只提交该权限字段和 groupID 。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setLookMemberInfo 1 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markMemberInfoAccessSubmitted groupID ; @Override public void onError int code, String error showPermissionError error ; ; 此开关约束通过群组入口获取成员资料的权限,不改变成员已经拥有的用户资料。" }, { - "path": "/sdk/android/deprecated", - "title": "Deprecated", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Deprecated. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/set-group-member-friend-permission", + "title": "设置成员好友申请权限", + "description": "通过 GroupInfo.applyMemberFriend 设置是否允许从群成员发起好友申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android deprecated", - "content": "" + "keywords": "sdk android v4 sdk android group set-group-member-friend-permission", + "content": "applyMemberFriend 使用整数开关: 0 关闭, 1 打开。该规则只影响从该群成员关系入口发起的好友申请。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setApplyMemberFriend 0 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markFriendPermissionSubmitted groupID ; @Override public void onError int code, String error showPermissionError error ; ; 更新后以 onGroupInfoChanged 或重新读取的 GroupInfo 为准。" }, { - "path": "/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", - "title": "Add or remove a channel event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add or remove a channel event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/change-group-mute", + "title": "设置全员禁言", + "description": "使用 changeGroupMute 开启或关闭群组全员禁言。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android event-handler managing-channel-event-handlers add-or-remove-a-channel-event-handler", - "content": "" + "keywords": "sdk android v4 sdk android group change-group-mute", + "content": "使用 changeGroupMute 切换全员禁言。 true 开启, false 关闭;成员级禁言见“禁言或解除禁言群成员”。 OpenIMClient.getInstance .groupManager.changeGroupMute new OnBase @Override public void onSuccess String data markGroupMuteSubmitted groupID, true ; @Override public void onError int code, String error showGroupMuteError error ; , groupID, true ; 群主和管理员的实际发言权限以及服务端权限校验以部署策略为准。" }, { - "path": "/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", - "title": "Add or remove a connection event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add or remove a connection event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/join-group", + "title": "申请加入群组", + "description": "使用 joinGroup 提交入群申请或加入请求。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android event-handler managing-connection-event-handlers add-or-remove-a-connection-event-handler", - "content": "" + "keywords": "sdk android v4 sdk android group join-group", + "content": "使用 joinGroup 提交入群请求。 joinSource 使用群组来源值,例如邀请、搜索或二维码;带扩展数据时使用五参数重载。 OpenIMClient.getInstance .groupManager.joinGroup new OnBase @Override public void onSuccess String data markJoinSubmitted groupID ; @Override public void onError int code, String error showJoinError error ; , groupID, \"希望加入项目讨论\", 3, \" \\\"from\\\":\\\"search\\\" \" ; 验证方式决定请求是否立即加入。后续通过 onJoinedGroupAdded 或群申请事件更新本地状态。" }, { - "path": "/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", - "title": "Add or remove a user event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add or remove a user event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/quit-group", + "title": "退出群组", + "description": "使用 quitGroup 让当前登录用户退出指定群组。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android event-handler managing-user-event-handlers add-or-remove-a-user-event-handler", - "content": "" + "keywords": "sdk android v4 sdk android group quit-group", + "content": "quitGroup 仅作用于当前登录用户,不会解散群组或移除其他成员。 OpenIMClient.getInstance .groupManager.quitGroup new OnBase @Override public void onSuccess String data removeJoinedGroup groupID ; @Override public void onError int code, String error showQuitError error ; , groupID ; 请求成功后仍应处理 onJoinedGroupDeleted ,并清理该群的成员列表、群会话入口等应用缓存。" }, { - "path": "/sdk/android/event-handler/overview-event-handler", - "title": "Event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/dismiss-group", + "title": "解散群组", + "description": "使用 dismissGroup 解散当前用户有权限管理的群组。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android event-handler overview-event-handler", - "content": "" + "keywords": "sdk android v4 sdk android group dismiss-group", + "content": "dismissGroup 解散指定群组,通常仅群主可执行。调用前应在产品层提供明确确认,避免将“退出群组”误实现为解散。 OpenIMClient.getInstance .groupManager.dismissGroup new OnBase @Override public void onSuccess String data markDismissSubmitted groupID ; @Override public void onError int code, String error showDismissError error ; , groupID ; 最终状态通过 onGroupDismissed 合并;收到事件后移除群资料、成员和群会话相关缓存。" }, { - "path": "/sdk/android/getting-started/collection-migration-guide", - "title": "Collection migration guide", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Collection migration guide. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "title": "获取群资料", + "description": "使用 getGroupsInfo 批量查询指定群组的最新资料。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android getting-started collection-migration-guide", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-groups get-specified-groups-info", + "content": "已持有一组 groupID 时,使用 getGroupsInfo 查询群资料。结果是 GroupInfo 列表,不能依赖响应顺序与请求列表完全一致。 OpenIMClient.getInstance .groupManager.getGroupsInfo new OnBase @Override public void onSuccess List groups mergeGroups groups ; @Override public void onError int code, String error showGroupQueryError error ; , groupIDs ; 先移除空值和重复 ID;权限不足或群组不存在的 ID 应按缺失结果处理。" }, { - "path": "/sdk/android/getting-started/kotlin-extension", - "title": "Kotlin extension (KTX)", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Kotlin extension (KTX). Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "title": "分页获取已加入群组", + "description": "使用 getJoinedGroupListPage 分页读取当前账号已加入的群组。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android getting-started kotlin-extension", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-groups get-joined-group-list-page", + "content": "Android SDK 仅提供分页版本。 offset 从 0 开始,后续页按已经成功合并的条目数推进;返回为空时停止加载。 OpenIMClient.getInstance .groupManager.getJoinedGroupListPage new OnBase @Override public void onSuccess List groups appendJoinedGroups groups ; @Override public void onError int code, String error showPageError error ; , offset, 20 ; 使用 onJoinedGroupAdded 与 onJoinedGroupDeleted 合并增量,不要仅依赖已加载分页作为完整群列表。" }, { - "path": "/sdk/android/getting-started/migration-guide", - "title": "Migration guide", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Migration guide. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-groups/is-join-group", + "title": "检查是否加入群组", + "description": "使用 isJoinGroup 查询当前登录用户是否已经加入指定群组。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android getting-started migration-guide", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-groups is-join-group", + "content": "isJoinGroup 仅检查当前登录用户与目标 groupID 的成员关系。 OpenIMClient.getInstance .groupManager.isJoinGroup groupID, new OnBase @Override public void onSuccess Boolean joined updateJoinAction Boolean.TRUE.equals joined ; @Override public void onError int code, String error showMembershipError error ; ; 该结果不替代群资料查询,也不能用于判断其他用户是否在群内。" }, { - "path": "/sdk/android/local-caching/overview-local-caching", - "title": "Local caching", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Local caching. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-groups/search-groups", + "title": "搜索群组", + "description": "使用 searchGroups 按群 ID 或群名称搜索本地可查询的群组。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android local-caching overview-local-caching", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-groups search-groups", + "content": "searchGroups 接收关键词列表,并分别指定是否搜索群 ID、群名称。两个开关都关闭时没有有效搜索范围。 OpenIMClient.getInstance .groupManager.searchGroups new OnBase @Override public void onSuccess List groups showSearchResults groups ; @Override public void onError int code, String error showSearchError error ; , Collections.singletonList keyword , true, true ; 搜索结果不是成员资格证明。进入群组前可使用“检查是否加入群组”确认当前状态。" }, { - "path": "/sdk/android/local-caching/using-group-channel-collection/group-channel-collection", - "title": "Group channel collection", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Group channel collection. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/group-applications/overview-group-applications", + "title": "群申请概览", + "description": "说明 Android SDK 中收到和发出的群申请、处理结果及状态事件。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android local-caching using-group-channel-collection group-channel-collection", - "content": "" + "keywords": "sdk android v4 sdk android group group-applications overview-group-applications", + "content": "群申请记录使用 GroupApplicationInfo 表示。收到的申请面向群管理者,发出的申请面向当前用户; handleResult 、 reqMsg 、 handledMsg 和处理时间用于展示申请状态。 Android SDK 提供收到与发出申请的分页查询,以及同意、拒绝操作;不提供 Flutter 菜单中的“待处理申请数量”接口。申请新增、同意、拒绝和删除事件由 群组概览 /sdk/android/group/overview group 的统一 listener 负责合并。" }, { - "path": "/sdk/android/local-caching/using-message-collection/message-collection", - "title": "Message collection", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Message collection. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "title": "获取收到的群申请", + "description": "使用 getRecvGroupApplicationList 分页读取当前用户可处理的入群申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android local-caching using-message-collection message-collection", - "content": "" + "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-recipient", + "content": "使用非废弃重载并传入 GetGroupApplicationListAsRecipientReq 。可设置 offset 、 count 、 groupIDs 和 handleResults 筛选条件。 GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .groupManager.getRecvGroupApplicationList new OnBase @Override public void onSuccess List items mergeReceivedApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ; 收到事件后按申请中的 groupID 和 userID 合并,不要把列表下标作为申请标识。" }, { - "path": "/sdk/android/logger", - "title": "Logger", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Logger. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "title": "获取发出的群申请", + "description": "使用 getSendGroupApplicationList 分页读取当前用户发出的入群申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android logger", - "content": "" + "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-applicant", + "content": "使用 GetGroupApplicationListAsApplicantReq 设置分页和筛选条件,再调用 getSendGroupApplicationList 。 GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .groupManager.getSendGroupApplicationList new OnBase @Override public void onSuccess List items mergeSentApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ; 申请被同意后,群列表变化以 onJoinedGroupAdded 为准。" }, { - "path": "/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type", - "title": "Categorize messages by custom type", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Categorize messages by custom type. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/group-applications/accept-group-application", + "title": "同意群申请", + "description": "使用 acceptGroupApplication 同意指定用户的入群申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message categorizing-messages categorize-messages-by-custom-type", - "content": "" + "keywords": "sdk android v4 sdk android group group-applications accept-group-application", + "content": "调用时同时传入申请的 groupID 、申请人 userID 和处理说明。服务端负责校验当前用户是否有审批权限。 OpenIMClient.getInstance .groupManager.acceptGroupApplication new OnBase @Override public void onSuccess String data markApplicationHandled groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"欢迎加入\" ; 同意后通过群申请事件与 onGroupMemberAdded 更新申请列表和成员列表。" }, { - "path": "/sdk/android/message/listing-changelogs/list-changelogs-of-messages", - "title": "List changelogs of messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List changelogs of messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/group-applications/refuse-group-application", + "title": "拒绝群申请", + "description": "使用 refuseGroupApplication 拒绝指定用户的入群申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message listing-changelogs list-changelogs-of-messages", - "content": "" + "keywords": "sdk android v4 sdk android group group-applications refuse-group-application", + "content": "拒绝操作同样使用申请所属 groupID 、申请人 userID 和处理说明。 OpenIMClient.getInstance .groupManager.refuseGroupApplication new OnBase @Override public void onSuccess String data markApplicationRejected groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"当前群组人数已满\" ; 成功 callback 后不要直接删除本地申请记录;以 onGroupApplicationRejected 或重新查询结果更新。" }, { - "path": "/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel", - "title": "Clear the chat history in a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Clear the chat history in a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "title": "群成员查询概览", + "description": "说明 Android SDK 中群成员列表、指定成员资料和成员状态查询。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message clear-the-chat-history-in-a-group-channel", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-group-members overview-retrieving-group-members", + "content": "成员查询使用 groupID 限定范围,结果为 GroupMembersInfo 或用户 ID 列表。成员列表提供角色过滤和 offset 分页;指定成员资料、在群检查、群主管理员和关键词搜索各有独立接口。 成员增删和资料变化由 群组概览 /sdk/android/group/overview group 归属的 OnGroupListener 统一合并。查询只建立快照,不能替代事件处理。" }, { - "path": "/sdk/android/message/managing-a-message/copy-a-message", - "title": "Copy a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Copy a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "title": "获取群成员列表", + "description": "使用 getGroupMemberList 按角色和分页条件读取群成员。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message copy-a-message", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-group-members get-group-member-list", + "content": "filter 传 0 查询全部成员, 1 普通成员, 2 群主, 3 管理员。 offset 与 count 控制分页。 OpenIMClient.getInstance .groupManager.getGroupMemberList new OnBase @Override public void onSuccess List members appendMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, 0, offset, 50 ; 分页期间仍应接受成员事件,合并键使用 groupID 与 userID 。" }, { - "path": "/sdk/android/message/managing-a-message/delete-a-message", - "title": "Delete a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "title": "获取群成员资料", + "description": "使用 getGroupMembersInfo 批量读取指定成员在群内的资料。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message delete-a-message", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-group-members get-specified-group-members-info", + "content": "getGroupMembersInfo 接收一个 groupID 和目标用户 ID 列表,返回这些用户在群内的 GroupMembersInfo 。 OpenIMClient.getInstance .groupManager.getGroupMembersInfo new OnBase @Override public void onSuccess List members mergeMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, userIDs ; 返回空列表可能表示目标未在群内或无读取权限,应按业务需求处理。" }, { - "path": "/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message", - "title": "Display Open Graph tags in a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Display Open Graph tags in a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "title": "检查用户是否在群内", + "description": "使用 getUsersInGroup 从候选用户中筛出当前在群内的用户 ID。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message display-open-graph-tags-in-a-message", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-group-members get-users-in-group", + "content": "getUsersInGroup 返回传入用户中已在指定群内的 ID 列表,不返回成员资料。 OpenIMClient.getInstance .groupManager.getUsersInGroup new OnBase @Override public void onSuccess List joinedUserIDs updateMembership joinedUserIDs ; @Override public void onError int code, String error showMembershipError error ; , groupID, candidateUserIDs ; 需要昵称、角色或禁言状态时,再调用“获取群成员资料”。" }, { - "path": "/sdk/android/message/managing-a-message/update-a-message", - "title": "Update a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "获取群主和管理员", + "description": "使用 getGroupMemberOwnerAndAdmin 查询群主和管理员成员资料。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message update-a-message", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-group-members get-group-member-owner-and-admin", + "content": "使用 getGroupMemberOwnerAndAdmin 获取需要展示或校验管理身份的成员记录。 OpenIMClient.getInstance .groupManager.getGroupMemberOwnerAndAdmin new OnBase @Override public void onSuccess List members showModerators members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID ; roleLevel 的群主、管理员和普通成员常量见 GroupRole ;实际操作权限仍由服务端决定。" }, { - "path": "/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages", - "title": "List pinned messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List pinned messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/retrieving-group-members/search-group-members", + "title": "搜索群成员", + "description": "使用 searchGroupMembers 按用户 ID 或群昵称搜索群成员。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-pinned-messages-in-group-channels list-pinned-messages", - "content": "" + "keywords": "sdk android v4 sdk android group retrieving-group-members search-group-members", + "content": "指定关键词列表、用户 ID 与群昵称两个搜索开关,以及分页条件。 OpenIMClient.getInstance .groupManager.searchGroupMembers new OnBase @Override public void onSuccess List members showMemberSearch members ; @Override public void onError int code, String error showSearchError error ; , groupID, Collections.singletonList keyword , true, true, 0, 20 ; 搜索仅限目标群组;空关键词或两个搜索开关均关闭时不应发起请求。" }, { - "path": "/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message", - "title": "Unpin a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Unpin a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/managing-group-members/invite-user-to-group", + "title": "邀请用户入群", + "description": "使用 inviteUserToGroup 邀请一组用户加入指定群组。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-pinned-messages-in-group-channels unpin-a-message", - "content": "" + "keywords": "sdk android v4 sdk android group managing-group-members invite-user-to-group", + "content": "传入群 ID、待邀请用户 ID 列表和邀请说明。服务端根据群设置和当前用户权限决定是否立即加入。 OpenIMClient.getInstance .groupManager.inviteUserToGroup new OnBase @Override public void onSuccess String data markInviteSubmitted groupID ; @Override public void onError int code, String error showInviteError error ; , groupID, inviteeUserIDs, \"邀请加入项目讨论\" ; 成员实际加入后以 onGroupMemberAdded 合并,不能仅以提交成功显示为已加入。" }, { - "path": "/sdk/android/message/managing-polls/add-a-poll-option", - "title": "Add a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/managing-group-members/kick-group-member", + "title": "移除群成员", + "description": "使用 kickGroupMember 将指定成员移出群组。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls add-a-poll-option", - "content": "" + "keywords": "sdk android v4 sdk android group managing-group-members kick-group-member", + "content": "kickGroupMember 接收成员 ID 列表和移除说明。产品层应先防止当前用户误移除自身,并遵守群主、管理员权限边界。 OpenIMClient.getInstance .groupManager.kickGroupMember new OnBase @Override public void onSuccess String data markRemovalSubmitted groupID ; @Override public void onError int code, String error showRemovalError error ; , groupID, memberUserIDs, \"已不再参与该项目\" ; 收到 onGroupMemberDeleted 后再从成员缓存中移除目标成员。" }, { - "path": "/sdk/android/message/managing-polls/cast-or-cancel-a-vote", - "title": "Cast or cancel a vote", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Cast or cancel a vote. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "title": "更新群昵称", + "description": "使用 SetGroupMemberInfo.nickname 更新成员在指定群中的显示昵称。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls cast-or-cancel-a-vote", - "content": "" + "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-nickname", + "content": "成员资料修改统一使用 setGroupMemberInfo 。请求中填写 groupID 、 userID 和 nickname 。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setNickname \"小林\" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markNicknameSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; 以 onGroupMemberInfoChanged 返回的 GroupMembersInfo.nickname 更新显示。" }, { - "path": "/sdk/android/message/managing-polls/close-a-poll", - "title": "Close a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Close a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "title": "管理群管理员", + "description": "使用 SetGroupMemberInfo.roleLevel 设置成员的群内角色。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls close-a-poll", - "content": "" + "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-role-level", + "content": "roleLevel 使用 GroupRole 常量: OWNER 、 ADMIN 和 MEMBER 。群主转让使用独立接口,不应通过本接口推测转让流程。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setRoleLevel GroupRole.ADMIN ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markRoleSubmitted groupID, userID ; @Override public void onError int code, String error showRoleError error ; ; 实际角色变更和权限由服务端校验,以成员资料变化事件为准。" }, { - "path": "/sdk/android/message/managing-polls/delete-a-poll", - "title": "Delete a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "title": "更新群成员头像", + "description": "使用 SetGroupMemberInfo.faceURL 更新成员在群内展示的头像。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls delete-a-poll", - "content": "" + "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-avatar", + "content": "群成员头像是群内资料字段,不修改用户全局头像。传入已可访问的头像 URL。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setFaceURL avatarURL ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markAvatarSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; 事件到达前保留原头像或使用本地乐观状态,并按最新成员资料校准。" }, { - "path": "/sdk/android/message/managing-polls/delete-a-poll-option", - "title": "Delete a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/managing-group-members/set-group-member-extension", + "title": "设置群成员扩展字段", + "description": "使用 SetGroupMemberInfo.ex 保存应用定义的群成员扩展数据。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls delete-a-poll-option", - "content": "" + "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-extension", + "content": "SetGroupMemberInfo.ex 是完整字符串,不会自动合并 JSON。多个业务模块共享时应先读取、合并并保留其他命名空间。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setEx \" \\\"duty\\\":\\\"reviewer\\\" \" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markMemberExtensionSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; 不要将凭据、令牌或仅限本机的显示状态写入该字段。" }, { - "path": "/sdk/android/message/managing-polls/list-changelogs-of-polls", - "title": "List changelogs of polls", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List changelogs of polls. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/managing-group-members/transfer-group-owner", + "title": "转让群主", + "description": "使用 transferGroupOwner 将群主身份转让给指定群成员。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls list-changelogs-of-polls", - "content": "" + "keywords": "sdk android v4 sdk android group managing-group-members transfer-group-owner", + "content": "目标用户必须是该群成员。转让前应在产品层要求明确确认,并在完成后重新查询群主和管理员资料。 OpenIMClient.getInstance .groupManager.transferGroupOwner new OnBase @Override public void onSuccess String data markOwnershipTransferSubmitted groupID ; @Override public void onError int code, String error showTransferError error ; , groupID, newOwnerUserID ; onGroupMemberInfoChanged 和群资料变化可能异步到达;不要在成功 callback 中假定本地角色已完成更新。" }, { - "path": "/sdk/android/message/managing-polls/retrieve-a-list-of-polls", - "title": "Retrieve a list of polls", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of polls. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/group/managing-group-members/change-group-member-mute", + "title": "禁言或解除禁言群成员", + "description": "使用 changeGroupMemberMute 设置指定成员的禁言时长。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls retrieve-a-list-of-polls", - "content": "" + "keywords": "sdk android v4 sdk android group managing-group-members change-group-member-mute", + "content": "seconds 为禁言时长,单位为秒;传 0 解除成员禁言。该操作与全员禁言相互独立。 OpenIMClient.getInstance .groupManager.changeGroupMemberMute new OnBase @Override public void onSuccess String data markMemberMuteSubmitted groupID, userID ; @Override public void onError int code, String error showMemberMuteError error ; , groupID, userID, 3600L ; 在 onGroupMemberInfoChanged 中读取 muteEndTime 更新成员状态;不要用本机时间和请求时长长期推算最终禁言状态。" }, { - "path": "/sdk/android/message/managing-polls/retrieve-a-list-of-voters", - "title": "Retrieve a list of voters", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of voters. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/overview-message", + "title": "消息概览", + "description": "了解 Android SDK 的 Message 模型、消息生命周期和消息监听。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls retrieve-a-list-of-voters", - "content": "" + "keywords": "sdk android v4 sdk android message overview-message", + "content": "Android 消息以 Message 表示,使用 clientMsgID 去重,使用 sessionType 、 recvID 和 groupID 区分单聊与群聊。消息内容由对应的 element 字段承载,发送、接收、撤回和删除是不同的状态变化。 OpenIMClient.getInstance .messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; ; 查询建立快照, OnAdvanceMsgListener 合并增量; MessageManager 的 listener 设置会替换当前 listener。" }, { - "path": "/sdk/android/message/managing-polls/retrieve-a-poll", - "title": "Retrieve a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-text-message", + "title": "创建文本消息", + "description": "使用 createTextMessage 创建文本 Message。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls retrieve-a-poll", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-text-message", + "content": "createTextMessage 只创建本地消息对象,不发送消息。 Message message = OpenIMClient.getInstance .messageManager.createTextMessage text ;" }, { - "path": "/sdk/android/message/managing-polls/retrieve-a-poll-option", - "title": "Retrieve a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-text-at-message", + "title": "创建 @ 消息", + "description": "使用 createTextAtMessage 创建带成员提醒的文本消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls retrieve-a-poll-option", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-text-at-message", + "content": "传入文本、被提醒用户 ID、 AtUserInfo 列表和可选引用消息。 Message message = OpenIMClient.getInstance .messageManager.createTextAtMessage text, userIDs, atUserInfos, quoteMessage ;" }, { - "path": "/sdk/android/message/managing-polls/update-a-poll", - "title": "Update a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-custom-message", + "title": "创建自定义消息", + "description": "使用 createCustomMessage 承载业务定义的 JSON 消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls update-a-poll", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-custom-message", + "content": "data 、 extension 和 description 由业务定义,接收端应按自己的协议解析。 Message message = OpenIMClient.getInstance .messageManager.createCustomMessage dataJson, extensionJson, description ;" }, { - "path": "/sdk/android/message/managing-polls/update-a-poll-option", - "title": "Update a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-image-message-by-file", + "title": "从文件创建图片消息", + "description": "使用相对路径或绝对路径创建图片消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls update-a-poll-option", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-image-message-by-file", + "content": "缓存目录内使用 createImageMessage ,绝对路径使用 createImageMessageFromFullPath 。 Message message = OpenIMClient.getInstance .messageManager.createImageMessageFromFullPath filePath ;" }, { - "path": "/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status", - "title": "Get read status of a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Get read status of a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-image-message-by-url", + "title": "从 URL 创建图片消息", + "description": "使用 createImageMessageByURL 创建已上传资源的图片消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-read-status-in-a-group-channel get-read-status", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-image-message-by-url", + "content": "准备 PictureInfo 的原图、大图和缩略图信息后创建消息。 Message message = OpenIMClient.getInstance .messageManager.createImageMessageByURL sourceURL, sourcePicture, bigPicture, snapshotPicture ;" }, { - "path": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read", - "title": "Mark messages as read", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as read. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "title": "从文件创建音频消息", + "description": "使用相对路径或绝对路径创建音频消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-read-status-in-a-group-channel mark-messages-as-read", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-sound-message-by-file", + "content": "音频时长单位为秒;根据文件位置选择相对路径或绝对路径方法。 Message message = OpenIMClient.getInstance .messageManager .createSoundMessageFromFullPath soundPath, durationSeconds ;" }, { - "path": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread", - "title": "Mark messages as unread", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as unread. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "title": "从 URL 创建音频消息", + "description": "使用 SoundElem 创建已上传资源的音频消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-read-status-in-a-group-channel mark-messages-as-unread", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-sound-message-by-url", + "content": "createSoundMessageByURL 接收已经包含 URL、时长和大小的 SoundElem 。 Message message = OpenIMClient.getInstance .messageManager.createSoundMessageByURL soundElem ;" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", - "title": "Cancel a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Cancel a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-video-message-by-file", + "title": "从文件创建视频消息", + "description": "使用相对路径或绝对路径创建视频消息及缩略图。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel cancel-a-scheduled-message", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-video-message-by-file", + "content": "视频方法需要 MIME 类型、时长和缩略图路径。 Message message = OpenIMClient.getInstance .messageManager.createVideoMessageFromFullPath videoPath, mimeType, durationSeconds, snapshotPath ;" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", - "title": "List all scheduled messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List all scheduled messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-video-message-by-url", + "title": "从 URL 创建视频消息", + "description": "使用 VideoElem 创建已上传资源的视频消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel list-all-scheduled-messages", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-video-message-by-url", + "content": "将远端视频及缩略图信息填入 VideoElem 后创建消息。 Message message = OpenIMClient.getInstance .messageManager.createVideoMessageByURL videoElem ;" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "title": "Retrieve a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-file-message-by-file", + "title": "从文件创建文件消息", + "description": "使用相对路径或绝对路径创建文件消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel retrieve-a-scheduled-message", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-file-message-by-file", + "content": "文件名与路径分别传入;相对路径相对于 SDK 初始化时配置的缓存目录。 Message message = OpenIMClient.getInstance .messageManager .createFileMessageFromFullPath filePath, fileName ;" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", - "title": "Retrieve the total number of scheduled messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve the total number of scheduled messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-file-message-by-url", + "title": "从 URL 创建文件消息", + "description": "使用 FileElem 创建已上传资源的文件消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel retrieve-the-total-number-of-scheduled-messages", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-file-message-by-url", + "content": "FileElem 应包含远端 URL、文件名和文件大小。 Message message = OpenIMClient.getInstance .messageManager.createFileMessageByURL fileElem ;" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", - "title": "Send scheduled message immediately", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send scheduled message immediately. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-card-message", + "title": "创建名片消息", + "description": "使用 createCardMessage 创建联系人名片消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel send-a-scheduled-message-immediately", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-card-message", + "content": "CardElem 保存名片用户的展示资料。 Message message = OpenIMClient.getInstance .messageManager.createCardMessage cardElem ;" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", - "title": "Update a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-location-message", + "title": "创建位置消息", + "description": "使用 createLocationMessage 创建经纬度和描述位置消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel update-a-scheduled-message", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-location-message", + "content": "经纬度使用十进制度数,描述用于地图或列表展示。 Message message = OpenIMClient.getInstance .messageManager .createLocationMessage latitude, longitude, description ;" }, { - "path": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", - "title": "Receive messages in a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Receive messages in a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-face-message", + "title": "创建表情消息", + "description": "使用 createFaceMessage 创建自定义表情消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message receiving-messages-through-event-handler receive-messages-in-a-group-channel", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-face-message", + "content": "index 表示表情位置, data 保存表情 URL 等 JSON 数据。 Message message = OpenIMClient.getInstance .messageManager.createFaceMessage index, dataJson ;" }, { - "path": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", - "title": "Receive messages in an open channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Receive messages in an open channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-quote-message", + "title": "创建引用消息", + "description": "使用 createQuoteMessage 创建引用已有消息的回复。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message receiving-messages-through-event-handler receive-messages-in-an-open-channel", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-quote-message", + "content": "引用消息保存被引用的完整 Message ,发送前应确保引用对象包含稳定的 clientMsgID 。 Message message = OpenIMClient.getInstance .messageManager .createQuoteMessage replyText, quotedMessage ;" }, { - "path": "/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages", - "title": "Retrieve a list of messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-forward-message", + "title": "创建转发消息", + "description": "使用 createForwardMessage 创建转发消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-messages retrieve-a-list-of-messages", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-forward-message", + "content": "传入待转发的 Message ,创建结果仍需通过发送方法投递到目标会话。 Message message = OpenIMClient.getInstance .messageManager.createForwardMessage sourceMessage ;" }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", - "title": "Retrieve number of members who haven't read a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of members who haven't read a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/creating-messages/create-merger-message", + "title": "创建合并消息", + "description": "使用 createMergerMessage 将多条消息合并为一条摘要消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel members-who-havent-read-a-message", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-merger-message", + "content": "传入消息列表、标题和摘要列表;摘要顺序应与展示协议保持一致。 Message message = OpenIMClient.getInstance .messageManager.createMergerMessage messages, title, summaries ;" }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", - "title": "Retrieve number of members who haven't received a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of members who haven't received a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/sending-messages/send-message", + "title": "发送消息", + "description": "使用 sendMessage 将 Message 发送到单聊或群聊。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel members-who-havent-received-a-message", - "content": "" + "keywords": "sdk android v4 sdk android message sending-messages send-message", + "content": "单聊填写 recvUid ,群聊填写 recvGid ,另一个目标参数传 null 。 OnMsgSendCallback 同时承载成功、失败和媒体进度。 messageManager.sendMessage new OnMsgSendCallback @Override public void onSuccess String id mergeSentMessage message ; @Override public void onError int code, String error showSendError error ; , message, peerUserID, null, offlinePushInfo ;" }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels", - "title": "Retrieve number of channels with unread messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of channels with unread messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/sending-messages/send-message-not-oss", + "title": "发送非 OSS 消息", + "description": "使用 sendMessageNotOss 发送已经由业务上传资源的媒体消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel unread-channels", - "content": "" + "keywords": "sdk android v4 sdk android message sending-messages send-message-not-oss", + "content": "消息中的媒体 URL 已准备好时使用该方法,避免 SDK 再次进入内置上传流程。 messageManager.sendMessageNotOss callback, message, peerUserID, null, offlinePushInfo ;" }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items", - "title": "Retrieve number of unread items", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of unread items. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "title": "跟踪消息发送进度", + "description": "通过 OnMsgSendCallback 的进度回调更新媒体发送进度。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel unread-items", - "content": "" + "keywords": "sdk android v4 sdk android message sending-messages set-msg-send-progress-listener", + "content": "Android 没有独立的全局发送进度 listener;进度随每次 sendMessage 或 sendMessageNotOss 传入的 OnMsgSendCallback 返回。 messageManager.sendMessage new OnMsgSendCallback @Override public void onProgress long progress updateProgress progress ; @Override public void onSuccess String id finishProgress ; @Override public void onError int code, String error failProgress error ; , message, peerUserID, null, offlinePushInfo ;" }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", - "title": "Retrieve number of unread messages in a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of unread messages in a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/receiving-messages/receive-messages", + "title": "接收消息", + "description": "使用 OnAdvanceMsgListener 接收新消息、离线消息和在线消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel unread-messages-in-a-channel", - "content": "" + "keywords": "sdk android v4 sdk android message receiving-messages receive-messages", + "content": "设置 setAdvancedMsgListener 后, onRecvNewMessage 接收实时消息, onRecvOfflineNewMessage 接收离线批次, onRecvOnlineOnlyMessage 接收在线消息字符串。所有消息都按 clientMsgID 幂等合并。 messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; @Override public void onRecvOfflineNewMessage List messages messageStore.mergeAll messages ; ;" }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "title": "Retrieve number of unread messages in all channels", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of unread messages in all channels. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "title": "接收自定义业务消息", + "description": "使用 setCustomBusinessListener 接收独立于普通聊天消息的业务回调。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel unread-messages-in-all-channels", - "content": "" + "keywords": "sdk android v4 sdk android message receiving-messages receive-custom-business-messages", + "content": "自定义业务回调携带字符串,业务侧应按协议校验来源和 JSON 结构,不要将其直接当作 Message 渲染。 messageManager.setCustomBusinessListener new OnCustomBusinessListener @Override public void onRecvCustomBusinessMessage String payload handleBusiness payload ; ; 本页是 onRecvCustomBusinessMessage 的完整处理归属页。载荷应包含业务协议版本和稳定幂等 ID,并按该 ID 去重;不要依赖回调顺序,也不要使用自定义业务消息授予客户端权限。 MessageManager 只保存一个自定义业务 listener,后一次设置会替换前一次。应在应用级事件中心设置一次,并在退出或切换账号时停止向旧账号状态分发。" }, { - "path": "/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload", - "title": "Cancel an in-progress file upload", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Cancel an in-progress file upload. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/retrieving-messages/load-older-messages", + "title": "加载更早消息", + "description": "使用 getAdvancedHistoryMessageList 分页加载会话历史消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message cancel-an-in-progress-file-upload", - "content": "" + "keywords": "sdk android v4 sdk android message retrieving-messages load-older-messages", + "content": "首次查询传 startMsg 为 null ,后续将上一页边界消息作为起点。按返回的 clientMsgID 去重。 messageManager.getAdvancedHistoryMessageList callback, conversationID, startMessage, 20, ViewType.NORMAL ;" }, { - "path": "/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "title": "Send a critical alert message to iOS device users", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send a critical alert message to iOS device users. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/retrieving-messages/load-newer-messages", + "title": "加载更新消息", + "description": "使用 getAdvancedHistoryMessageListReverse 加载起点之后的消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message send-a-critical-alert-message-to-ios-device-users", - "content": "" + "keywords": "sdk android v4 sdk android message retrieving-messages load-newer-messages", + "content": "该方法用于从消息定位点向后读取,适合搜索定位或上下文分页。 messageManager.getAdvancedHistoryMessageListReverse callback, conversationID, startMessage, 20, ViewType.NORMAL ;" }, { - "path": "/sdk/android/message/sending-a-message/send-a-message", - "title": "Send a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "title": "按 ID 查询消息", + "description": "使用 findMessageList 按 SearchParams 查询消息记录。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message send-a-message", - "content": "" + "keywords": "sdk android v4 sdk android message retrieving-messages find-messages-by-id", + "content": "构造 SearchParams 列表查询消息。返回结果应按消息 ID 合并,不要用列表位置作为稳定标识。 messageManager.findMessageList new OnBase @Override public void onSuccess SearchResult result showFoundMessages result ; @Override public void onError int code, String error showQueryError error ; , searchParams ;" }, { - "path": "/sdk/android/message/sending-a-message/send-an-admin-message", - "title": "Send an admin message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send an admin message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/searching-messages/search-messages", + "title": "搜索消息", + "description": "使用 searchLocalMessages 搜索当前账号已同步到本地的消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message send-an-admin-message", - "content": "" + "keywords": "sdk android v4 sdk android message searching-messages search-messages", + "content": "可按会话、关键词、发送者、消息类型、时间范围和分页参数搜索。 conversationID 传 null 表示全局搜索。 messageManager.searchLocalMessages callback, conversationID, keywords, 1, senderIDs, messageTypes, 0, 0, 0, 20 ;" }, { - "path": "/sdk/android/message/sending-a-message/spam-flood-protection", - "title": "Spam flood protection", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Spam flood protection. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/composing-messages/update-typing-status", + "title": "更新输入状态", + "description": "使用 typingStatusUpdate 提示单聊对方当前正在输入。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message spam-flood-protection", - "content": "" + "keywords": "sdk android v4 sdk android message composing-messages update-typing-status", + "content": "输入框变化时传入对方用户 ID 和业务约定的提示字符串。调用侧应防抖,避免每次按键都发送请求。 messageManager.typingStatusUpdate callback, peerUserID, \"typing\" ; 成功 callback 表示输入状态上报请求完成,不表示对端已经处理。对端通过应用级 OnConversationListener.onConversationUserInputStatusChanged 接收字符串载荷;Android wrapper 不会自动把它转换为模型,应在校验 JSON 后再解析: @Override public void onConversationUserInputStatusChanged String payload InputStatesChangedData state = JsonUtil.toObj payload, InputStatesChangedData.class ; if state == null || state.getConversationID == null return; updateTypingState state.getConversationID , state.getUserID , state.getPlatformIDs ; 输入状态按 conversationID:userID 合并,并设置业务侧超时自动清除。 ConversationManager 只保存一个会话 listener,本回调必须与会话列表、总未读数和同步事件组合后统一设置,不能在输入框页面单独覆盖。" }, { - "path": "/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler", - "title": "Track file upload progress using a handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Track file upload progress using a handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/delete-local-message", + "title": "删除本地消息", + "description": "使用 deleteMessageFromLocalStorage 仅删除当前设备的消息副本。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message track-file-upload-progress-using-a-handler", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages delete-local-message", + "content": "该操作不影响其他设备和其他用户的消息记录。 messageManager.deleteMessageFromLocalStorage conversationID, clientMsgID, callback ;" }, { - "path": "/sdk/android/message/translating-messages/translation-engine", - "title": "Translation engine", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Translation engine. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/delete-saved-messages", + "title": "删除已保存消息", + "description": "使用 deleteMessageFromLocalAndSvr 删除本地和服务端的一条消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message translating-messages translation-engine", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages delete-saved-messages", + "content": "删除结果通过消息事件同步,调用成功不代表所有端已经刷新。 messageManager.deleteMessageFromLocalAndSvr conversationID, clientMsgID, callback ;" }, { - "path": "/sdk/android/message/using-message-threading/list-replies-in-a-message-thread", - "title": "List replies in a message thread", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List replies in a message thread. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/revoke-a-message", + "title": "撤回消息", + "description": "使用 revokeMessageV2 撤回已发送消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message using-message-threading list-replies-in-a-message-thread", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages revoke-a-message", + "content": "Android 的撤回方法为 revokeMessageV2 ,撤回详情通过 onRecvMessageRevokedV2 返回。 messageManager.revokeMessageV2 callback, conversationID, clientMsgID ;" }, { - "path": "/sdk/android/migrating-to-openim", - "title": "Migrating to OpenIM", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Migrating to OpenIM. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/modify-a-message", + "title": "修改消息", + "description": "使用 ModifyMessageReq 修改支持修改的消息内容。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android migrating-to-openim", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages modify-a-message", + "content": "请求对象中填写会话 ID、客户端消息 ID 和新的消息内容,修改结果通过 onMessageModified 同步。 messageManager.modifyMessage callback, modifyRequest ;" }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates", - "title": "Push notification content templates", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Push notification content templates. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/get-pinned-messages", + "title": "查看置顶消息", + "description": "使用 getConversationPinnedMsgs 查询会话中的置顶消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications push-notification-content-templates", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages get-pinned-messages", + "content": "查询结果是指定会话当前的置顶消息快照。 messageManager.getConversationPinnedMsgs new OnBase @Override public void onSuccess List messages showPinned messages ; @Override public void onError int code, String error showPinnedError error ; , conversationID ;" }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/push-notification-tester", - "title": "Push notification tester", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Push notification tester. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/set-message-pinned", + "title": "置顶或取消置顶消息", + "description": "使用 setConversationPinnedMsg 设置会话消息的置顶状态。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications push-notification-tester", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages set-message-pinned", + "content": "最后一个参数为 true 置顶, false 取消置顶;变化通过 onChangedPinnedMsg 同步。 messageManager.setConversationPinnedMsg callback, conversationID, clientMsgID, true ;" }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for FCM. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/insert-local-single-message", + "title": "插入本地单聊消息", + "description": "使用 insertSingleMessageToLocalStorage 插入仅当前设备可见的单聊消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications set-up-push-notifications-for-fcm", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages insert-local-single-message", + "content": "该方法不向服务器发送消息, receiver 和 sender 用于建立本地消息归属。 messageManager.insertSingleMessageToLocalStorage callback, message, receiverUserID, senderUserID ;" }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for HMS. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/insert-local-group-message", + "title": "插入本地群聊消息", + "description": "使用 insertGroupMessageToLocalStorage 插入仅当前设备可见的群聊消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications set-up-push-notifications-for-hms", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages insert-local-group-message", + "content": "传入群 ID 与发送者 ID,消息不会同步到其他设备。 messageManager.insertGroupMessageToLocalStorage callback, message, groupID, senderUserID ;" }, { - "path": "/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", - "title": "Mark push notifications as delivered", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark push notifications as delivered. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/clear-all-local-messages", + "title": "清空全部本地消息", + "description": "使用 deleteAllMsgFromLocal 清理当前设备的全部消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications marking-push-notifications-as-delivered mark-push-notifications-as-delivered", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages clear-all-local-messages", + "content": "该操作只清理当前设备本地缓存,不删除服务端记录。 messageManager.deleteAllMsgFromLocal callback ;" }, { - "path": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for FCM. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/clear-all-messages", + "title": "清空全部已保存消息", + "description": "使用 deleteAllMsgFromLocalAndSvr 清理本地和服务端消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications multi-device-support set-up-push-notifications-for-fcm", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages clear-all-messages", + "content": "这是高影响操作,产品层应二次确认,并在完成后清理本地会话展示。 messageManager.deleteAllMsgFromLocalAndSvr callback ;" }, { - "path": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for HMS. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/message/managing-messages/set-message-local-ex", + "title": "设置消息本地扩展字段", + "description": "使用 setMessageLocalEx 保存仅当前设备使用的消息扩展数据。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications multi-device-support set-up-push-notifications-for-hms", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages set-message-local-ex", + "content": "localEx 适合保存下载路径、播放状态等本地信息,不会同步给其他用户。 messageManager.setMessageLocalEx callback, conversationID, clientMsgID, localExJson ;" }, { - "path": "/sdk/android/report/creating-a-report/report-a-message-user-or-channel", - "title": "Report a message, user, or channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Report a message, user, or channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/file-uploads/track-file-upload-progress", + "title": "跟踪文件上传进度", + "description": "使用 Android SDK 的 OnPutFileListener 跟踪单次文件上传任务。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android report creating-a-report report-a-message-user-or-channel", - "content": "" + "keywords": "sdk android v4 sdk android file-uploads track-file-upload-progress", + "content": "Android SDK 不设置全局文件上传 listener。每次调用 uploadFile 时传入一个 OnPutFileListener ,由该 listener 接收当前上传任务的进度、分片状态和完成信息。 OnPutFileListener uploadListener = new OnPutFileListener @Override public void open long size initializeUploadProgress uploadTaskID, size ; @Override public void uploadID String id bindSdkUploadID uploadTaskID, id ; @Override public void uploadComplete long fileSize, long uploadedSize, long storageSize updateUploadProgress uploadTaskID, uploadedSize, fileSize ; @Override public void uploadPartComplete long partNumber, long partSize, String partHash markPartComplete uploadTaskID, partNumber, partSize, partHash ; @Override public void complete long size, String url, long type completeUpload uploadTaskID, size, url, type ; ; OpenIMClient.getInstance .uploadFile resultCallback, uploadListener, putArgs ; open 可用于初始化总大小, uploadID 返回 SDK 上传任务标识, uploadComplete 提供上传过程数据, uploadPartComplete 表示一个分片已经完成, complete 返回最终大小、远端 URL 和资源类型。只有业务需要展示分片细节时才处理分片回调;普通进度条通常只需要过程回调和最终完成回调。 业务层仍应生成自己的稳定 uploadTaskID ,并在 listener 闭包中关联界面状态。SDK 上传 ID、文件名和数组位置都不应代替业务任务主键。每个上传任务使用独立 listener;页面或账号状态销毁后应停止向旧状态分发回调。 完整的参数构造和错误处理见 上传文件 /sdk/android/file uploads/upload file 。" }, { - "path": "/sdk/android/user/managing-user-metadata/manage-user-metadata", - "title": "Manage user metadata", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Manage user metadata. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/file-uploads/upload-file", + "title": "上传文件", + "description": "使用 Android SDK 独立上传文件并获取远端资源地址。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user managing-user-metadata manage-user-metadata", - "content": "" + "keywords": "sdk android v4 sdk android file-uploads upload-file", + "content": "uploadFile 是独立文件上传能力,可用于头像、群头像、资料附件或其他业务文件。上传过程不从属于消息,也不会自动创建消息或更新用户资料。 参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | base | OnBase | 是 | 接收上传请求的最终成功或失败结果。 | | listener | OnPutFileListener | 是 | 接收当前任务的上传进度、分片状态和完成信息。 | | putArgs.filepath | String | 是 | Android 应用可读取的本地文件路径。 | | putArgs.name | String | 是 | 上传使用的文件名; PutArgs 默认使用传入路径,可按业务需要改为原始文件名。 | | putArgs.cuase | String | 否 | 业务约定的上传原因。字段名以 Android SDK 的 PutArgs 声明为准。 | File file = new File localPath ; PutArgs args = new PutArgs file.getAbsolutePath ; args.name = file.getName ; args.cuase = \"user avatar\"; OpenIMClient.getInstance .uploadFile new OnBase @Override public void onSuccess String result finishUploadRequest result ; @Override public void onError int code, String error showUploadError code, error ; , new OnPutFileListener @Override public void uploadComplete long fileSize, long uploadedSize, long storageSize updateUploadProgress uploadTaskID, uploadedSize, fileSize ; @Override public void complete long size, String url, long type completeUpload uploadTaskID, size, url, type ; , args ; 每次调用都传入独立的 OnPutFileListener ,因此无需设置全局上传 listener。并行上传时应由业务层为任务生成稳定 ID,并在回调闭包中关联对应任务,不要使用文件名或列表位置作为唯一标识。各回调的职责见 跟踪文件上传进度 /sdk/android/file uploads/track file upload progress 。 complete 返回的 URL 可用于后续更新头像、保存附件地址或创建 URL 类型的媒体消息。上传成功只表示文件资源已经写入远端;资料更新、消息创建和消息发送仍需分别调用对应 API。" }, { - "path": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "title": "Retrieve a list of blocked users", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of blocked users. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/overview-calling", + "title": "音视频通话概览", + "description": "了解 Android SDK 的音视频通话信令、房间信息和事件边界。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user moderating-a-user retrieve-a-list-of-blocked-users", - "content": "" + "keywords": "sdk android v4 sdk android calling overview-calling", + "content": "Android SDK 的 SignalingManager 提供发起邀请、接受、拒绝、取消、挂断、查询房间和同步通话状态所需的信令 API。它负责协调通话参与者、房间信息和通话生命周期,不负责采集摄像头画面、播放远端媒体流或渲染通话界面。 应用需要把 SDK 返回的 roomID 、 token 和 liveURL 交给所选的实时音视频媒体引擎,并自行处理 Android 权限、音视频设备、媒体轨道、弱网策略和界面状态。信令 API 不是一套完整的实时音视频媒体 SDK。 通话流程 1. 调用 signalingInvite 发起单聊通话,或调用 signalingInviteInGroup 发起群聊通话。 2. 被邀请方从 onReceiveNewInvitation 获取 SignalingInfo ,选择接受或拒绝。 3. 接受方调用 signalingAccept ,双方使用返回的房间凭据接入媒体引擎。 4. 通话过程中根据参与者、媒体流和自定义信令回调更新本地状态。 5. 发起方可以取消尚未接通的邀请;任一通话参与者都可以挂断已经建立的通话。 核心数据 | 数据 | 说明 | | | | | SignalingInvitationInfo | 邀请人、被邀请人、群组、房间、媒体类型、超时时间、会话类型和业务扩展数据。 | | SignalingInfo | 当前操作用户、原始邀请、参与者资料和可选的离线推送信息。 | | SignalingCertificate | OpenIMServer 返回的 roomID 、 token 、 liveURL 和忙线用户列表。 | | RoomCallingInfo | 按群组查询到的房间、邀请、参与者、群组和入会凭据快照。 | customData 和自定义信令只适合传递业务协商信息。长期凭据、管理员密钥和其他敏感数据不应写入这些字段。 状态更新与事件归属 发起、接受、拒绝、取消和挂断等写操作需要分别处理 API 回调与通话 listener。API 成功回调表示当前信令请求已经完成;listener 反映邀请方、被邀请方、其他设备或房间参与者看到的增量状态,两者不是同一个完成信号。 邀请生命周期、参与者进出房间、挂断和媒体流变化的完整 listener 统一见 处理通话事件 /sdk/android/calling/managing calls/handle call events ;自定义信令见 发送自定义信令 /sdk/android/calling/sending custom signals/send a custom signal 。房间、凭据和待处理邀请查询只返回调用时的状态快照。 概览页不设置 listener。通话状态以 roomID 为主键;参与者状态还需要结合用户 ID。需要恢复或校准当前房间状态时,再调用对应查询 API。 按任务查找页面 | 任务 | 页面 | | | | | 发起单聊或群聊通话 | 发起单聊通话 /sdk/android/calling/managing calls/start single call 、 发起群聊通话 /sdk/android/calling/managing calls/start group call | | 接受或拒绝邀请 | 接受通话 /sdk/android/calling/managing calls/accept call 、 拒绝通话 /sdk/android/calling/managing calls/reject call | | 取消邀请或挂断通话 | 取消通话邀请 /sdk/android/calling/managing calls/cancel call 、 挂断通话 /sdk/android/calling/managing calls/hang up call | | 恢复房间或待处理邀请 | 查询群组通话房间 /sdk/android/calling/retrieving call information/get room by group id 、 获取通话房间 Token /sdk/android/calling/retrieving call information/get token by room id 、 恢复启动前收到的通话邀请 /sdk/android/calling/retrieving call information/restore pending invitation | | 处理通话事件和业务协商 | 处理通话事件 /sdk/android/calling/managing calls/handle call events 、 发送自定义信令 /sdk/android/calling/sending custom signals/send a custom signal |" }, { - "path": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users", - "title": "Retrieve a list of muted users", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of muted users. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/managing-calls/start-single-call", + "title": "发起单聊通话", + "description": "使用 Android SDK 发起单聊音视频通话。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user moderating-a-user retrieve-a-list-of-muted-users", - "content": "" + "keywords": "sdk android v4 sdk android calling managing-calls start-single-call", + "content": "signalingInvite 发起单聊通话。Android SDK 负责通话信令,应用仍需使用返回的房间凭据接入实时音视频媒体引擎。 参数说明 | 字段 | 类型 | 是否必填 | 说明 | | | | | | | userID | String | 是 | 执行邀请操作的当前登录用户 ID。 | | inviterUserID | String | 是 | 邀请方用户 ID,通常与当前登录用户一致。 | | inviteeUserIDList | List | 是 | 被邀请用户列表;单聊只填写对方一个用户。 | | groupID | String | 是 | 单聊固定传空字符串。 | | roomID | String | 是 | 本次通话的唯一房间标识,后续状态按它合并。 | | timeout | long | 是 | 邀请等待时长,单位为秒。 | | mediaType | String | 是 | 媒体类型,业务通常约定为 audio 或 video 。 | | sessionType | int | 是 | 单聊使用 ConversationType.SINGLE CHAT 。 | | platformID | int | 是 | Android 手机端使用 Platform.ANDROID 。 | | customData | String | 否 | 随邀请携带的业务扩展字符串。 | | offlinePushInfo | OfflinePushInfo | 否 | 被邀请人离线时使用的推送内容。 | SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList Collections.singletonList peerUserID ; invitation.setGroupID \"\" ; invitation.setRoomID roomID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.SINGLE CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"contact card\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setUserID currentUserID ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInvite new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCallError code, error ; , info ; 成功回调返回 SignalingCertificate 。其中 roomID 是媒体房间 ID, token 是加入房间使用的短期凭据, liveURL 是媒体服务提供的连接地址, busyLineUserIDList 是忙线用户列表。 只有取得有效的 token 和 roomID 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态由 处理通话事件 /sdk/android/calling/managing calls/handle call events 合并。" }, { - "path": "/sdk/android/user/overview-user", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/managing-calls/start-group-call", + "title": "发起群聊通话", + "description": "使用 Android SDK 发起群聊音视频通话。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user overview-user", - "content": "" + "keywords": "sdk android v4 sdk android calling managing-calls start-group-call", + "content": "signalingInviteInGroup 发起群聊通话,只邀请 inviteeUserIDList 明确列出的群成员,不会因为填写 groupID 自动邀请全群。 SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList selectedGroupMemberIDs ; invitation.setGroupID groupID ; invitation.setRoomID groupID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.GROUP CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"group call\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setUserID currentUserID ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInviteInGroup new OnBase @Override public void onSuccess SignalingCertificate credentials startGroupCall credentials ; @Override public void onError int code, String error showCallError code, error ; , info ; groupID 不能为空, inviteeUserIDList 应排除当前用户、空值和重复成员。示例沿用群组 ID 作为房间 ID;若业务自行生成 roomID ,所有参与端必须使用同一个值。 成功回调返回 SignalingCertificate ,字段含义见 发起单聊通话 /sdk/android/calling/managing calls/start single call 。 busyLineUserIDList 只表示部分成员忙线,不应中止其他成员的邀请流程;成功也不表示其他成员已经接听。" }, { - "path": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "title": "Retrieve the latest information on participants", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve the latest information on participants. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/managing-calls/accept-call", + "title": "接受通话", + "description": "使用 Android SDK 接受通话邀请并获取房间凭据。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-and-updating-user-information retrieve-the-latest-information-on-participants", - "content": "" + "keywords": "sdk android v4 sdk android calling managing-calls accept-call", + "content": "从 onReceiveNewInvitation 取得原始 SignalingInfo 后,使用 signalingAccept 接受邀请: OpenIMClient.getInstance .signalingManager.signalingAccept new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showAcceptError code, error ; , receivedInfo ; receivedInfo 必须保留收到的原始 roomID 、邀请人、被邀请人和会话类型,不能重新构造为只包含 roomID 的对象。 成功回调返回 SignalingCertificate 。取得有效的 token 和 roomID 后再连接媒体房间;远端状态由 处理通话事件 /sdk/android/calling/managing calls/handle call events 继续合并。" }, { - "path": "/sdk/android/user/retrieving-and-updating-user-information/update-user-profile", - "title": "Update user profile", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update user profile. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/managing-calls/reject-call", + "title": "拒绝通话", + "description": "使用 Android SDK 拒绝通话邀请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-and-updating-user-information update-user-profile", - "content": "" + "keywords": "sdk android v4 sdk android calling managing-calls reject-call", + "content": "用户拒绝来电时,将收到的原始 SignalingInfo 交给 signalingReject : OpenIMClient.getInstance .signalingManager.signalingReject new OnBase @Override public void onSuccess String result closeIncomingCallUI ; @Override public void onError int code, String error showRejectError code, error ; , receivedInfo ; 成功回调只表示拒绝信令请求完成。发起端随后通过 onInviteeRejected 更新界面;完整处理见 处理通话事件 /sdk/android/calling/managing calls/handle call events 。" }, { - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", - "title": "Retrieve a list of members and operators in a specific order", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of members and operators in a specific order. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/managing-calls/cancel-call", + "title": "取消通话邀请", + "description": "使用 Android SDK 取消尚未接通的通话邀请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-a-list-of-members-and-operators-in-a-specific-order", - "content": "" + "keywords": "sdk android v4 sdk android calling managing-calls cancel-call", + "content": "邀请尚未接通时,发起方调用 signalingCancel : OpenIMClient.getInstance .signalingManager.signalingCancel new OnBase @Override public void onSuccess String result stopWaitingForAnswer activeInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showCancelError code, error ; , activeInfo ; 必须传入发起时保存的完整 SignalingInfo ,不能只构造一个 roomID 。成功回调表示取消信令请求完成;应用还应结束本地等待接听状态,并释放尚未使用的媒体资源。远端通过 onInvitationCancelled 更新。" }, { - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-operators", - "title": "Retrieve a list of operators", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of operators. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/managing-calls/hang-up-call", + "title": "挂断通话", + "description": "使用 Android SDK 挂断已经建立的通话。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-a-list-of-operators", - "content": "" + "keywords": "sdk android v4 sdk android calling managing-calls hang-up-call", + "content": "通话已经建立后,参与者调用 signalingHungUp 。传入的 SignalingInfo 应保留本次通话的完整邀请信息,其中 roomID 必须与当前媒体房间一致。 OpenIMClient.getInstance .signalingManager.signalingHungUp new OnBase @Override public void onSuccess String result releaseCallResources activeInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showHangUpError code, error ; , activeInfo ; 成功回调只表示挂断信令请求完成。应用还需要停止本地采集、断开媒体房间,并释放摄像头和麦克风。取消、拒绝、超时和挂断应进入同一套按 roomID 幂等执行的清理流程。" }, { - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel", - "title": "Retrieve a list of users in a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of users in a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/managing-calls/handle-call-events", + "title": "处理通话事件", + "description": "集中设置 Android SDK 的通话邀请、参与者和媒体流 listener。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-a-list-of-users-in-a-channel", - "content": "" + "keywords": "sdk android v4 sdk android calling managing-calls handle-call-events", + "content": "通话状态层应集中设置一次 OnSignalingListener ,并按 roomID 合并邀请生命周期、参与者连接状态和媒体流变化。 OpenIMClient.getInstance .signalingManager.setSignalingListener new OnSignalingListener @Override public void onReceiveNewInvitation SignalingInfo info upsertCall info, \"ringing\" ; @Override public void onInviteeAccepted SignalingInfo info mergeCallEvent \"accepted\", info ; @Override public void onInviteeRejected SignalingInfo info mergeCallEvent \"rejected\", info ; @Override public void onInvitationCancelled SignalingInfo info mergeCallEvent \"cancelled\", info ; @Override public void onInvitationTimeout SignalingInfo info mergeCallEvent \"timeout\", info ; @Override public void onInviteeAcceptedByOtherDevice SignalingInfo info mergeCallEvent \"accepted by other device\", info ; @Override public void onInviteeRejectedByOtherDevice SignalingInfo info mergeCallEvent \"rejected by other device\", info ; @Override public void onHangup SignalingInfo info finishCall info.getInvitation .getRoomID ; @Override public void onRoomParticipantConnected RoomCallingInfo room mergeConnectedParticipants room.getRoomID , room.getParticipant ; @Override public void onRoomParticipantDisconnected RoomCallingInfo room mergeDisconnectedParticipants room.getRoomID , room.getParticipant ; @Override public void onStreamChange String streamInfo mergeStreamChange streamInfo ; ; 本页是除 onReceiveCustomSignal 外 11 个已接入 Android 适配层的通话回调的完整归属页。自定义信令的处理边界见 发送自定义信令 /sdk/android/calling/sending custom signals/send a custom signal 。 邀请事件使用 SignalingInfo.invitation.roomID 合并。参与者状态使用 RoomCallingInfo.roomID ,并结合参与者的用户 ID 更新;不要按事件顺序、展示名称或数组位置合并。 onStreamChange 当前提供字符串载荷,应由接入层按服务端实际协议解析并校验。 SignalingManager 只设置一个 listener,后一次设置会替换先前实例,并且没有公开移除方法。自定义信令回调必须与本页的其他回调组合在同一个应用级 listener 中。退出登录或切换账号时,应停止向旧账号状态写入,并用新账号的完整 listener 覆盖。" }, { - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application", - "title": "Retrieve a list of users in an application", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of users in an application. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "title": "恢复启动前收到的通话邀请", + "description": "使用 Android SDK 恢复应用启动时尚未处理的通话邀请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-a-list-of-users-in-an-application", - "content": "" + "keywords": "sdk android v4 sdk android calling retrieving-call-information restore-pending-invitation", + "content": "getSignalingInvitationInfoStartApp 不接收业务参数,返回应用启动或恢复时需要处理的邀请快照: OpenIMClient.getInstance .signalingManager.getSignalingInvitationInfoStartApp new OnBase @Override public void onSuccess SignalingInfo info if info = null && info.getInvitation = null && info.getInvitation .getRoomID = null && info.getInvitation .getRoomID .isEmpty restoreIncomingCall info ; @Override public void onError int code, String error clearExpiredIncomingCall ; ; 成功回调只表示取得当前快照,不会替代通话 listener。仅在 invitation 和 roomID 有效时恢复来电界面;随后仍需处理取消、超时、接受和挂断,完整处理见 处理通话事件 /sdk/android/calling/managing calls/handle call events 。" }, { - "path": "/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "title": "Mark messages as read", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as read. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "title": "查询群组通话房间", + "description": "使用 Android SDK 按群组 ID 查询进行中的通话房间。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message marking-messages-as-read-in-a-group-channel mark-messages-as-read", - "content": "" + "keywords": "sdk android v4 sdk android calling retrieving-call-information get-room-by-group-id", + "content": "signalingGetRoomByGroupID 的参数是群组 ID,不是自定义 roomID : OpenIMClient.getInstance .signalingManager.signalingGetRoomByGroupID new OnBase @Override public void onSuccess RoomCallingInfo room if room.getRoomID = null && room.getRoomID .isEmpty renderParticipants room.getParticipant ; @Override public void onError int code, String error showNoActiveGroupCall ; , groupID ; 成功回调返回 RoomCallingInfo 快照,其中包含房间 ID、原始邀请、参与者、群组 ID、Token 和连接地址。参与者资料中的账号资料、群内资料和群资料属于不同数据源,不应相互覆盖。 没有进行中的群通话时,应把错误或空房间视为“当前没有可恢复的通话”,不要继续使用旧凭据。即使业务为群通话使用自定义房间 ID,本方法仍然传入 groupID 。" + }, + { + "path": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "title": "获取通话房间 Token", + "description": "使用 Android SDK 按房间 ID 重新获取入会凭据。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling retrieving-call-information get-token-by-room-id", + "content": "已经知道 roomID 、但需要重新获取入会凭据时,调用 signalingGetTokenByRoomID : OpenIMClient.getInstance .signalingManager.signalingGetTokenByRoomID new OnBase @Override public void onSuccess SignalingCertificate credentials if credentials.getToken = null && credentials.getRoomID = null joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCredentialError code, error ; , roomID ; 成功回调返回 SignalingCertificate ,字段含义见 发起单聊通话 /sdk/android/calling/managing calls/start single call 。只有取得有效的 token 和 roomID 后才能连接媒体引擎。 房间 Token 是短期敏感凭据,只在内存中使用,不要写入日志、URL、分析事件或持久化存储。" + }, + { + "path": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "title": "发送自定义信令", + "description": "使用 Android SDK 在通话房间中发送和接收自定义信令。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling sending-custom-signals send-a-custom-signal", + "content": "signalingSendCustomSignal 用于向指定通话房间发送轻量级业务协商数据,例如举手、切换布局提示或业务侧状态同步。它不是聊天消息接口,也不能替代媒体引擎的数据通道。 发送信令 roomID 与 customInfo 都是必填字符串。需要传递结构化数据时,应定义稳定的数据格式并序列化为 JSON。 JSONObject signal = new JSONObject ; signal.put \"version\", 1 ; signal.put \"eventID\", eventID ; signal.put \"type\", \"hand raised\" ; signal.put \"userID\", currentUserID ; signal.put \"sentAt\", System.currentTimeMillis ; OpenIMClient.getInstance .signalingManager.signalingSendCustomSignal new OnBase @Override public void onSuccess String result markSignalSent eventID ; @Override public void onError int code, String error showSignalError code, error ; , roomID, signal.toString ; 成功回调表示本次自定义信令发送请求已经完成,不等于其他参与者已经处理。自定义信令应保持精简,并包含协议版本和业务幂等 ID。大文件、聊天记录、长期状态和敏感凭据不应放入 customInfo 。 接收信令 OnSignalingListener.onReceiveCustomSignal 返回 CustomSignalingInfo 。应用应先校验房间和自有业务协议,再更新界面: @Override public void onReceiveCustomSignal CustomSignalingInfo info if info == null || activeRoomID.equals info.getRoomID return; CallSignal signal = parseAndValidateCallSignal info.getCustomInfo ; String mergeID = info.getRoomID + \":\" + signal.getEventID ; if hasAppliedSignal mergeID return; applyCallSignal signal ; 本页是 onReceiveCustomSignal 的完整处理归属页。 parseAndValidateCallSignal 应检查 JSON 结构、协议版本、 eventID 、 type 和业务字段。按 roomID:eventID 幂等处理,不要依赖事件顺序。 SignalingManager 只设置一个 listener。接收自定义信令的回调应合并到 处理通话事件 /sdk/android/calling/managing calls/handle call events 所示的应用级 listener 中,不能为本页单独设置一个新 listener,否则会覆盖其他通话回调。 客户端自定义信令不能用于授予主持人、付费或隐私权限。需要权威校验的状态应由可信后端保存和判断;连接恢复后,通过房间查询或业务后端校准长期状态。" + }, + { + "path": "/sdk/android/events/overview-events", + "title": "事件概览", + "description": "集中设置 Android SDK listener,并按业务领域分发连接、同步和数据事件。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android events overview-events", + "content": "OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。 连接 listener 是例外: OnConnListener 在 initSDK 时传入,其完整处理见 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。 集中设置 listener 下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。 public final class OpenIMEventCenter private final OpenIMClient client = OpenIMClient.getInstance ; private final OnUserListener userListener = buildUserListener ; private final OnFriendshipListener friendshipListener = buildFriendshipListener ; private final OnConversationListener conversationListener = buildConversationListener ; private final OnGroupListener groupListener = buildGroupListener ; private final OnAdvanceMsgListener messageListener = buildMessageListener ; private final OnCustomBusinessListener businessListener = buildBusinessListener ; private final OnSignalingListener signalingListener = buildSignalingListener ; public void registerBeforeLogin client.userInfoManager.setOnUserListener userListener ; client.friendshipManager.setOnFriendshipListener friendshipListener ; client.conversationManager.setOnConversationListener conversationListener ; client.groupManager.setOnGroupListener groupListener ; client.messageManager.setAdvancedMsgListener messageListener ; client.messageManager.setCustomBusinessListener businessListener ; client.signalingManager.setSignalingListener signalingListener ; Android SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。 事件归属 | 事件范围 | 合并标识 | 完整处理页面 | | | | | | 连接、Token 和强制下线 | 当前 SDK 实例与登录用户 | 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session | | 当前用户资料 | userID | 更新当前用户资料 /sdk/android/user/user profile/set self info | | 在线状态 | userID | 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status | | 好友关系与资料 | userID | 分页获取好友列表 /sdk/android/user/friends/get friend list page | | 好友申请 | fromUserID:toUserID | 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list | | 黑名单 | userID | 拉黑用户 /sdk/android/user/blacklist/add blacklist 、 移出黑名单 /sdk/android/user/blacklist/remove blacklist | | 会话列表 | conversationID | 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list | | 总未读数 | 当前登录用户 | 获取消息总未读数 /sdk/android/conversation/managing conversations/get total unread count | | 输入状态 | conversationID:userID | 更新输入状态 /sdk/android/message/composing messages/update typing status | | 群资料、成员和群申请 | groupID 或 groupID:userID | 群组概览 /sdk/android/group/overview group | | 新消息、离线消息和在线消息 | clientMsgID ,必要时结合 conversationID | 接收消息 /sdk/android/message/receiving messages/receive messages | | 消息撤回、删除、修改和置顶 | clientMsgID ,必要时结合 conversationID | 消息概览 /sdk/android/message/overview message | | 单聊已读回执 | conversationID:clientMsgID | 标记会话已读 /sdk/android/conversation/managing conversations/mark conversation read | | 自定义业务消息 | 业务协议中的幂等 ID | 接收自定义业务消息 /sdk/android/message/receiving messages/receive custom business messages | | 通话 | roomID ,参与者结合用户 ID | 处理通话事件 /sdk/android/calling/managing calls/handle call events | | 通话自定义信令 | roomID:eventID | 发送自定义信令 /sdk/android/calling/sending custom signals/send a custom signal | | SDK 数据同步 | 当前 SDK 实例与登录用户 | 本页“监听初始化同步” | 查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。 监听初始化同步 同步生命周期属于应用级 OnConversationListener 。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑: private OnConversationListener buildConversationListener return new OnConversationListener @Override public void onNewConversation List conversations mergeNewConversations conversations ; @Override public void onConversationChanged List conversations mergeChangedConversations conversations ; @Override public void onTotalUnreadMessageCountChanged int total updateTotalUnreadCount total ; @Override public void onConversationUserInputStatusChanged String payload handleInputStatus payload ; @Override public void onSyncServerStart boolean reinstall setSyncState \"syncing\", 0, reinstall ; @Override public void onSyncServerProgress long progress setSyncProgress progress ; @Override public void onSyncServerFinish boolean reinstall setSyncState \"ready\", 100, reinstall ; reloadVisibleSnapshots ; @Override public void onSyncServerFailed boolean reinstall setSyncState \"failed\", 0, reinstall ; ; reinstall 为 true 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。 onSyncServerProgress 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。 本页是 onSyncServerStart 、 onSyncServerProgress 、 onSyncServerFinish 和 onSyncServerFailed 的完整处理归属页。同步状态没有业务实体合并键,应按当前 OpenIMClient 单例和登录用户隔离。" + }, + { + "path": "/sdk/android/logger", + "title": "日志", + "description": "配置 Android SDK 日志、写入应用诊断信息并上传日志。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android logger", + "content": "OpenIM Android SDK 日志用于定位初始化、连接和业务 API 调用问题。开发和预发布环境可以输出较详细的信息;生产环境应减少日志量,并避免记录 Token、完整消息正文、原始文件 URL、通话房间凭据和用户隐私字段。 初始化日志配置 日志选项属于 InitConfig ,必须在 initSDK 前设置: File dataDirectory = new File application.getFilesDir , \"openim\" ; File logDirectory = new File application.getFilesDir , \"openim logs\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn; config.isLogStandardOutput = BuildConfig.DEBUG; config.logFilePath = logDirectory.getAbsolutePath ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; | 字段 | 说明 | | | | | logLevel | 使用 LogLevel 常量控制详细程度。可选值包括 DebugWithSQL 、 Debug 、 Info 、 Warn 、 Error 、 Panic 和 Fatal 。 | | isLogStandardOutput | 是否把 SDK 日志输出到 Android 标准日志;开发诊断时开启。 | | logFilePath | 可选日志目录,应位于应用可写范围并纳入容量与保留期管理。 | 开发诊断可以使用 Debug ;只有排查数据库问题时才临时启用 DebugWithSQL 。生产环境通常使用 Warn 或 Error ,并关闭不必要的标准输出。 写入应用诊断日志 需要把业务上下文写入 SDK 日志时,使用未废弃的 logs 重载: OpenIMClient.getInstance .logs LogLevel.Error, ChatRepository.class.getSimpleName , 184, \"send message failed\", errorMessage, \"conversationID\", conversationID, \"clientMsgID\", clientMsgID ; currentClassName 和 currentLineNum 用于定位调用位置, msgStr 是简短动作描述, errStr 是错误信息。 Warn 、 Error 、 Panic 和 Fatal 级别必须提供非空错误信息。末尾的 extra 按“键、值”成对传入;只记录排查所需的非敏感标识。 旧的带 OnBase 、 Map 参数的 logs 重载已经废弃,不应在新代码中使用。 上传诊断日志 只在用户明确同意提交诊断信息后调用 uploadLogs 。Android API 保留了 params 参数;没有额外参数时传空列表。 line 表示本次上传读取的日志行数配置。 String uploadID = UUID.randomUUID .toString ; OpenIMClient.getInstance .uploadLogs new OnBase @Override public void onSuccess String data showLogUploadCompleted ; @Override public void onError int code, String error showLogUploadError code, error ; , Collections.emptyList , 2000, uploadID, \"support ticket 42\", new UploadLogProgress @Override public void onProgress long current, long total updateLogUploadProgress current, total ; ; | 参数 | 说明 | | | | | line | 本次上传读取的日志行数配置。 | | cancelID | 本次上传的稳定标识,可使用业务生成的 UUID。 | | ex | 附加到上传任务的诊断说明,例如工单 ID;不能包含凭据或隐私数据。 | | UploadLogProgress | 提供当前进度和总量,用于更新上传界面。 | 成功 callback 表示本次日志上传请求完成,不会修改用户、会话或消息状态,也不会触发业务领域事件。上传失败时记录错误码、当前用户和业务诊断 ID,不要再次输出完整日志内容。 operationID 与业务追踪 Android Java wrapper 的公共业务方法不接收 operationID 。每次调用时,wrapper 会通过 ParamsUtil.buildOperationID 自动生成并传给 Core,因此应用通常不需要创建或传递该值。 应用日志应另外维护自己的 trace ID,并记录业务动作、错误码以及必要的 conversationID 、 clientMsgID 、 groupID 或 roomID 。应用 trace ID 用于串联多步骤业务流程;SDK 的 operationID 用于单次 SDK 调用链路,两者都不是身份凭据或业务幂等键。 相关页面 按 Android 环境接入 /sdk/android/getting started/environment specific implementation 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 发送消息 /sdk/android/message/sending messages/send message" }, { "path": "/sdk/flutter/overview", diff --git a/src/generated/search-index.json b/src/generated/search-index.json index 8fd6d279f9..e42b8f2c52 100644 --- a/src/generated/search-index.json +++ b/src/generated/search-index.json @@ -1895,1029 +1895,357 @@ "keywords": "sdk ios v4 sdk ios logger", "content": "OpenIM iOS SDK logs help diagnose initialization, connection, and business API issues. Development builds can emit detailed information. Production builds should reduce log volume and must avoid recording tokens, message bodies, file URLs, or private user fields. Configure logging during initialization Logging options belong to OIMInitConfig and must be set before initSDKWithConfig:... : OIMInitConfig config = OIMInitConfig new ; config.platform = iPhone; config.apiAddr = apiAddress; config.wsAddr = websocketAddress; config.dataDir = dataDirectory; config.logLevel = 4; config.isLogStandardOutput = YES; config.logFilePath = logDirectory; config.systemType = @\"ios\"; Parameters | Field | Type | Description | | | | | | logLevel | NSInteger | The SDK log level. The default is 6 ; follow the conventions of the SDK version in use. | | isLogStandardOutput | BOOL | Whether to emit standard SDK logs. | | logFilePath | NSString | Optional directory for log files. | | systemType | NSString | System type label written into logs. | Do not leave the most verbose logging enabled indefinitely in production. Keep the log directory within an app writable location and manage its capacity, retention period, and privacy requirements. Write application diagnostic logs To include application context in SDK logs, call: OIMManager manager logs: NSString stringWithUTF8String: FILE .lastPathComponent line: LINE msgs:@\"send message failed\" err:errorMessage keyAndValues:@ @\"conversationID\", conversationID, @\"clientMsgID\", clientMsgID logLevel:2 ; Include only non sensitive identifiers needed for diagnosis in keyAndValues . Never record access tokens, complete message content, or raw file URLs. Trace a call with operationID Public Objective C business selectors do not require your app to pass an operationID . The SDK generates identifiers for call chains. To obtain a new chain ID for application diagnostics, call: NSString operationID = OIMManager manager operationId ; operationID is only for log correlation. It is not a user identity, authorization credential, business idempotency key, conversationID , or clientMsgID . Use a new value for each independent call chain. To correlate a multi step business flow, use a separate trace ID defined by your application. Upload logs After the user has explicitly agreed to submit diagnostic information, upload the SDK logs: OIMManager manager uploadLogsWithProgress:^ NSInteger saveBytes, NSInteger currentBytes, NSInteger totalBytes self updateLogUploadCurrentBytes:currentBytes totalBytes:totalBytes ; line:2000 ex:@\"support ticket 42\" onSuccess:^ NSString Nullable data self showLogUploadCompleted ; onFailure:^ NSInteger code, NSString message self showLogUploadError:code message:message ; ; The progress callback reports saved, currently processed, and total bytes in that order. Explain the collection scope before uploading, and follow your product's privacy, consent, and retention policies." }, - { - "path": "/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel", - "title": "Freeze and unfreeze a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Freeze and unfreeze a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel moderating-a-channel freeze-and-unfreeze-a-channel", - "content": "" - }, - { - "path": "/sdk/android/channel/overview-channel", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel overview-channel", - "content": "" - }, - { - "path": "/sdk/android/getting-started/send-first-message", - "title": "Send your first message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send your first message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android getting-started send-first-message", - "content": "" - }, - { - "path": "/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message", - "title": "Add extra data to a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add extra data to a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message adding-extra-data-to-a-message add-extra-data-to-a-message", - "content": "" - }, - { - "path": "/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message", - "title": "Generate thumbnails of a file message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Generate thumbnails of a file message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message generate-thumbnails-of-a-file-message", - "content": "" - }, - { - "path": "/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel", - "title": "React to a message in a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for React to a message in a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message react-to-a-message-in-a-group-channel", - "content": "" - }, - { - "path": "/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members", - "title": "Send typing indicators to other members", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send typing indicators to other members. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message send-typing-indicators-to-other-members", - "content": "" - }, - { - "path": "/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message", - "title": "Pin a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Pin a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-pinned-messages-in-group-channels pin-a-message", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/create-a-poll", - "title": "Create a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls create-a-poll", - "content": "" - }, - { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", - "title": "Create a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel create-a-scheduled-message", - "content": "" - }, - { - "path": "/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", - "title": "Mark messages as delivered", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as delivered. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message marking-messages-as-delivered-in-a-group-channel mark-messages-as-delivered", - "content": "" - }, - { - "path": "/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "title": "Mention other users in a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mention other users in a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message mentioning-other-users-in-a-message mention-other-users-in-a-message", - "content": "" - }, - { - "path": "/sdk/android/message/overview-message", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message overview-message", - "content": "" - }, - { - "path": "/sdk/android/message/retrieving-messages/retrieve-a-message", - "title": "Retrieve a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-messages retrieve-a-message", - "content": "" - }, - { - "path": "/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", - "title": "Search messages by a keyword", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Search messages by a keyword. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message searching-messages-in-a-group-channel search-messages-by-a-keyword", - "content": "" - }, - { - "path": "/sdk/android/message/sending-a-message/share-an-encrypted-file", - "title": "Share an encrypted file", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Share an encrypted file. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message share-an-encrypted-file", - "content": "" - }, - { - "path": "/sdk/android/message/sending-a-message/smart-throttling", - "title": "Smart throttling", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Smart throttling. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message smart-throttling", - "content": "" - }, - { - "path": "/sdk/android/message/translating-messages/auto-translate-messages", - "title": "Auto-translate messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Auto-translate messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message translating-messages auto-translate-messages", - "content": "" - }, - { - "path": "/sdk/android/message/translating-messages/translate-messages-on-demand", - "title": "Translate messages on-demand", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Translate messages on-demand. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message translating-messages translate-messages-on-demand", - "content": "" - }, - { - "path": "/sdk/android/message/using-message-threading/create-a-message-thread", - "title": "Create a message thread", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a message thread. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message using-message-threading create-a-message-thread", - "content": "" - }, { "path": "/sdk/android/overview", - "title": "OpenIM SDK for Android", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for OpenIM SDK for Android. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "title": "OpenIM Android SDK overview", + "description": "Integrate users, conversations, groups, messages, calling signals, and events into a native Android application with OpenIM Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android overview", - "content": "" - }, - { - "path": "/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences", - "title": "Configure push notification preferences", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Configure push notification preferences. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications configure-push-notification-preferences", - "content": "" - }, - { - "path": "/sdk/android/push-notifications/managing-push-notifications/push-notification-translation", - "title": "Push notification translation", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Push notification translation. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications push-notification-translation", - "content": "" - }, - { - "path": "/sdk/android/push-notifications/overview-push-notifications", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications overview-push-notifications", - "content": "" - }, - { - "path": "/sdk/android/report/overview-report", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android report overview-report", - "content": "" - }, - { - "path": "/sdk/android/user/moderating-a-user/block-and-unblock-other-members", - "title": "Block and unblock other members", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Block and unblock other members. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user moderating-a-user block-and-unblock-other-members", - "content": "" - }, - { - "path": "/sdk/android/user/moderating-a-user/mute-and-unmute-a-user", - "title": "Mute and unmute a user", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mute and unmute a user. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user moderating-a-user mute-and-unmute-a-user", - "content": "" - }, - { - "path": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", - "title": "Retrieve the online status of a user", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve the online status of a user. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-and-updating-user-information retrieve-the-online-status-of-a-user", - "content": "" - }, - { - "path": "/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message", - "title": "Retrieve members who have read a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve members who have read a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-members-who-have-read-a-message", - "content": "" - }, - { - "path": "/sdk/android/application/authenticating-a-user/authentication", - "title": "Authentication", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Authentication. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android application authenticating-a-user authentication", - "content": "" - }, - { - "path": "/sdk/android/application/overview-application", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android application overview-application", - "content": "" - }, - { - "path": "/sdk/android/application/understanding-rate-limits/rate-limits", - "title": "Rate limits", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Rate limits. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android application understanding-rate-limits rate-limits", - "content": "" - }, - { - "path": "/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type", - "title": "Categorize channels by custom type", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Categorize channels by custom type. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel categorizing-channels categorize-channels-by-custom-type", - "content": "" - }, - { - "path": "/sdk/android/channel/creating-a-channel/create-a-channel", - "title": "Create a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Create a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel creating-a-channel create-a-channel", - "content": "" - }, - { - "path": "/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", - "title": "Accept or decline an invitation", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Accept or decline an invitation. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel inviting-users-to-a-group-channel accept-or-decline-an-invitation", - "content": "" - }, - { - "path": "/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members", - "title": "Invite users as members", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Invite users as members. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel inviting-users-to-a-group-channel invite-users-as-members", - "content": "" - }, - { - "path": "/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", - "title": "Enter and exit an open channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Enter and exit an open channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel joining-and-leaving-a-channel enter-and-exit-an-open-channel", - "content": "" - }, - { - "path": "/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", - "title": "Join and leave a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Join and leave a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel joining-and-leaving-a-channel join-and-leave-a-group-channel", - "content": "" - }, - { - "path": "/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters", - "title": "Manage channel metacounters", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Manage channel metacounters. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channel-metacounters manage-channel-metacounters", - "content": "" - }, - { - "path": "/sdk/android/channel/managing-channel-metadata/manage-channel-metadata", - "title": "Manage channel metadata", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Manage channel metadata. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channel-metadata manage-channel-metadata", - "content": "" - }, - { - "path": "/sdk/android/channel/managing-channels/delete-a-channel", - "title": "Delete a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channels delete-a-channel", - "content": "" - }, - { - "path": "/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel", - "title": "Hide or archive a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Hide or archive a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channels hide-or-archive-a-group-channel", - "content": "" - }, - { - "path": "/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel", - "title": "Refresh all data related to a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Refresh all data related to a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-channels refresh-all-data-related-to-a-group-channel", - "content": "" - }, - { - "path": "/sdk/android/channel/managing-operators/register-and-remove-operators", - "title": "Register and remove operators", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Register and remove operators. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-operators register-and-remove-operators", - "content": "" - }, - { - "path": "/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url", - "title": "Retrieve a channel by URL", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a channel by URL. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel retrieving-channels retrieve-a-channel-by-url", - "content": "" - }, - { - "path": "/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels", - "title": "Retrieve a list of channels", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of channels. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel retrieving-channels retrieve-a-list-of-channels", - "content": "" - }, - { - "path": "/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids", - "title": "Filter group channels by user IDs", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Filter group channels by user IDs. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel searching-channels filter-group-channels-by-user-ids", - "content": "" - }, - { - "path": "/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters", - "title": "Search group channels by name, URL, or other filters", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Search group channels by name, URL, or other filters. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel searching-channels search-group-channels-by-name-url-or-other-filters", - "content": "" - }, - { - "path": "/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types", - "title": "Search open channels by name, URL, or custom type", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Search open channels by name, URL, or custom type. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel searching-channels search-open-channels-by-name-url-or-custom-types", - "content": "" - }, - { - "path": "/sdk/android/deprecated", - "title": "Deprecated", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Deprecated. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android deprecated", - "content": "" - }, - { - "path": "/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", - "title": "Add or remove a channel event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add or remove a channel event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android event-handler managing-channel-event-handlers add-or-remove-a-channel-event-handler", - "content": "" - }, - { - "path": "/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", - "title": "Add or remove a connection event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add or remove a connection event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android event-handler managing-connection-event-handlers add-or-remove-a-connection-event-handler", - "content": "" - }, - { - "path": "/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", - "title": "Add or remove a user event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add or remove a user event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android event-handler managing-user-event-handlers add-or-remove-a-user-event-handler", - "content": "" - }, - { - "path": "/sdk/android/event-handler/overview-event-handler", - "title": "Event handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Event handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android event-handler overview-event-handler", - "content": "" - }, - { - "path": "/sdk/android/getting-started/collection-migration-guide", - "title": "Collection migration guide", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Collection migration guide. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android getting-started collection-migration-guide", - "content": "" - }, - { - "path": "/sdk/android/getting-started/kotlin-extension", - "title": "Kotlin extension (KTX)", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Kotlin extension (KTX). Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android getting-started kotlin-extension", - "content": "" - }, - { - "path": "/sdk/android/getting-started/migration-guide", - "title": "Migration guide", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Migration guide. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android getting-started migration-guide", - "content": "" - }, - { - "path": "/sdk/android/local-caching/overview-local-caching", - "title": "Local caching", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Local caching. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android local-caching overview-local-caching", - "content": "" - }, - { - "path": "/sdk/android/local-caching/using-group-channel-collection/group-channel-collection", - "title": "Group channel collection", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Group channel collection. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android local-caching using-group-channel-collection group-channel-collection", - "content": "" - }, - { - "path": "/sdk/android/local-caching/using-message-collection/message-collection", - "title": "Message collection", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Message collection. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android local-caching using-message-collection message-collection", - "content": "" - }, - { - "path": "/sdk/android/logger", - "title": "Logger", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Logger. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android logger", - "content": "" - }, - { - "path": "/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type", - "title": "Categorize messages by custom type", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Categorize messages by custom type. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message categorizing-messages categorize-messages-by-custom-type", - "content": "" - }, - { - "path": "/sdk/android/message/listing-changelogs/list-changelogs-of-messages", - "title": "List changelogs of messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List changelogs of messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message listing-changelogs list-changelogs-of-messages", - "content": "" - }, - { - "path": "/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel", - "title": "Clear the chat history in a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Clear the chat history in a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message clear-the-chat-history-in-a-group-channel", - "content": "" - }, - { - "path": "/sdk/android/message/managing-a-message/copy-a-message", - "title": "Copy a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Copy a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message copy-a-message", - "content": "" - }, - { - "path": "/sdk/android/message/managing-a-message/delete-a-message", - "title": "Delete a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message delete-a-message", - "content": "" - }, - { - "path": "/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message", - "title": "Display Open Graph tags in a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Display Open Graph tags in a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message display-open-graph-tags-in-a-message", - "content": "" - }, - { - "path": "/sdk/android/message/managing-a-message/update-a-message", - "title": "Update a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-a-message update-a-message", - "content": "" - }, - { - "path": "/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages", - "title": "List pinned messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List pinned messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-pinned-messages-in-group-channels list-pinned-messages", - "content": "" - }, - { - "path": "/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message", - "title": "Unpin a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Unpin a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-pinned-messages-in-group-channels unpin-a-message", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/add-a-poll-option", - "title": "Add a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Add a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls add-a-poll-option", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/cast-or-cancel-a-vote", - "title": "Cast or cancel a vote", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Cast or cancel a vote. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls cast-or-cancel-a-vote", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/close-a-poll", - "title": "Close a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Close a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls close-a-poll", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/delete-a-poll", - "title": "Delete a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls delete-a-poll", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/delete-a-poll-option", - "title": "Delete a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Delete a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls delete-a-poll-option", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/list-changelogs-of-polls", - "title": "List changelogs of polls", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List changelogs of polls. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls list-changelogs-of-polls", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/retrieve-a-list-of-polls", - "title": "Retrieve a list of polls", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of polls. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls retrieve-a-list-of-polls", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/retrieve-a-list-of-voters", - "title": "Retrieve a list of voters", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of voters. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls retrieve-a-list-of-voters", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/retrieve-a-poll", - "title": "Retrieve a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls retrieve-a-poll", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/retrieve-a-poll-option", - "title": "Retrieve a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls retrieve-a-poll-option", - "content": "" - }, - { - "path": "/sdk/android/message/managing-polls/update-a-poll", - "title": "Update a poll", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a poll. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls update-a-poll", - "content": "" + "content": "OpenIM Android SDK brings OpenIMSDK capabilities to native Android applications. Choose a domain below to open its documentation. Documentation navigation | Domain | Content | | | | | Getting started /sdk/android/getting started/environment specific implementation | Integrate the SDK, configure the Android project, authenticate, manage the connection lifecycle, and send the first message. | | Users and relationships /sdk/android/user/overview user | User profiles, online status, friends, friend applications, and blacklist. | | Conversations /sdk/android/conversation/overview conversation | Conversation queries, drafts, unread counts, receive options, burn after reading settings, hiding, and deletion. | | Groups /sdk/android/group/overview group | Group profiles, members, applications, permissions, mute settings, and group events. | | Messages /sdk/android/message/overview message | Message creation, sending, receiving, history, search, deletion, revocation, and read receipts. | | File uploads /sdk/android/file uploads/upload file | Standalone file uploads and upload progress. | | Audio and video calls /sdk/android/calling/overview calling | Invitations, acceptance, rejection, cancellation, hangup, room credentials, and custom signaling. | | Events /sdk/android/events/overview events | Manager listeners, connection state, and data events. | | Logging /sdk/android/logger | SDK logging configuration and troubleshooting. |" }, { - "path": "/sdk/android/message/managing-polls/update-a-poll-option", - "title": "Update a poll option", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a poll option. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls update-a-poll-option", - "content": "" - }, - { - "path": "/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status", - "title": "Get read status of a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Get read status of a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-read-status-in-a-group-channel get-read-status", - "content": "" - }, - { - "path": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read", - "title": "Mark messages as read", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as read. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-read-status-in-a-group-channel mark-messages-as-read", - "content": "" - }, - { - "path": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread", - "title": "Mark messages as unread", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as unread. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-read-status-in-a-group-channel mark-messages-as-unread", - "content": "" - }, - { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", - "title": "Cancel a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Cancel a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/getting-started/before-you-start", + "title": "Before you start", + "description": "Prepare OpenIMServer, user credentials, and the Android project before initializing, authenticating, or sending messages.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel cancel-a-scheduled-message", - "content": "" + "keywords": "sdk android v4 sdk android getting-started before-you-start", + "content": "Before integrating OpenIMClientSDK into a native Android application, prepare an accessible OpenIMServer deployment, a trusted user authentication flow, and an Android project that satisfies the SDK build requirements. These prerequisites apply to both Authenticate and manage a session /sdk/android/getting started/authenticate and manage session and Send your first message /sdk/android/getting started/send first message . Prepare OpenIMServer If OpenIMServer is not yet available, follow the Docker deployment guide /docs/guides/quick deployment/docker . Confirm that both physical devices and emulators can reach these endpoints: | Field | Description | | | | | apiAddr | OpenIMServer HTTP API endpoint used for login, synchronization, and resource requests. | | wsAddr | OpenIMServer WebSocket endpoint used for the persistent connection and real time events. | Do not validate the endpoints only from the development computer. localhost inside an Android emulator refers to the emulator itself, so it cannot directly access services running locally on the development computer. When OpenIMServer runs on the development computer, map the API and WebSocket ports to the emulator first: adb reverse tcp:10002 tcp:10002 adb reverse tcp:10001 tcp:10001 After mapping, the emulator can use http://127.0.0.1:10002 as apiAddr and ws://127.0.0.1:10001 as wsAddr . Replace the port numbers with the ports that the development computer actually listens on, and confirm that adb is connected to the target emulator before running the commands. Production applications should use HTTPS and WSS, with DNS, TLS certificates, firewalls, reverse proxies, and WebSocket upgrades verified from a physical device. Prepare the user and token userID identifies an OpenIMSDK user, while the token authenticates that user. A trusted backend must create or associate users, issue tokens, and enforce application permissions. The Android application must never store an administrator token, secret, or other server side credential. For the backend flow, see Prepare to use the Platform API /platform api/prepare to use api and Issue a session token /platform api/user/managing session tokens/issue a session token . After authenticating the application account, the backend should return only the following data needed for SDK login: | Data | Description | | | | | userID | The current user's OpenIM user ID. | | token | The login token associated with that user. | | apiAddr | The OpenIMServer HTTP API endpoint. | | wsAddr | The OpenIMServer WebSocket endpoint. | The userID must correspond to the token. The client must not accept an arbitrary user ID and then issue, assemble, or exchange an administrator token. Prepare the Android project Before integration, verify that the Android project meets the following requirements: The application uses minSdk 21 or later, Java 8 compiler options, and compileSdk 36 or later. The application manifest declares android.permission.INTERNET and permits the SDK to inspect network state. An application private persistent data directory is available, such as a dedicated directory under Application.getFilesDir . Do not store the SDK database in a temporary cache or shared storage. Physical devices can reach apiAddr , wsAddr , and message media domains. The release package covers the target device ABI; verify the native ABIs included in the actual delivery package. Product behavior is defined for network recovery, foreground and background transitions, token failure, forced logout, and multi device login. For dependencies and manifest entries, see Integrate for Android /sdk/android/getting started/environment specific implementation . For SDK initialization and authentication, see Authenticate and manage a session /sdk/android/getting started/authenticate and manage session . Continue the integration Complete Authenticate and manage a session /sdk/android/getting started/authenticate and manage session first. After the login callback succeeds and OnConnListener.onConnectSuccess arrives, verify the messaging path with Send your first message /sdk/android/getting started/send first message ." }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", - "title": "List all scheduled messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List all scheduled messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/getting-started/environment-specific-implementation", + "title": "Integrate for Android", + "description": "Add OpenIM Android SDK dependencies and network permissions to an Android project.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel list-all-scheduled-messages", - "content": "" + "keywords": "sdk android v4 sdk android getting-started environment-specific-implementation", + "content": "This page covers Android project dependencies and permissions only. For SDK initialization, connection listeners, and sign in, see Authenticate and manage a session /sdk/android/getting started/authenticate and manage session . Add SDK dependencies Add the dependencies to the application module's build.gradle : dependencies implementation 'io.openim:android sdk:latest@aar' implementation 'io.openim:core sdk:latest@aar' implementation 'com.google.code.gson:gson:2.9.0' Configure the manifest The application needs network access: Next steps Authenticate and manage a session /sdk/android/getting started/authenticate and manage session Send your first message /sdk/android/getting started/send first message" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "title": "Retrieve a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/getting-started/authenticate-and-manage-session", + "title": "Authenticate and manage a session", + "description": "Initialize OpenIM Android SDK, log in, inspect login state, handle connection callbacks, and sign out the current account.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel retrieve-a-scheduled-message", - "content": "" + "keywords": "sdk android v4 sdk android getting-started authenticate-and-manage-session", + "content": "OpenIM Android SDK uses initSDK to initialize the local runtime and login to establish the current user's session. Complete the service, user, and token preparation in Before you start /sdk/android/getting started/before you start , then add dependencies and permissions as described in Integrate for Android /sdk/android/getting started/environment specific implementation . The complete flow is: 1. Create a stable OnConnListener in an application level session component. 2. Call initSDK and confirm that it returns true . 3. Register message, user, relationship, conversation, group, and call signaling listeners before login. 4. Obtain the matching userID and token from a trusted backend, then call login . 5. Wait separately for login success and onConnectSuccess before enabling operations that require the persistent connection. 6. On sign out or account switching, call logout and then clear application state owned by the current account. The apiAddr , wsAddr , userID , and token used below are all provided by a trusted backend. Initialize and handle the connection lifecycle During the Application lifecycle, create the data directory, initialize the SDK, and provide the connection listener. Store connection state without recording tokens or complete service credentials in callback logs. import android.app.Application; import java.io.File; import io.openim.android.sdk.OpenIMClient; import io.openim.android.sdk.enums.LogLevel; import io.openim.android.sdk.listener.OnConnListener; import io.openim.android.sdk.models.InitConfig; File dataDirectory = new File application.getFilesDir , \"openim\" ; if dataDirectory.exists && dataDirectory.mkdirs throw new IllegalStateException \"Cannot create the OpenIM data directory.\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = LogLevel.Info; config.isLogStandardOutput = false; OnConnListener connectionListener = new OnConnListener @Override public void onConnecting sessionState.setConnectionState \"connecting\" ; @Override public void onConnectSuccess sessionState.setConnectionState \"connected\" ; sessionState.enableConnectedOperations ; @Override public void onConnectFailed long code, String error sessionState.setConnectionState \"failed\" ; recordConnectionFailure code, error ; @Override public void onKickedOffline sessionState.clearCurrentAccount ; showSignedInElsewhereScreen ; @Override public void onUserTokenExpired requestNewTokenAndRelogin ; @Override public void onUserTokenInvalid String reason sessionState.clearCurrentAccount ; showSignInScreen reason ; ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; if initialized throw new IllegalStateException \"OpenIMClientSDK initialization failed.\" ; A true return value means that the local SDK runtime initialized successfully. OnConnListener starts reporting persistent connection state after login is called. | Field | Type | Description | | | | | | application | Application | Application level context that owns the SDK lifecycle. | | apiAddr | String | OpenIMServer HTTP API endpoint. | | wsAddr | String | OpenIMServer WebSocket endpoint. | | dataDirectory | File | Application private persistent directory for the SDK database and logs. | | config.logLevel | int | A LogLevel constant; reduce the logging level explicitly in production. | | isLogStandardOutput | boolean | Whether OpenIM Core logs are emitted to the standard log stream. | Initialize the SDK only once in Application or an application level session component. The Java wrapper exposes networkChanged to ask Core to re evaluate network connectivity; call it only when the application already has one centralized system network observer, not from multiple screens. Register business listeners before login Listener registration uses set semantics, so a later call replaces the previous listener. Create stable listener instances in an application level event dispatcher and forward events to screen state. See Send your first message /sdk/android/getting started/send first message for the complete message listener registration and incremental merge example. User, relationship, conversation, group, and call signaling listeners follow the same ownership rule. The SDK does not expose remove or unset methods. During sign out or account switching, the application event dispatcher must stop delivering callbacks to state owned by the previous account and replace the complete listener set before the next login. Log in the current user OpenIMClient.getInstance .login new OnBase @Override public void onError int code, String error sessionState.setLoginState \"failed\" ; recordLoginFailure code, error ; @Override public void onSuccess String data sessionState.setLoginState \"logged\" ; sessionState.setCurrentUserID userID ; , userID, token ; The successful login callback means that the current login call completed. OnConnListener.onConnectSuccess means that the persistent connection is available. Handle these as separate stages. Do not call login concurrently or infer both states from only one callback. Inspect login state int loginStatus = OpenIMClient.getInstance .getLoginStatus ; if loginStatus == LoginStatus.Logged String currentUserID = OpenIMClient.getInstance .getLoginUserID ; restoreSessionFor currentUserID ; | State | Description | | | | | LoginStatus.Logout | The SDK is not logged in. | | LoginStatus.Logging | Login is in progress; do not start another login concurrently. | | LoginStatus.Logged | The SDK is logged in. Persistent connection state still comes from OnConnListener . | getLoginStatus and getLoginUserID return local SDK snapshots and do not trigger connection callbacks. Sign out the previous account before logging in with a different account. Handle token failure and forced logout After onUserTokenExpired or onUserTokenInvalid , obtain new credentials for the current user from a trusted backend, then reauthenticate or return to the sign in flow according to product policy. After onKickedOffline , clear conversations, message views, unread counts, and other state owned by the current account. Do not treat forced logout as an explicit user sign out. These callbacks do not have a business entity merge key. Isolate them by the current OpenIMClient singleton and logged in user. Stop asynchronous work and screen subscriptions owned by the previous account before starting a new login. Sign out and release the SDK OpenIMClient.getInstance .logout new OnBase @Override public void onError int code, String error recordLogoutFailure code, error ; @Override public void onSuccess String data sessionState.clearCurrentAccount ; ; Successful completion means that the current SDK login session has signed out. Clear application state after the success callback. For account switching, wait for the previous logout before calling login for the next account. When the application will no longer use the SDK, release the runtime with: OpenIMClient.getInstance .unInit ; unInit is not a replacement for logout and must not run when an ordinary screen is destroyed. Next steps Before you start /sdk/android/getting started/before you start Integrate for Android /sdk/android/getting started/environment specific implementation Send your first message /sdk/android/getting started/send first message" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", - "title": "Retrieve the total number of scheduled messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve the total number of scheduled messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/getting-started/send-first-message", + "title": "Send your first message", + "description": "Send and verify the first one-to-one text message in an Android application.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel retrieve-the-total-number-of-scheduled-messages", - "content": "" + "keywords": "sdk android v4 sdk android getting-started send-first-message", + "content": "Use one to one text messaging to confirm that OpenIM is integrated correctly. Before starting, complete SDK initialization and sign in in Authenticate and manage a session /sdk/android/getting started/authenticate and manage session . Before you start Prepare a test account for the sender and another for the receiver. Initialize the SDK for both accounts as described in Authenticate and manage a session /sdk/android/getting started/authenticate and manage session . Register the following listener on the receiver before it signs in. Replace user b in the example with the receiver's actual userID . Step 1: Listen for incoming messages on the receiver Register the message listener on the receiver before sign in. When a message arrives, add it to the chat list or refresh the UI. OpenIMClient.getInstance .messageManager .setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message // Display message in the chat UI. ; Step 2: Confirm that sending is available After both accounts sign in, the sender can send only after its login callback succeeds and OnConnListener.onConnectSuccess arrives. Keep the receiver connected so it can receive the new message. If a connection is not ready, wait for it to recover instead of calling login again. Step 3: Send a text message Send a one to one text message Create the message, then send it. Put the receiver's userID in the user destination and leave the group destination empty. Message message = OpenIMClient.getInstance .messageManager .createTextMessage \"Hello, OpenIMSDK\" ; OnMsgSendCallback sendCallback = new OnMsgSendCallback @Override public void onProgress long progress // Text messages usually do not need progress handling. @Override public void onError int code, String error // Tell the user that sending failed and allow a retry. @Override public void onSuccess Message sentMessage // Update the sender's chat UI with sentMessage. ; OpenIMClient.getInstance .messageManager.sendMessage sendCallback, message, \"user b\", \"\", new OfflinePushInfo ; OfflinePushInfo configures offline push content. For this first test, pass an empty object and add a title, summary, or extra data later if needed. onSuccess means the sender has sent the message successfully. onRecvNewMessage on the receiver means the other side received it. Both callbacks should arrive before considering this one to one test complete. Send a group text message To send a group message, leave the receiver userID empty and provide the group's groupID : Message groupMessage = OpenIMClient.getInstance .messageManager .createTextMessage \"Hello, OpenIMSDK\" ; OpenIMClient.getInstance .messageManager.sendMessage sendCallback, groupMessage, \"\", \"group 123\", new OfflinePushInfo ; Set either userID or groupID in a single call, never both. Verify success The sender enters onSuccess . The receiver enters onRecvNewMessage and sees the text message. A one to one message sets only the receiver's userID ; a group message sets only groupID . Next steps Authenticate and manage a session /sdk/android/getting started/authenticate and manage session OpenIM Android SDK overview /sdk/android/overview" }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", - "title": "Send scheduled message immediately", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send scheduled message immediately. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/overview-user", + "title": "User overview", + "description": "Learn about user profiles, friendships, friend requests, blacklists, and online status in the Android SDK.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel send-a-scheduled-message-immediately", - "content": "" + "keywords": "sdk android v4 sdk android user overview-user", + "content": "OpenIM Android SDK identifies each user by userID . When implementing profile cards, friend requests, contacts, or a blocklist, distinguish an application's public user profile from the current user's friend relationship and blocklist state. Group member lists, in group nicknames, group roles, and member administration belong to the Groups domain. User APIs cover profiles, friendships, friend requests, blacklists, and online status. User objects Android SDK returns different user objects for different scenarios: | Type | Use case | Main APIs | | | | | | LocalUser | The current user's local profile, settings page, avatar, nickname, and account level receive setting | getSelfLocalUserInfo , setSelfInfo | | PublicUserInfo | Application user lookup, friend candidates, and profiles for users who are not friends | getUsersInfo | | UserInfo | Combined Android wrapper object that can carry public, friend, or blacklist information | getFriendListPage , getFriendsInfo , getBlacklist | | FriendInfo | The current user's friend list, friend remarks, and relationship extension data | searchFriends , getFriendListPage | | FriendApplicationInfo | The parties, handling state, and message for a friend request | Friend request queries and callbacks | | BlacklistInfo | Users blocked by the current user and their blocklist relationship fields | getBlacklist , addBlacklist , removeBlacklist | | UsersOnlineStatus | User online status and connected platforms | subscribeUsersOnlineStatus , getSubscribeOnlineUsersStatus | The same userID can appear in public profile, friend, blocklist, and group member data. Prefer UserInfo.getFriendInfo when displaying a contact, PublicUserInfo when only a public account profile is needed, and UserInfo.getBlackInfo on a blocklist screen. Conversation list and chat page titles belong to conversation data and should use the conversation display name. Use userID as the stable key for user lists and events. A friend request contains both parties, so use fromUserID:toUserID to identify one request. Feature entry points | Requirement | Recommended page | | | | | Retrieve public profiles by userID for friend candidates or profile cards | Get specified user profiles /sdk/android/user/user profile/get users info | | Page through, search, or retrieve friend relationships by ID | Get the friend list by page /sdk/android/user/friends/get friend list page | | Send, retrieve, accept, or reject friend requests | Get received friend requests /sdk/android/user/friend applications/get recv friend application list | | Update friend data | Update friend profiles /sdk/android/user/friends/update friends | | Delete a friend relationship | Delete a friend /sdk/android/user/friends/delete friend | | View and maintain the current user's blocklist | Get the blacklist /sdk/android/user/blacklist/get blacklist | | Read or update the current user's nickname, avatar, and extension data | Update the current user profile /sdk/android/user/user profile/set self info | | Configure account level message reception and notification behavior | Set global message reception /sdk/android/user/user profile/set global message reception | | Subscribe to and retrieve online status | Subscribe to user online status /sdk/android/user/online status/subscribe users online status | State updates Each user related capability page owns the listener and merge behavior for its events: Current user profile changes: Update the current user profile /sdk/android/user/user profile/set self info . Friend request changes: Get received friend requests /sdk/android/user/friend applications/get recv friend application list . Friend relationship and profile changes: Get the friend list by page /sdk/android/user/friends/get friend list page . Blocklist changes: Block a user /sdk/android/user/blacklist/add blacklist . Online status changes: Subscribe to user online status /sdk/android/user/online status/subscribe users online status . UserInfoManager and FriendshipManager each retain one listener. setOnUserListener and setOnFriendshipListener replace the current listener. Combine the required callbacks in a shared state layer and set each listener once; multiple pages must not overwrite one another's listeners." }, { - "path": "/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", - "title": "Update a scheduled message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update a scheduled message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/user-profile/get-users-info", + "title": "Get specified user profiles", + "description": "Use getUsersInfo() to query public profiles by userID.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-scheduled-messages-in-group-channel update-a-scheduled-message", - "content": "" + "keywords": "sdk android v4 sdk android user user-profile get-users-info", + "content": "getUsersInfo returns public profiles for a list of user IDs. It is suitable for friend candidates and profiles of users outside the current friend list. It does not return relationship fields such as the current user's friend remark. List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.getUsersInfo new OnBase @Override public void onSuccess List users for PublicUserInfo user : users publicUserStore.put user.getUserID , user ; @Override public void onError int code, String error recordUserQueryFailure code, error ; , userIDs ; Remove empty and duplicate IDs before calling the API, and keep each request within the application's batch limit. The callback returns List with fields such as userID , nickname , faceURL , ex , and createTime . This query does not trigger OnUserListener ; query again and merge by userID when the profile snapshot must be refreshed. Returned fields | Field | Description | | | | | userID | OpenIM user ID and the stable local cache key. | | nickname | Account level public nickname. | | faceURL | Account level public avatar URL. | | ex | Account level public extension string defined by the application. | | createTime | User profile creation time. | Do not use PublicUserInfo to overwrite friend remarks, pinned state, or in group nicknames. Use FriendInfo for friends and the group member model for group members. Searching by nickname, phone number, or email is an application backend capability. A trusted backend should perform the search and permission checks, then return candidate user IDs for this API. Refreshing profiles Replace or merge the public profile snapshot after a successful query. Re query when opening a profile card, when the user explicitly refreshes, after reconnecting, or after a trusted backend reports a profile change. OnUserListener.onSelfInfoUpdated only describes the signed in user's profile and is not a change event for other users." }, { - "path": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", - "title": "Receive messages in a group channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Receive messages in a group channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/user-profile/get-self-local-user-info", + "title": "Get the current user profile", + "description": "Use getSelfLocalUserInfo() to retrieve the local profile for the current user.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message receiving-messages-through-event-handler receive-messages-in-a-group-channel", - "content": "" + "keywords": "sdk android v4 sdk android user user-profile get-self-local-user-info", + "content": "OpenIMClient.getInstance .userInfoManager.getSelfLocalUserInfo new OnBase @Override public void onSuccess LocalUser user currentUserStore.set user ; @Override public void onError int code, String error recordSelfProfileFailure code, error ; ; After initialization and login, call this method to retrieve the current account's local profile. Success returns LocalUser with fields such as userID , nickname , faceURL , ex , attachedInfo , globalRecvMsgOpt , and addFriendPermission . Returned fields | Field | Description | | | | | userID | Signed in user ID. | | nickname | Current account nickname. | | faceURL | Current account avatar URL. | | ex | Current account extension string. | | attachedInfo | SDK attached data; parse only an application defined format. | | globalRecvMsgOpt | Global message reception: 0 receive, 1 do not receive, 2 receive without notification. | | addFriendPermission | Add friend permission value defined by the server contract. | The query does not trigger a profile callback. Clear the previous account snapshot when logging out or switching accounts so that the previous user's data is not rendered for the new account. getSelfUserInfo is deprecated and is not the recommended API." }, { - "path": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", - "title": "Receive messages in an open channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Receive messages in an open channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/user-profile/set-self-info", + "title": "Update the current user profile", + "description": "Use setSelfInfo() to update the nickname, avatar, or extension data of the current user.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message receiving-messages-through-event-handler receive-messages-in-an-open-channel", - "content": "" + "keywords": "sdk android v4 sdk android user user-profile set-self-info", + "content": "Set only the fields that must change on UserInfoReq . The SDK omits null fields when serializing the request. UserInfoReq request = new UserInfoReq ; request.setNickname displayName.trim ; request.setFaceURL avatarURL ; request.setEx mergedExtra ; OpenIMClient.getInstance .userInfoManager.setSelfInfo new OnBase @Override public void onSuccess String data markProfileUpdateSubmitted ; @Override public void onError int code, String error recordProfileUpdateFailure code, error ; , request ; UserInfoReq supports fields such as nickname , faceURL , ex , and addFriendPermission . ex is a complete string; read, parse, and merge the application's namespace before updating it rather than overwriting the value with a partial JSON object. A successful callback means the update request completed. Merge the final profile increment from onSelfInfoUpdated UserInfo info , or query getSelfLocalUserInfo again. Updatable fields | Field | Description | | | | | nickname | New nickname. | | faceURL | New avatar URL. | | ex | Complete extension string. | | addFriendPermission | Add friend permission value. | Send only fields that should change. Although the global message reception setting is also written with setSelfInfo , use the dedicated Set global message reception /sdk/android/user/user profile/set global message reception entry point. This page owns onSelfInfoUpdated . Combine it into the application's single OnUserListener : @Override public void onSelfInfoUpdated UserInfo info currentUserStore.merge info.getUserID , info ;" }, { - "path": "/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages", - "title": "Retrieve a list of messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/user-profile/set-global-message-reception", + "title": "Set global message reception", + "description": "Use setSelfInfo() to set the account-wide message reception and notification policy.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-messages retrieve-a-list-of-messages", - "content": "" + "keywords": "sdk android v4 sdk android user user-profile set-global-message-reception", + "content": "Use a separate UserInfoReq for globalRecvMsgOpt so profile updates do not accidentally overwrite the account wide message policy. UserInfoReq request = new UserInfoReq ; request.setGlobalRecvMsgOpt 2 ; OpenIMClient.getInstance .userInfoManager.setSelfInfo new OnBase @Override public void onSuccess String data markGlobalReceiveOptionSubmitted ; @Override public void onError int code, String error recordGlobalReceiveOptionFailure code, error ; , request ; | Value | Meaning | | | | | 0 | Receive messages and allow notifications. | | 1 | Do not receive messages. | | 2 | Receive messages without notifications. | If the product exposes only a global do not disturb switch, it usually toggles between 0 and 2 ; 1 stops message reception and should be presented as a separate option. Per conversation reception is managed by conversation APIs and is not replaced by this setting. A successful callback means the request completed. Reconcile the final account snapshot through onSelfInfoUpdated or getSelfLocalUserInfo . Event handling is documented in Update the current user profile /sdk/android/user/user profile/set self info ." }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", - "title": "Retrieve number of members who haven't read a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of members who haven't read a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/online-status/subscribe-users-online-status", + "title": "Subscribe to user online status", + "description": "Use subscribeUsersOnlineStatus() to subscribe to online status for specified users.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel members-who-havent-read-a-message", - "content": "" + "keywords": "sdk android v4 sdk android user online-status subscribe-users-online-status", + "content": "List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.subscribeUsersOnlineStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusSubscriptionFailure code, error ; , userIDs ; Remove empty and duplicate IDs, and subscribe only to users whose status is needed. The callback returns the initial List snapshot. Each item contains userID , status , and platformIDs . Deduplicate repeated subscriptions in the application state layer. Status fields | Field | Description | | | | | userID | Target user ID. | | status | Online status value defined by the server contract. | | platformIDs | Platforms on which the user is online. | This page owns onUserStatusChanged . Combine it into the application's single OnUserListener and merge by userID : @Override public void onUserStatusChanged UsersOnlineStatus status onlineStatusStore.put status.getUserID , status ; Subscription only creates or updates the subscription set; do not treat its callback as friend profile data. Manage the subscription set centrally when users leave the visible range or the account changes. Android does not expose a verifiable unsubscribe entry point, so this documentation does not record one." }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", - "title": "Retrieve number of members who haven't received a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of members who haven't received a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "title": "Get subscribed user online status", + "description": "Use getSubscribeOnlineUsersStatus() to retrieve online status for subscribed users.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel members-who-havent-received-a-message", - "content": "" + "keywords": "sdk android v4 sdk android user online-status get-subscribe-online-users-status", + "content": "OpenIMClient.getInstance .userInfoManager.getSubscribeOnlineUsersStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusQueryFailure code, error ; ; This method does not accept user IDs or modify the subscription set. The callback returns the current subscribed user List snapshot, which can reconcile status by userID after reconnecting or reopening a screen. The query does not trigger onUserStatusChanged . Apply the snapshot only to presence state; retrieve names and avatars through the user profile APIs." }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels", - "title": "Retrieve number of channels with unread messages", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of channels with unread messages. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/get-friend-list-page", + "title": "Get the friend list by page", + "description": "Use getFriendListPage() to retrieve the current user friend list by page.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel unread-channels", - "content": "" + "keywords": "sdk android v4 sdk android user friends get-friend-list-page", + "content": "OpenIMClient.getInstance .friendshipManager.getFriendListPage new OnBase @Override public void onSuccess List friends for UserInfo friend : friends friendStore.put friend.getUserID , friend ; @Override public void onError int code, String error recordFriendListFailure code, error ; , 0, 40, true ; The arguments after the callback are offset , count , and filterBlack . offset starts at 0 , count is the page size, and filterBlack removes blocked users when true . The callback returns the current page as List ; call getFriendInfo on each item for relationship details. Increase offset by the requested item count when loading another page; a page smaller than count normally marks the end. Use the paged API instead of getFriendList . Merge snapshots and increments by userID . Friend profile fields UserInfo is the Android wrapper object. getFriendInfo returns FriendInfo for a friend list item. Common fields are: | Field | Description | | | | | userID | Friend user ID and the stable friend list key. | | nickname | Account nickname of the friend. | | faceURL | Account avatar URL of the friend. | | remark | Friend remark set by the current account. | | ex | Friendship extension string. | | addSource | Source that created the friendship. | | operatorUserID | User ID that created or updated the relationship. | | createTime | Friendship creation time. | nickname and faceURL are account data, while remark and ex belong to the friendship. UpdateFriendsReq can submit isPinned , but the current Android FriendInfo model has no corresponding read field, so pinned state needs application owned storage. Do not use a friend object to overwrite a stranger's PublicUserInfo , or write a friend remark back to the account nickname. This page owns the friend added, changed, and deleted callbacks. Combine them into the application's single OnFriendshipListener : @Override public void onFriendAdded FriendInfo friend friendStore.put friend.getUserID , friend ; @Override public void onFriendInfoChanged FriendInfo friend friendStore.put friend.getUserID , friend ; @Override public void onFriendDeleted FriendInfo friend friendStore.remove friend.getUserID ;" }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items", - "title": "Retrieve number of unread items", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of unread items. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/search-friends", + "title": "Search friends", + "description": "Use searchFriends() to search the current user friend list.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel unread-items", - "content": "" + "keywords": "sdk android v4 sdk android user friends search-friends", + "content": "OpenIMClient.getInstance .friendshipManager.searchFriends new OnBase @Override public void onSuccess List results showFriendSearchResults results ; @Override public void onError int code, String error recordFriendSearchFailure code, error ; , Collections.singletonList keyword.trim , true, true, true ; Pass one non empty value in keywordList . The three Boolean arguments select matching by user ID, nickname, and friend remark. Enable at least one field. To search multiple fields, enable the corresponding flags; the API does not treat multiple keywords as independent search conditions. The callback returns List . Search results belong to the current search view and should not replace the full friend snapshot. This query does not trigger friendship callbacks." }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", - "title": "Retrieve number of unread messages in a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of unread messages in a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/get-friends-info", + "title": "Get specified friend profiles", + "description": "Use getFriendsInfo() to query friendship profiles for specified users.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel unread-messages-in-a-channel", - "content": "" + "keywords": "sdk android v4 sdk android user friends get-friends-info", + "content": "OpenIMClient.getInstance .friendshipManager.getFriendsInfo new OnBase @Override public void onSuccess List friends for UserInfo friend : friends friendStore.put friend.getUserID , friend ; @Override public void onError int code, String error recordFriendInfoFailure code, error ; , Arrays.asList \"user a\", \"user b\" , true ; The second argument is the target user ID list. filterBlack controls whether blocked users are removed. Remove empty and duplicate IDs before calling. The callback returns List ; use getFriendInfo for friend remarks and relationship fields, then merge by userID . The result can omit a target that is not a friend or is excluded by filterBlack == true . When the UI also needs account level public data, call Get specified user profiles /sdk/android/user/user profile/get users info and merge the two sources by userID . This query does not trigger friendship callbacks. Use checkFriend /sdk/android/user/friends/check friend when only the relationship state is needed." }, { - "path": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "title": "Retrieve number of unread messages in all channels", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve number of unread messages in all channels. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/check-friend", + "title": "Check friendship", + "description": "Use checkFriend() to check whether specified users are friends of the current user.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message retrieving-unread-count-in-a-group-channel unread-messages-in-all-channels", - "content": "" + "keywords": "sdk android v4 sdk android user friends check-friend", + "content": "OpenIMClient.getInstance .friendshipManager.checkFriend new OnBase @Override public void onSuccess List relations showFriendshipStates relations ; @Override public void onError int code, String error recordFriendshipCheckFailure code, error ; , Arrays.asList \"user a\", \"user b\" ; The callback returns List . Each item's userID identifies the target user. result == 1 means the user is a friend and is not in the blacklist. Interpret other result values only through the server contract; do not create additional client side states. This method only establishes a relationship snapshot and does not trigger friendship callbacks. Use getFriendsInfo /sdk/android/user/friends/get friends info when nickname, avatar, or friend remark data is required." }, { - "path": "/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload", - "title": "Cancel an in-progress file upload", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Cancel an in-progress file upload. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/update-friends", + "title": "Update friend profiles", + "description": "Use updateFriendsReq() to update friend remarks, pinned state, or extension data.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message cancel-an-in-progress-file-upload", - "content": "" + "keywords": "sdk android v4 sdk android user friends update-friends", + "content": "UpdateFriendsReq request = new UpdateFriendsReq ; request.setFriendUserIDs new String friendUserID ; request.setRemark remark.trim ; OpenIMClient.getInstance .friendshipManager.updateFriendsReq new OnBase @Override public void onSuccess String data markFriendUpdateSubmitted ; @Override public void onError int code, String error recordFriendUpdateFailure code, error ; , request ; UpdateFriendsReq supports friendUserIDs , remark , isPinned , and ex . One call applies the same field value to every target friend. Use separate calls when friends need different values. ex is a complete string. | Field | Description | | | | | friendUserIDs | Friend ID array to update. | | remark | Friend remark for the current account. | | isPinned | Whether to pin the friend. | | ex | Friendship extension string, replaced as a complete value. | A successful callback means the update request completed. Merge the friend increment through onFriendInfoChanged , as documented in Get the friend list by page /sdk/android/user/friends/get friend list page ." }, { - "path": "/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "title": "Send a critical alert message to iOS device users", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send a critical alert message to iOS device users. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friends/delete-friend", + "title": "Delete a friend", + "description": "Use deleteFriend() to remove one friendship from the current user.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message send-a-critical-alert-message-to-ios-device-users", - "content": "" + "keywords": "sdk android v4 sdk android user friends delete-friend", + "content": "OpenIMClient.getInstance .friendshipManager.deleteFriend new OnBase @Override public void onSuccess String data markFriendDeletionSubmitted friendUserID ; @Override public void onError int code, String error recordFriendDeletionFailure code, error ; , friendUserID ; A successful callback means the delete request completed. Remove the local record by userID after onFriendDeleted arrives. Event handling is documented in Get the friend list by page /sdk/android/user/friends/get friend list page ." }, { - "path": "/sdk/android/message/sending-a-message/send-a-message", - "title": "Send a message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send a message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/add-friend", + "title": "Send a friend request", + "description": "Use addFriend() to send a friend request to a specified user.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message send-a-message", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications add-friend", + "content": "OpenIMClient.getInstance .friendshipManager.addFriend new OnBase @Override public void onSuccess String data markFriendApplicationSubmitted ; @Override public void onError int code, String error recordFriendApplicationFailure code, error ; , \"user b\", \"Hello, I am Alex\" ; The second argument is the recipient's userID , and the third argument is the request message. A successful callback means the server received the request, not that the recipient accepted it. The target ID cannot be empty. Let a trusted application backend handle lookup by nickname, phone number, or other private fields. Merge friend request changes through OnFriendshipListener , as documented in Get received friend requests /sdk/android/user/friend applications/get recv friend application list ." }, { - "path": "/sdk/android/message/sending-a-message/send-an-admin-message", - "title": "Send an admin message", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Send an admin message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "title": "Get received friend requests", + "description": "Use getRecvFriendApplicationList() to query received friend requests by page.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message send-an-admin-message", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications get-recv-friend-application-list", + "content": "GetFriendApplicationListAsRecipientReq request = new GetFriendApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .friendshipManager.getRecvFriendApplicationList new OnBase @Override public void onSuccess List applications replaceReceivedApplications applications ; @Override public void onError int code, String error recordReceivedApplicationFailure code, error ; , request ; offset starts at 0 , and count is the page size. To filter by handling state, use setHandleResults int with values defined by the server contract. The callback returns the current page as List . | Field | Description | | | | | fromUserID / fromNickname / fromFaceURL | Applicant ID, nickname, and avatar snapshot. | | toUserID / toNickname / toFaceURL | Recipient ID, nickname, and avatar snapshot. | | reqMsg | Friend request message. | | handleResult | Handling result: 0 pending, 1 accepted, 2 rejected. | | handlerUserID | User ID that handled the request; it can be empty while pending. | | handleMsg | Handling message. | | handleTime | Handling time; do not treat it as valid while pending. | | createTime | Request creation time. | | ex | Friend request extension string. | Use fromUserID:toUserID as the stable request key. This page owns the friend request added, accepted, rejected, and deleted callbacks. Combine them into the application's single OnFriendshipListener : @Override public void onFriendApplicationAdded FriendApplicationInfo application friendApplicationStore.merge application ; @Override public void onFriendApplicationAccepted FriendApplicationInfo application friendApplicationStore.merge application ; @Override public void onFriendApplicationRejected FriendApplicationInfo application friendApplicationStore.merge application ; @Override public void onFriendApplicationDeleted FriendApplicationInfo application friendApplicationStore.remove application.getFromUserID , application.getToUserID ; Use whether toUserID equals the signed in user ID to route a record to the received or sent list. After an application is accepted, onFriendAdded , owned by Get the friend list by page /sdk/android/user/friends/get friend list page , merges the new friendship." }, { - "path": "/sdk/android/message/sending-a-message/spam-flood-protection", - "title": "Spam flood protection", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Spam flood protection. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "title": "Get sent friend requests", + "description": "Use getSendFriendApplicationList() to query sent friend requests by page.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message spam-flood-protection", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications get-send-friend-application-list", + "content": "GetFriendApplicationListAsApplicantReq request = new GetFriendApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .friendshipManager.getSendFriendApplicationList new OnBase @Override public void onSuccess List applications replaceSentApplications applications ; @Override public void onError int code, String error recordSentApplicationFailure code, error ; , request ; offset starts at 0 , and count is the page size. The callback returns the current page as List . Merge items by fromUserID:toUserID . This query only establishes a snapshot and does not trigger friend request callbacks. For sent requests, the signed in user is normally fromUserID . The record fields and handling semantics are the same as Get received friend requests /sdk/android/user/friend applications/get recv friend application list : the Android server contract uses 0 for pending, 1 for accepted, and 2 for rejected." }, { - "path": "/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler", - "title": "Track file upload progress using a handler", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Track file upload progress using a handler. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/accept-friend-application", + "title": "Accept a friend request", + "description": "Use acceptFriendApplication() to accept a friend request.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message track-file-upload-progress-using-a-handler", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications accept-friend-application", + "content": "OpenIMClient.getInstance .friendshipManager.acceptFriendApplication new OnBase @Override public void onSuccess String data markApplicationAccepted applicantUserID ; @Override public void onError int code, String error recordApplicationAcceptFailure code, error ; , applicantUserID, \"Accepted\" ; applicantUserID identifies the applicant, and the final argument is the handling message. A successful callback means the accept request completed. The request state and new friendship can arrive through separate callbacks and should be merged independently: onFriendApplicationAccepted updates the application and onFriendAdded updates the friendship." }, { - "path": "/sdk/android/message/translating-messages/translation-engine", - "title": "Translation engine", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Translation engine. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/friend-applications/refuse-friend-application", + "title": "Reject a friend request", + "description": "Use refuseFriendApplication() to reject a friend request.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message translating-messages translation-engine", - "content": "" + "keywords": "sdk android v4 sdk android user friend-applications refuse-friend-application", + "content": "OpenIMClient.getInstance .friendshipManager.refuseFriendApplication new OnBase @Override public void onSuccess String data markApplicationRejected applicantUserID ; @Override public void onError int code, String error recordApplicationRejectFailure code, error ; , applicantUserID, \"Not now\" ; applicantUserID identifies the applicant, and the final argument is the handling message. A successful callback means the reject request completed. Merge request state through the shared friend request listener; the final rejected state is handleResult == 2 ." }, { - "path": "/sdk/android/message/using-message-threading/list-replies-in-a-message-thread", - "title": "List replies in a message thread", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for List replies in a message thread. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/blacklist/get-blacklist", + "title": "Get the blacklist", + "description": "Use getBlacklist() to retrieve the current user blacklist.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message using-message-threading list-replies-in-a-message-thread", - "content": "" + "keywords": "sdk android v4 sdk android user blacklist get-blacklist", + "content": "The blacklist records users blocked by the current account. Use it for a blacklist settings screen, relationship state on a profile card, or to limit a chat entry point. Blacklist management and group member management are separate capabilities; use Group APIs to mute, remove, or change the role of a group member. Get the blacklist After SDK initialization and login, call getBlacklist to retrieve the full blacklist for the signed in account. An empty list means no users are blocked. OpenIMClient.getInstance .friendshipManager.getBlacklist new OnBase @Override public void onSuccess List users blacklistStore.replace users ; @Override public void onError int code, String error recordBlacklistFailure code, error ; ; The callback returns List ; call UserInfo.getBlackInfo to retrieve the blacklist relationship object. Blacklist record fields Common BlacklistInfo fields are: | Field | Description | | | | | userID | Target user ID blocked by the current user and the stable list key. | | nickname | Target user nickname snapshot. | | faceURL | Target user avatar URL. | | gender | Target user gender value. | | operatorUserID | User ID that performed the block operation. | | createTime | Blacklist relationship creation time. | | addSource | Source that added the blacklist relationship. | | ex | Blacklist relationship extension string. | When the screen also needs friend remarks or the latest public profile, separately merge FriendInfo or PublicUserInfo by userID . Do not treat blacklist fields as friend profile data. Merge blacklist state by userID . This query does not trigger blacklist added or deleted callbacks. Replace the local snapshot on initial load, after reconnecting, or after an explicit refresh; incremental changes are owned by the Block a user /sdk/android/user/blacklist/add blacklist and Unblock a user /sdk/android/user/blacklist/remove blacklist listener pages." }, { - "path": "/sdk/android/migrating-to-openim", - "title": "Migrating to OpenIM", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Migrating to OpenIM. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/blacklist/add-blacklist", + "title": "Block a user", + "description": "Use addBlacklist() to add a user to the current account blacklist.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android migrating-to-openim", - "content": "" + "keywords": "sdk android v4 sdk android user blacklist add-blacklist", + "content": "OpenIMClient.getInstance .friendshipManager.addBlacklist new OnBase @Override public void onSuccess String data markBlacklistRequestSubmitted targetUserID ; @Override public void onError int code, String error recordBlacklistAddFailure code, error ; , targetUserID, \" \\\"source\\\":\\\"profile menu\\\" \" ; The second argument is the target userID , and the third argument is optional extension data. Use the overload without ex when no extension data is needed. A successful callback means the block request completed, not that the event has arrived. The blacklist is one way: the blocked user cannot send messages to the current account. Whether the current account can continue to send messages is an application level rule. ex is a complete string, so merge application owned fields before updating it. This page owns onBlacklistAdded . Combine it into the application's single OnFriendshipListener : @Override public void onBlacklistAdded BlacklistInfo user blacklistStore.put user.getUserID , user ;" }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates", - "title": "Push notification content templates", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Push notification content templates. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/user/blacklist/remove-blacklist", + "title": "Unblock a user", + "description": "Use removeBlacklist() to remove a user from the current account blacklist.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications push-notification-content-templates", - "content": "" + "keywords": "sdk android v4 sdk android user blacklist remove-blacklist", + "content": "OpenIMClient.getInstance .friendshipManager.removeBlacklist new OnBase @Override public void onSuccess String data markBlacklistRemovalSubmitted targetUserID ; @Override public void onError int code, String error recordBlacklistRemovalFailure code, error ; , targetUserID ; A successful callback means the remove request completed, not that the event has arrived. Remove the local entry after onBlacklistDeleted ; if the event is missed, reconcile through Get the blacklist /sdk/android/user/blacklist/get blacklist . This page owns onBlacklistDeleted ; remove the local entry by userID : @Override public void onBlacklistDeleted BlacklistInfo user blacklistStore.remove user.getUserID ;" }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/push-notification-tester", - "title": "Push notification tester", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Push notification tester. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/overview-conversation", + "title": "Conversation overview", + "description": "Learn about ConversationInfo, conversationID, conversation settings, and conversation events in the Android SDK.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications push-notification-tester", - "content": "" + "keywords": "sdk android v4 sdk android conversation overview-conversation", + "content": "A conversation is the chat list state maintained by the signed in account for a one to one or group chat. A ConversationInfo record contains unread count, latest message, pinning, draft, message reception, and extension data. conversationID identifies the account's conversation state; the chat target is the peer userID for a one to one chat or the groupID for a group chat. Group profile, membership, and permissions belong to Group APIs. Use groupID for group operations and conversationID for conversation settings, unread state, drafts, and message cleanup. Conversation identifiers | Identifier | Purpose | | | | | conversationID | Conversation record ID for settings, unread state, and message history. | | userID | Peer user ID in a one to one chat. | | groupID | Group ID for a group chat and Group API target. | | sourceId | Chat target passed to queries and ID resolution: userID for a one to one chat, groupID for a group chat. | Use ConversationType.SINGLE CHAT for one to one chats. For a group chat, use ConversationType.GROUP CHAT or ConversationType.SUPER GROUP CHAT according to the group type. Do not construct a conversationID in application code. ConversationInfo | Field | Description | | | | | conversationID / conversationType | Conversation ID and type. | | userID / groupID | Peer user or target group. | | showName / faceURL | Conversation list display name and avatar. | | unreadCount | Unread count for the conversation. | | latestMsg / latestMsgSendTime | Latest message JSON and send time. | | recvMsgOpt / groupAtType | Reception option and group mention state. | | draftText / draftTextTime | Draft and draft update time. | | isPinned | Whether the conversation is pinned. | | isPrivateChat / burnDuration | Burn after reading setting and duration. | | isMsgDestruct / msgDestructTime | Server message destruction configuration. | | ex | Application defined conversation extension string. | State updates Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list owns onNewConversation and onConversationChanged . Track the total unread count /sdk/android/conversation/managing conversations/get total unread count owns onTotalUnreadMessageCountChanged . ConversationManager retains one OnConversationListener ; setOnConversationListener replaces it. Set a composed listener once in a shared state layer. Request completion, event arrival, and snapshot reconciliation are separate stages." }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for FCM. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "title": "Open a conversation", + "description": "Use getOneConversation() to retrieve one Android conversation by user or group.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications set-up-push-notifications-for-fcm", - "content": "" + "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversation-by-target", + "content": "Use getOneConversation when opening a chat from a contact, user profile, or group profile. Pass the peer user ID for a one to one chat and the group ID for a group chat; do not construct ConversationInfo locally when no messages exist yet. OpenIMClient.getInstance .conversationManager.getOneConversation new OnBase @Override public void onSuccess ConversationInfo conversation openChatPage conversation ; @Override public void onError int code, String error recordConversationOpenFailure code, error ; , targetUserID, ConversationType.SINGLE CHAT ; sourceId is the peer userID for a one to one chat and groupID for a group chat. Use ConversationType.GROUP CHAT or ConversationType.SUPER GROUP CHAT for a group according to its type. The callback returns ConversationInfo . This query does not trigger a conversation listener; Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list merges later changes by conversationID ." }, { - "path": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for HMS. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", + "description": "Use getConversationIDBySessionType() to resolve an Android conversation ID from a chat target.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications managing-push-notifications set-up-push-notifications-for-hms", - "content": "" + "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversation-id", + "content": "When only the conversation ID is needed, call getConversationIDBySessionType rather than constructing it in application code. String conversationID = OpenIMClient.getInstance .conversationManager .getConversationIDBySessionType targetUserID, ConversationType.SINGLE CHAT ; sourceId is the peer userID for a one to one chat and groupID for a group chat. Use the group conversation type that matches the target group. This Android API synchronously returns a String conversationID . It does not return ConversationInfo or trigger a conversation listener. Use Open a conversation /sdk/android/conversation/retrieving conversations/get conversation by target when profile data is required." }, { - "path": "/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", - "title": "Mark push notifications as delivered", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark push notifications as delivered. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", + "description": "Use getMultipleConversation() to retrieve Android conversations by conversationID.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications marking-push-notifications-as-delivered mark-push-notifications-as-delivered", - "content": "" + "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversations-by-id", + "content": "Use getMultipleConversation when a set of conversationID values is already available and the latest conversation snapshot is needed. OpenIMClient.getInstance .conversationManager.getMultipleConversation new OnBase @Override public void onSuccess List conversations for ConversationInfo item : conversations conversationStore.put item.getConversationID , item ; @Override public void onError int code, String error recordConversationQueryFailure code, error ; , conversationIDs ; Remove empty and duplicate IDs before calling. The callback returns List . Treat an ID with no returned item as missing; do not assume response order exactly matches request order. This query does not trigger a conversation listener." }, { - "path": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for FCM. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "Get the conversation list", + "description": "Use getConversationListSplit() to retrieve the current Android account conversation list by page.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications multi-device-support set-up-push-notifications-for-fcm", - "content": "" + "keywords": "sdk android v4 sdk android conversation retrieving-conversations retrieve-conversation-list", + "content": "The conversation list belongs to the signed in account. Each ConversationInfo contains list state such as unread count, latest message, pinning, and draft. Use the paged API instead of the non paged getAllConversationList . Retrieve a page OpenIMClient.getInstance .conversationManager.getConversationListSplit new OnBase @Override public void onSuccess List conversations mergeConversations conversations ; @Override public void onError int code, String error recordConversationListFailure code, error ; , 0, 50 ; | Parameter | Type | Description | | | | | | offset | long | Zero based paging offset; reset it to 0 on refresh. | | count | long | Requested number of conversations. | The callback returns the current List page. Advance offset by the requested item count and deduplicate by conversationID . A page smaller than count normally indicates the end; clear paging state and reload from 0 on refresh. Keep the list synchronized getConversationListSplit only creates a snapshot. Combine these callbacks in the application's single OnConversationListener : @Override public void onNewConversation List conversations mergeConversations conversations ; @Override public void onConversationChanged List conversations mergeConversations conversations ; Both callbacks carry List and must merge idempotently by conversationID . A user can join a group without an existing conversation, and a historical conversation can remain after leaving a group, so do not substitute the joined group list for the conversation list." }, { - "path": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Set up push notifications for HMS. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/pin-conversation", + "title": "Pin or unpin a conversation", + "description": "Use pinConversation() to set the pinned state of an Android conversation.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications multi-device-support set-up-push-notifications-for-hms", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations pin-conversation", + "content": "OpenIMClient.getInstance .conversationManager.pinConversation new OnBase @Override public void onSuccess String data markPinRequestSubmitted conversationID, true ; @Override public void onError int code, String error recordConversationPinFailure code, error ; , conversationID, true ; Pass true to pin and false to unpin. The setting affects only the current account's conversation list. A successful callback does not mean onConversationChanged has arrived; merge the later conversation increment by conversationID ." }, { - "path": "/sdk/android/report/creating-a-report/report-a-message-user-or-channel", - "title": "Report a message, user, or channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Report a message, user, or channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "title": "Set conversation extra data", + "description": "Use setConversationEx() to set an Android conversation extension string.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android report creating-a-report report-a-message-user-or-channel", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-conversation-extension", + "content": "ex is a complete string. The SDK does not merge JSON, so read the prior value and retain namespaces owned by other application modules. OpenIMClient.getInstance .conversationManager.setConversationEx new OnBase @Override public void onSuccess String data markConversationExtensionSubmitted conversationID ; @Override public void onError int code, String error recordConversationExtensionFailure code, error ; , conversationID, mergedExtensionJSON ; Reconcile the result through onConversationChanged by conversationID ; listener ownership is documented in Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list ." }, { - "path": "/sdk/android/user/managing-user-metadata/manage-user-metadata", - "title": "Manage user metadata", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Manage user metadata. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "title": "Set a conversation draft", + "description": "Use setConversationDraft() to save an Android conversation draft.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user managing-user-metadata manage-user-metadata", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-conversation-draft", + "content": "Save the draft when a chat is left, the conversation changes, or editor content changes. Maintain editor state locally and debounce intermediate saves; submit the newest value before leaving the page. OpenIMClient.getInstance .conversationManager.setConversationDraft new OnBase @Override public void onSuccess String data markDraftSubmitted conversationID ; @Override public void onError int code, String error recordDraftSaveFailure code, error ; , conversationID, editorValue ; Pass an empty string to clear the draft. Request completion and the later onConversationChanged update are separate; merge draftText and draftTextTime by conversationID , and clear in memory editor state after logout or an account switch." }, { - "path": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "title": "Retrieve a list of blocked users", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of blocked users. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "title": "Set conversation message reception", + "description": "Use setConversationRecvMessageOpt() to set message reception and notification behavior for one Android conversation.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user moderating-a-user retrieve-a-list-of-blocked-users", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-message-receive-option", + "content": "OpenIMClient.getInstance .conversationManager.setConversationRecvMessageOpt new OnBase @Override public void onSuccess String data markReceiveOptionSubmitted conversationID ; @Override public void onError int code, String error recordReceiveOptionFailure code, error ; , conversationID, 2 ; | Value | Meaning | | | | | 0 | Receive messages and allow notifications. | | 1 | Do not receive messages from this conversation or notify. | | 2 | Receive messages from this conversation without notification. | The account default is documented in Set global message reception /sdk/android/user/user profile/set global message reception . Merge the later onConversationChanged result by conversationID ." }, { - "path": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users", - "title": "Retrieve a list of muted users", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of muted users. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "title": "Reset group mention status", + "description": "Use resetConversationGroupAtType() to reset an Android conversation group mention state.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user moderating-a-user retrieve-a-list-of-muted-users", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations clear-group-mentions", + "content": "After handling group messages that mention the current user, call resetConversationGroupAtType to reset groupAtType to the normal state. OpenIMClient.getInstance .conversationManager.resetConversationGroupAtType new OnBase @Override public void onSuccess String data markGroupMentionStateReset conversationID ; @Override public void onError int code, String error recordGroupMentionResetFailure code, error ; , conversationID ; This operation only resets the state and must not be used to set atMe or atAll . Group mention state is distinct from message read state. Reconcile the conversation through onConversationChanged ." }, { - "path": "/sdk/android/user/overview-user", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "title": "Mark a conversation as read", + "description": "Use messageManager.markConversationMessageAsRead() to mark Android conversation messages as read.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user overview-user", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations mark-conversation-read", + "content": "Call messageManager.markConversationMessageAsRead after the user has opened and read visible messages. Do not mark a conversation read merely because a notification was previewed or a message arrived in the background. OpenIMClient.getInstance .messageManager.markConversationMessageAsRead conversationID, new OnBase @Override public void onSuccess String data markConversationReadSubmitted conversationID ; @Override public void onError int code, String error recordMarkReadFailure code, error ; ; Request completion does not guarantee onConversationChanged has arrived. Merge the current ConversationInfo by conversationID , or re query it when immediate confirmation is required. For one to one chats, the peer can receive OnAdvanceMsgListener.onRecvC2CReadReceipt . Validate sessionType == ConversationType.SINGLE CHAT and a non empty userID , then update message read state from msgIDList . MessageManager retains one advanced message listener and should be configured once in a shared message state layer." }, { - "path": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "title": "Retrieve the latest information on participants", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve the latest information on participants. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "title": "Track the total unread count", + "description": "Use getTotalUnreadMsgCount() to retrieve the total unread count for the current Android account.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-and-updating-user-information retrieve-the-latest-information-on-participants", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations get-total-unread-count", + "content": "getTotalUnreadMsgCount returns the complete unread snapshot for the signed in account. Do not sum unreadCount values from only the currently loaded conversation pages. OpenIMClient.getInstance .conversationManager.getTotalUnreadMsgCount new OnBase @Override public void onSuccess String value int totalUnread = Integer.parseInt value ; updateApplicationBadge totalUnread ; @Override public void onError int code, String error recordTotalUnreadFailure code, error ; ; The callback value is a String ; handle parse failures as an application error rather than treating it as a partial list total. This page owns OnConversationListener.onTotalUnreadMessageCountChanged int count , which updates the application badge after the initial query." }, { - "path": "/sdk/android/user/retrieving-and-updating-user-information/update-user-profile", - "title": "Update user profile", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Update user profile. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-private-chat", + "title": "Enable or disable burn after reading", + "description": "Use setOneConversationPrivateChat() to configure burn-after-reading mode for an Android conversation.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-and-updating-user-information update-user-profile", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-private-chat", + "content": "OpenIMClient.getInstance .conversationManager.setOneConversationPrivateChat new OnBase @Override public void onSuccess String data markPrivateChatSubmitted conversationID, true ; @Override public void onError int code, String error recordPrivateChatFailure code, error ; , conversationID, true ; Pass false to disable burn after reading. Set the duration separately with burnDuration ; see Set the burn duration /sdk/android/conversation/managing conversations/set burn duration . This is distinct from scheduled server message deletion. Reconcile the final state through onConversationChanged ." }, { - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", - "title": "Retrieve a list of members and operators in a specific order", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of members and operators in a specific order. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", + "description": "Use setConversationBurnDuration() to set the Android burn-after-reading retention duration.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-a-list-of-members-and-operators-in-a-specific-order", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-burn-duration", + "content": "OpenIMClient.getInstance .conversationManager.setConversationBurnDuration new OnBase @Override public void onSuccess String data markBurnDurationSubmitted conversationID, 30 ; @Override public void onError int code, String error recordBurnDurationFailure code, error ; , conversationID, 30 ; burnDuration is measured in seconds. Enable or disable burn after reading with isPrivateChat ; do not confuse this value with the scheduled server deletion period msgDestructTime . Merge the updated duration from onConversationChanged ." }, { - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-operators", - "title": "Retrieve a list of operators", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of operators. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", + "description": "Use setConversation() to configure scheduled server message deletion for an Android conversation.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-a-list-of-operators", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations set-message-destruct", + "content": "isMsgDestruct and msgDestructTime together configure scheduled server message deletion and can be sent in one ConversationReq . ConversationReq request = new ConversationReq ; request.setMsgDestruct true ; request.setMsgDestructTime 3600 ; OpenIMClient.getInstance .conversationManager.setConversation new OnBase @Override public void onSuccess String data markMessageDestructSubmitted conversationID ; @Override public void onError int code, String error recordMessageDestructFailure code, error ; , conversationID, request ; msgDestructTime is measured in seconds. Set request.setMsgDestruct false to disable the policy. This capability is distinct from burn after reading. Reconcile the latest switch and period through onConversationChanged ." }, { - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel", - "title": "Retrieve a list of users in a channel", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of users in a channel. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", + "description": "Use hideConversation() to hide a conversation entry from the current Android account.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-a-list-of-users-in-a-channel", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations hide-a-conversation", + "content": "hideConversation hides only the current account's conversation entry. It does not delete a one to one relationship, leave a group, or affect another account. OpenIMClient.getInstance .conversationManager.hideConversation new OnBase @Override public void onSuccess String data conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationHideFailure code, error ; , conversationID ; A hidden conversation can appear again after a new message or resynchronization. Remove it optimistically after success, then merge later onConversationChanged events idempotently by conversationID ." }, { - "path": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application", - "title": "Retrieve a list of users in an application", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Retrieve a list of users in an application. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", + "description": "Use deleteConversationAndDeleteAllMsg() to delete an Android conversation and its messages.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user retrieving-users retrieve-a-list-of-users-in-an-application", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations delete-conversation-with-messages", + "content": "Use deleteConversationAndDeleteAllMsg for a product action such as “delete this chat”. OpenIMClient.getInstance .conversationManager.deleteConversationAndDeleteAllMsg new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationDeleteFailure code, error ; , conversationID ; After success, clear the current message list and conversation row. This does not delete a friend relationship or leave or dismiss a group. A conversation can be regenerated by a new message or synchronization while the chat target still exists; reconcile through onConversationChanged or a fresh query." }, { - "path": "/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "title": "Mark messages as read", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Mark messages as read. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "path": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", + "description": "Use messageManager.clearConversationAndDeleteAllMsg() to keep an Android conversation entry while clearing its messages.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message marking-messages-as-read-in-a-group-channel mark-messages-as-read", - "content": "" + "keywords": "sdk android v4 sdk android conversation managing-conversations clear-conversation-messages", + "content": "Use messageManager.clearConversationAndDeleteAllMsg for a product action such as “clear chat history”. OpenIMClient.getInstance .messageManager.clearConversationAndDeleteAllMsg conversationID, new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; @Override public void onError int code, String error recordConversationClearFailure code, error ; ; The conversation entry remains while the current account's messages and summary state are cleared. Clear the visible message list immediately, then reconcile the latest message, summary, and unread state from onConversationChanged or a fresh query." }, { "path": "/sdk/flutter/overview", diff --git a/src/lib/client-sdk-commercial.ts b/src/lib/client-sdk-commercial.ts index 0518e40313..678b1c9b70 100644 --- a/src/lib/client-sdk-commercial.ts +++ b/src/lib/client-sdk-commercial.ts @@ -1,5 +1,6 @@ import flutterAudit from '@/data/structure/flutter-content-audit.json'; import iosAudit from '@/data/structure/ios-content-audit.json'; +import androidAudit from '@/data/structure/android-content-audit.json'; import ownership from '@/data/structure/wasm-api-ownership.json'; type OwnershipEntry = { @@ -9,7 +10,7 @@ type OwnershipEntry = { commercial?: boolean; }; -type NativePlatform = 'flutter' | 'ios'; +type NativePlatform = 'android' | 'flutter' | 'ios'; type ClientSdkAuditPage = { currentPath: string; @@ -36,11 +37,16 @@ const commercialEventNames = new Set( events.filter((entry) => entry.commercial).map((entry) => entry.name), ); const nativeAudits: Record = { + android: androidAudit.pages as ClientSdkAuditPage[], flutter: flutterAudit.pages as ClientSdkAuditPage[], ios: iosAudit.pages as ClientSdkAuditPage[], }; const platformSymbolAliases: Record> = { + android: { + onHangup: 'OnHangUp', + onRecvGroupMessageReadReceipt: 'OnRecvGroupReadReceipt', + }, flutter: { getConversationGroupByConversationID: 'getConversationGroupIDsByConversationID', onHangup: 'OnHangUp', @@ -104,6 +110,9 @@ const fullCommercialConceptPages = new Set([ '/sdk/ios/conversation/managing-conversations/set-message-destruct', '/sdk/ios/conversation/managing-conversations/set-message-destruct-time', '/sdk/ios/message/composing-messages/save-local-transcript', + '/sdk/android/conversation/managing-conversations/set-private-chat', + '/sdk/android/conversation/managing-conversations/set-burn-duration', + '/sdk/android/conversation/managing-conversations/set-message-destruct', ]); function applyCommercialConceptOverride( @@ -150,7 +159,7 @@ function parseClientSdkPath( | { platform: 'wasm'; wasmPath: string } | { platform: NativePlatform; wasmPath: string } | undefined { - const match = pagePath.match(/^\/sdk\/(wasm|flutter|ios)(\/.*)$/); + const match = pagePath.match(/^\/sdk\/(android|wasm|flutter|ios)(\/.*)$/); if (!match) return undefined; const platform = match[1] as 'wasm' | NativePlatform; diff --git a/src/lib/client-sdk-publication.ts b/src/lib/client-sdk-publication.ts index cac41c8253..83c31ee0fc 100644 --- a/src/lib/client-sdk-publication.ts +++ b/src/lib/client-sdk-publication.ts @@ -1,3 +1,5 @@ +import androidAuditData from '../../data/structure/android-content-audit.json' with { type: 'json' }; +import androidSidebarData from '../../data/structure/android-sidebar.json' with { type: 'json' }; import flutterAuditData from '../../data/structure/flutter-content-audit.json' with { type: 'json' }; import flutterSidebarData from '../../data/structure/flutter-sidebar.json' with { type: 'json' }; import iosAuditData from '../../data/structure/ios-content-audit.json' with { type: 'json' }; @@ -6,7 +8,7 @@ import wasmAuditData from '../../data/structure/wasm-content-audit.json' with { import wasmSidebarData from '../../data/structure/wasm-sidebar.json' with { type: 'json' }; export type ReviewLocale = 'en' | 'zh'; -export type ClientSdkPlatform = 'flutter' | 'ios' | 'wasm'; +export type ClientSdkPlatform = 'android' | 'flutter' | 'ios' | 'wasm'; type ReviewStatus = | 'deferred' @@ -69,6 +71,10 @@ export function createClientSdkPublicationLookup( } const publicationLookup = createClientSdkPublicationLookup({ + android: { + pages: androidAuditData.pages as ClientSdkAuditPage[], + activePaths: flattenSidebarPaths(androidSidebarData.nodes), + }, flutter: { pages: flutterAuditData.pages as ClientSdkAuditPage[], activePaths: flattenSidebarPaths(flutterSidebarData.nodes), @@ -84,6 +90,7 @@ const publicationLookup = createClientSdkPublicationLookup({ }); const platformNames: Record = { + android: 'Android', flutter: 'Flutter', ios: 'iOS', wasm: 'WASM', diff --git a/src/lib/localized-docs.ts b/src/lib/localized-docs.ts index 9cc312dacb..c2789920b2 100644 --- a/src/lib/localized-docs.ts +++ b/src/lib/localized-docs.ts @@ -2,6 +2,7 @@ import 'server-only'; import { existsSync, readFileSync } from 'node:fs'; import { resolve } from 'node:path'; +import androidSdkData from '@/src/generated/android-sdk-zh-content.json'; import flutterSdkData from '@/src/generated/flutter-sdk-zh-content.json'; import iosSdkData from '@/src/generated/ios-sdk-zh-content.json'; import wasmSdkData from '@/src/generated/wasm-sdk-zh-content.json'; @@ -29,6 +30,7 @@ type LocalizedSdkData = { }; const sdkZhByContext: Record = { + 'chat/sdk/android': androidSdkData as LocalizedSdkData, 'chat/sdk/flutter': flutterSdkData as LocalizedSdkData, 'chat/sdk/ios': iosSdkData as LocalizedSdkData, 'chat/sdk/wasm': wasmSdkData as LocalizedSdkData, From 00340adaa32570332c23468ef32c976b94bf0812 Mon Sep 17 00:00:00 2001 From: chan <1499188352@qq.com> Date: Mon, 10 Aug 2026 18:43:36 +0800 Subject: [PATCH 02/12] docs: publish Android SDK documentation - Add reviewed English Android SDK pages for groups, messages, calling, events, and uploads - Expand Chinese Android documentation and add missing capability pages --- .../calling/managing-calls/accept-call.mdx | 34 +- .../calling/managing-calls/cancel-call.mdx | 28 +- .../managing-calls/handle-call-events.mdx | 76 +- .../calling/managing-calls/hang-up-call.mdx | 30 +- .../calling/managing-calls/reject-call.mdx | 28 +- .../managing-calls/start-group-call.mdx | 46 +- .../managing-calls/start-single-call.mdx | 66 +- .../sdk/android/calling/overview-calling.mdx | 48 +- .../get-room-by-group-id.mdx | 32 +- .../get-token-by-room-id.mdx | 39 +- .../restore-pending-invitation.mdx | 34 +- .../send-a-custom-signal.mdx | 66 +- .../sdk/android/events/overview-events.mdx | 123 +- .../track-file-upload-progress.mdx | 46 +- .../sdk/android/file-uploads/upload-file.mdx | 56 +- .../sdk/android/group/change-group-mute.mdx | 18 +- .../chat/sdk/android/group/create-group.mdx | 25 +- .../chat/sdk/android/group/dismiss-group.mdx | 18 +- .../accept-group-application.mdx | 18 +- ...et-group-application-list-as-applicant.mdx | 20 +- ...et-group-application-list-as-recipient.mdx | 20 +- .../overview-group-applications.mdx | 11 +- .../refuse-group-application.mdx | 18 +- .../chat/sdk/android/group/join-group.mdx | 18 +- .../change-group-member-mute.mdx | 18 +- .../invite-user-to-group.mdx | 18 +- .../kick-group-member.mdx | 18 +- .../set-group-member-avatar.mdx | 25 +- .../set-group-member-extension.mdx | 25 +- .../set-group-member-nickname.mdx | 25 +- .../set-group-member-role-level.mdx | 23 +- .../transfer-group-owner.mdx | 18 +- .../chat/sdk/android/group/overview-group.mdx | 35 +- .../chat/sdk/android/group/quit-group.mdx | 18 +- .../get-group-member-list.mdx | 21 +- .../get-group-member-owner-and-admin.mdx | 21 +- .../get-specified-group-members-info.mdx | 21 +- .../get-users-in-group.mdx | 20 +- .../overview-retrieving-group-members.mdx | 11 +- .../search-group-members.mdx | 19 +- .../get-joined-group-list-page.mdx | 18 +- .../get-specified-groups-info.mdx | 18 +- .../group/retrieving-groups/is-join-group.mdx | 18 +- .../group/retrieving-groups/search-groups.mdx | 18 +- .../android/group/set-group-announcement.mdx | 22 +- .../sdk/android/group/set-group-extension.mdx | 22 +- .../group/set-group-join-verification.mdx | 22 +- .../set-group-member-friend-permission.mdx | 22 +- .../group/set-group-member-profile-access.mdx | 22 +- .../android/group/update-group-profile.mdx | 23 +- content/docs/chat/sdk/android/logger.mdx | 119 +- .../composing-messages/get-typing-status.mdx | 35 + .../update-typing-status.mdx | 61 +- .../create-advanced-quote-message.mdx | 30 + .../create-advanced-text-message.mdx | 30 + .../creating-messages/create-card-message.mdx | 13 +- .../create-custom-message.mdx | 14 +- .../creating-messages/create-face-message.mdx | 13 +- .../create-file-message-by-file.mdx | 16 +- .../create-file-message-by-url.mdx | 13 +- .../creating-messages/create-file-message.mdx | 19 + .../create-forward-message.mdx | 13 +- .../create-image-message-by-file.mdx | 16 +- .../create-image-message-by-url.mdx | 16 +- .../create-image-message.mdx | 19 + .../create-location-message.mdx | 14 +- .../create-merger-message.mdx | 16 +- .../create-quote-message.mdx | 14 +- .../create-sound-message-by-file.mdx | 16 +- .../create-sound-message-by-url.mdx | 13 +- .../create-sound-message.mdx | 19 + .../create-text-at-message.mdx | 16 +- .../creating-messages/create-text-message.mdx | 13 +- .../create-video-message-by-file.mdx | 20 +- .../create-video-message-by-url.mdx | 13 +- .../create-video-message.mdx | 23 + .../clear-all-local-messages.mdx | 13 +- .../managing-messages/clear-all-messages.mdx | 15 +- .../delete-local-message.mdx | 13 +- .../delete-saved-messages.mdx | 50 +- .../delete-user-messages.mdx | 43 + .../managing-messages/get-pinned-messages.mdx | 18 +- .../insert-local-group-message.mdx | 13 +- .../insert-local-single-message.mdx | 15 +- .../managing-messages/modify-a-message.mdx | 30 +- .../managing-messages/revoke-a-message.mdx | 33 +- .../set-message-local-ex.mdx | 15 +- .../managing-messages/set-message-pinned.mdx | 31 +- .../get-group-message-readers.mdx | 45 + .../send-group-read-receipts.mdx | 43 + .../sdk/android/message/overview-message.mdx | 22 +- .../receive-custom-business-messages.mdx | 19 +- .../receiving-messages/receive-messages.mdx | 16 +- .../find-messages-by-id.mdx | 16 +- .../load-message-context.mdx | 50 + .../load-newer-messages.mdx | 15 +- .../load-older-messages.mdx | 15 +- .../searching-messages/search-messages.mdx | 14 +- .../sending-messages/send-message-not-oss.mdx | 15 +- .../message/sending-messages/send-message.mdx | 16 +- .../set-msg-send-progress-listener.mdx | 17 +- .../subscribe-users-online-status.mdx | 4 +- .../unsubscribe-users-online-status.mdx | 39 + .../chat/sdk/android/user/overview-user.mdx | 6 +- .../user/user-profile/set-self-info.mdx | 4 +- .../sdk/android/events/overview-events.mdx | 39 +- .../track-file-upload-progress.mdx | 2 +- .../sdk/android/group/change-group-mute.mdx | 2 +- .../accept-group-application.mdx | 2 +- ...et-group-application-list-as-applicant.mdx | 2 +- ...et-group-application-list-as-recipient.mdx | 2 +- .../overview-group-applications.mdx | 2 +- .../refuse-group-application.mdx | 2 +- .../change-group-member-mute.mdx | 2 +- .../invite-user-to-group.mdx | 2 +- .../set-group-member-nickname.mdx | 2 +- .../set-group-member-role-level.mdx | 2 +- .../get-group-member-list.mdx | 2 +- .../get-specified-group-members-info.mdx | 2 +- .../get-users-in-group.mdx | 2 +- .../get-specified-groups-info.mdx | 2 +- .../group/retrieving-groups/is-join-group.mdx | 2 +- .../android/group/set-group-announcement.mdx | 2 +- .../sdk/android/group/set-group-extension.mdx | 2 +- .../set-group-member-friend-permission.mdx | 2 +- .../android/group/update-group-profile.mdx | 2 +- .../composing-messages/get-typing-status.mdx | 28 + .../update-typing-status.mdx | 36 +- .../create-advanced-quote-message.mdx | 23 + .../create-advanced-text-message.mdx | 23 + .../create-file-message-by-file.mdx | 10 +- .../create-file-message-by-url.mdx | 2 +- .../creating-messages/create-file-message.mdx | 12 + .../create-image-message-by-file.mdx | 11 +- .../create-image-message-by-url.mdx | 2 +- .../create-image-message.mdx | 12 + .../create-quote-message.mdx | 2 +- .../create-sound-message-by-file.mdx | 10 +- .../create-sound-message-by-url.mdx | 2 +- .../create-sound-message.mdx | 12 + .../create-video-message-by-file.mdx | 14 +- .../create-video-message-by-url.mdx | 2 +- .../create-video-message.mdx | 16 + .../clear-all-local-messages.mdx | 2 +- .../managing-messages/clear-all-messages.mdx | 2 +- .../delete-saved-messages.mdx | 45 +- .../delete-user-messages.mdx | 36 + .../managing-messages/get-pinned-messages.mdx | 2 +- .../managing-messages/modify-a-message.mdx | 21 +- .../managing-messages/revoke-a-message.mdx | 24 +- .../set-message-local-ex.mdx | 2 +- .../managing-messages/set-message-pinned.mdx | 24 +- .../get-group-message-readers.mdx | 38 + .../send-group-read-receipts.mdx | 36 + .../find-messages-by-id.mdx | 2 +- .../load-message-context.mdx | 43 + .../load-newer-messages.mdx | 6 +- .../load-older-messages.mdx | 6 +- .../sending-messages/send-message-not-oss.mdx | 2 +- .../message/sending-messages/send-message.mdx | 2 +- .../set-msg-send-progress-listener.mdx | 4 +- .../subscribe-users-online-status.mdx | 2 +- .../unsubscribe-users-online-status.mdx | 32 + .../chat/sdk/android/user/overview-user.mdx | 4 +- data/structure/android-content-audit.json | 3030 +++++-- data/structure/android-navigation-labels.json | 226 +- data/structure/android-sidebar.json | 90 +- data/structure/chat-pages.json | 7820 +++++++++-------- scripts/__tests__/client-sdk-sidebar.test.mjs | 1 + .../sync-client-sdk-route-skeletons.test.mjs | 47 + scripts/__tests__/wasm-commercial.test.mjs | 38 +- .../wasm-full-capability-structure.test.mjs | 5 +- scripts/sync-client-sdk-route-skeletons.mjs | 25 + src/components/docs/documentation-page.tsx | 4 +- src/components/docs/sdk-overview-page.tsx | 103 +- src/generated/android-sdk-zh-content.json | 476 +- src/generated/navigation.json | 512 +- src/generated/routes.json | 1374 +-- src/generated/search-index-zh.json | 218 +- src/generated/search-index.json | 822 +- src/lib/client-sdk-commercial.ts | 6 + 181 files changed, 11755 insertions(+), 6381 deletions(-) create mode 100644 content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx create mode 100644 content/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx create mode 100644 content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx create mode 100644 content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx create mode 100644 content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx create mode 100644 content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx diff --git a/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx index dab1418694..3c0b57557a 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx @@ -1,17 +1,39 @@ --- title: 'Accept a call' -description: 'OpenIM Android SDK guide for Accept a call.' +description: 'Accept a call invitation with the Android SDK and retrieve room credentials.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/managing-calls/accept-call' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +After receiving the original `SignalingInfo` from `onReceiveNewInvitation`, pass it to `signalingAccept()`: -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().signalingManager.signalingAccept( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + joinMediaRoom( + credentials.getRoomID(), + credentials.getToken(), + credentials.getLiveURL() + ); + } + + @Override + public void onError(int code, String error) { + showAcceptError(code, error); + } + }, + receivedInfo +); +``` + +Preserve the original `roomID`, inviter, invitees, and session type in `receivedInfo`. Do not rebuild it as an object that contains only `roomID`. + +The success callback returns `SignalingCertificate`. Connect the media room only after receiving a valid `token` and `roomID`, then keep merging remote state through [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). diff --git a/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx index cfe818d79a..c7bdb66974 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx @@ -1,17 +1,33 @@ --- title: 'Cancel a call invitation' -description: 'OpenIM Android SDK guide for Cancel a call invitation.' +description: 'Cancel a call invitation before it is accepted with the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/managing-calls/cancel-call' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Before an invitation is accepted, the inviter can call `signalingCancel()`: -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().signalingManager.signalingCancel( + new OnBase() { + @Override + public void onSuccess(String result) { + stopWaitingForAnswer(activeInfo.getInvitation().getRoomID()); + } + + @Override + public void onError(int code, String error) { + showCancelError(code, error); + } + }, + activeInfo +); +``` + +Pass the complete `SignalingInfo` saved when the call was started, not a new object containing only `roomID`. A successful callback means that the cancel request completed. End the local waiting state and release unused media resources; remote clients update through `onInvitationCancelled`. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx b/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx index 5e00226229..51eff77695 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx @@ -1,17 +1,81 @@ --- title: 'Handle call events' -description: 'OpenIM Android SDK guide for Handle call events.' +description: 'Register Android SDK invitation, participant, and media-stream callbacks in one call listener.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/managing-calls/handle-call-events' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Register `OnSignalingListener` once in the call state layer. Merge invitation lifecycle, participant connection, and media stream changes by `roomID`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().signalingManager.setSignalingListener( + new OnSignalingListener() { + @Override + public void onReceiveNewInvitation(SignalingInfo info) { + upsertCall(info, "ringing"); + } + + @Override + public void onInviteeAccepted(SignalingInfo info) { + mergeCallEvent("accepted", info); + } + + @Override + public void onInviteeRejected(SignalingInfo info) { + mergeCallEvent("rejected", info); + } + + @Override + public void onInvitationCancelled(SignalingInfo info) { + mergeCallEvent("cancelled", info); + } + + @Override + public void onInvitationTimeout(SignalingInfo info) { + mergeCallEvent("timeout", info); + } + + @Override + public void onInviteeAcceptedByOtherDevice(SignalingInfo info) { + mergeCallEvent("accepted-by-other-device", info); + } + + @Override + public void onInviteeRejectedByOtherDevice(SignalingInfo info) { + mergeCallEvent("rejected-by-other-device", info); + } + + @Override + public void onHangup(SignalingInfo info) { + finishCall(info.getInvitation().getRoomID()); + } + + @Override + public void onRoomParticipantConnected(RoomCallingInfo room) { + mergeConnectedParticipants(room.getRoomID(), room.getParticipant()); + } + + @Override + public void onRoomParticipantDisconnected(RoomCallingInfo room) { + mergeDisconnectedParticipants(room.getRoomID(), room.getParticipant()); + } + + @Override + public void onStreamChange(String streamInfo) { + mergeStreamChange(streamInfo); + } + } +); +``` + +This page owns the complete handling contract for the 11 call callbacks exposed by the Android adapter other than `onReceiveCustomSignal`. Custom signaling belongs to [Send a custom signal](/sdk/android/calling/sending-custom-signals/send-a-custom-signal). + +Merge invitation events with `SignalingInfo.invitation.roomID`. Merge participant state with `RoomCallingInfo.roomID` plus the participant user ID. Do not merge by event order, display name, or array position. `onStreamChange` currently carries a string payload; parse and validate it according to the actual server protocol used by your deployment. + +`SignalingManager` retains one listener. Setting another replaces the previous instance, and there is no public remove method. Combine custom signaling with these callbacks in the same application-level listener. When signing out or switching accounts, stop writing into old account state and replace the listener with the complete listener for the new account. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx index a8f59457c7..85e4b0d993 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx @@ -1,17 +1,33 @@ --- -title: 'End a call' -description: 'OpenIM Android SDK guide for End a call.' +title: 'Hang up a call' +description: 'Hang up an established call with the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/managing-calls/hang-up-call' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +After a call is established, a participant can call `signalingHungUp()`. The supplied `SignalingInfo` should preserve the complete invitation, and its `roomID` must match the active media room. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().signalingManager.signalingHungUp( + new OnBase() { + @Override + public void onSuccess(String result) { + releaseCallResources(activeInfo.getInvitation().getRoomID()); + } + + @Override + public void onError(int code, String error) { + showHangUpError(code, error); + } + }, + activeInfo +); +``` + +The success callback only means that the hang-up request completed. Stop local capture, disconnect the media room, and release the camera and microphone. Cancellation, rejection, timeout, and hang-up should all enter one idempotent cleanup flow keyed by `roomID`. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx index 1ab2de057c..974b545897 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx @@ -1,17 +1,33 @@ --- title: 'Reject a call' -description: 'OpenIM Android SDK guide for Reject a call.' +description: 'Reject a call invitation with the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/managing-calls/reject-call' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +When the user declines an incoming call, pass the original `SignalingInfo` to `signalingReject()`: -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().signalingManager.signalingReject( + new OnBase() { + @Override + public void onSuccess(String result) { + closeIncomingCallUI(); + } + + @Override + public void onError(int code, String error) { + showRejectError(code, error); + } + }, + receivedInfo +); +``` + +The success callback only means that the reject signaling request completed. The inviter later updates its interface through `onInviteeRejected`; see [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). diff --git a/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx index 0b701cf118..44e5b0163d 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx @@ -1,17 +1,51 @@ --- title: 'Start a group call' -description: 'OpenIM Android SDK guide for Start a group call.' +description: 'Start a group audio or video call with the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/managing-calls/start-group-call' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`signalingInviteInGroup()` starts a group call. It invites only the members explicitly listed in `inviteeUserIDList`; setting `groupID` does not automatically invite every group member. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +SignalingInvitationInfo invitation = new SignalingInvitationInfo(); +invitation.setInviterUserID(currentUserID); +invitation.setInviteeUserIDList(selectedGroupMemberIDs); +invitation.setGroupID(groupID); +invitation.setRoomID(groupID); +invitation.setTimeout(30); +invitation.setMediaType("video"); +invitation.setSessionType(ConversationType.GROUP_CHAT); +invitation.setPlatformID(Platform.ANDROID); +invitation.setCustomData("{\"source\":\"group-call\"}"); + +SignalingInfo info = new SignalingInfo(); +info.setUserID(currentUserID); +info.setInvitation(invitation); +info.setOfflinePushInfo(offlinePushInfo); + +OpenIMClient.getInstance().signalingManager.signalingInviteInGroup( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + startGroupCall(credentials); + } + + @Override + public void onError(int code, String error) { + showCallError(code, error); + } + }, + info +); +``` + +`groupID` must not be empty. Remove the current user, empty IDs, and duplicates from `inviteeUserIDList`. The example reuses the group ID as the room ID. If your application generates another `roomID`, every participant must use the same value. + +The success callback returns `SignalingCertificate`; see [Start a one-to-one call](/sdk/android/calling/managing-calls/start-single-call) for its fields. `busyLineUserIDList` only identifies some unavailable members and should not stop invitations to the others. Success does not mean that any member has accepted. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx index 09e21d3939..1c89908027 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx @@ -1,17 +1,71 @@ --- title: 'Start a one-to-one call' -description: 'OpenIM Android SDK guide for Start a one-to-one call.' +description: 'Start a one-to-one audio or video call with the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/managing-calls/start-single-call' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`signalingInvite()` starts a one-to-one call. The Android SDK handles call signaling; your application must connect a real-time audio/video engine with the returned room credentials. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +## Parameters + +| Field | Type | Required | Description | +| ------------------- | ----------------- | -------- | --------------------------------------------------------------------------- | +| `userID` | `String` | Yes | The current signed-in user performing the invite operation. | +| `inviterUserID` | `String` | Yes | The inviter, normally the current signed-in user. | +| `inviteeUserIDList` | `List` | Yes | The invitees; for a one-to-one call, include only the other user. | +| `groupID` | `String` | Yes | Use an empty string for a one-to-one call. | +| `roomID` | `String` | Yes | The call's unique room identifier and the primary key for subsequent state. | +| `timeout` | `long` | Yes | Invitation timeout in seconds. | +| `mediaType` | `String` | Yes | The application-defined media type, typically `audio` or `video`. | +| `sessionType` | `int` | Yes | Use `ConversationType.SINGLE_CHAT`. | +| `platformID` | `int` | Yes | Use `Platform.ANDROID` for an Android phone client. | +| `customData` | `String` | No | Application extra data carried with the invitation. | +| `offlinePushInfo` | `OfflinePushInfo` | No | Push content used when the invitee is offline. | + +```java +SignalingInvitationInfo invitation = new SignalingInvitationInfo(); +invitation.setInviterUserID(currentUserID); +invitation.setInviteeUserIDList(Collections.singletonList(peerUserID)); +invitation.setGroupID(""); +invitation.setRoomID(roomID); +invitation.setTimeout(30); +invitation.setMediaType("video"); +invitation.setSessionType(ConversationType.SINGLE_CHAT); +invitation.setPlatformID(Platform.ANDROID); +invitation.setCustomData("{\"source\":\"contact-card\"}"); + +SignalingInfo info = new SignalingInfo(); +info.setUserID(currentUserID); +info.setInvitation(invitation); +info.setOfflinePushInfo(offlinePushInfo); + +OpenIMClient.getInstance().signalingManager.signalingInvite( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + joinMediaRoom( + credentials.getRoomID(), + credentials.getToken(), + credentials.getLiveURL() + ); + } + + @Override + public void onError(int code, String error) { + showCallError(code, error); + } + }, + info +); +``` + +The success callback returns `SignalingCertificate`. `roomID` identifies the media room, `token` is a short-lived join credential, `liveURL` is the media service address, and `busyLineUserIDList` contains busy users. + +Connect the media engine only after receiving a valid `token` and `roomID`. API success does not mean the invitee accepted; merge subsequent state through [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). diff --git a/content/docs/chat/sdk/android/calling/overview-calling.mdx b/content/docs/chat/sdk/android/calling/overview-calling.mdx index 1893a85cc9..e0dc94ef3f 100644 --- a/content/docs/chat/sdk/android/calling/overview-calling.mdx +++ b/content/docs/chat/sdk/android/calling/overview-calling.mdx @@ -1,17 +1,53 @@ --- title: 'Audio and video calling overview' -description: 'OpenIM Android SDK guide for Audio and video calling overview.' +description: 'Learn about Android SDK call signaling, room information, and event boundaries.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/overview-calling' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +The Android SDK `SignalingManager` provides the signaling APIs needed to invite, accept, reject, cancel, hang up, query rooms, and synchronize call state. It coordinates participants, room information, and the call lifecycle. It does not capture camera video, play remote media, or render a call interface. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +Pass the returned `roomID`, `token`, and `liveURL` to your chosen real-time audio/video engine. Your application remains responsible for Android permissions, devices, media tracks, poor-network behavior, and UI state. The signaling APIs are not a complete real-time media SDK. + +## Call flow + +1. Call `signalingInvite()` for a one-to-one call or `signalingInviteInGroup()` for a group call. +2. The invitee receives `SignalingInfo` through `onReceiveNewInvitation` and chooses to accept or reject. +3. The invitee calls `signalingAccept()`, and both parties connect their media engine with the returned room credentials. +4. During the call, update local state from participant, media stream, and custom signaling callbacks. +5. The inviter can cancel a pending invitation; any participant can hang up an established call. + +## Core data + +| Data | Description | +| ------------------------- | --------------------------------------------------------------------------------------------------------- | +| `SignalingInvitationInfo` | Inviter, invitees, group, room, media type, timeout, session type, and application extra data. | +| `SignalingInfo` | Current operation user, original invitation, participant profiles, and optional offline push information. | +| `SignalingCertificate` | The `roomID`, `token`, `liveURL`, and busy user list returned by OpenIMServer. | +| `RoomCallingInfo` | A snapshot of a group's room, invitation, participants, group, and join credentials. | + +Use `customData` and custom signaling only for application negotiation data. Do not place long-lived credentials, administrator secrets, or other sensitive data in these fields. + +## State updates and event ownership + +For invite, accept, reject, cancel, and hang-up operations, handle both the API callback and the call listener. The API success callback means that the current signaling request completed. The listener represents incremental state observed by inviters, invitees, other devices, or room participants. They are not the same completion signal. + +The complete invitation lifecycle, participant, hang-up, and stream listener belongs to [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). Custom signaling belongs to [Send a custom signal](/sdk/android/calling/sending-custom-signals/send-a-custom-signal). Room, credential, and pending-invitation queries only return snapshots. + +This overview does not register a listener. Use `roomID` as the call-state key and combine it with user ID for participant state. Query again when the current room needs to be restored or reconciled. + +## Find a page by task + +| Task | Page | +| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Start a one-to-one or group call | [Start a one-to-one call](/sdk/android/calling/managing-calls/start-single-call), [Start a group call](/sdk/android/calling/managing-calls/start-group-call) | +| Accept or reject an invitation | [Accept a call](/sdk/android/calling/managing-calls/accept-call), [Reject a call](/sdk/android/calling/managing-calls/reject-call) | +| Cancel an invitation or hang up | [Cancel a call invitation](/sdk/android/calling/managing-calls/cancel-call), [Hang up a call](/sdk/android/calling/managing-calls/hang-up-call) | +| Restore a room or pending invitation | [Get a group call room](/sdk/android/calling/retrieving-call-information/get-room-by-group-id), [Get room credentials](/sdk/android/calling/retrieving-call-information/get-token-by-room-id), [Restore a pending invitation](/sdk/android/calling/retrieving-call-information/restore-pending-invitation) | +| Handle call events and negotiation | [Handle call events](/sdk/android/calling/managing-calls/handle-call-events), [Send a custom signal](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) | diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx index bbff58ad19..5beee147ca 100644 --- a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx @@ -1,17 +1,37 @@ --- title: 'Get a group call room' -description: 'OpenIM Android SDK guide for Get a group call room.' +description: 'Use the Android SDK to retrieve an active call room by group ID.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/retrieving-call-information/get-room-by-group-id' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`signalingGetRoomByGroupID()` takes a group ID, not a custom `roomID`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID( + new OnBase() { + @Override + public void onSuccess(RoomCallingInfo room) { + if (room.getRoomID() != null && !room.getRoomID().isEmpty()) { + renderParticipants(room.getParticipant()); + } + } + + @Override + public void onError(int code, String error) { + showNoActiveGroupCall(); + } + }, + groupID +); +``` + +The success callback returns a `RoomCallingInfo` snapshot containing the room ID, original invitation, participants, group ID, token, and connection address. Account profiles, group member profiles, and group profiles inside participant data come from different sources and must not overwrite one another. + +If no group call is active, treat an error or empty room as “no call to restore” and discard old credentials. Even when your group call uses a custom room ID, this method still receives `groupID`. diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx index a4642bd62a..655d317e4a 100644 --- a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx @@ -1,17 +1,42 @@ --- -title: 'Get a call room token' -description: 'OpenIM Android SDK guide for Get a call room token.' +title: 'Get room credentials' +description: 'Use the Android SDK to retrieve fresh join credentials for a known room ID.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/retrieving-call-information/get-token-by-room-id' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +When you know the `roomID` but need new join credentials, call `signalingGetTokenByRoomID()`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().signalingManager.signalingGetTokenByRoomID( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + if (credentials.getToken() != null + && credentials.getRoomID() != null) { + joinMediaRoom( + credentials.getRoomID(), + credentials.getToken(), + credentials.getLiveURL() + ); + } + } + + @Override + public void onError(int code, String error) { + showCredentialError(code, error); + } + }, + roomID +); +``` + +The success callback returns `SignalingCertificate`; see [Start a one-to-one call](/sdk/android/calling/managing-calls/start-single-call) for its fields. Connect the media engine only after receiving a valid `token` and `roomID`. + +A room token is a short-lived sensitive credential. Keep it in memory and do not write it to logs, URLs, analytics events, or persistent storage. diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx index 46f22f6153..f42fb5e22c 100644 --- a/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx @@ -1,17 +1,37 @@ --- -title: 'Restore a pending call invitation' -description: 'OpenIM Android SDK guide for Restore a pending call invitation.' +title: 'Restore a pending invitation' +description: 'Restore a call invitation that was received before the Android application started or resumed.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/retrieving-call-information/restore-pending-invitation' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`getSignalingInvitationInfoStartApp()` takes no application parameters. It returns the invitation snapshot that should be handled when the application starts or resumes. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().signalingManager.getSignalingInvitationInfoStartApp( + new OnBase() { + @Override + public void onSuccess(SignalingInfo info) { + if (info != null + && info.getInvitation() != null + && info.getInvitation().getRoomID() != null + && !info.getInvitation().getRoomID().isEmpty()) { + restoreIncomingCall(info); + } + } + + @Override + public void onError(int code, String error) { + clearExpiredIncomingCall(); + } + } +); +``` + +Success only means that the current snapshot was retrieved; it does not replace the call listener. Restore the incoming-call interface only when both `invitation` and `roomID` are valid. Continue handling cancellation, timeout, acceptance, and hang-up through [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). diff --git a/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx b/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx index 98d59a1877..6ba5f79847 100644 --- a/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx +++ b/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx @@ -1,17 +1,71 @@ --- title: 'Send a custom signal' -description: 'OpenIM Android SDK guide for Send a custom signal.' +description: 'Send and receive custom signaling data in an Android SDK call room.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/calling/sending-custom-signals/send-a-custom-signal' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`signalingSendCustomSignal()` sends lightweight application negotiation data to a call room, such as a raised-hand action, layout hint, or application state update. It is not a chat message API and does not replace the media engine's data channel. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +## Send a signal + +Both `roomID` and `customInfo` are required strings. Define a stable schema and serialize structured data as JSON. + +```java +JSONObject signal = new JSONObject(); +signal.put("version", 1); +signal.put("eventID", eventID); +signal.put("type", "hand-raised"); +signal.put("userID", currentUserID); +signal.put("sentAt", System.currentTimeMillis()); + +OpenIMClient.getInstance().signalingManager.signalingSendCustomSignal( + new OnBase() { + @Override + public void onSuccess(String result) { + markSignalSent(eventID); + } + + @Override + public void onError(int code, String error) { + showSignalError(code, error); + } + }, + roomID, + signal.toString() +); +``` + +The success callback means that the send request completed, not that other participants processed it. Keep custom signals small and include a protocol version and application idempotency ID. Do not place large files, chat history, long-lived state, or sensitive credentials in `customInfo`. + +## Receive a signal + +`OnSignalingListener.onReceiveCustomSignal` returns `CustomSignalingInfo`. Validate the room and your application protocol before updating the interface. + +```java +@Override +public void onReceiveCustomSignal(CustomSignalingInfo info) { + if (info == null || !activeRoomID.equals(info.getRoomID())) { + return; + } + + CallSignal signal = parseAndValidateCallSignal(info.getCustomInfo()); + String mergeID = info.getRoomID() + ":" + signal.getEventID(); + if (hasAppliedSignal(mergeID)) { + return; + } + applyCallSignal(signal); +} +``` + +This page owns the complete handling contract for `onReceiveCustomSignal`. `parseAndValidateCallSignal()` should check the JSON structure, protocol version, `eventID`, `type`, and application fields. Process signals idempotently by `roomID:eventID` and do not depend on event order. + +`SignalingManager` retains only one listener. Add the custom signal callback to the application-level listener shown in [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). Registering another listener from this feature would replace all other call callbacks. + +Custom client signaling must not grant host, payment, or privacy permissions. Store and validate authoritative state on a trusted backend. After reconnecting, reconcile long-lived state through a room query or the application backend. diff --git a/content/docs/chat/sdk/android/events/overview-events.mdx b/content/docs/chat/sdk/android/events/overview-events.mdx index 7b89f87bab..897d4e2c50 100644 --- a/content/docs/chat/sdk/android/events/overview-events.mdx +++ b/content/docs/chat/sdk/android/events/overview-events.mdx @@ -1,17 +1,128 @@ --- title: 'Events overview' -description: 'OpenIM Android SDK guide for Events overview.' +description: 'Register Android SDK listeners centrally and route connection, synchronization, and data events by domain.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/events/overview-events' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +OpenIM Android SDK uses listeners to report connection, synchronization, user, friendship, conversation, group, message, and calling changes. Listener setters on each manager use replacement semantics: a later call replaces the previous instance. Combine all callbacks in an application-level event center and register them once before login. Do not register them repeatedly from an Activity, Fragment, Compose screen, or feature component. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +The connection listener is the exception. `OnConnListener` is passed to `initSDK()`; its complete handling contract is described in [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session). + +## Register listeners centrally + +The following entry point uses stable application-level listeners. Each listener should include all callbacks for its domain; detailed merge behavior remains on the page that owns each event. + +```java +public final class OpenIMEventCenter { + private final OpenIMClient client = OpenIMClient.getInstance(); + + private final OnUserListener userListener = buildUserListener(); + private final OnFriendshipListener friendshipListener = buildFriendshipListener(); + private final OnConversationListener conversationListener = buildConversationListener(); + private final OnGroupListener groupListener = buildGroupListener(); + private final OnAdvanceMsgListener messageListener = buildMessageListener(); + private final OnCustomBusinessListener businessListener = buildBusinessListener(); + private final OnSignalingListener signalingListener = buildSignalingListener(); + + public void registerBeforeLogin() { + client.userInfoManager.setOnUserListener(userListener); + client.friendshipManager.setOnFriendshipListener(friendshipListener); + client.conversationManager.setOnConversationListener(conversationListener); + client.groupManager.setOnGroupListener(groupListener); + client.messageManager.setAdvancedMsgListener(messageListener); + client.messageManager.setCustomBusinessListener(businessListener); + client.signalingManager.setSignalingListener(signalingListener); + } +} +``` + +The Android SDK does not expose remove or unset methods for these listeners. When signing out, switching accounts, or destroying the application state layer, stop dispatching into old account state and destroyed screens. Before the next login, replace each listener with the complete listener set for the new account. + +## Event ownership + +| Event scope | Listener | Corresponding page | +| --- | --- | --- | +| Connection, token, and forced logout | `OnConnListener` | [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session) | +| Current user profile | `OnUserListener` | [Update the current user profile](/sdk/android/user/user-profile/set-self-info) | +| Online status | `OnUserListener` | [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status) | +| Friend relationships and profiles | `OnFriendshipListener` | [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page) | +| Friend applications | `OnFriendshipListener` | [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list) | +| Blacklist | `OnFriendshipListener` | [Block a user](/sdk/android/user/blacklist/add-blacklist), [Remove a user from the blacklist](/sdk/android/user/blacklist/remove-blacklist) | +| Conversation list | `OnConversationListener` | [Retrieve the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) | +| Total unread count | `OnConversationListener` | [Get the total unread count](/sdk/android/conversation/managing-conversations/get-total-unread-count) | +| Typing state | `OnConversationListener` | [Update typing status](/sdk/android/message/composing-messages/update-typing-status) | +| Group profiles, members, and applications | `OnGroupListener` | [Group overview](/sdk/android/group/overview-group) | +| New, offline, and online-only messages | `OnAdvanceMsgListener` | [Receive messages](/sdk/android/message/receiving-messages/receive-messages) | +| Message revocation | `OnAdvanceMsgListener` | [Revoke a message](/sdk/android/message/managing-messages/revoke-a-message) | +| Message deletion | `OnAdvanceMsgListener` | [Delete messages in a batch](/sdk/android/message/managing-messages/delete-saved-messages) | +| Message modification | `OnAdvanceMsgListener` | [Modify a message](/sdk/android/message/managing-messages/modify-a-message) | +| Pinned messages | `OnAdvanceMsgListener` | [Pin or unpin a message](/sdk/android/message/managing-messages/set-message-pinned) | +| One-to-one read receipts | `OnAdvanceMsgListener` | [Mark a conversation as read](/sdk/android/conversation/managing-conversations/mark-conversation-read) | +| Custom business messages | `OnCustomBusinessListener` | [Receive custom business messages](/sdk/android/message/receiving-messages/receive-custom-business-messages) | +| Calls | `OnSignalingListener` | [Handle call events](/sdk/android/calling/managing-calls/handle-call-events) | +| Custom call signaling | `OnSignalingListener` | [Send a custom signal](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) | +| SDK data synchronization | `OnConversationListener` | [Handle initial synchronization](#handle-initial-synchronization) | + +Query APIs establish snapshots, and listeners merge subsequent changes. Query results, successful API callbacks, and event delivery are three independent stages and cannot replace one another. + +## Handle initial synchronization + +The synchronization lifecycle belongs to the application-level `OnConversationListener`. That listener must also include conversation-list, unread-count, and typing-status callbacks. The following example only highlights synchronization logic owned by this page. + +```java +private OnConversationListener buildConversationListener() { + return new OnConversationListener() { + @Override + public void onNewConversation(List conversations) { + mergeNewConversations(conversations); + } + + @Override + public void onConversationChanged(List conversations) { + mergeChangedConversations(conversations); + } + + @Override + public void onTotalUnreadMessageCountChanged(int total) { + updateTotalUnreadCount(total); + } + + @Override + public void onConversationUserInputStatusChanged(String payload) { + handleInputStatus(payload); + } + + @Override + public void onSyncServerStart(boolean reinstall) { + setSyncState("syncing", 0, reinstall); + } + + @Override + public void onSyncServerProgress(long progress) { + setSyncProgress(progress); + } + + @Override + public void onSyncServerFinish(boolean reinstall) { + setSyncState("ready", 100, reinstall); + reloadVisibleSnapshots(); + } + + @Override + public void onSyncServerFailed(boolean reinstall) { + setSyncState("failed", 0, reinstall); + } + }; +} +``` + +When `reinstall` is `true`, treat local data as being rebuilt. Show a more complete synchronization state and avoid relying on old cache data until synchronization completes. `onSyncServerProgress` reports current progress. After completion, query the snapshots needed by visible screens again. On failure, record the error and wait for retry or connection recovery. + +This page owns the complete handling contract for `onSyncServerStart`, `onSyncServerProgress`, `onSyncServerFinish`, and `onSyncServerFailed`. Synchronization state has no business entity key; isolate it by the current `OpenIMClient` singleton and signed-in user. diff --git a/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx b/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx index b140b51680..79f9e2b579 100644 --- a/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx +++ b/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx @@ -1,17 +1,51 @@ --- title: 'Track file upload progress' -description: 'OpenIM Android SDK guide for Track file upload progress.' +description: 'Use OnPutFileListener to track an individual Android SDK file upload.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/file-uploads/track-file-upload-progress' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +The Android SDK does not use a global file-upload listener. Pass an `OnPutFileListener` to each `uploadFile()` call. That listener receives progress, part completion, and final result callbacks for the current task. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OnPutFileListener uploadListener = new OnPutFileListener() { + @Override + public void open(long size) { + initializeUploadProgress(uploadTaskID, size); + } + + @Override + public void uploadID(String id) { + bindSdkUploadID(uploadTaskID, id); + } + + @Override + public void uploadComplete(long fileSize, long uploadedSize, long storageSize) { + updateUploadProgress(uploadTaskID, uploadedSize, fileSize); + } + + @Override + public void uploadPartComplete(long partNumber, long partSize, String partHash) { + markPartComplete(uploadTaskID, partNumber, partSize, partHash); + } + + @Override + public void complete(long size, String url, long type) { + completeUpload(uploadTaskID, size, url, type); + } +}; + +OpenIMClient.getInstance().uploadFile(resultCallback, uploadListener, putArgs); +``` + +Use `open()` to initialize the total size, `uploadID()` to receive the SDK upload identifier, `uploadComplete()` for in-progress byte counts, `uploadPartComplete()` when one part finishes, and `complete()` for the final size, remote URL, and resource type. Most progress bars only need the progress and completion callbacks; process part details only when the product exposes them. + +Generate a stable application-level `uploadTaskID` and capture it in the listener. Do not use the SDK upload ID, file name, or array position as the task's primary key. Give each task its own listener, and stop dispatching callbacks into destroyed page or account state. + +For complete argument construction and error handling, see [Upload a file](/sdk/android/file-uploads/upload-file). diff --git a/content/docs/chat/sdk/android/file-uploads/upload-file.mdx b/content/docs/chat/sdk/android/file-uploads/upload-file.mdx index d42e494ae4..2a71ae182a 100644 --- a/content/docs/chat/sdk/android/file-uploads/upload-file.mdx +++ b/content/docs/chat/sdk/android/file-uploads/upload-file.mdx @@ -1,17 +1,61 @@ --- title: 'Upload a file' -description: 'OpenIM Android SDK guide for Upload a file.' +description: 'Upload a standalone file with the Android SDK and retrieve its remote resource URL.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/file-uploads/upload-file' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`uploadFile()` uploads a standalone file for uses such as a user avatar, group avatar, profile attachment, or other application resource. The upload does not belong to a message and does not automatically create a message or update a profile. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +## Parameters + +| Parameter | Type | Required | Description | +| ------------------ | ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------- | +| `base` | `OnBase` | Yes | Receives the final success or failure result for the upload request. | +| `listener` | `OnPutFileListener` | Yes | Receives progress, part completion, and final file information for this task. | +| `putArgs.filepath` | `String` | Yes | A local file path readable by the Android application. | +| `putArgs.name` | `String` | Yes | The upload file name. `PutArgs` initially uses the supplied path; replace it with the original file name when appropriate. | +| `putArgs.cuase` | `String` | No | An application-defined upload reason. The spelling follows the Android SDK `PutArgs` declaration. | + +```java +File file = new File(localPath); +PutArgs args = new PutArgs(file.getAbsolutePath()); +args.name = file.getName(); +args.cuase = "user-avatar"; + +OpenIMClient.getInstance().uploadFile( + new OnBase() { + @Override + public void onSuccess(String result) { + finishUploadRequest(result); + } + + @Override + public void onError(int code, String error) { + showUploadError(code, error); + } + }, + new OnPutFileListener() { + @Override + public void uploadComplete(long fileSize, long uploadedSize, long storageSize) { + updateUploadProgress(uploadTaskID, uploadedSize, fileSize); + } + + @Override + public void complete(long size, String url, long type) { + completeUpload(uploadTaskID, size, url, type); + } + }, + args +); +``` + +Each call receives its own `OnPutFileListener`, so no global upload listener is required. For parallel uploads, generate a stable task ID and capture it in the callbacks. Do not use a file name or list position as the unique identifier. See [Track file upload progress](/sdk/android/file-uploads/track-file-upload-progress) for callback responsibilities. + +The URL returned by `complete()` can be used later to update an avatar, store an attachment address, or create a URL-based media message. Upload success only means that the resource was written remotely; profile updates, message creation, and message sending remain separate API calls. diff --git a/content/docs/chat/sdk/android/group/change-group-mute.mdx b/content/docs/chat/sdk/android/group/change-group-mute.mdx index 9c15b73f1b..3e2048532f 100644 --- a/content/docs/chat/sdk/android/group/change-group-mute.mdx +++ b/content/docs/chat/sdk/android/group/change-group-mute.mdx @@ -1,17 +1,23 @@ --- title: 'Change group mute status' -description: 'OpenIM Android SDK guide for Change group mute status.' +description: 'Use changeGroupMute to enable or disable mute-all mode for a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/change-group-mute' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use `changeGroupMute()` to toggle mute-all mode. Pass `true` to enable it or `false` to disable it. To mute one member, see [Mute or unmute a group member](/sdk/android/group/managing-group-members/change-group-member-mute). -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() { + @Override public void onSuccess(String data) { markGroupMuteSubmitted(groupID, true); } + @Override public void onError(int code, String error) { showGroupMuteError(error); } +}, groupID, true); +``` + +The effective speaking permissions for the owner and administrators, as well as server-side permission checks, depend on the deployment policy. diff --git a/content/docs/chat/sdk/android/group/create-group.mdx b/content/docs/chat/sdk/android/group/create-group.mdx index 69c7b84bab..464e171ce8 100644 --- a/content/docs/chat/sdk/android/group/create-group.mdx +++ b/content/docs/chat/sdk/android/group/create-group.mdx @@ -1,17 +1,30 @@ --- title: 'Create a group' -description: 'OpenIM Android SDK guide for Create a group.' +description: 'Use createGroup to create a group profile and specify its initial members, administrators, and owner.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/create-group' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use `createGroup()` to create a group. Set the group profile in `GroupInfo`, and pass the initial regular members, administrators, and owner as separate parameters. The success callback returns the complete `GroupInfo` created by the server. Store the server-assigned `groupID`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +GroupInfo info = new GroupInfo(); +info.setGroupName("Project discussion"); +info.setIntroduction("For project members only"); + +OpenIMClient.getInstance().groupManager.createGroup( + memberUserIDs, adminUserIDs, info, ownerUserID, + new OnBase() { + @Override public void onSuccess(GroupInfo group) { openGroup(group.getGroupID()); } + @Override public void onError(int code, String error) { showCreateError(error); } + } +); +``` + +Select the owner and administrators according to your application's permission rules. Do not infer the owner from a local user list. diff --git a/content/docs/chat/sdk/android/group/dismiss-group.mdx b/content/docs/chat/sdk/android/group/dismiss-group.mdx index 470891a2b7..cab2a028c0 100644 --- a/content/docs/chat/sdk/android/group/dismiss-group.mdx +++ b/content/docs/chat/sdk/android/group/dismiss-group.mdx @@ -1,17 +1,23 @@ --- title: 'Dismiss a group' -description: 'OpenIM Android SDK guide for Dismiss a group.' +description: 'Use dismissGroup to dismiss a group that the current user is allowed to manage.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/dismiss-group' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`dismissGroup()` dismisses the specified group and is normally available only to its owner. Ask for explicit confirmation before calling it so that leaving a group is not accidentally implemented as dismissing it. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.dismissGroup(new OnBase() { + @Override public void onSuccess(String data) { markDismissSubmitted(groupID); } + @Override public void onError(int code, String error) { showDismissError(error); } +}, groupID); +``` + +Merge the final state from `onGroupDismissed`. After receiving the event, remove cached group profile, member, and conversation-related data. diff --git a/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx b/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx index 002afef04a..ee851a9f89 100644 --- a/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx @@ -1,17 +1,23 @@ --- title: 'Accept a group application' -description: 'OpenIM Android SDK guide for Accept a group application.' +description: 'Use acceptGroupApplication to accept a user’s application to join a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/group-applications/accept-group-application' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Pass the application's `groupID`, the applicant's `userID`, and a handling message. The server checks whether the current user has permission to approve the application. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() { + @Override public void onSuccess(String data) { markApplicationHandled(groupID, applicantUserID); } + @Override public void onError(int code, String error) { showHandleError(error); } +}, groupID, applicantUserID, "Welcome to the group"); +``` + +After acceptance, update the application and member lists through the group application event and `onGroupMemberAdded`. diff --git a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx index 7f5554b186..0a1acdbd6e 100644 --- a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx @@ -1,17 +1,25 @@ --- title: 'Get sent group applications' -description: 'OpenIM Android SDK guide for Get sent group applications.' +description: 'Use getSendGroupApplicationList to retrieve group applications sent by the current user.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-applicant' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Configure pagination and filters in `GetGroupApplicationListAsApplicantReq`, then call `getSendGroupApplicationList()`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq(0, 20); +OpenIMClient.getInstance().groupManager.getSendGroupApplicationList( + new OnBase>() { + @Override public void onSuccess(List items) { mergeSentApplications(items); } + @Override public void onError(int code, String error) { showApplicationError(error); } + }, request); +``` + +After an application is accepted, use `onJoinedGroupAdded` as the source of truth for the joined-group list. diff --git a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx index 6dfb5603ad..1cfaefc554 100644 --- a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx @@ -1,17 +1,25 @@ --- title: 'Get received group applications' -description: 'OpenIM Android SDK guide for Get received group applications.' +description: 'Use getRecvGroupApplicationList to retrieve group applications that the current user can handle.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-recipient' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use the non-deprecated overload with `GetGroupApplicationListAsRecipientReq`. The request can filter by `offset`, `count`, `groupIDs`, and `handleResults`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq(0, 20); +OpenIMClient.getInstance().groupManager.getRecvGroupApplicationList( + new OnBase>() { + @Override public void onSuccess(List items) { mergeReceivedApplications(items); } + @Override public void onError(int code, String error) { showApplicationError(error); } + }, request); +``` + +Merge application events by their `groupID` and `userID`. Do not use a list index as an application identifier. diff --git a/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx b/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx index 09014ab0b3..48e09a40af 100644 --- a/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx @@ -1,17 +1,16 @@ --- title: 'Group applications overview' -description: 'OpenIM Android SDK guide for Group applications overview.' +description: 'Understand received and sent group applications, handling results, and state events in the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/group-applications/overview-group-applications' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Group applications are represented by `GroupApplicationInfo`. Received applications are intended for group administrators, while sent applications belong to the current user. Use `handleResult`, `reqMsg`, `handledMsg`, and the handling time to display application state. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +The Android SDK provides paginated queries for received and sent applications, as well as accept and reject operations. It does not provide the pending-application count API found in the Flutter menu. Merge application-added, accepted, rejected, and deleted events through the shared listener described in [Group overview](/sdk/android/group/overview-group). diff --git a/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx b/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx index e1096ebbe8..40f3ddd672 100644 --- a/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx @@ -1,17 +1,23 @@ --- title: 'Reject a group application' -description: 'OpenIM Android SDK guide for Reject a group application.' +description: 'Use refuseGroupApplication to reject a user’s application to join a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/group-applications/refuse-group-application' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +The reject operation also takes the application's `groupID`, the applicant's `userID`, and a handling message. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.refuseGroupApplication(new OnBase() { + @Override public void onSuccess(String data) { markApplicationRejected(groupID, applicantUserID); } + @Override public void onError(int code, String error) { showHandleError(error); } +}, groupID, applicantUserID, "The group is currently full"); +``` + +Do not delete the local record immediately after the success callback. Update it from `onGroupApplicationRejected` or a fresh query. diff --git a/content/docs/chat/sdk/android/group/join-group.mdx b/content/docs/chat/sdk/android/group/join-group.mdx index 6d8cf63d19..c86b7d4027 100644 --- a/content/docs/chat/sdk/android/group/join-group.mdx +++ b/content/docs/chat/sdk/android/group/join-group.mdx @@ -1,17 +1,23 @@ --- title: 'Apply to join a group' -description: 'OpenIM Android SDK guide for Apply to join a group.' +description: 'Use joinGroup to submit a group application or join request.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/join-group' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use `joinGroup()` to submit a request to join a group. Set `joinSource` to the source of the request, such as an invitation, search result, or QR code. Use the five-parameter overload when attaching extra data. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.joinGroup(new OnBase() { + @Override public void onSuccess(String data) { markJoinSubmitted(groupID); } + @Override public void onError(int code, String error) { showJoinError(error); } +}, groupID, "I would like to join the project discussion", 3, "{\"from\":\"search\"}"); +``` + +The verification mode determines whether the user joins immediately. Update local state later through `onJoinedGroupAdded` or the relevant group application event. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx b/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx index 1cfdf22d93..5f09604e8b 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx @@ -1,17 +1,23 @@ --- title: 'Mute or unmute a group member' -description: 'OpenIM Android SDK guide for Mute or unmute a group member.' +description: 'Use changeGroupMemberMute to set the mute duration for a specified group member.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/change-group-member-mute' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`seconds` is the mute duration in seconds. Pass `0` to unmute the member. Member-level mute state is independent from the group's mute-all setting. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.changeGroupMemberMute(new OnBase() { + @Override public void onSuccess(String data) { markMemberMuteSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberMuteError(error); } +}, groupID, userID, 3600L); +``` + +Read `muteEndTime` from `onGroupMemberInfoChanged` to update the member state. Do not keep deriving the final mute state from local time and the submitted duration. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx b/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx index 4a92ebecde..68c8355266 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx @@ -1,17 +1,23 @@ --- title: 'Invite users to a group' -description: 'OpenIM Android SDK guide for Invite users to a group.' +description: 'Use inviteUserToGroup to invite a list of users to a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/invite-user-to-group' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Pass the group ID, the list of invited user IDs, and an invitation message. The server determines whether the users join immediately according to the group settings and the current user's permissions. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() { + @Override public void onSuccess(String data) { markInviteSubmitted(groupID); } + @Override public void onError(int code, String error) { showInviteError(error); } +}, groupID, inviteeUserIDs, "Join the project discussion"); +``` + +Merge users into the member list only after `onGroupMemberAdded` confirms that they joined. A successful submission alone does not mean that they are already members. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx b/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx index b26abd5092..461fae5b14 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx @@ -1,17 +1,23 @@ --- title: 'Remove group members' -description: 'OpenIM Android SDK guide for Remove group members.' +description: 'Use kickGroupMember to remove specified members from a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/kick-group-member' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`kickGroupMember()` accepts a list of member IDs and a removal message. Prevent the current user from accidentally selecting themselves and respect the permission boundaries between owners and administrators. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() { + @Override public void onSuccess(String data) { markRemovalSubmitted(groupID); } + @Override public void onError(int code, String error) { showRemovalError(error); } +}, groupID, memberUserIDs, "No longer participating in this project"); +``` + +Remove targets from the member cache after receiving `onGroupMemberDeleted`. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx index 2eed4eff78..a741d1aa65 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx @@ -1,17 +1,28 @@ --- -title: 'Update a group member’s avatar' -description: 'OpenIM Android SDK guide for Update a group member’s avatar.' +title: 'Update a group member avatar' +description: 'Use SetGroupMemberInfo.faceURL to update the avatar displayed for a member in a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/set-group-member-avatar' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +A group member avatar is a group-specific profile field and does not change the user's global avatar. Pass an avatar URL that group members can access. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setFaceURL(avatarURL); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markAvatarSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberUpdateError(error); } +}); +``` + +Keep the previous avatar or an optimistic local state until the event arrives, then reconcile it with the latest member profile. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx index eb98faea13..b3c9e2b3f4 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx @@ -1,17 +1,28 @@ --- -title: 'Set a group member extension' -description: 'OpenIM Android SDK guide for Set a group member extension.' +title: 'Set group member extra data' +description: 'Store application-defined group member data in SetGroupMemberInfo.ex.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/set-group-member-extension' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`SetGroupMemberInfo.ex` is a complete string; the SDK does not merge JSON values. If several application modules share the field, read and merge the existing value while preserving the other namespaces. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setEx("{\"duty\":\"reviewer\"}"); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markMemberExtensionSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberUpdateError(error); } +}); +``` + +Do not store credentials, tokens, or device-only display state in this field. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx index fdad13ad63..21e64a2c7b 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx @@ -1,17 +1,28 @@ --- -title: 'Update a member’s group nickname' -description: 'OpenIM Android SDK guide for Update a member’s group nickname.' +title: 'Update a group nickname' +description: 'Use SetGroupMemberInfo.nickname to update a member’s display name in a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/set-group-member-nickname' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +All group member profile changes use `setGroupMemberInfo()`. Set the `groupID`, `userID`, and `nickname` in the request. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setNickname("Lin"); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markNicknameSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberUpdateError(error); } +}); +``` + +Update the displayed name from `GroupMembersInfo.nickname` received by `onGroupMemberInfoChanged`. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx index 33d54640cb..07242afff6 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx @@ -1,17 +1,28 @@ --- title: 'Manage group administrators' -description: 'OpenIM Android SDK guide for Manage group administrators.' +description: 'Use SetGroupMemberInfo.roleLevel to change a member’s role in a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/set-group-member-role-level' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Set `roleLevel` with a `GroupRole` constant: `OWNER`, `ADMIN`, or `MEMBER`. Use the separate ownership-transfer API when changing the group owner; do not infer an ownership-transfer flow from this API. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setRoleLevel(GroupRole.ADMIN); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markRoleSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showRoleError(error); } +}); +``` + +The server validates the role change and its permissions. Use the member profile change event as the source of truth. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx b/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx index d93b0ea0c7..f4cc863381 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx @@ -1,17 +1,23 @@ --- title: 'Transfer group ownership' -description: 'OpenIM Android SDK guide for Transfer group ownership.' +description: 'Use transferGroupOwner to transfer group ownership to a specified member.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/transfer-group-owner' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +The target user must already be a group member. Require explicit confirmation before transferring ownership, then retrieve the owner and administrator profiles again after completion. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.transferGroupOwner(new OnBase() { + @Override public void onSuccess(String data) { markOwnershipTransferSubmitted(groupID); } + @Override public void onError(int code, String error) { showTransferError(error); } +}, groupID, newOwnerUserID); +``` + +`onGroupMemberInfoChanged` and group profile changes can arrive asynchronously. Do not assume that local roles have already been updated inside the success callback. diff --git a/content/docs/chat/sdk/android/group/overview-group.mdx b/content/docs/chat/sdk/android/group/overview-group.mdx index 067715a67d..0931a93b3f 100644 --- a/content/docs/chat/sdk/android/group/overview-group.mdx +++ b/content/docs/chat/sdk/android/group/overview-group.mdx @@ -1,17 +1,40 @@ --- title: 'Group overview' -description: 'OpenIM Android SDK guide for Group overview.' +description: 'Learn how group profiles, members, applications, and group events are organized in the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/overview-group' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +A group is represented by `GroupInfo`. Its `groupID` is the unique target identifier for profile, member, application, and permission operations. `GroupMembersInfo` represents a member's group-specific nickname, role, mute expiration time, and extra data. One-to-one relationships and conversation unread counts do not belong to the group APIs. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +`GroupManager` delivers group profile changes, member changes, application handling, and joined-group changes through one `OnGroupListener`. Set the listener once in a shared state layer and merge events by `groupID` or `userID`. + +```java +OpenIMClient.getInstance().groupManager.setOnGroupListener(new OnGroupListener() { + @Override public void onGroupInfoChanged(GroupInfo group) { + groupStore.put(group.getGroupID(), group); + } + + @Override public void onGroupMemberInfoChanged(GroupMembersInfo member) { + memberStore.put(member.getGroupID() + member.getUserID(), member); + } +}); +``` + +A successful callback from a group profile or member operation only means that the request completed. Use the corresponding group event or a fresh query as the source of truth. + +## Main capabilities + +- [Group profile and settings](/sdk/android/group/create-group) +- [Group permissions](/sdk/android/group/set-group-join-verification) +- [Joining and leaving groups](/sdk/android/group/join-group) +- [Retrieving groups](/sdk/android/group/retrieving-groups/get-specified-groups-info) +- [Group applications](/sdk/android/group/group-applications/overview-group-applications) +- [Retrieving group members](/sdk/android/group/retrieving-group-members/overview-retrieving-group-members) +- [Managing group members](/sdk/android/group/managing-group-members/invite-user-to-group) diff --git a/content/docs/chat/sdk/android/group/quit-group.mdx b/content/docs/chat/sdk/android/group/quit-group.mdx index ee871c76e6..cb62fc3059 100644 --- a/content/docs/chat/sdk/android/group/quit-group.mdx +++ b/content/docs/chat/sdk/android/group/quit-group.mdx @@ -1,17 +1,23 @@ --- title: 'Leave a group' -description: 'OpenIM Android SDK guide for Leave a group.' +description: 'Use quitGroup to remove the current signed-in user from a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/quit-group' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`quitGroup()` only removes the current signed-in user. It does not dismiss the group or remove other members. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.quitGroup(new OnBase() { + @Override public void onSuccess(String data) { removeJoinedGroup(groupID); } + @Override public void onError(int code, String error) { showQuitError(error); } +}, groupID); +``` + +Even after the request succeeds, handle `onJoinedGroupDeleted` and clear application caches for the group's member list, conversation entry, and related data. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx index fd056bb831..957432832e 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx @@ -1,17 +1,24 @@ --- -title: 'List group members' -description: 'OpenIM Android SDK guide for List group members.' +title: 'Get group members' +description: 'Use getGroupMemberList to retrieve group members by role and page.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-list' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Set `filter` to `0` for all members, `1` for regular members, `2` for the owner, or `3` for administrators. Use `offset` and `count` for pagination. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.getGroupMemberList( + new OnBase>() { + @Override public void onSuccess(List members) { appendMembers(members); } + @Override public void onError(int code, String error) { showMemberQueryError(error); } + }, groupID, 0, offset, 50); +``` + +Continue accepting member events while paging. Use the combination of `groupID` and `userID` as the merge key. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx index d758141c79..966aeb38c7 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx @@ -1,17 +1,24 @@ --- -title: 'Get the group owner and administrators' -description: 'OpenIM Android SDK guide for Get the group owner and administrators.' +title: 'Get group owners and admins' +description: 'Use getGroupMemberOwnerAndAdmin to retrieve the group owner and administrator profiles.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use `getGroupMemberOwnerAndAdmin()` when you need to display or check members with management roles. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.getGroupMemberOwnerAndAdmin( + new OnBase>() { + @Override public void onSuccess(List members) { showModerators(members); } + @Override public void onError(int code, String error) { showMemberQueryError(error); } + }, groupID); +``` + +The owner, administrator, and regular-member `roleLevel` constants are defined in `GroupRole`. The server still determines whether a particular operation is permitted. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx index 8faea3fba3..48353fdec3 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx @@ -1,17 +1,24 @@ --- -title: 'Get specified group member profiles' -description: 'OpenIM Android SDK guide for Get specified group member profiles.' +title: 'Get group member profiles' +description: 'Use getGroupMembersInfo to retrieve specified users’ profiles within a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-group-members/get-specified-group-members-info' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`getGroupMembersInfo()` accepts one `groupID` and a list of target user IDs. It returns the users' `GroupMembersInfo` profiles within that group. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.getGroupMembersInfo( + new OnBase>() { + @Override public void onSuccess(List members) { mergeMembers(members); } + @Override public void onError(int code, String error) { showMemberQueryError(error); } + }, groupID, userIDs); +``` + +An empty list can mean that the targets are not in the group or that the current user cannot read their profiles. Handle the result according to your product requirements. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx index 3b19bb1eef..9a97cecd0e 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx @@ -1,17 +1,23 @@ --- -title: 'Check group membership' -description: 'OpenIM Android SDK guide for Check group membership.' +title: 'Check users in a group' +description: 'Use getUsersInGroup to select the users who are currently members of a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-group-members/get-users-in-group' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`getUsersInGroup()` returns the IDs among the supplied candidates that currently belong to the specified group. It does not return member profiles. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.getUsersInGroup(new OnBase>() { + @Override public void onSuccess(List joinedUserIDs) { updateMembership(joinedUserIDs); } + @Override public void onError(int code, String error) { showMembershipError(error); } +}, groupID, candidateUserIDs); +``` + +To retrieve nicknames, roles, or mute state, call [Get group member profiles](/sdk/android/group/retrieving-group-members/get-specified-group-members-info) afterward. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx index 09f43f4f5f..e287f72d45 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx @@ -1,17 +1,16 @@ --- title: 'Group member queries overview' -description: 'OpenIM Android SDK guide for Group member queries overview.' +description: 'Understand group member lists, specified member profiles, and membership queries in the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-group-members/overview-retrieving-group-members' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Group member queries are scoped by `groupID` and return either `GroupMembersInfo` objects or user ID lists. The member list supports role filtering and offset pagination. Separate APIs retrieve specified member profiles, check membership, retrieve owners and administrators, and search by keyword. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +Merge member additions, removals, and profile changes through the `OnGroupListener` owned by [Group overview](/sdk/android/group/overview-group). A query provides a snapshot and does not replace event handling. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx index 261b3b6b1d..73a100ac9e 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx @@ -1,17 +1,24 @@ --- title: 'Search group members' -description: 'OpenIM Android SDK guide for Search group members.' +description: 'Use searchGroupMembers to search group members by user ID or group nickname.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-group-members/search-group-members' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Provide a keyword list, switches for user ID and group nickname matching, and pagination parameters. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.searchGroupMembers( + new OnBase>() { + @Override public void onSuccess(List members) { showMemberSearch(members); } + @Override public void onError(int code, String error) { showSearchError(error); } + }, groupID, Collections.singletonList(keyword), true, true, 0, 20); +``` + +The search is limited to the target group. Do not make the request with an empty keyword or with both search switches disabled. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx index 9260220b44..25c1aba8ff 100644 --- a/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx @@ -1,17 +1,23 @@ --- title: 'Get joined groups by page' -description: 'OpenIM Android SDK guide for Get joined groups by page.' +description: 'Use getJoinedGroupListPage to retrieve the current account’s joined groups by page.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-groups/get-joined-group-list-page' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +The Android SDK provides the paginated API. Start `offset` at `0`, then advance it by the number of items successfully merged from each page. Stop loading when the returned list is empty. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() { + @Override public void onSuccess(List groups) { appendJoinedGroups(groups); } + @Override public void onError(int code, String error) { showPageError(error); } +}, offset, 20); +``` + +Merge incremental changes from `onJoinedGroupAdded` and `onJoinedGroupDeleted`. Do not treat the pages loaded so far as the complete joined-group list. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx index 3efd2eec6f..9baaff97c0 100644 --- a/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx @@ -1,17 +1,23 @@ --- title: 'Get group information' -description: 'OpenIM Android SDK guide for Get group information.' +description: 'Use getGroupsInfo to retrieve the latest profiles for specified groups.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-groups/get-specified-groups-info' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +When you already have a set of `groupID` values, use `getGroupsInfo()` to retrieve their profiles. The result is a list of `GroupInfo` objects. Do not assume that its order exactly matches the request list. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.getGroupsInfo(new OnBase>() { + @Override public void onSuccess(List groups) { mergeGroups(groups); } + @Override public void onError(int code, String error) { showGroupQueryError(error); } +}, groupIDs); +``` + +Remove empty and duplicate IDs before making the request. Treat groups that do not exist or cannot be accessed as missing results. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx index 6c1a41ea33..4e8903d73e 100644 --- a/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx @@ -1,17 +1,23 @@ --- title: 'Check group membership' -description: 'OpenIM Android SDK guide for Check group membership.' +description: 'Use isJoinGroup to determine whether the current signed-in user has joined a group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-groups/is-join-group' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`isJoinGroup()` only checks the membership relationship between the current signed-in user and the specified `groupID`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.isJoinGroup(groupID, new OnBase() { + @Override public void onSuccess(Boolean joined) { updateJoinAction(Boolean.TRUE.equals(joined)); } + @Override public void onError(int code, String error) { showMembershipError(error); } +}); +``` + +This result does not replace a group profile query and cannot determine whether another user is in the group. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx index 28f5870b58..da44d05239 100644 --- a/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx @@ -1,17 +1,23 @@ --- title: 'Search groups' -description: 'OpenIM Android SDK guide for Search groups.' +description: 'Use searchGroups to search locally available groups by group ID or name.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-groups/search-groups' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`searchGroups()` accepts a keyword list and separate switches for searching group IDs and group names. If both switches are disabled, there is no valid search scope. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +OpenIMClient.getInstance().groupManager.searchGroups(new OnBase>() { + @Override public void onSuccess(List groups) { showSearchResults(groups); } + @Override public void onError(int code, String error) { showSearchError(error); } +}, Collections.singletonList(keyword), true, true); +``` + +A search result does not prove membership. Before opening the group, call [Check group membership](/sdk/android/group/retrieving-groups/is-join-group) when the current state matters. diff --git a/content/docs/chat/sdk/android/group/set-group-announcement.mdx b/content/docs/chat/sdk/android/group/set-group-announcement.mdx index 21b94105d2..d7f1e14f75 100644 --- a/content/docs/chat/sdk/android/group/set-group-announcement.mdx +++ b/content/docs/chat/sdk/android/group/set-group-announcement.mdx @@ -1,17 +1,27 @@ --- title: 'Publish a group announcement' -description: 'OpenIM Android SDK guide for Publish a group announcement.' +description: 'Publish or update a group announcement through GroupInfo.notification.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/set-group-announcement' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +The Android SDK does not provide a separate announcement method. Create a `GroupInfo` containing the `groupID` and `notification`, then call `setGroupInfo()`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setNotification("Release review starts at 20:00 tonight."); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { refreshAnnouncement(groupID); } + @Override public void onError(int code, String error) { showAnnouncementError(error); } +}); +``` + +The returned `GroupInfo` exposes the update time and author through `notificationUpdateTime` and `notificationUserID`. The server validates whether the current user has permission to publish the announcement. diff --git a/content/docs/chat/sdk/android/group/set-group-extension.mdx b/content/docs/chat/sdk/android/group/set-group-extension.mdx index 2ff7858f49..fe2d81c83d 100644 --- a/content/docs/chat/sdk/android/group/set-group-extension.mdx +++ b/content/docs/chat/sdk/android/group/set-group-extension.mdx @@ -1,17 +1,27 @@ --- title: 'Set group extra data' -description: 'OpenIM Android SDK guide for Set group extra data.' +description: 'Store application-defined group data in GroupInfo.ex.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/set-group-extension' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`GroupInfo.ex` is a complete string; the SDK does not merge JSON values. If several application modules share the field, read the existing value and preserve the other namespaces when merging your changes. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setEx("{\"projectCode\":\"mobile\",\"archived\":false}"); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markExtensionSubmitted(groupID); } + @Override public void onError(int code, String error) { showExtensionError(error); } +}); +``` + +Do not store access tokens, secrets, or device-only UI state in group extra data. diff --git a/content/docs/chat/sdk/android/group/set-group-join-verification.mdx b/content/docs/chat/sdk/android/group/set-group-join-verification.mdx index dbb80b7c6a..6a55069a17 100644 --- a/content/docs/chat/sdk/android/group/set-group-join-verification.mdx +++ b/content/docs/chat/sdk/android/group/set-group-join-verification.mdx @@ -1,17 +1,27 @@ --- title: 'Set group join verification' -description: 'OpenIM Android SDK guide for Set group join verification.' +description: 'Configure verification rules for group applications and invitations through GroupInfo.needVerification.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/set-group-join-verification' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Set the verification mode in `GroupInfo.needVerification`, then call `setGroupInfo()`. Use one of the `GroupVerification` constants: `APPLY_NEED_VERIFICATION_INVITE_DIRECTLY`, `ALL_NEED_VERIFICATION`, or `DIRECTLY`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setNeedVerification(GroupVerification.ALL_NEED_VERIFICATION); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markVerificationSubmitted(groupID); } + @Override public void onError(int code, String error) { showVerificationError(error); } +}); +``` + +This setting applies to subsequent join requests. It does not accept or reject existing applications. diff --git a/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx b/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx index 6d04505804..81326ef42c 100644 --- a/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx +++ b/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx @@ -1,17 +1,27 @@ --- title: 'Set member friend request permission' -description: 'OpenIM Android SDK guide for Set member friend request permission.' +description: 'Use GroupInfo.applyMemberFriend to control whether users can send friend requests from the group member list.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/set-group-member-friend-permission' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`applyMemberFriend` is an integer switch: `0` disables friend requests and `1` enables them. This rule only affects requests initiated through the member relationship in this group. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setApplyMemberFriend(0); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markFriendPermissionSubmitted(groupID); } + @Override public void onError(int code, String error) { showPermissionError(error); } +}); +``` + +After the update, use `onGroupInfoChanged` or a newly retrieved `GroupInfo` as the source of truth. diff --git a/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx b/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx index dd5387bdca..76fabb39e8 100644 --- a/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx +++ b/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx @@ -1,17 +1,27 @@ --- title: 'Set member profile access' -description: 'OpenIM Android SDK guide for Set member profile access.' +description: 'Use GroupInfo.lookMemberInfo to control whether users can view member profiles through the group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/set-group-member-profile-access' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`lookMemberInfo` is an integer switch: `0` disables access and `1` enables it. Submit only the `groupID` and this permission field when changing the setting. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setLookMemberInfo(1); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markMemberInfoAccessSubmitted(groupID); } + @Override public void onError(int code, String error) { showPermissionError(error); } +}); +``` + +This switch controls profile access through the group. It does not change user profile data that a member already possesses. diff --git a/content/docs/chat/sdk/android/group/update-group-profile.mdx b/content/docs/chat/sdk/android/group/update-group-profile.mdx index dcd2399ee6..794b40d4c4 100644 --- a/content/docs/chat/sdk/android/group/update-group-profile.mdx +++ b/content/docs/chat/sdk/android/group/update-group-profile.mdx @@ -1,17 +1,28 @@ --- title: 'Update group profile' -description: 'OpenIM Android SDK guide for Update group profile.' +description: 'Use setGroupInfo to update a group name, avatar, introduction, and other profile fields.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/update-group-profile' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use `setGroupInfo()` to update a group profile. The request object should contain at least the `groupID` and the fields being changed. Do not use an incomplete local cache to overwrite fields that are not part of the current edit. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setGroupName("Mobile project team"); +update.setIntroduction("Android and iOS collaboration group"); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markGroupUpdateSubmitted(groupID); } + @Override public void onError(int code, String error) { showGroupUpdateError(error); } +}); +``` + +Merge the latest profile from `onGroupInfoChanged`. Group announcements and extra data use the same API and are covered on their respective pages. diff --git a/content/docs/chat/sdk/android/logger.mdx b/content/docs/chat/sdk/android/logger.mdx index 71d8632250..467929c2d8 100644 --- a/content/docs/chat/sdk/android/logger.mdx +++ b/content/docs/chat/sdk/android/logger.mdx @@ -1,18 +1,119 @@ --- -title: 'Logger' -description: 'OpenIM · SDK · Android · v4 documentation scaffold for Logger. Replace this placeholder with OpenIM-specific guidance, examples, and assets.' +title: 'Logging' +description: 'Configure Android SDK logging, write application diagnostics, and upload logs.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'scaffold' -lastUpdated: '2026-06-24' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/logger' --- - +OpenIM Android SDK logs help diagnose initialization, connection, and business API problems. Development and staging builds can use more detailed output. Production builds should reduce log volume and must avoid recording tokens, complete message bodies, raw file URLs, call room credentials, and private user fields. + +## Configure logging during initialization + +Logging options belong to `InitConfig` and must be set before `initSDK()`. + +```java +File dataDirectory = new File(application.getFilesDir(), "openim"); +File logDirectory = new File(application.getFilesDir(), "openim-logs"); + +InitConfig config = new InitConfig( + apiAddr, + wsAddr, + dataDirectory.getAbsolutePath() +); +config.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn; +config.isLogStandardOutput = BuildConfig.DEBUG; +config.logFilePath = logDirectory.getAbsolutePath(); + +boolean initialized = OpenIMClient.getInstance().initSDK( + application, + config, + connectionListener +); +``` + +| Field | Description | +| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| `logLevel` | Controls verbosity with a `LogLevel` constant. Available values include `DebugWithSQL`, `Debug`, `Info`, `Warn`, `Error`, `Panic`, and `Fatal`. | +| `isLogStandardOutput` | Writes SDK logs to Android standard output when enabled; use it for development diagnostics. | +| `logFilePath` | Optional log directory. Keep it within application-writable storage and manage its size and retention. | + +Use `Debug` for ordinary development diagnostics. Enable `DebugWithSQL` temporarily and only when diagnosing database problems. Production builds normally use `Warn` or `Error` and disable unnecessary standard output. + +## Write application diagnostic logs + +Use the non-deprecated `logs()` overload to add application context to SDK logs. + +```java +OpenIMClient.getInstance().logs( + LogLevel.Error, + ChatRepository.class.getSimpleName(), + 184, + "send_message_failed", + errorMessage, + "conversationID", conversationID, + "clientMsgID", clientMsgID +); +``` + +`currentClassName` and `currentLineNum` identify the call site. `msgStr` is a short action description, and `errStr` is the error information. `Warn`, `Error`, `Panic`, and `Fatal` require a non-empty error string. Pass trailing `extra` values as key-value pairs and include only non-sensitive identifiers needed for diagnosis. + +The older `logs()` overload with `OnBase` and `Map` parameters is deprecated and should not be used in new code. + +## Upload diagnostic logs + +Call `uploadLogs()` only after the user explicitly agrees to submit diagnostic information. The Android API retains the `params` argument; pass an empty list when no additional parameters are needed. `line` configures how many log lines are read for the upload. + +```java +String uploadID = UUID.randomUUID().toString(); + +OpenIMClient.getInstance().uploadLogs( + new OnBase() { + @Override + public void onSuccess(String data) { + showLogUploadCompleted(); + } + + @Override + public void onError(int code, String error) { + showLogUploadError(code, error); + } + }, + Collections.emptyList(), + 2000, + uploadID, + "support-ticket-42", + new UploadLogProgress() { + @Override + public void onProgress(long current, long total) { + updateLogUploadProgress(current, total); + } + } +); +``` + +| Parameter | Description | +| ------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| `line` | Number of log lines configured for this upload. | +| `cancelID` | Stable identifier for this upload, such as an application-generated UUID. | +| `ex` | Diagnostic context attached to the task, such as a support ticket ID. It must not contain credentials or private data. | +| `UploadLogProgress` | Reports current progress and total work for the upload interface. | + +The success callback means that the log upload request completed. It does not change user, conversation, or message state and does not trigger a business-domain event. On failure, record the error code, current user, and application diagnostic ID without printing the complete logs again. + +## operationID and application tracing + +Public methods in the Android Java wrapper do not accept `operationID`. The wrapper generates one with `ParamsUtil.buildOperationID()` for each call and passes it to Core, so applications normally do not create or supply this value. + +Maintain a separate application trace ID in your own logs. Record the business action, error code, and only the required `conversationID`, `clientMsgID`, `groupID`, or `roomID`. The application trace ID links a multi-step business flow, while the SDK `operationID` links one SDK call. Neither is an identity credential or a business idempotency key. + +## Related pages + +- [Implement for the Android environment](/sdk/android/getting-started/environment-specific-implementation) +- [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session) +- [Send a message](/sdk/android/message/sending-messages/send-message) diff --git a/content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx b/content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx new file mode 100644 index 0000000000..531230a50c --- /dev/null +++ b/content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx @@ -0,0 +1,35 @@ +--- +title: 'Retrieve typing status' +description: 'Use getInputState to retrieve a specified user’s current typing status in a conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/composing-messages/get-typing-status' +--- + +When opening a conversation, restoring a connection, or reconciling state, query the platform IDs on which a specified user is currently typing. + +```java +OpenIMClient.getInstance().conversationManager.getInputState( + new OnBase>() { + @Override + public void onSuccess(List platformIDs) { + boolean typing = platformIDs != null && !platformIDs.isEmpty(); + updateTypingState(conversationID, userID, typing); + } + + @Override + public void onError(int code, String error) { + recordTypingStatusQueryFailure(code, error); + } + }, + conversationID, + userID +); +``` + +The callback returns a snapshot array of platform IDs. An empty array means that no platform was typing at query time. The query itself does not trigger a typing-status event. In a group chat, do not poll every member frequently. Query relevant members only when opening the screen, restoring a connection, or reconciling state, and maintain incremental updates through the listener owned by [Report typing status](/sdk/android/message/composing-messages/update-typing-status). diff --git a/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx b/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx index de5209df08..8499b1c100 100644 --- a/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx +++ b/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx @@ -1,17 +1,64 @@ --- -title: 'Report typing status' -description: 'OpenIM Android SDK guide for Report typing status.' +title: 'Update typing status' +description: 'Report the current conversation typing state with the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/composing-messages/update-typing-status' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Set `focus` to `true` when typing starts. Set it to `false` when typing ends, the input field loses focus, or the conversation screen closes. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +conversationManager.changeInputState( + new OnBase() { + @Override + public void onSuccess(String data) { + // The typing state has been reported + } + + @Override + public void onError(int code, String error) { + // Handle the failure + } + }, + conversationID, + true +); +``` + +Clear the state promptly when typing ends: + +```java +conversationManager.changeInputState(callback, conversationID, false); +``` + +Coalesce consecutive focus changes and attempt to report `false` before the screen closes or the connection is interrupted. A successful callback means only that the report request completed; it does not mean that other clients have updated their interfaces. + +Other clients receive typing-state changes through `OnConversationListener.onConversationUserInputStatusChanged`. The Android SDK returns the event payload as a string, so validate the JSON before parsing it: + +```java +@Override +public void onConversationUserInputStatusChanged(String payload) { + InputStatesChangedData state = JsonUtil.toObj( + payload, + InputStatesChangedData.class + ); + if (state == null || state.getConversationID() == null) { + return; + } + updateTypingState( + state.getConversationID(), + state.getUserID(), + state.getPlatformIDs() + ); +} +``` + +Merge typing states by `conversationID:userID` and clear them after an application-defined timeout. `ConversationManager` retains only one conversation listener, so combine this callback with conversation-list, total-unread, and synchronization events in one listener. + +When opening a conversation or restoring a connection, use [Get typing status](/sdk/android/message/composing-messages/get-typing-status) to retrieve the current snapshot. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx new file mode 100644 index 0000000000..83c301d6e4 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx @@ -0,0 +1,30 @@ +--- +title: 'Create a rich-text reply' +description: 'Use createAdvancedQuoteMessage to create a quoted reply with rich-text entities.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-advanced-quote-message' +--- + +A rich-text reply stores the reply text, the quoted message, and the `RichMessage` entity ranges in the reply text. + +```java +RichMessage mention = new RichMessage(); +mention.setType("mention"); +mention.setOffset(0); +mention.setLength(6); +mention.setInfo("{\"userID\":\"user_a\"}"); + +Message message = OpenIMClient.getInstance().messageManager.createAdvancedQuoteMessage( + "OpenIM agreed", + originalMessage, + Collections.singletonList(mention) +); +``` + +The quoted `originalMessage` should contain a stable `clientMsgID`, and every entity range must match the final reply text. Use the same application protocol for `type`, `url`, and `info` as described in [Create a rich-text message](/sdk/android/message/creating-messages/create-advanced-text-message). This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx new file mode 100644 index 0000000000..5123acfc35 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx @@ -0,0 +1,30 @@ +--- +title: 'Create a rich-text message' +description: 'Use createAdvancedTextMessage to create a rich-text message with structured entity ranges.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-advanced-text-message' +--- + +`RichMessage` marks a range in the text with `offset` and `length`, while `type`, `url`, and `info` carry application-defined entity data. + +```java +RichMessage link = new RichMessage(); +link.setType("link"); +link.setOffset(0); +link.setLength(6); +link.setUrl("https://docs.openim.io"); +link.setInfo("{\"title\":\"OpenIM documentation\"}"); + +Message message = OpenIMClient.getInstance().messageManager.createAdvancedTextMessage( + "OpenIM docs", + Collections.singletonList(link) +); +``` + +Every entity range must match an actual range in the final text. Validate the ranges, URLs, and `info` values before sending, and make sure receiving clients use the same `type` and `info` protocol. This method only creates a `Message`; send it through [Send a message](/sdk/android/message/sending-messages/send-message). diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx index 1580e92d0b..6bbbf011e0 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx @@ -1,17 +1,18 @@ --- title: 'Create a contact card message' -description: 'OpenIM Android SDK guide for Create a contact card message.' +description: 'Use createCardMessage to create a contact card message.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-card-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`CardElem` stores the display profile for the user represented by the card. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createCardMessage(cardElem); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx index e673b56096..a3e337a2e2 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx @@ -1,17 +1,19 @@ --- title: 'Create a custom message' -description: 'OpenIM Android SDK guide for Create a custom message.' +description: 'Use createCustomMessage to carry application-defined JSON content.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-custom-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Your application defines `data`, `extension`, and `description`. Receiving clients must parse them according to the same application protocol. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createCustomMessage( + dataJson, extensionJson, description); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx index 4101251733..86147d2552 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx @@ -1,17 +1,18 @@ --- title: 'Create an emoji message' -description: 'OpenIM Android SDK guide for Create an emoji message.' +description: 'Use createFaceMessage to create a custom emoji message.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-face-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`index` identifies the emoji position, while `data` stores JSON such as an emoji URL. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createFaceMessage(index, dataJson); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx index 4996020871..247642e42a 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx @@ -1,17 +1,19 @@ --- -title: 'Create a file message from a file' -description: 'OpenIM Android SDK guide for Create a file message from a file.' +title: 'Create a file message from a local path' +description: 'Create a file message from an absolute path.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-file' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +```java +Message message = OpenIMClient.getInstance().messageManager + .createFileMessageFromFullPath(absolutePath, fileName); +``` -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +The absolute path must be readable. Pass the file name and path separately. This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx index 3fa9cce541..0009ae6dc1 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx @@ -1,17 +1,18 @@ --- title: 'Create a file message from a URL' -description: 'OpenIM Android SDK guide for Create a file message from a URL.' +description: 'Use FileElem to create a file message for an uploaded resource.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-url' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`FileElem` should contain the remote URL, file name, and file size. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createFileMessageByURL(fileElem); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx new file mode 100644 index 0000000000..90be38a522 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create a file message' +description: 'Create a file message from a path relative to the SDK data directory.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-file-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createFileMessage(filePath, fileName); +``` + +The file must be stored under the data directory configured during SDK initialization. Pass its path relative to that directory; `fileName` is displayed to recipients. This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx index e5868d7827..4f3094d8d8 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx @@ -1,17 +1,18 @@ --- title: 'Create a forwarded message' -description: 'OpenIM Android SDK guide for Create a forwarded message.' +description: 'Use createForwardMessage to create a forwarded copy of a message.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-forward-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Pass the source `Message`. The returned message must still be delivered to the target conversation through a send API. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createForwardMessage(sourceMessage); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx index 204f98e23a..c7aef18986 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx @@ -1,17 +1,19 @@ --- -title: 'Create an image message from a file' -description: 'OpenIM Android SDK guide for Create an image message from a file.' +title: 'Create an image message from a local path' +description: 'Create an image message from an absolute path.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-file' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +```java +Message message = OpenIMClient.getInstance().messageManager + .createImageMessageFromFullPath(absolutePath); +``` -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +The absolute path must be readable. This method only creates an object waiting to be sent; the regular send flow uploads the image. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx index 09ff19a178..d021cddb3d 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx @@ -1,17 +1,19 @@ --- -title: 'Create an image message from a URL' -description: 'OpenIM Android SDK guide for Create an image message from a URL.' +title: 'Create an image message from URLs' +description: 'Use createImageMessageByURL to create an image message for an uploaded resource.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-url' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Prepare the original, large, and thumbnail `PictureInfo` values before creating the message. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createImageMessageByURL( + sourceURL, sourcePicture, bigPicture, snapshotPicture); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx new file mode 100644 index 0000000000..dd58ab9cf3 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create an image message' +description: 'Create an image message from a path relative to the SDK data directory.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-image-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createImageMessage(imagePath); +``` + +The image file must be stored under the data directory configured during SDK initialization. Pass its path relative to that directory. This method only creates an object waiting to be sent; the regular send flow uploads the image. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx index 1cb0f5805f..91ecdcb675 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx @@ -1,17 +1,19 @@ --- title: 'Create a location message' -description: 'OpenIM Android SDK guide for Create a location message.' +description: 'Use createLocationMessage to create a message with coordinates and a location description.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-location-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use decimal degrees for latitude and longitude. The description is displayed in a map view or message list. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager + .createLocationMessage(latitude, longitude, description); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx index a7d9803089..639286caf4 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx @@ -1,17 +1,19 @@ --- -title: 'Create a merged forward message' -description: 'OpenIM Android SDK guide for Create a merged forward message.' +title: 'Create a merged message' +description: 'Use createMergerMessage to combine multiple messages into one summary message.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-merger-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Pass the message list, title, and summary list. Keep summary ordering consistent with the display protocol used by your clients. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createMergerMessage( + messages, title, summaries); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx index 41a9694cb6..331231460d 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx @@ -1,17 +1,19 @@ --- title: 'Create a reply message' -description: 'OpenIM Android SDK guide for Create a reply message.' +description: 'Use createQuoteMessage to reply while quoting an existing message.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-quote-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +A quote message stores the complete quoted `Message`. Before sending, make sure the quoted object has a stable `clientMsgID`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager + .createQuoteMessage(replyText, quotedMessage); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx index c4b8965e56..838d8707db 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx @@ -1,17 +1,19 @@ --- -title: 'Create an audio message from a file' -description: 'OpenIM Android SDK guide for Create an audio message from a file.' +title: 'Create an audio message from a local path' +description: 'Create an audio message from an absolute path.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-file' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +```java +Message message = OpenIMClient.getInstance().messageManager + .createSoundMessageFromFullPath(absolutePath, durationSeconds); +``` -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +The absolute path must be readable, and the audio duration is measured in seconds. This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx index da093ce0e0..eec46a25b8 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx @@ -1,17 +1,18 @@ --- title: 'Create an audio message from a URL' -description: 'OpenIM Android SDK guide for Create an audio message from a URL.' +description: 'Use SoundElem to create an audio message for an uploaded resource.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-url' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`createSoundMessageByURL()` accepts a `SoundElem` that already contains the remote URL, duration, and file size. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createSoundMessageByURL(soundElem); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx new file mode 100644 index 0000000000..b633c83ef5 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create an audio message' +description: 'Create an audio message from a path relative to the SDK data directory.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createSoundMessage(soundPath, durationSeconds); +``` + +The audio file must be stored under the data directory configured during SDK initialization. Pass its path relative to that directory, and specify the duration in seconds. This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx index e17e180fd3..0277086122 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx @@ -1,17 +1,19 @@ --- -title: 'Create an @ message' -description: 'OpenIM Android SDK guide for Create an @ message.' +title: 'Create a mention message' +description: 'Use createTextAtMessage to create a text message that mentions group members.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-text-at-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Pass the text, mentioned user IDs, the `AtUserInfo` list, and an optional quoted message. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createTextAtMessage( + text, userIDs, atUserInfos, quoteMessage); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx index 9c71b67d46..af34a3229f 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx @@ -1,17 +1,18 @@ --- title: 'Create a text message' -description: 'OpenIM Android SDK guide for Create a text message.' +description: 'Use createTextMessage to create a text Message.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-text-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`createTextMessage()` only creates a local message object. It does not send the message. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createTextMessage(text); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx index 7960d05813..d75a82d83c 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx @@ -1,17 +1,23 @@ --- -title: 'Create a video message from files' -description: 'OpenIM Android SDK guide for Create a video message from files.' +title: 'Create a video message from local paths' +description: 'Create a video message from absolute video and thumbnail paths.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-file' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessageFromFullPath( + absoluteVideoPath, + mimeType, + durationSeconds, + absoluteSnapshotPath +); +``` -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +The absolute video and thumbnail paths must be readable, and the duration is measured in seconds. This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx index 6777dc8506..b3383c24e6 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx @@ -1,17 +1,18 @@ --- title: 'Create a video message from URLs' -description: 'OpenIM Android SDK guide for Create a video message from URLs.' +description: 'Use VideoElem to create a video message for an uploaded resource.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-url' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Populate `VideoElem` with the remote video and thumbnail information, then create the message. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessageByURL(videoElem); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx new file mode 100644 index 0000000000..d5152c2a0c --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx @@ -0,0 +1,23 @@ +--- +title: 'Create a video message' +description: 'Create a video message from paths relative to the SDK data directory.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-video-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessage( + videoPath, + mimeType, + durationSeconds, + snapshotPath +); +``` + +The video and snapshot files must be stored under the data directory configured during SDK initialization. Pass both paths relative to that directory, and specify the duration in seconds. This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx index 2cb99cd5e6..8ba10115dd 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx @@ -1,17 +1,18 @@ --- title: 'Clear all local messages' -description: 'OpenIM Android SDK guide for Clear all local messages.' +description: 'Use deleteAllMsgFromLocal to clear all messages stored on the current device.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/clear-all-local-messages' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +This operation only clears the current device's local cache. It does not delete server records. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.deleteAllMsgFromLocal(callback); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx index 1030a9cb05..b9b3dff3e5 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx @@ -1,17 +1,18 @@ --- -title: 'Clear local and server messages' -description: 'OpenIM Android SDK guide for Clear local and server messages.' +title: 'Clear all saved messages' +description: 'Use deleteAllMsgFromLocalAndSvr to clear local and server-side messages.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/clear-all-messages' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +This is a high-impact operation. Ask for confirmation before calling it, then clear the local conversation display after it completes. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.deleteAllMsgFromLocalAndSvr(callback); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx index f026d8cd54..1056e39c5c 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx @@ -1,17 +1,18 @@ --- title: 'Delete a local message' -description: 'OpenIM Android SDK guide for Delete a local message.' +description: 'Use deleteMessageFromLocalStorage to delete only the message copy on the current device.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/delete-local-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +This operation does not affect message records on other devices or for other users. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.deleteMessageFromLocalStorage(conversationID, clientMsgID, callback); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx index 7649e1dfbe..37bd744399 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx @@ -1,17 +1,55 @@ --- title: 'Delete messages in a batch' -description: 'OpenIM Android SDK guide for Delete messages in a batch.' +description: 'Delete multiple messages from one conversation for the current account with the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/delete-saved-messages' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +## Parameters -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +| Parameter | Type | Required | Description | +| --- | --- | --- | --- | +| `conversationID` | `String` | Yes | ID of the conversation containing the messages to delete. | +| `clientMsgIDs` | `String[]` | Yes | IDs of the messages to delete. Every ID in one batch must belong to the same conversation. | +| `isSync` | `boolean` | Yes | Whether to synchronize the deletion to the current account's other clients. | + +```java +DeleteMessagesReq request = new DeleteMessagesReq( + true, + conversationID, + selectedClientMsgIDs.toArray(new String[0]) +); + +messageManager.deleteMessages(request, new OnBase() { + @Override + public void onSuccess(String data) { + // The deletion request has completed + } + + @Override + public void onError(int code, String error) { + // Handle the failure + } +}); +``` + +With `isSync` set to `false`, the operation deletes the current device's copy and the current account's server-side record. With `true`, it also requests deletion synchronization to the account's other clients. It does not delete copies held by other conversation members or display a revocation notice. + +The success callback means that the deletion request has completed. When synchronization is enabled, it does not mean that other clients have already received the event or updated their interfaces. + +This page owns `OnAdvanceMsgListener.onMsgDeleted`. Determine the conversation from the message routing fields, then remove the message idempotently by `clientMsgID`. + +```java +@Override +public void onMsgDeleted(Message message) { + removeMessage(resolveConversationID(message), message.getClientMsgID()); +} +``` + +To reconcile the current message snapshot, query the corresponding conversation history again. diff --git a/content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx new file mode 100644 index 0000000000..1f99329d66 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx @@ -0,0 +1,43 @@ +--- +title: 'Delete all messages from a user in a group chat' +description: 'Delete every message sent by a specified user in a group chat with the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/delete-user-messages' +--- + +```java +messageManager.deleteUserAllMessagesInConv( + conversationID, + targetUserID, + new OnBase() { + @Override + public void onSuccess(String data) { + // The deletion request has completed + } + + @Override + public void onError(int code, String error) { + // Handle the failure + } + } +); +``` + +This API is available only for group chats and deletes every message sent by the specified user in the target group conversation. It is a high-impact group moderation action and should not appear in an ordinary single-message menu. OpenIMServer validates the operator's permission. A successful callback does not mean that the event has already arrived. + +This page owns `OnAdvanceMsgListener.onDeleteUserAllMsgsInConv`. When the event arrives, use its `conversationID` and `userID` to remove messages from that sender in the cached conversation, or reload conversation history to reconcile the state. + +```java +@Override +public void onDeleteUserAllMsgsInConv(DeleteUserAllMsgsListenerMsg event) { + removeMessagesBySender(event.getConversationID(), event.getUserID()); +} +``` + +Callback completion, event arrival, and a new history query are three independent stages. diff --git a/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx index 969069c18b..c9ba3d657c 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx @@ -1,17 +1,21 @@ --- -title: 'Get pinned messages in a conversation' -description: 'OpenIM Android SDK guide for Get pinned messages in a conversation.' +title: 'View pinned messages' +description: 'Use getConversationPinnedMsgs to retrieve pinned messages in a conversation.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/get-pinned-messages' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +The result is a snapshot of the messages currently pinned in the specified conversation. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.getConversationPinnedMsgs(new OnBase>() { + @Override public void onSuccess(List messages) { showPinned(messages); } + @Override public void onError(int code, String error) { showPinnedError(error); } +}, conversationID); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx index f3543c748b..9a286488a3 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx @@ -1,17 +1,18 @@ --- title: 'Insert a local group message' -description: 'OpenIM Android SDK guide for Insert a local group message.' +description: 'Use insertGroupMessageToLocalStorage to insert a group message visible only on the current device.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/insert-local-group-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Pass the group ID and sender ID. The message is not synchronized to other devices. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.insertGroupMessageToLocalStorage(callback, message, groupID, senderUserID); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx index ccaf2bcc05..c776d12b79 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx @@ -1,17 +1,18 @@ --- -title: 'Insert a local one-to-one message' -description: 'OpenIM Android SDK guide for Insert a local one-to-one message.' +title: 'Insert a local direct message' +description: 'Use insertSingleMessageToLocalStorage to insert a one-to-one message visible only on the current device.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/insert-local-single-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +This method does not send the message to the server. `receiver` and `sender` determine how the local message is associated with the conversation. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.insertSingleMessageToLocalStorage(callback, message, receiverUserID, senderUserID); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx index 57f100501a..ebee0737f3 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx @@ -1,17 +1,35 @@ --- title: 'Modify a message' -description: 'OpenIM Android SDK guide for Modify a message.' +description: 'Modify supported message content and handle modification events received by other clients.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/modify-a-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use `modifyMessage` to change an existing message in a conversation. Preserve the original conversation ID, `clientMsgID`, routing fields, sender, and other message data in the request, and update only the supported content. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.modifyMessage(callback, modifyRequest); +``` + +The success callback means that the modification request completed; it does not mean that every client interface has updated. Other clients receive the complete modified `Message` through `OnAdvanceMsgListener.onMessageModified`. + +This page is the complete owner of `onMessageModified`. Resolve the `conversationID` from the message routing fields, then replace the original message by `conversationID:clientMsgID`. Do not match by array position or displayed text: + +```java +@Override +public void onMessageModified(Message message) { + String conversationID = resolveConversationID(message); + if (conversationID == null) { + return; + } + replaceMessage(conversationID, message.getClientMsgID(), message); +} +``` + +Add this callback to the application's single `OnAdvanceMsgListener`; see [Events](/sdk/android/events/overview-events) for centralized setup. Callback completion, event delivery, and a new history query are three independent stages. diff --git a/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx index c47af6dbb7..eb3fb3e856 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx @@ -1,17 +1,38 @@ --- title: 'Revoke a message' -description: 'OpenIM Android SDK guide for Revoke a message.' +description: 'Revoke a sent message and handle revocation notifications received by other clients.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/revoke-a-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Revoking a message causes other clients to display the original message in a revoked state. Before calling the API, confirm that the message was sent successfully and enforce the revocation time window in the application interface. The server makes the final authorization decision. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.revokeMessageV2(callback, conversationID, clientMsgID); +``` + +The success callback means that the server completed the revocation request; it does not mean that every client has received the event. Receiving clients merge the change through `OnAdvanceMsgListener.onRecvMessageRevokedV2`. + +This page is the complete owner of `onRecvMessageRevokedV2`. `RevokedInfo` contains the `clientMsgID`, revoker, and revocation time, but not the `conversationID`. Resolve the owning conversation from the current account's message index, then update by `conversationID:clientMsgID`: + +```java +@Override +public void onRecvMessageRevokedV2(RevokedInfo info) { + String clientMsgID = info.getClientMsgID(); + String conversationID = findConversationIDByClientMsgID(clientMsgID); + if (conversationID == null) { + return; + } + markMessageRevoked(conversationID, clientMsgID, info); +} +``` + +Update the matching message to a revoked state instead of deleting it from the list. Add this callback to the application's single `OnAdvanceMsgListener`; see [Events](/sdk/android/events/overview-events) for centralized setup. + +Callback completion, event delivery, and a new history query are three independent stages. Re-query the corresponding conversation history when reconciliation is required. diff --git a/content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx b/content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx index 628339da08..ddd254244d 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx @@ -1,17 +1,18 @@ --- -title: 'Set a local message extension' -description: 'OpenIM Android SDK guide for Set a local message extension.' +title: 'Set local message extensions' +description: 'Use setMessageLocalEx to store message data used only on the current device.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/set-message-local-ex' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +`localEx` is suitable for local information such as a download path or playback state. It is not synchronized to other users. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.setMessageLocalEx(callback, conversationID, clientMsgID, localExJson); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx b/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx index 7491a448cd..a7eef200b6 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx @@ -1,17 +1,36 @@ --- title: 'Pin or unpin a message' -description: 'OpenIM Android SDK guide for Pin or unpin a message.' +description: 'Change a conversation message’s pinned state and handle pinned-message change events.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/set-message-pinned' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Pass `true` as the final argument to pin the message or `false` to unpin it: -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.setConversationPinnedMsg( + callback, + conversationID, + clientMsgID, + true +); +``` + +The success callback means that the request completed; it does not mean that the pinned-message event has arrived. + +This page owns `OnAdvanceMsgListener.onChangedPinnedMsg`. `ChangedPinnedMsg` contains the `conversationID` and current pinned-message collection. Replace the collection for that conversation, then deduplicate its messages by `clientMsgID`: + +```java +@Override +public void onChangedPinnedMsg(ChangedPinnedMsg event) { + replacePinnedMessages(event.getConversationID(), event.getMsgs()); +} +``` + +Add this callback to the application's single `OnAdvanceMsgListener`; see [Events](/sdk/android/events/overview-events) for centralized setup. Callback completion, event delivery, and the snapshot from [View pinned messages](/sdk/android/message/managing-messages/get-pinned-messages) are three independent stages. diff --git a/content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx b/content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx new file mode 100644 index 0000000000..91c5e8f5fc --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx @@ -0,0 +1,45 @@ +--- +title: 'Get members who read a group message' +description: 'Retrieve members who have or have not read a group message using pagination.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-read-status/get-group-message-readers' +--- + +## Parameters + +| Parameter | Type | Required | Description | +| --- | --- | --- | --- | +| `conversationID` | `String` | Yes | ID of the group conversation. | +| `clientMsgID` | `String` | Yes | ID of the message whose reader list to query. | +| `filter` | `int` | Yes | Pass `0` for members who have read the message or `1` for members who have not read it. | +| `offset` | `int` | Yes | Pagination offset. Pass `0` for the first page. | +| `count` | `int` | Yes | Maximum number of members to retrieve. | + +```java +messageManager.getGroupMessageReaderList( + conversationID, + clientMsgID, + 0, + 0, + 50, + new OnBase>() { + @Override + public void onSuccess(List members) { + renderMembers(members); + } + + @Override + public void onError(int code, String error) { + // Handle the failure + } + } +); +``` + +The success callback returns the current page of `GroupMembersInfo` objects. For field descriptions, see [List group members](/sdk/android/group/retrieving-group-members/get-group-member-list). Deduplicate by `groupID:userID`. The query establishes a snapshot and does not trigger a receipt event. Continue paging when the complete list is required. diff --git a/content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx b/content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx new file mode 100644 index 0000000000..0ff04b682a --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx @@ -0,0 +1,43 @@ +--- +title: 'Report group messages as read' +description: 'Report group-message read receipts with the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-read-status/send-group-read-receipts' +--- + +```java +messageManager.sendGroupMessageReadReceipt( + conversationID, + visibleClientMsgIDs, + new OnBase() { + @Override + public void onSuccess(String data) { + // The read receipts have been reported + } + + @Override + public void onError(int code, String error) { + // Handle the failure + } + } +); +``` + +Every message in one batch must belong to the target group conversation. A successful callback means only that the server accepted the report; it does not mean that other client interfaces have already updated. The conversation unread count is maintained separately through `markConversationMessageAsRead`. + +Other clients receive member-level group read changes through `OnAdvanceMsgListener.onRecvGroupMessageReadReceipt`. This page is the canonical reference for that event. Merge read counts, unread counts, and member information using the receipt's `conversationID` and message IDs. + +```java +@Override +public void onRecvGroupMessageReadReceipt(GroupMessageReceipt receipt) { + mergeGroupReadReceipt(receipt); +} +``` + +The report callback, the group receipt event, and the member snapshot from [Get members who read a group message](/sdk/android/message/managing-read-status/get-group-message-readers) are three independent stages. diff --git a/content/docs/chat/sdk/android/message/overview-message.mdx b/content/docs/chat/sdk/android/message/overview-message.mdx index 66a452f77f..5173f3fd3b 100644 --- a/content/docs/chat/sdk/android/message/overview-message.mdx +++ b/content/docs/chat/sdk/android/message/overview-message.mdx @@ -1,18 +1,22 @@ --- -title: 'Overview' -description: 'OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.' +title: 'Message overview' +description: 'Learn about the Android SDK Message model, message lifecycle, and message listener.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'scaffold' -lastUpdated: '2026-06-24' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/overview-message' --- - +Android messages are represented by `Message`. Use `clientMsgID` for deduplication, and use `sessionType`, `recvID`, and `groupID` to distinguish one-to-one chats from group chats. Message content is stored in the corresponding element field. Sending, receiving, revoking, and deleting are separate state changes. + +```java +OpenIMClient.getInstance().messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); } +}); +``` + +Queries establish a snapshot, while `OnAdvanceMsgListener` merges incremental changes. Setting a listener on `MessageManager` replaces the current listener, so register it once in a shared state layer. diff --git a/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx b/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx index eb318b59c8..596a219233 100644 --- a/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx +++ b/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx @@ -1,17 +1,24 @@ --- title: 'Receive custom business messages' -description: 'OpenIM Android SDK guide for Receive custom business messages.' +description: 'Use setCustomBusinessListener to receive business callbacks that are separate from regular chat messages.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/receiving-messages/receive-custom-business-messages' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +The custom business callback carries a string payload. Validate its source and JSON structure according to your application protocol instead of rendering it directly as a `Message`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.setCustomBusinessListener(new OnCustomBusinessListener() { + @Override public void onRecvCustomBusinessMessage(String payload) { handleBusiness(payload); } +}); +``` + +This page owns the complete handling contract for `onRecvCustomBusinessMessage`. Include a protocol version and stable idempotency ID in the payload, and deduplicate by that ID. Do not depend on callback order or use a custom business message to grant client-side permissions. + +`MessageManager` retains only one custom business listener; setting another replaces the previous one. Register it once in an application-level event center, and stop dispatching into the previous account's state when signing out or switching accounts. diff --git a/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx b/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx index ccaaaf7102..309676bb92 100644 --- a/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx +++ b/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx @@ -1,17 +1,21 @@ --- title: 'Receive messages' -description: 'OpenIM Android SDK guide for Receive messages.' +description: 'Use OnAdvanceMsgListener to receive new, offline, and online-only messages.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/receiving-messages/receive-messages' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +After calling `setAdvancedMsgListener()`, `onRecvNewMessage` receives real-time messages, `onRecvOfflineNewMessage` receives offline batches, and `onRecvOnlineOnlyMessage` receives online-only message strings. Merge all messages idempotently by `clientMsgID`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); } + @Override public void onRecvOfflineNewMessage(List messages) { messageStore.mergeAll(messages); } +}); +``` diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx index f606fc6ddc..f4cba4da2e 100644 --- a/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx +++ b/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx @@ -1,17 +1,21 @@ --- title: 'Find messages by ID' -description: 'OpenIM Android SDK guide for Find messages by ID.' +description: 'Use findMessageList to retrieve message records with SearchParams.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/retrieving-messages/find-messages-by-id' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Create a list of `SearchParams` for the messages you need. Merge returned records by message ID rather than treating their list positions as stable identifiers. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.findMessageList(new OnBase() { + @Override public void onSuccess(SearchResult result) { showFoundMessages(result); } + @Override public void onError(int code, String error) { showQueryError(error); } +}, searchParams); +``` diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx new file mode 100644 index 0000000000..d9437e7ece --- /dev/null +++ b/content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx @@ -0,0 +1,50 @@ +--- +title: 'Load message context' +description: 'Retrieve messages before and after a specified message with the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/retrieving-messages/load-message-context' +--- + +When navigating from a search result or referenced message into its chat context, use the `Message` already retrieved as the anchor. + +## Parameters + +| Parameter | Type | Required | Description | +| --- | --- | --- | --- | +| `conversationID` | `String` | Yes | ID of the conversation containing the anchor message. | +| `startMsg` | `Message` | Yes | Previously retrieved anchor message. | +| `type` | `ViewType` | Yes | Context type. Use `ViewType.History` for a referenced message and `ViewType.Search` for a search result. | +| `before` | `int` | Yes | Maximum number of messages to retrieve before the anchor. | +| `after` | `int` | Yes | Maximum number of messages to retrieve after the anchor. | + +```java +messageManager.fetchSurroundingMessages( + new OnBase() { + @Override + public void onSuccess(Messages messages) { + List surrounding = messages.getData(); + renderMessages(surrounding); + } + + @Override + public void onError(int code, String error) { + // Handle the failure + } + }, + conversationID, + targetMessage, + ViewType.Search, + 20, + 20 +); +``` + +In the success callback, `messages.getData()` is the list retrieved before and after the anchor. For message fields, see [Message overview](/sdk/android/message/overview-message). + +`before` and `after` independently limit the number of messages on either side. The result can contain fewer messages than requested when the anchor is near a history boundary or some messages have been deleted. Merge by `conversationID:clientMsgID`; do not rely on fixed array positions. If the message must first be located, see [Find messages by ID](/sdk/android/message/retrieving-messages/find-messages-by-id). diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx index d582a57fdc..a5825c8d54 100644 --- a/content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx +++ b/content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx @@ -1,17 +1,18 @@ --- -title: 'Load message history in reverse' -description: 'OpenIM Android SDK guide for Load message history in reverse.' +title: 'Load newer messages' +description: 'Use getAdvancedHistoryMessageListReverse to load messages after a starting point.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/retrieving-messages/load-newer-messages' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use this method to read forward from a message anchor when loading the following page of history. Use `ViewType.History` for this directional history paging. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.getAdvancedHistoryMessageListReverse(callback, conversationID, startMessage, 20, ViewType.History); +``` diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx index af547c4b35..fbd73af2c6 100644 --- a/content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx +++ b/content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx @@ -1,17 +1,18 @@ --- -title: 'Load message history' -description: 'OpenIM Android SDK guide for Load message history.' +title: 'Load older messages' +description: 'Use getAdvancedHistoryMessageList to load conversation history by page.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/retrieving-messages/load-older-messages' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Pass `null` for `startMsg` on the first query. For each subsequent page, use the boundary message from the previous page as the starting point. Use `ViewType.History` for ordinary history loading and deduplicate returned messages by `clientMsgID`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.getAdvancedHistoryMessageList(callback, conversationID, startMessage, 20, ViewType.History); +``` diff --git a/content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx b/content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx index aa0346051e..e781838770 100644 --- a/content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx +++ b/content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx @@ -1,17 +1,19 @@ --- title: 'Search messages' -description: 'OpenIM Android SDK guide for Search messages.' +description: 'Use searchLocalMessages to search messages synchronized to the current account’s local storage.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/searching-messages/search-messages' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Search by conversation, keywords, senders, message types, time range, and pagination parameters. Pass `null` for `conversationID` to search across all local conversations. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.searchLocalMessages(callback, conversationID, keywords, 1, + senderIDs, messageTypes, 0, 0, 0, 20); +``` diff --git a/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx b/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx index 173ae35cee..70819a9e5c 100644 --- a/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx +++ b/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx @@ -1,17 +1,18 @@ --- -title: 'Send an uploaded media message' -description: 'OpenIM Android SDK guide for Send an uploaded media message.' +title: 'Send a message without OSS' +description: 'Use sendMessageNotOss to send a media message whose resources were uploaded by your application.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/sending-messages/send-message-not-oss' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Use this method when the media URLs in the message are already available. It prevents the SDK from entering its built-in upload flow again. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.sendMessageNotOss(callback, message, peerUserID, null, offlinePushInfo); +``` diff --git a/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx b/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx index 3764812cef..470ee3532e 100644 --- a/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx +++ b/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx @@ -1,17 +1,21 @@ --- title: 'Send a message' -description: 'OpenIM Android SDK guide for Send a message.' +description: 'Use sendMessage to send a Message to a one-to-one or group conversation.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/sending-messages/send-message' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +For a one-to-one message, set `recvUid` and pass `null` for the group target. For a group message, set `recvGid` and pass `null` for the user target. `OnMsgSendCallback` reports success, failure, and media upload progress. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.sendMessage(new OnMsgSendCallback() { + @Override public void onSuccess(Message sentMessage) { mergeSentMessage(sentMessage); } + @Override public void onError(int code, String error) { showSendError(error); } +}, message, peerUserID, null, offlinePushInfo); +``` diff --git a/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx b/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx index 9cfa3ba752..a9048f9032 100644 --- a/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx +++ b/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx @@ -1,17 +1,22 @@ --- title: 'Track message sending progress' -description: 'OpenIM Android SDK guide for Track message sending progress.' +description: 'Use the progress callback on OnMsgSendCallback to update media sending progress.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'draft' -lastUpdated: '2026-07-20' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/sending-messages/set-msg-send-progress-listener' -generatedBy: 'sync-client-sdk-route-skeletons' --- -## Overview +Android does not provide a separate global send-progress listener. Each call to `sendMessage()` or `sendMessageNotOss()` reports progress through its own `OnMsgSendCallback`. -The English version of this OpenIM Android SDK guide is deferred until the reviewed Chinese documentation is complete. +```java +messageManager.sendMessage(new OnMsgSendCallback() { + @Override public void onProgress(long progress) { updateProgress(progress); } + @Override public void onSuccess(Message sentMessage) { finishProgress(); } + @Override public void onError(int code, String error) { failProgress(error); } +}, message, peerUserID, null, offlinePushInfo); +``` diff --git a/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx b/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx index d0d5962638..64258f4353 100644 --- a/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx +++ b/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-06' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/user/online-status/subscribe-users-online-status' @@ -49,4 +49,4 @@ public void onUserStatusChanged(UsersOnlineStatus status) { } ``` -Subscription only creates or updates the subscription set; do not treat its callback as friend profile data. Manage the subscription set centrally when users leave the visible range or the account changes. Android does not expose a verifiable unsubscribe entry point, so this documentation does not record one. +Subscription only creates or updates the subscription set; do not treat its callback as friend profile data. Manage the subscription set centrally when users leave the visible range or the account changes, and remove users that are no longer needed through [Unsubscribe from user status](/sdk/android/user/online-status/unsubscribe-users-online-status). diff --git a/content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx b/content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx new file mode 100644 index 0000000000..86256bcdd4 --- /dev/null +++ b/content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx @@ -0,0 +1,39 @@ +--- +title: 'Unsubscribe from user status' +description: 'Use unsubscribeOnlineUsersStatus to cancel online-status subscriptions for specified users.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/online-status/unsubscribe-users-online-status' +--- + +Cancel online-status subscriptions when users leave the visible range, the screen closes, or the account changes. Remove empty and duplicate IDs before making the call. + +```java +List userIDs = Arrays.asList("user_a", "user_b"); + +OpenIMClient.getInstance().userInfoManager.unsubscribeOnlineUsersStatus( + new OnBase() { + @Override + public void onSuccess(String data) { + for (String userID : userIDs) { + presenceByUserID.remove(userID); + } + } + + @Override + public void onError(int code, String error) { + recordStatusUnsubscribeFailure(code, error); + } + }, + userIDs +); +``` + +A successful callback means that the unsubscribe request completed. Only then remove the IDs from the application's subscription set and presence cache. Retain the previous state after an error so the operation can be retried. This operation does not change user profiles or friend relationships. + +Call [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status) when those users need to be tracked again. diff --git a/content/docs/chat/sdk/android/user/overview-user.mdx b/content/docs/chat/sdk/android/user/overview-user.mdx index a4e83af60a..713b18a418 100644 --- a/content/docs/chat/sdk/android/user/overview-user.mdx +++ b/content/docs/chat/sdk/android/user/overview-user.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-06' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/user/overview-user' @@ -27,7 +27,7 @@ Android SDK returns different user objects for different scenarios: | `FriendInfo` | The current user's friend list, friend remarks, and relationship extension data | `searchFriends()`, `getFriendListPage()` | | `FriendApplicationInfo` | The parties, handling state, and message for a friend request | Friend request queries and callbacks | | `BlacklistInfo` | Users blocked by the current user and their blocklist relationship fields | `getBlacklist()`, `addBlacklist()`, `removeBlacklist()` | -| `UsersOnlineStatus` | User online status and connected platforms | `subscribeUsersOnlineStatus()`, `getSubscribeOnlineUsersStatus()` | +| `UsersOnlineStatus` | User online status and connected platforms | `subscribeUsersOnlineStatus()`, `getSubscribeOnlineUsersStatus()`, `unsubscribeOnlineUsersStatus()` | The same `userID` can appear in public profile, friend, blocklist, and group member data. Prefer `UserInfo.getFriendInfo()` when displaying a contact, `PublicUserInfo` when only a public account profile is needed, and `UserInfo.getBlackInfo()` on a blocklist screen. Conversation list and chat page titles belong to conversation data and should use the conversation display name. @@ -45,7 +45,7 @@ Use `userID` as the stable key for user lists and events. A friend request conta | View and maintain the current user's blocklist | [Get the blacklist](/sdk/android/user/blacklist/get-blacklist) | | Read or update the current user's nickname, avatar, and extension data | [Update the current user profile](/sdk/android/user/user-profile/set-self-info) | | Configure account-level message reception and notification behavior | [Set global message reception](/sdk/android/user/user-profile/set-global-message-reception) | -| Subscribe to and retrieve online status | [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status) | +| Subscribe to, retrieve, and unsubscribe from online status | [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status), [Unsubscribe from user status](/sdk/android/user/online-status/unsubscribe-users-online-status) | ## State updates diff --git a/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx b/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx index 1994106aca..7a80357bd7 100644 --- a/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx +++ b/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx @@ -1,11 +1,11 @@ --- -title: 'Update the current user profile' +title: 'Update your profile' description: 'Use setSelfInfo() to update the nickname, avatar, or extension data of the current user.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-06' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/user/user-profile/set-self-info' diff --git a/content/zh/docs/chat/sdk/android/events/overview-events.mdx b/content/zh/docs/chat/sdk/android/events/overview-events.mdx index fbb9e7a665..7ba0c0f9e2 100644 --- a/content/zh/docs/chat/sdk/android/events/overview-events.mdx +++ b/content/zh/docs/chat/sdk/android/events/overview-events.mdx @@ -40,25 +40,28 @@ Android SDK 没有公开的 remove 或 unset 方法。退出登录、切换账 ## 事件归属 -| 事件范围 | 合并标识 | 完整处理页面 | +| 事件范围 | Listener | 对应页面 | | --- | --- | --- | -| 连接、Token 和强制下线 | 当前 SDK 实例与登录用户 | [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) | -| 当前用户资料 | `userID` | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) | -| 在线状态 | `userID` | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) | -| 好友关系与资料 | `userID` | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) | -| 好友申请 | `fromUserID:toUserID` | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) | -| 黑名单 | `userID` | [拉黑用户](/sdk/android/user/blacklist/add-blacklist)、[移出黑名单](/sdk/android/user/blacklist/remove-blacklist) | -| 会话列表 | `conversationID` | [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) | -| 总未读数 | 当前登录用户 | [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) | -| 输入状态 | `conversationID:userID` | [更新输入状态](/sdk/android/message/composing-messages/update-typing-status) | -| 群资料、成员和群申请 | `groupID` 或 `groupID:userID` | [群组概览](/sdk/android/group/overview-group) | -| 新消息、离线消息和在线消息 | `clientMsgID`,必要时结合 `conversationID` | [接收消息](/sdk/android/message/receiving-messages/receive-messages) | -| 消息撤回、删除、修改和置顶 | `clientMsgID`,必要时结合 `conversationID` | [消息概览](/sdk/android/message/overview-message) | -| 单聊已读回执 | `conversationID:clientMsgID` | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) | -| 自定义业务消息 | 业务协议中的幂等 ID | [接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) | -| 通话 | `roomID`,参与者结合用户 ID | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events) | -| 通话自定义信令 | `roomID:eventID` | [发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) | -| SDK 数据同步 | 当前 SDK 实例与登录用户 | 本页“监听初始化同步” | +| 连接、Token 和强制下线 | `OnConnListener` | [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) | +| 当前用户资料 | `OnUserListener` | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) | +| 在线状态 | `OnUserListener` | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) | +| 好友关系与资料 | `OnFriendshipListener` | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) | +| 好友申请 | `OnFriendshipListener` | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) | +| 黑名单 | `OnFriendshipListener` | [拉黑用户](/sdk/android/user/blacklist/add-blacklist)、[移出黑名单](/sdk/android/user/blacklist/remove-blacklist) | +| 会话列表 | `OnConversationListener` | [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) | +| 总未读数 | `OnConversationListener` | [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) | +| 输入状态 | `OnConversationListener` | [上报输入状态](/sdk/android/message/composing-messages/update-typing-status) | +| 群资料、成员和群申请 | `OnGroupListener` | [群组概览](/sdk/android/group/overview-group) | +| 新消息、离线消息和在线消息 | `OnAdvanceMsgListener` | [接收消息](/sdk/android/message/receiving-messages/receive-messages) | +| 消息撤回 | `OnAdvanceMsgListener` | [撤回消息](/sdk/android/message/managing-messages/revoke-a-message) | +| 消息删除 | `OnAdvanceMsgListener` | [批量删除消息](/sdk/android/message/managing-messages/delete-saved-messages) | +| 消息修改 | `OnAdvanceMsgListener` | [修改消息](/sdk/android/message/managing-messages/modify-a-message) | +| 置顶消息 | `OnAdvanceMsgListener` | [置顶或取消置顶消息](/sdk/android/message/managing-messages/set-message-pinned) | +| 单聊已读回执 | `OnAdvanceMsgListener` | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) | +| 自定义业务消息 | `OnCustomBusinessListener` | [接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) | +| 通话 | `OnSignalingListener` | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events) | +| 通话自定义信令 | `OnSignalingListener` | [发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) | +| SDK 数据同步 | `OnConversationListener` | [监听初始化同步](#监听初始化同步) | 查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。 diff --git a/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx b/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx index 5083948c6c..984a0e57b7 100644 --- a/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx +++ b/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx @@ -1,5 +1,5 @@ --- -title: '跟踪文件上传进度' +title: '监听文件上传进度' description: '使用 Android SDK 的 OnPutFileListener 跟踪单次文件上传任务。' sourcePath: '/sdk/android/file-uploads/track-file-upload-progress' --- diff --git a/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx b/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx index 92c5b37c37..157837178b 100644 --- a/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx +++ b/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx @@ -1,5 +1,5 @@ --- -title: '设置全员禁言' +title: '设置群组全员禁言' description: '使用 changeGroupMute 开启或关闭群组全员禁言。' sourcePath: '/sdk/android/group/change-group-mute' --- diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx index 15ea849e77..8838f4dd75 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx @@ -1,5 +1,5 @@ --- -title: '同意群申请' +title: '接受入群申请' description: '使用 acceptGroupApplication 同意指定用户的入群申请。' sourcePath: '/sdk/android/group/group-applications/accept-group-application' --- diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx index 8393c7f2a2..ed061725ee 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx @@ -1,5 +1,5 @@ --- -title: '获取发出的群申请' +title: '获取发出的入群申请' description: '使用 getSendGroupApplicationList 分页读取当前用户发出的入群申请。' sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-applicant' --- diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx index 363217b817..0f981e7d0f 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx @@ -1,5 +1,5 @@ --- -title: '获取收到的群申请' +title: '获取收到的入群申请' description: '使用 getRecvGroupApplicationList 分页读取当前用户可处理的入群申请。' sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-recipient' --- diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx index 879a6b5f7c..2d8c85ba01 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx @@ -1,5 +1,5 @@ --- -title: '群申请概览' +title: '入群申请概览' description: '说明 Android SDK 中收到和发出的群申请、处理结果及状态事件。' sourcePath: '/sdk/android/group/group-applications/overview-group-applications' --- diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx index da3929960b..fb4d329b32 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx @@ -1,5 +1,5 @@ --- -title: '拒绝群申请' +title: '拒绝入群申请' description: '使用 refuseGroupApplication 拒绝指定用户的入群申请。' sourcePath: '/sdk/android/group/group-applications/refuse-group-application' --- diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx index b7f69cd49d..c7ad6aad04 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx @@ -1,5 +1,5 @@ --- -title: '禁言或解除禁言群成员' +title: '设置群成员禁言' description: '使用 changeGroupMemberMute 设置指定成员的禁言时长。' sourcePath: '/sdk/android/group/managing-group-members/change-group-member-mute' --- diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx index 789b2e2c37..0943cf2601 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx @@ -1,5 +1,5 @@ --- -title: '邀请用户入群' +title: '邀请用户加入群组' description: '使用 inviteUserToGroup 邀请一组用户加入指定群组。' sourcePath: '/sdk/android/group/managing-group-members/invite-user-to-group' --- diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx index b5644f4a58..1854d25a2c 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx @@ -1,5 +1,5 @@ --- -title: '更新群昵称' +title: '修改群内昵称' description: '使用 SetGroupMemberInfo.nickname 更新成员在指定群中的显示昵称。' sourcePath: '/sdk/android/group/managing-group-members/set-group-member-nickname' --- diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx index 4c7276d677..88c908c115 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx @@ -1,5 +1,5 @@ --- -title: '管理群管理员' +title: '设置管理员' description: '使用 SetGroupMemberInfo.roleLevel 设置成员的群内角色。' sourcePath: '/sdk/android/group/managing-group-members/set-group-member-role-level' --- diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx index f364f78db8..4da60e1a14 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx @@ -1,5 +1,5 @@ --- -title: '获取群成员列表' +title: '分页查询群成员' description: '使用 getGroupMemberList 按角色和分页条件读取群成员。' sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-list' --- diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx index 1b3a030a06..c15b5f4ce6 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx @@ -1,5 +1,5 @@ --- -title: '获取群成员资料' +title: '查询指定群成员资料' description: '使用 getGroupMembersInfo 批量读取指定成员在群内的资料。' sourcePath: '/sdk/android/group/retrieving-group-members/get-specified-group-members-info' --- diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx index db3243966b..17e80ec6f1 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx @@ -1,5 +1,5 @@ --- -title: '检查用户是否在群内' +title: '查询用户入群状态' description: '使用 getUsersInGroup 从候选用户中筛出当前在群内的用户 ID。' sourcePath: '/sdk/android/group/retrieving-group-members/get-users-in-group' --- diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx index 97c8eaaff6..dd7a3f5d80 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx @@ -1,5 +1,5 @@ --- -title: '获取群资料' +title: '查询指定群组资料' description: '使用 getGroupsInfo 批量查询指定群组的最新资料。' sourcePath: '/sdk/android/group/retrieving-groups/get-specified-groups-info' --- diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx index a495b3e12c..24ef248c64 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx @@ -1,5 +1,5 @@ --- -title: '检查是否加入群组' +title: '检查是否已加入群组' description: '使用 isJoinGroup 查询当前登录用户是否已经加入指定群组。' sourcePath: '/sdk/android/group/retrieving-groups/is-join-group' --- diff --git a/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx b/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx index 358f31067c..b592ee761b 100644 --- a/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx +++ b/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx @@ -1,5 +1,5 @@ --- -title: '发布群公告' +title: '发布或更新群公告' description: '通过 GroupInfo.notification 发布或更新群公告。' sourcePath: '/sdk/android/group/set-group-announcement' --- diff --git a/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx b/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx index 5a3f42d309..2b08a36203 100644 --- a/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx +++ b/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx @@ -1,5 +1,5 @@ --- -title: '设置群扩展字段' +title: '设置群组扩展字段' description: '通过 GroupInfo.ex 保存应用定义的群组扩展数据。' sourcePath: '/sdk/android/group/set-group-extension' --- diff --git a/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx b/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx index 595cc08ede..c923b533e5 100644 --- a/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx +++ b/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx @@ -1,5 +1,5 @@ --- -title: '设置成员好友申请权限' +title: '设置群内添加好友权限' description: '通过 GroupInfo.applyMemberFriend 设置是否允许从群成员发起好友申请。' sourcePath: '/sdk/android/group/set-group-member-friend-permission' --- diff --git a/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx b/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx index 9ed87d5dfd..1b64245029 100644 --- a/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx +++ b/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx @@ -1,5 +1,5 @@ --- -title: '更新群资料' +title: '更新群名称、简介和头像' description: '使用 setGroupInfo 更新群名称、头像、简介和其他群资料字段。' sourcePath: '/sdk/android/group/update-group-profile' --- diff --git a/content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx b/content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx new file mode 100644 index 0000000000..279f782485 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx @@ -0,0 +1,28 @@ +--- +title: '查询输入状态' +description: '使用 getInputState 查询指定用户在会话中的当前输入状态。' +sourcePath: '/sdk/android/message/composing-messages/get-typing-status' +--- + +进入会话、连接恢复或需要校准状态时,查询指定用户当前正在输入的平台 ID 列表。 + +```java +OpenIMClient.getInstance().conversationManager.getInputState( + new OnBase>() { + @Override + public void onSuccess(List platformIDs) { + boolean typing = platformIDs != null && !platformIDs.isEmpty(); + updateTypingState(conversationID, userID, typing); + } + + @Override + public void onError(int code, String error) { + recordTypingStatusQueryFailure(code, error); + } + }, + conversationID, + userID +); +``` + +成功 callback 返回平台 ID 数组快照;空列表表示查询时没有平台处于输入状态。查询本身不会触发输入状态事件。群聊中不要频繁轮询全部成员,只在进入页面、连接恢复或补偿状态时查询重点成员;在线增量由[上报输入状态](/sdk/android/message/composing-messages/update-typing-status)归属的 listener 维护。 diff --git a/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx b/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx index 373932fa94..83c36e8052 100644 --- a/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx +++ b/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx @@ -1,16 +1,38 @@ --- -title: '更新输入状态' -description: '使用 typingStatusUpdate 提示单聊对方当前正在输入。' +title: '上报输入状态' +description: '使用 Android SDK 上报当前会话的输入状态。' sourcePath: '/sdk/android/message/composing-messages/update-typing-status' --- -输入框变化时传入对方用户 ID 和业务约定的提示字符串。调用侧应防抖,避免每次按键都发送请求。 +进入输入状态时,将 `focus` 设为 `true`;输入结束、输入框失去焦点或退出会话时,将其设为 `false`。 ```java -messageManager.typingStatusUpdate(callback, peerUserID, "typing"); +conversationManager.changeInputState( + new OnBase() { + @Override + public void onSuccess(String data) { + // 输入状态已上报 + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } + }, + conversationID, + true +); ``` -成功 callback 表示输入状态上报请求完成,不表示对端已经处理。对端通过应用级 `OnConversationListener.onConversationUserInputStatusChanged` 接收字符串载荷;Android wrapper 不会自动把它转换为模型,应在校验 JSON 后再解析: +输入结束时及时清除状态: + +```java +conversationManager.changeInputState(callback, conversationID, false); +``` + +调用侧应合并连续的焦点变化,并在页面退出或连接中断前尝试上报 `false`。成功回调只表示上报请求完成,不表示其他客户端已经更新界面。 + +其他客户端通过 `OnConversationListener.onConversationUserInputStatusChanged` 接收输入状态变化。Android SDK 以字符串形式返回事件载荷,应在校验 JSON 后再解析: ```java @Override @@ -30,4 +52,6 @@ public void onConversationUserInputStatusChanged(String payload) { } ``` -输入状态按 `conversationID:userID` 合并,并设置业务侧超时自动清除。`ConversationManager` 只保存一个会话 listener,本回调必须与会话列表、总未读数和同步事件组合后统一设置,不能在输入框页面单独覆盖。 +输入状态按 `conversationID:userID` 合并,并设置业务侧超时自动清除。`ConversationManager` 只保存一个会话 listener,本回调应与会话列表、总未读数和同步事件组合后统一设置。 + +进入会话或连接恢复时,可通过[查询输入状态](/sdk/android/message/composing-messages/get-typing-status)获取当前快照。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx new file mode 100644 index 0000000000..e9375d42cf --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx @@ -0,0 +1,23 @@ +--- +title: '创建富文本回复' +description: '使用 createAdvancedQuoteMessage 创建带富文本实体的引用回复消息。' +sourcePath: '/sdk/android/message/creating-messages/create-advanced-quote-message' +--- + +富文本回复同时保存回复正文、被引用的原消息和正文中的 `RichMessage` 实体范围。 + +```java +RichMessage mention = new RichMessage(); +mention.setType("mention"); +mention.setOffset(0); +mention.setLength(6); +mention.setInfo("{\"userID\":\"user_a\"}"); + +Message message = OpenIMClient.getInstance().messageManager.createAdvancedQuoteMessage( + "OpenIM agreed", + originalMessage, + Collections.singletonList(mention) +); +``` + +被引用的 `originalMessage` 应包含稳定的 `clientMsgID`,实体范围必须对应最终回复正文。`type`、`url` 和 `info` 的业务协议与[创建富文本消息](/sdk/android/message/creating-messages/create-advanced-text-message)相同。本方法只创建待发送对象,不会自动发送。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx new file mode 100644 index 0000000000..76c5b8e988 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx @@ -0,0 +1,23 @@ +--- +title: '创建富文本消息' +description: '使用 createAdvancedTextMessage 创建包含结构化实体范围的富文本消息。' +sourcePath: '/sdk/android/message/creating-messages/create-advanced-text-message' +--- + +`RichMessage` 使用 `offset` 和 `length` 标记正文范围,并通过 `type`、`url` 和 `info` 携带业务定义的实体信息。 + +```java +RichMessage link = new RichMessage(); +link.setType("link"); +link.setOffset(0); +link.setLength(6); +link.setUrl("https://docs.openim.io"); +link.setInfo("{\"title\":\"OpenIM documentation\"}"); + +Message message = OpenIMClient.getInstance().messageManager.createAdvancedTextMessage( + "OpenIM docs", + Collections.singletonList(link) +); +``` + +每个实体的范围必须对应最终正文中的实际位置。发送前应校验范围、URL 和 `info` 内容,并确保接收端使用相同的 `type` 与 `info` 协议。本方法只创建 `Message`,不会发送消息;创建完成后使用[发送消息](/sdk/android/message/sending-messages/send-message)。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx index a08758fce1..b0df73bd91 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx @@ -1,12 +1,12 @@ --- -title: '从文件创建文件消息' -description: '使用相对路径或绝对路径创建文件消息。' +title: '使用本地路径创建文件消息' +description: '使用绝对路径创建文件消息。' sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-file' --- -文件名与路径分别传入;相对路径相对于 SDK 初始化时配置的缓存目录。 - ```java Message message = OpenIMClient.getInstance().messageManager - .createFileMessageFromFullPath(filePath, fileName); + .createFileMessageFromFullPath(absolutePath, fileName); ``` + +绝对路径必须可读,文件名与路径分别传入。本方法只创建待发送对象。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx index 2ce7b0a895..474514464c 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx @@ -1,5 +1,5 @@ --- -title: '从 URL 创建文件消息' +title: '使用 URL 创建文件消息' description: '使用 FileElem 创建已上传资源的文件消息。' sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-url' --- diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx new file mode 100644 index 0000000000..ac83e0e22d --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建文件消息' +description: '使用相对于 SDK 初始化数据目录的路径创建文件消息。' +sourcePath: '/sdk/android/message/creating-messages/create-file-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createFileMessage(filePath, fileName); +``` + +文件应位于 SDK 初始化时配置的数据目录内,`filePath` 传入相对于该目录的路径,`fileName` 用于接收端展示。本方法只创建待发送对象。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx index b01ed5ea73..24fd6a258a 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx @@ -1,11 +1,12 @@ --- -title: '从文件创建图片消息' -description: '使用相对路径或绝对路径创建图片消息。' +title: '使用本地路径创建图片消息' +description: '使用绝对路径创建图片消息。' sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-file' --- -缓存目录内使用 `createImageMessage()`,绝对路径使用 `createImageMessageFromFullPath()`。 - ```java -Message message = OpenIMClient.getInstance().messageManager.createImageMessageFromFullPath(filePath); +Message message = OpenIMClient.getInstance().messageManager + .createImageMessageFromFullPath(absolutePath); ``` + +绝对路径必须可读。本方法只创建待发送对象,普通发送流程负责上传图片。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx index e789e2283f..47a1e6358f 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx @@ -1,5 +1,5 @@ --- -title: '从 URL 创建图片消息' +title: '使用 URL 创建图片消息' description: '使用 createImageMessageByURL 创建已上传资源的图片消息。' sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-url' --- diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx new file mode 100644 index 0000000000..1ea3a0d49f --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建图片消息' +description: '使用相对于 SDK 初始化数据目录的路径创建图片消息。' +sourcePath: '/sdk/android/message/creating-messages/create-image-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createImageMessage(imagePath); +``` + +图片文件应位于 SDK 初始化时配置的数据目录内,`imagePath` 传入相对于该目录的路径。本方法只创建待发送对象,普通发送流程负责上传图片。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx index 498b2717ce..977ef62f22 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx @@ -1,5 +1,5 @@ --- -title: '创建引用消息' +title: '创建回复消息' description: '使用 createQuoteMessage 创建引用已有消息的回复。' sourcePath: '/sdk/android/message/creating-messages/create-quote-message' --- diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx index 5c3ee21b12..476cbf4958 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx @@ -1,12 +1,12 @@ --- -title: '从文件创建音频消息' -description: '使用相对路径或绝对路径创建音频消息。' +title: '使用本地路径创建音频消息' +description: '使用绝对路径创建音频消息。' sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-file' --- -音频时长单位为秒;根据文件位置选择相对路径或绝对路径方法。 - ```java Message message = OpenIMClient.getInstance().messageManager - .createSoundMessageFromFullPath(soundPath, durationSeconds); + .createSoundMessageFromFullPath(absolutePath, durationSeconds); ``` + +绝对路径必须可读,音频时长单位为秒。本方法只创建待发送对象。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx index f647e57883..fde2b58811 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx @@ -1,5 +1,5 @@ --- -title: '从 URL 创建音频消息' +title: '使用 URL 创建音频消息' description: '使用 SoundElem 创建已上传资源的音频消息。' sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-url' --- diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx new file mode 100644 index 0000000000..b84d206f0a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建音频消息' +description: '使用相对于 SDK 初始化数据目录的路径创建音频消息。' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createSoundMessage(soundPath, durationSeconds); +``` + +音频文件应位于 SDK 初始化时配置的数据目录内,`soundPath` 传入相对于该目录的路径,时长单位为秒。本方法只创建待发送对象。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx index 1de9a128c6..ed009dbd59 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx @@ -1,12 +1,16 @@ --- -title: '从文件创建视频消息' -description: '使用相对路径或绝对路径创建视频消息及缩略图。' +title: '使用本地路径创建视频消息' +description: '使用视频和缩略图的绝对路径创建视频消息。' sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-file' --- -视频方法需要 MIME 类型、时长和缩略图路径。 - ```java Message message = OpenIMClient.getInstance().messageManager.createVideoMessageFromFullPath( - videoPath, mimeType, durationSeconds, snapshotPath); + absoluteVideoPath, + mimeType, + durationSeconds, + absoluteSnapshotPath +); ``` + +视频和缩略图的绝对路径必须可读,视频时长单位为秒。本方法只创建待发送对象。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx index 8f15837c33..91cb67dec4 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx @@ -1,5 +1,5 @@ --- -title: '从 URL 创建视频消息' +title: '使用 URL 创建视频消息' description: '使用 VideoElem 创建已上传资源的视频消息。' sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-url' --- diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx new file mode 100644 index 0000000000..edc1e79f06 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx @@ -0,0 +1,16 @@ +--- +title: '创建视频消息' +description: '使用相对于 SDK 初始化数据目录的路径创建视频消息。' +sourcePath: '/sdk/android/message/creating-messages/create-video-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessage( + videoPath, + mimeType, + durationSeconds, + snapshotPath +); +``` + +视频和快照文件应位于 SDK 初始化时配置的数据目录内,两个路径均相对于该目录。视频时长单位为秒。本方法只创建待发送对象。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx index 8c35a9aea7..38569554d7 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx @@ -1,5 +1,5 @@ --- -title: '清空全部本地消息' +title: '清理全部本地消息' description: '使用 deleteAllMsgFromLocal 清理当前设备的全部消息。' sourcePath: '/sdk/android/message/managing-messages/clear-all-local-messages' --- diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx index cdcb7102f0..12a2130f0c 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx @@ -1,5 +1,5 @@ --- -title: '清空全部已保存消息' +title: '清理全部消息' description: '使用 deleteAllMsgFromLocalAndSvr 清理本地和服务端消息。' sourcePath: '/sdk/android/message/managing-messages/clear-all-messages' --- diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx index 846606b0cd..dcb41dae6e 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx @@ -1,11 +1,48 @@ --- -title: '删除已保存消息' -description: '使用 deleteMessageFromLocalAndSvr 删除本地和服务端的一条消息。' +title: '批量删除消息' +description: '使用 Android SDK 批量删除当前账号在同一会话中的消息。' sourcePath: '/sdk/android/message/managing-messages/delete-saved-messages' --- -删除结果通过消息事件同步,调用成功不代表所有端已经刷新。 +## 参数说明 + +| 参数 | 类型 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| `conversationID` | `String` | 是 | 要删除消息所在的会话 ID。 | +| `clientMsgIDs` | `String[]` | 是 | 要删除的消息 ID 列表;同一批 ID 必须属于同一会话。 | +| `isSync` | `boolean` | 是 | 是否把删除动作同步到当前账号的其他客户端。 | + +```java +DeleteMessagesReq request = new DeleteMessagesReq( + true, + conversationID, + selectedClientMsgIDs.toArray(new String[0]) +); + +messageManager.deleteMessages(request, new OnBase() { + @Override + public void onSuccess(String data) { + // 删除请求已完成 + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } +}); +``` + +`isSync` 为 `false` 时,删除当前设备及当前账号服务端保存的记录;为 `true` 时,还会请求把删除动作同步到当前账号的其他客户端。该操作不会删除其他会话成员持有的副本,也不会产生撤回提示。 + +成功回调表示删除请求已经完成;开启同步时,不代表其他客户端已经收到事件或完成界面更新。 + +`OnAdvanceMsgListener.onMsgDeleted` 是本页归属事件。根据消息路由字段确定会话后,按 `clientMsgID` 幂等移除消息。 ```java -messageManager.deleteMessageFromLocalAndSvr(conversationID, clientMsgID, callback); +@Override +public void onMsgDeleted(Message message) { + removeMessage(resolveConversationID(message), message.getClientMsgID()); +} ``` + +需要校准当前消息快照时,重新查询对应会话的历史消息。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx new file mode 100644 index 0000000000..63239d1731 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx @@ -0,0 +1,36 @@ +--- +title: '删除群聊中指定用户的全部消息' +description: '使用 Android SDK 删除指定用户在群聊中的全部消息。' +sourcePath: '/sdk/android/message/managing-messages/delete-user-messages' +--- + +```java +messageManager.deleteUserAllMessagesInConv( + conversationID, + targetUserID, + new OnBase() { + @Override + public void onSuccess(String data) { + // 删除请求已完成 + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } + } +); +``` + +该 API 只用于群聊,可删除指定用户在目标群会话中的全部消息。这是高影响的群组管控操作,不应放入普通单条消息菜单;操作者权限由 OpenIMServer 校验。成功回调不代表事件已经到达。 + +`OnAdvanceMsgListener.onDeleteUserAllMsgsInConv` 是本页归属事件。收到事件后,根据 `conversationID` 和 `userID` 移除缓存中该用户发送的消息,或重新读取会话历史进行校准。 + +```java +@Override +public void onDeleteUserAllMsgsInConv(DeleteUserAllMsgsListenerMsg event) { + removeMessagesBySender(event.getConversationID(), event.getUserID()); +} +``` + +成功回调、事件到达和重新查询历史是三个独立阶段。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx index faccb79cd4..a8886cb400 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx @@ -1,5 +1,5 @@ --- -title: '查看置顶消息' +title: '查询会话置顶消息' description: '使用 getConversationPinnedMsgs 查询会话中的置顶消息。' sourcePath: '/sdk/android/message/managing-messages/get-pinned-messages' --- diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx index 5faba1be23..ef13cc038a 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx @@ -1,11 +1,28 @@ --- title: '修改消息' -description: '使用 ModifyMessageReq 修改支持修改的消息内容。' +description: '修改支持编辑的消息内容,并处理其他客户端收到的消息修改事件。' sourcePath: '/sdk/android/message/managing-messages/modify-a-message' --- -请求对象中填写会话 ID、客户端消息 ID 和新的消息内容,修改结果通过 `onMessageModified` 同步。 +`modifyMessage` 用于修改会话中已经存在的消息。请求对象应保留原消息的会话 ID、`clientMsgID`、路由和发送者等字段,只更新允许修改的内容。 ```java messageManager.modifyMessage(callback, modifyRequest); ``` + +成功回调表示修改请求已经完成,不代表所有客户端界面都已经更新。其他客户端通过 `OnAdvanceMsgListener.onMessageModified` 接收修改后的完整 `Message`。 + +本页是 `onMessageModified` 的完整事件归属页。根据消息路由解析 `conversationID`,再按 `conversationID:clientMsgID` 替换原消息,不要按数组位置或显示文本匹配: + +```java +@Override +public void onMessageModified(Message message) { + String conversationID = resolveConversationID(message); + if (conversationID == null) { + return; + } + replaceMessage(conversationID, message.getClientMsgID(), message); +} +``` + +该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。成功回调、修改事件到达和重新查询历史是三个独立阶段。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx index 315f117125..7479c49769 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx @@ -1,11 +1,31 @@ --- title: '撤回消息' -description: '使用 revokeMessageV2 撤回已发送消息。' +description: '撤回已发送消息,并处理其他客户端收到的撤回通知。' sourcePath: '/sdk/android/message/managing-messages/revoke-a-message' --- -Android 的撤回方法为 `revokeMessageV2()`,撤回详情通过 `onRecvMessageRevokedV2` 返回。 +撤回会使其他客户端把原消息显示为撤回状态。调用前应确认消息已经发送成功,并由业务界面限制可撤回时间;最终权限由服务端校验。 ```java messageManager.revokeMessageV2(callback, conversationID, clientMsgID); ``` + +成功回调表示服务端完成撤回请求,不代表所有客户端都已经收到事件。接收端通过 `OnAdvanceMsgListener.onRecvMessageRevokedV2` 合并撤回变化。 + +本页是 `onRecvMessageRevokedV2` 的完整事件归属页。`RevokedInfo` 包含 `clientMsgID`、撤回者和撤回时间,但不包含 `conversationID`,应先从当前账号的消息索引解析所属会话,再按 `conversationID:clientMsgID` 更新消息: + +```java +@Override +public void onRecvMessageRevokedV2(RevokedInfo info) { + String clientMsgID = info.getClientMsgID(); + String conversationID = findConversationIDByClientMsgID(clientMsgID); + if (conversationID == null) { + return; + } + markMessageRevoked(conversationID, clientMsgID, info); +} +``` + +接收端应把对应消息更新为撤回状态,而不是直接从列表删除。该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。 + +成功回调、撤回事件到达和重新查询历史是三个独立阶段。需要校准时重新读取对应会话的历史消息。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx index c991a22e6a..6e64c0b8a9 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx @@ -1,5 +1,5 @@ --- -title: '设置消息本地扩展字段' +title: '设置消息本地扩展' description: '使用 setMessageLocalEx 保存仅当前设备使用的消息扩展数据。' sourcePath: '/sdk/android/message/managing-messages/set-message-local-ex' --- diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx index 308db6a098..8c812ae422 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx @@ -1,11 +1,29 @@ --- title: '置顶或取消置顶消息' -description: '使用 setConversationPinnedMsg 设置会话消息的置顶状态。' +description: '设置会话消息的置顶状态,并处理置顶消息变化事件。' sourcePath: '/sdk/android/message/managing-messages/set-message-pinned' --- -最后一个参数为 `true` 置顶,`false` 取消置顶;变化通过 `onChangedPinnedMsg` 同步。 +最后一个参数为 `true` 时置顶消息,为 `false` 时取消置顶: ```java -messageManager.setConversationPinnedMsg(callback, conversationID, clientMsgID, true); +messageManager.setConversationPinnedMsg( + callback, + conversationID, + clientMsgID, + true +); ``` + +成功回调表示设置请求完成,不代表置顶变化事件已经到达。 + +`OnAdvanceMsgListener.onChangedPinnedMsg` 是本页归属事件。回调中的 `ChangedPinnedMsg` 包含 `conversationID` 和当前置顶消息集合;按会话替换集合,并按每条置顶消息的 `clientMsgID` 去重: + +```java +@Override +public void onChangedPinnedMsg(ChangedPinnedMsg event) { + replacePinnedMessages(event.getConversationID(), event.getMsgs()); +} +``` + +该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。成功回调、事件到达和[查询会话置顶消息](/sdk/android/message/managing-messages/get-pinned-messages)取得的快照是三个独立阶段。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx b/content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx new file mode 100644 index 0000000000..667a270226 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx @@ -0,0 +1,38 @@ +--- +title: '查询群消息已读成员' +description: '使用 Android SDK 分页查询群消息的已读或未读成员。' +sourcePath: '/sdk/android/message/managing-read-status/get-group-message-readers' +--- + +## 参数说明 + +| 参数 | 类型 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| `conversationID` | `String` | 是 | 群聊会话 ID。 | +| `clientMsgID` | `String` | 是 | 要查询阅读成员的消息 ID。 | +| `filter` | `int` | 是 | `0` 查询已读成员,`1` 查询未读成员。 | +| `offset` | `int` | 是 | 分页偏移量,首页传 `0`。 | +| `count` | `int` | 是 | 本次请求的成员数量。 | + +```java +messageManager.getGroupMessageReaderList( + conversationID, + clientMsgID, + 0, + 0, + 50, + new OnBase>() { + @Override + public void onSuccess(List members) { + renderMembers(members); + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } + } +); +``` + +成功回调返回当前页 `GroupMembersInfo` 列表,字段含义见[分页查询群成员](/sdk/android/group/retrieving-group-members/get-group-member-list)。按 `groupID:userID` 去重;查询只建立当前快照,不触发回执事件。需要完整列表时继续分页。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx b/content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx new file mode 100644 index 0000000000..aa0852b8dc --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx @@ -0,0 +1,36 @@ +--- +title: '上报群消息已读' +description: '使用 Android SDK 上报群消息已读回执。' +sourcePath: '/sdk/android/message/managing-read-status/send-group-read-receipts' +--- + +```java +messageManager.sendGroupMessageReadReceipt( + conversationID, + visibleClientMsgIDs, + new OnBase() { + @Override + public void onSuccess(String data) { + // 已读回执已上报 + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } + } +); +``` + +同一批消息必须属于目标群会话。成功回调只表示服务端接受上报,不代表其他客户端界面已经更新。会话未读数仍由 `markConversationMessageAsRead` 独立维护。 + +其他客户端通过 `OnAdvanceMsgListener.onRecvGroupMessageReadReceipt` 接收群聊成员级已读变化。本页是该事件的完整监听归属页;根据 `conversationID` 以及回执中的消息 ID 合并消息已读数、未读数和成员信息。 + +```java +@Override +public void onRecvGroupMessageReadReceipt(GroupMessageReceipt receipt) { + mergeGroupReadReceipt(receipt); +} +``` + +上报回调、群回执事件和[查询群消息已读成员](/sdk/android/message/managing-read-status/get-group-message-readers)取得的成员快照是三个独立阶段。 diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx index 381f4ab42c..2583ae4544 100644 --- a/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx @@ -1,5 +1,5 @@ --- -title: '按 ID 查询消息' +title: '按 ID 查找消息' description: '使用 findMessageList 按 SearchParams 查询消息记录。' sourcePath: '/sdk/android/message/retrieving-messages/find-messages-by-id' --- diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx new file mode 100644 index 0000000000..dcf4caaa73 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx @@ -0,0 +1,43 @@ +--- +title: '读取消息上下文' +description: '使用 Android SDK 读取一条消息前后的上下文。' +sourcePath: '/sdk/android/message/retrieving-messages/load-message-context' +--- + +从搜索结果或引用消息跳入聊天上下文时,把已经取得的 `Message` 作为锚点。 + +## 参数说明 + +| 参数 | 类型 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| `conversationID` | `String` | 是 | 锚点消息所在的会话 ID。 | +| `startMsg` | `Message` | 是 | 已经取得的锚点消息。 | +| `type` | `ViewType` | 是 | 上下文查看类型;引用消息使用 `ViewType.History`,搜索结果使用 `ViewType.Search`。 | +| `before` | `int` | 是 | 锚点之前最多读取的消息数量。 | +| `after` | `int` | 是 | 锚点之后最多读取的消息数量。 | + +```java +messageManager.fetchSurroundingMessages( + new OnBase() { + @Override + public void onSuccess(Messages messages) { + List surrounding = messages.getData(); + renderMessages(surrounding); + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } + }, + conversationID, + targetMessage, + ViewType.Search, + 20, + 20 +); +``` + +成功回调中的 `messages.getData()` 是锚点前后取得的消息列表,消息字段见[消息概览](/sdk/android/message/overview-message)。 + +`before` 和 `after` 分别限制锚点前后的数量。返回结果可能少于请求总数,例如锚点靠近历史边界或部分消息已经删除。按 `conversationID:clientMsgID` 合并,不要依赖固定数组位置。需要先定位消息时见[按 ID 查找消息](/sdk/android/message/retrieving-messages/find-messages-by-id)。 diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx index 8ae412f2cb..a1a6b9355f 100644 --- a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx @@ -1,11 +1,11 @@ --- -title: '加载更新消息' +title: '反向加载历史消息' description: '使用 getAdvancedHistoryMessageListReverse 加载起点之后的消息。' sourcePath: '/sdk/android/message/retrieving-messages/load-newer-messages' --- -该方法用于从消息定位点向后读取,适合搜索定位或上下文分页。 +该方法用于从消息定位点向后读取下一页历史消息。此类方向历史分页使用 `ViewType.History`。 ```java -messageManager.getAdvancedHistoryMessageListReverse(callback, conversationID, startMessage, 20, ViewType.NORMAL); +messageManager.getAdvancedHistoryMessageListReverse(callback, conversationID, startMessage, 20, ViewType.History); ``` diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx index 7f6fa2a448..31e810cd30 100644 --- a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx @@ -1,11 +1,11 @@ --- -title: '加载更早消息' +title: '加载历史消息' description: '使用 getAdvancedHistoryMessageList 分页加载会话历史消息。' sourcePath: '/sdk/android/message/retrieving-messages/load-older-messages' --- -首次查询传 `startMsg` 为 `null`,后续将上一页边界消息作为起点。按返回的 `clientMsgID` 去重。 +首次查询传 `startMsg` 为 `null`,后续将上一页边界消息作为起点。普通历史消息使用 `ViewType.History`,按返回的 `clientMsgID` 去重。 ```java -messageManager.getAdvancedHistoryMessageList(callback, conversationID, startMessage, 20, ViewType.NORMAL); +messageManager.getAdvancedHistoryMessageList(callback, conversationID, startMessage, 20, ViewType.History); ``` diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx index 86bbd1a9fb..2d5fe56db3 100644 --- a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx @@ -1,5 +1,5 @@ --- -title: '发送非 OSS 消息' +title: '发送不经 OSS 的消息' description: '使用 sendMessageNotOss 发送已经由业务上传资源的媒体消息。' sourcePath: '/sdk/android/message/sending-messages/send-message-not-oss' --- diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx index e14f1ddc5e..d18b4047c5 100644 --- a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx @@ -8,7 +8,7 @@ sourcePath: '/sdk/android/message/sending-messages/send-message' ```java messageManager.sendMessage(new OnMsgSendCallback() { - @Override public void onSuccess(String id) { mergeSentMessage(message); } + @Override public void onSuccess(Message sentMessage) { mergeSentMessage(sentMessage); } @Override public void onError(int code, String error) { showSendError(error); } }, message, peerUserID, null, offlinePushInfo); ``` diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx index 107d841dff..521d34e08e 100644 --- a/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx @@ -1,5 +1,5 @@ --- -title: '跟踪消息发送进度' +title: '监听消息发送进度' description: '通过 OnMsgSendCallback 的进度回调更新媒体发送进度。' sourcePath: '/sdk/android/message/sending-messages/set-msg-send-progress-listener' --- @@ -9,7 +9,7 @@ Android 没有独立的全局发送进度 listener;进度随每次 `sendMessag ```java messageManager.sendMessage(new OnMsgSendCallback() { @Override public void onProgress(long progress) { updateProgress(progress); } - @Override public void onSuccess(String id) { finishProgress(); } + @Override public void onSuccess(Message sentMessage) { finishProgress(); } @Override public void onError(int code, String error) { failProgress(error); } }, message, peerUserID, null, offlinePushInfo); ``` diff --git a/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx b/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx index 5e8e963d45..db82484ce2 100644 --- a/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx +++ b/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx @@ -42,4 +42,4 @@ public void onUserStatusChanged(UsersOnlineStatus status) { } ``` -订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合;Android API 未提供可验证的取消订阅入口,因此不在文档中记录取消订阅调用。 +订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合,并通过[取消用户状态订阅](/sdk/android/user/online-status/unsubscribe-users-online-status)移除不再需要的用户。 diff --git a/content/zh/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx b/content/zh/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx new file mode 100644 index 0000000000..caf17506e6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx @@ -0,0 +1,32 @@ +--- +title: '取消用户状态订阅' +description: '使用 unsubscribeOnlineUsersStatus 取消指定用户的在线状态订阅。' +sourcePath: '/sdk/android/user/online-status/unsubscribe-users-online-status' +--- + +用户离开可见范围、页面结束或切换账号时,取消不再需要的在线状态订阅。调用前应去除空值和重复 ID。 + +```java +List userIDs = Arrays.asList("user_a", "user_b"); + +OpenIMClient.getInstance().userInfoManager.unsubscribeOnlineUsersStatus( + new OnBase() { + @Override + public void onSuccess(String data) { + for (String userID : userIDs) { + presenceByUserID.remove(userID); + } + } + + @Override + public void onError(int code, String error) { + recordStatusUnsubscribeFailure(code, error); + } + }, + userIDs +); +``` + +成功 callback 表示取消订阅请求已完成。此后再从应用维护的订阅集合和在线状态缓存中移除这些 `userID`;失败时保留原状态,以便重试。该操作不会修改用户资料或好友关系。 + +需要再次跟踪用户状态时,重新调用[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。 diff --git a/content/zh/docs/chat/sdk/android/user/overview-user.mdx b/content/zh/docs/chat/sdk/android/user/overview-user.mdx index cb4d3311f3..7b447ea85c 100644 --- a/content/zh/docs/chat/sdk/android/user/overview-user.mdx +++ b/content/zh/docs/chat/sdk/android/user/overview-user.mdx @@ -20,7 +20,7 @@ Android SDK 会根据使用场景返回不同的用户对象: | `FriendInfo` | 当前用户的好友列表、好友备注和关系扩展字段 | `searchFriends()`、`getFriendListPage()` | | `FriendApplicationInfo` | 好友申请双方、处理状态和附言 | 好友申请查询与 listener | | `BlacklistInfo` | 当前用户拉黑的用户及黑名单关系字段 | `getBlacklist()`、`addBlacklist()`、`removeBlacklist()` | -| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()` | +| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()`、`unsubscribeOnlineUsersStatus()` | 同一个 `userID` 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 `UserInfo.getFriendInfo()`;只需要账号公开资料时使用 `PublicUserInfo`;黑名单页面使用 `UserInfo.getBlackInfo()`。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。 @@ -40,7 +40,7 @@ Android SDK 会根据使用场景返回不同的用户对象: | 查看和维护当前用户黑名单 | [获取黑名单列表](/sdk/android/user/blacklist/get-blacklist) | | 读取或更新当前用户的昵称、头像和扩展资料 | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) | | 设置账号级消息接收和通知策略 | [设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception) | -| 订阅和读取在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) | +| 订阅、读取和取消在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)、[取消用户状态订阅](/sdk/android/user/online-status/unsubscribe-users-online-status) | ## 状态更新 diff --git a/data/structure/android-content-audit.json b/data/structure/android-content-audit.json index 7705f7517e..a8d324a7df 100644 --- a/data/structure/android-content-audit.json +++ b/data/structure/android-content-audit.json @@ -20,7 +20,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setOnGroupListener"], + "sdkMethods": [ + "setOnGroupListener" + ], "sdkEvents": [ "onGroupApplicationAccepted", "onGroupApplicationAdded", @@ -48,10 +50,16 @@ } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnGroupListener.java" + ], + "reason": null + } } }, "redirectTo": null @@ -64,7 +72,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["createGroup"], + "sdkMethods": [ + "createGroup" + ], "sdkEvents": [], "locales": { "zh": { @@ -73,15 +83,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.createGroup"], + "evidence": [ + "GroupManager.createGroup" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.createGroup" + ], + "reason": null + } } }, "redirectTo": null @@ -94,24 +112,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupInfo"], + "sdkMethods": [ + "setGroupInfo" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.setGroupInfo"], + "evidence": [ + "GroupManager.setGroupInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -124,24 +152,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupInfo"], + "sdkMethods": [ + "setGroupInfo" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.setGroupInfo"], + "evidence": [ + "GroupManager.setGroupInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -154,24 +192,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupInfo"], + "sdkMethods": [ + "setGroupInfo" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.setGroupInfo"], + "evidence": [ + "GroupManager.setGroupInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -184,7 +232,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupInfo"], + "sdkMethods": [ + "setGroupInfo" + ], "sdkEvents": [], "locales": { "zh": { @@ -193,15 +243,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupInfo.setNeedVerification"], + "evidence": [ + "GroupInfo.setNeedVerification" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupInfo.setNeedVerification" + ], + "reason": null + } } }, "redirectTo": null @@ -214,7 +272,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupInfo"], + "sdkMethods": [ + "setGroupInfo" + ], "sdkEvents": [], "locales": { "zh": { @@ -223,15 +283,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupInfo.setLookMemberInfo"], + "evidence": [ + "GroupInfo.setLookMemberInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupInfo.setLookMemberInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -244,24 +312,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupInfo"], + "sdkMethods": [ + "setGroupInfo" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupInfo.setApplyMemberFriend"], + "evidence": [ + "GroupInfo.setApplyMemberFriend" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupInfo.setApplyMemberFriend" + ], + "reason": null + } } }, "redirectTo": null @@ -274,24 +352,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["changeGroupMute"], + "sdkMethods": [ + "changeGroupMute" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.changeGroupMute"], + "evidence": [ + "GroupManager.changeGroupMute" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.changeGroupMute" + ], + "reason": null + } } }, "redirectTo": null @@ -304,7 +392,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["joinGroup"], + "sdkMethods": [ + "joinGroup" + ], "sdkEvents": [], "locales": { "zh": { @@ -313,15 +403,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.joinGroup"], + "evidence": [ + "GroupManager.joinGroup" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.joinGroup" + ], + "reason": null + } } }, "redirectTo": null @@ -334,7 +432,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["quitGroup"], + "sdkMethods": [ + "quitGroup" + ], "sdkEvents": [], "locales": { "zh": { @@ -343,15 +443,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.quitGroup"], + "evidence": [ + "GroupManager.quitGroup" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.quitGroup" + ], + "reason": null + } } }, "redirectTo": null @@ -364,7 +472,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["dismissGroup"], + "sdkMethods": [ + "dismissGroup" + ], "sdkEvents": [], "locales": { "zh": { @@ -373,15 +483,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.dismissGroup"], + "evidence": [ + "GroupManager.dismissGroup" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.dismissGroup" + ], + "reason": null + } } }, "redirectTo": null @@ -394,24 +512,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["getGroupsInfo"], + "sdkMethods": [ + "getGroupsInfo" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.getGroupsInfo"], + "evidence": [ + "GroupManager.getGroupsInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupsInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -424,7 +552,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["getJoinedGroupListPage"], + "sdkMethods": [ + "getJoinedGroupListPage" + ], "sdkEvents": [], "locales": { "zh": { @@ -433,15 +563,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.getJoinedGroupListPage"], + "evidence": [ + "GroupManager.getJoinedGroupListPage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getJoinedGroupListPage" + ], + "reason": null + } } }, "redirectTo": null @@ -454,24 +592,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["isJoinGroup"], + "sdkMethods": [ + "isJoinGroup" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.isJoinGroup"], + "evidence": [ + "GroupManager.isJoinGroup" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.isJoinGroup" + ], + "reason": null + } } }, "redirectTo": null @@ -484,7 +632,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["searchGroups"], + "sdkMethods": [ + "searchGroups" + ], "sdkEvents": [], "locales": { "zh": { @@ -493,15 +643,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.searchGroups"], + "evidence": [ + "GroupManager.searchGroups" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.searchGroups" + ], + "reason": null + } } }, "redirectTo": null @@ -520,7 +678,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "not-applicable", "evidence": [], @@ -528,10 +686,14 @@ } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "This overview explains application state and page responsibilities without a code example." + } } }, "redirectTo": null @@ -544,24 +706,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["getRecvGroupApplicationList"], + "sdkMethods": [ + "getRecvGroupApplicationList" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.getRecvGroupApplicationList"], + "evidence": [ + "GroupManager.getRecvGroupApplicationList" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getRecvGroupApplicationList" + ], + "reason": null + } } }, "redirectTo": null @@ -574,24 +746,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["getSendGroupApplicationList"], + "sdkMethods": [ + "getSendGroupApplicationList" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.getSendGroupApplicationList"], + "evidence": [ + "GroupManager.getSendGroupApplicationList" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getSendGroupApplicationList" + ], + "reason": null + } } }, "redirectTo": null @@ -604,24 +786,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["acceptGroupApplication"], + "sdkMethods": [ + "acceptGroupApplication" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.acceptGroupApplication"], + "evidence": [ + "GroupManager.acceptGroupApplication" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.acceptGroupApplication" + ], + "reason": null + } } }, "redirectTo": null @@ -634,24 +826,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["refuseGroupApplication"], + "sdkMethods": [ + "refuseGroupApplication" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.refuseGroupApplication"], + "evidence": [ + "GroupManager.refuseGroupApplication" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.refuseGroupApplication" + ], + "reason": null + } } }, "redirectTo": null @@ -678,10 +880,14 @@ } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "This overview explains query identifiers and returned models without a code example." + } } }, "redirectTo": null @@ -694,24 +900,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["getGroupMemberList"], + "sdkMethods": [ + "getGroupMemberList" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.getGroupMemberList"], + "evidence": [ + "GroupManager.getGroupMemberList" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupMemberList" + ], + "reason": null + } } }, "redirectTo": null @@ -724,24 +940,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["getGroupMembersInfo"], + "sdkMethods": [ + "getGroupMembersInfo" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.getGroupMembersInfo"], + "evidence": [ + "GroupManager.getGroupMembersInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupMembersInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -754,24 +980,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["getUsersInGroup"], + "sdkMethods": [ + "getUsersInGroup" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.getUsersInGroup"], + "evidence": [ + "GroupManager.getUsersInGroup" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getUsersInGroup" + ], + "reason": null + } } }, "redirectTo": null @@ -784,7 +1020,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["getGroupMemberOwnerAndAdmin"], + "sdkMethods": [ + "getGroupMemberOwnerAndAdmin" + ], "sdkEvents": [], "locales": { "zh": { @@ -793,15 +1031,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.getGroupMemberOwnerAndAdmin"], + "evidence": [ + "GroupManager.getGroupMemberOwnerAndAdmin" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupMemberOwnerAndAdmin" + ], + "reason": null + } } }, "redirectTo": null @@ -814,7 +1060,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["searchGroupMembers"], + "sdkMethods": [ + "searchGroupMembers" + ], "sdkEvents": [], "locales": { "zh": { @@ -823,15 +1071,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.searchGroupMembers"], + "evidence": [ + "GroupManager.searchGroupMembers" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.searchGroupMembers" + ], + "reason": null + } } }, "redirectTo": null @@ -844,24 +1100,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["inviteUserToGroup"], + "sdkMethods": [ + "inviteUserToGroup" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.inviteUserToGroup"], + "evidence": [ + "GroupManager.inviteUserToGroup" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.inviteUserToGroup" + ], + "reason": null + } } }, "redirectTo": null @@ -874,7 +1140,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["kickGroupMember"], + "sdkMethods": [ + "kickGroupMember" + ], "sdkEvents": [], "locales": { "zh": { @@ -883,15 +1151,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.kickGroupMember"], + "evidence": [ + "GroupManager.kickGroupMember" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.kickGroupMember" + ], + "reason": null + } } }, "redirectTo": null @@ -904,24 +1180,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupMemberInfo"], + "sdkMethods": [ + "setGroupMemberInfo" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.setGroupMemberInfo"], + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -934,24 +1220,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupMemberInfo"], + "sdkMethods": [ + "setGroupMemberInfo" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.setGroupMemberInfo"], + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -964,7 +1260,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupMemberInfo"], + "sdkMethods": [ + "setGroupMemberInfo" + ], "sdkEvents": [], "locales": { "zh": { @@ -973,15 +1271,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.setGroupMemberInfo"], + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -994,7 +1300,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["setGroupMemberInfo"], + "sdkMethods": [ + "setGroupMemberInfo" + ], "sdkEvents": [], "locales": { "zh": { @@ -1003,15 +1311,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.setGroupMemberInfo"], + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -1024,7 +1340,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["transferGroupOwner"], + "sdkMethods": [ + "transferGroupOwner" + ], "sdkEvents": [], "locales": { "zh": { @@ -1033,15 +1351,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.transferGroupOwner"], + "evidence": [ + "GroupManager.transferGroupOwner" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.transferGroupOwner" + ], + "reason": null + } } }, "redirectTo": null @@ -1054,24 +1380,34 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": ["changeGroupMemberMute"], + "sdkMethods": [ + "changeGroupMemberMute" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["GroupManager.changeGroupMemberMute"], + "evidence": [ + "GroupManager.changeGroupMemberMute" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.changeGroupMemberMute" + ], + "reason": null + } } }, "redirectTo": null @@ -1085,7 +1421,9 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/tree/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java" ], - "sdkMethods": ["OpenIMClient.getInstance"], + "sdkMethods": [ + "OpenIMClient.getInstance" + ], "sdkEvents": [], "locales": { "zh": { @@ -1146,7 +1484,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", "evidence": [ @@ -1173,7 +1511,12 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" ], - "sdkMethods": ["initSDK", "networkChanged", "logout", "unInit"], + "sdkMethods": [ + "initSDK", + "networkChanged", + "logout", + "unInit" + ], "sdkEvents": [], "locales": { "zh": { @@ -1220,7 +1563,14 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/enums/LoginStatus.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConnListener.java" ], - "sdkMethods": ["initSDK", "login", "getLoginStatus", "getLoginUserID", "logout", "unInit"], + "sdkMethods": [ + "initSDK", + "login", + "getLoginStatus", + "getLoginUserID", + "logout", + "unInit" + ], "sdkEvents": [ "onConnecting", "onConnectSuccess", @@ -1275,8 +1625,15 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnMsgSendCallback.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/OfflinePushInfo.java" ], - "sdkMethods": ["setAdvancedMsgListener", "login", "createTextMessage", "sendMessage"], - "sdkEvents": ["onRecvNewMessage"], + "sdkMethods": [ + "setAdvancedMsgListener", + "login", + "createTextMessage", + "sendMessage" + ], + "sdkEvents": [ + "onRecvNewMessage" + ], "locales": { "zh": { "reviewStatus": "published", @@ -1327,7 +1684,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "not-applicable", "evidence": [], @@ -1337,7 +1694,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "not-applicable", "evidence": [], @@ -1355,7 +1712,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" ], - "sdkMethods": ["getUsersInfo"], + "sdkMethods": [ + "getUsersInfo" + ], "sdkEvents": [], "locales": { "zh": { @@ -1393,7 +1752,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" ], - "sdkMethods": ["getSelfLocalUserInfo"], + "sdkMethods": [ + "getSelfLocalUserInfo" + ], "sdkEvents": [], "locales": { "zh": { @@ -1432,8 +1793,12 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" ], - "sdkMethods": ["setSelfInfo"], - "sdkEvents": ["onSelfInfoUpdated"], + "sdkMethods": [ + "setSelfInfo" + ], + "sdkEvents": [ + "onSelfInfoUpdated" + ], "locales": { "zh": { "reviewStatus": "published", @@ -1451,7 +1816,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", "evidence": [ @@ -1472,7 +1837,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" ], - "sdkMethods": ["setSelfInfo"], + "sdkMethods": [ + "setSelfInfo" + ], "sdkEvents": [], "locales": { "zh": { @@ -1511,8 +1878,14 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" ], - "sdkMethods": ["getFriendListPage"], - "sdkEvents": ["onFriendAdded", "onFriendInfoChanged", "onFriendDeleted"], + "sdkMethods": [ + "getFriendListPage" + ], + "sdkEvents": [ + "onFriendAdded", + "onFriendInfoChanged", + "onFriendDeleted" + ], "locales": { "zh": { "reviewStatus": "published", @@ -1551,7 +1924,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["searchFriends"], + "sdkMethods": [ + "searchFriends" + ], "sdkEvents": [], "locales": { "zh": { @@ -1589,7 +1964,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["getFriendsInfo"], + "sdkMethods": [ + "getFriendsInfo" + ], "sdkEvents": [], "locales": { "zh": { @@ -1627,7 +2004,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["checkFriend"], + "sdkMethods": [ + "checkFriend" + ], "sdkEvents": [], "locales": { "zh": { @@ -1665,7 +2044,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["updateFriendsReq"], + "sdkMethods": [ + "updateFriendsReq" + ], "sdkEvents": [], "locales": { "zh": { @@ -1703,7 +2084,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["deleteFriend"], + "sdkMethods": [ + "deleteFriend" + ], "sdkEvents": [], "locales": { "zh": { @@ -1741,7 +2124,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["addFriend"], + "sdkMethods": [ + "addFriend" + ], "sdkEvents": [], "locales": { "zh": { @@ -1780,7 +2165,9 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" ], - "sdkMethods": ["getRecvFriendApplicationList"], + "sdkMethods": [ + "getRecvFriendApplicationList" + ], "sdkEvents": [ "onFriendApplicationAdded", "onFriendApplicationAccepted", @@ -1825,7 +2212,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["getSendFriendApplicationList"], + "sdkMethods": [ + "getSendFriendApplicationList" + ], "sdkEvents": [], "locales": { "zh": { @@ -1863,7 +2252,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["acceptFriendApplication"], + "sdkMethods": [ + "acceptFriendApplication" + ], "sdkEvents": [], "locales": { "zh": { @@ -1901,7 +2292,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["refuseFriendApplication"], + "sdkMethods": [ + "refuseFriendApplication" + ], "sdkEvents": [], "locales": { "zh": { @@ -1939,7 +2332,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" ], - "sdkMethods": ["getBlacklist"], + "sdkMethods": [ + "getBlacklist" + ], "sdkEvents": [], "locales": { "zh": { @@ -1978,8 +2373,12 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" ], - "sdkMethods": ["addBlacklist"], - "sdkEvents": ["onBlacklistAdded"], + "sdkMethods": [ + "addBlacklist" + ], + "sdkEvents": [ + "onBlacklistAdded" + ], "locales": { "zh": { "reviewStatus": "published", @@ -2019,8 +2418,12 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" ], - "sdkMethods": ["removeBlacklist"], - "sdkEvents": ["onBlacklistDeleted"], + "sdkMethods": [ + "removeBlacklist" + ], + "sdkEvents": [ + "onBlacklistDeleted" + ], "locales": { "zh": { "reviewStatus": "published", @@ -2060,13 +2463,17 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" ], - "sdkMethods": ["subscribeUsersOnlineStatus"], - "sdkEvents": ["onUserStatusChanged"], + "sdkMethods": [ + "subscribeUsersOnlineStatus" + ], + "sdkEvents": [ + "onUserStatusChanged" + ], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", "evidence": [ @@ -2079,7 +2486,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", "evidence": [ @@ -2100,7 +2507,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" ], - "sdkMethods": ["getSubscribeOnlineUsersStatus"], + "sdkMethods": [ + "getSubscribeOnlineUsersStatus" + ], "sdkEvents": [], "locales": { "zh": { @@ -2130,6 +2539,46 @@ }, "redirectTo": null }, + { + "currentPath": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "targetPath": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "sdkMethods": [ + "unsubscribeOnlineUsersStatus" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "UserInfoManager.unsubscribeOnlineUsersStatus" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "UserInfoManager.unsubscribeOnlineUsersStatus" + ], + "reason": null + } + } + }, + "redirectTo": null + }, { "currentPath": "/sdk/android/conversation/overview-conversation", "targetPath": "/sdk/android/conversation/overview-conversation", @@ -2173,7 +2622,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["getOneConversation"], + "sdkMethods": [ + "getOneConversation" + ], "sdkEvents": [], "locales": { "zh": { @@ -2211,7 +2662,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["getConversationIDBySessionType"], + "sdkMethods": [ + "getConversationIDBySessionType" + ], "sdkEvents": [], "locales": { "zh": { @@ -2249,7 +2702,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["getMultipleConversation"], + "sdkMethods": [ + "getMultipleConversation" + ], "sdkEvents": [], "locales": { "zh": { @@ -2288,8 +2743,14 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java" ], - "sdkMethods": ["getConversationListSplit", "setOnConversationListener"], - "sdkEvents": ["onNewConversation", "onConversationChanged"], + "sdkMethods": [ + "getConversationListSplit", + "setOnConversationListener" + ], + "sdkEvents": [ + "onNewConversation", + "onConversationChanged" + ], "locales": { "zh": { "reviewStatus": "published", @@ -2326,7 +2787,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["pinConversation"], + "sdkMethods": [ + "pinConversation" + ], "sdkEvents": [], "locales": { "zh": { @@ -2364,7 +2827,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["setConversationEx"], + "sdkMethods": [ + "setConversationEx" + ], "sdkEvents": [], "locales": { "zh": { @@ -2402,7 +2867,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["setConversationDraft"], + "sdkMethods": [ + "setConversationDraft" + ], "sdkEvents": [], "locales": { "zh": { @@ -2440,7 +2907,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["setConversationRecvMessageOpt"], + "sdkMethods": [ + "setConversationRecvMessageOpt" + ], "sdkEvents": [], "locales": { "zh": { @@ -2478,7 +2947,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["resetConversationGroupAtType"], + "sdkMethods": [ + "resetConversationGroupAtType" + ], "sdkEvents": [], "locales": { "zh": { @@ -2517,8 +2988,13 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" ], - "sdkMethods": ["markConversationMessageAsRead", "setAdvancedMsgListener"], - "sdkEvents": ["onRecvC2CReadReceipt"], + "sdkMethods": [ + "markConversationMessageAsRead", + "setAdvancedMsgListener" + ], + "sdkEvents": [ + "onRecvC2CReadReceipt" + ], "locales": { "zh": { "reviewStatus": "published", @@ -2556,8 +3032,12 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java" ], - "sdkMethods": ["getTotalUnreadMsgCount"], - "sdkEvents": ["onTotalUnreadMessageCountChanged"], + "sdkMethods": [ + "getTotalUnreadMsgCount" + ], + "sdkEvents": [ + "onTotalUnreadMessageCountChanged" + ], "locales": { "zh": { "reviewStatus": "published", @@ -2594,7 +3074,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["setOneConversationPrivateChat"], + "sdkMethods": [ + "setOneConversationPrivateChat" + ], "sdkEvents": [], "locales": { "zh": { @@ -2632,7 +3114,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["setConversationBurnDuration"], + "sdkMethods": [ + "setConversationBurnDuration" + ], "sdkEvents": [], "locales": { "zh": { @@ -2670,7 +3154,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["setConversation"], + "sdkMethods": [ + "setConversation" + ], "sdkEvents": [], "locales": { "zh": { @@ -2708,7 +3194,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["hideConversation"], + "sdkMethods": [ + "hideConversation" + ], "sdkEvents": [], "locales": { "zh": { @@ -2746,7 +3234,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" ], - "sdkMethods": ["deleteConversationAndDeleteAllMsg"], + "sdkMethods": [ + "deleteConversationAndDeleteAllMsg" + ], "sdkEvents": [], "locales": { "zh": { @@ -2784,7 +3274,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["clearConversationAndDeleteAllMsg"], + "sdkMethods": [ + "clearConversationAndDeleteAllMsg" + ], "sdkEvents": [], "locales": { "zh": { @@ -2822,14 +3314,10 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["setAdvancedMsgListener"], - "sdkEvents": [ - "onRecvGroupMessageReadReceipt", - "onRecvMessageRevokedV2", - "onChangedPinnedMsg", - "onMsgDeleted", - "onMessageModified" + "sdkMethods": [ + "setAdvancedMsgListener" ], + "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", @@ -2844,10 +3332,16 @@ } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" + ], + "reason": null + } } }, "redirectTo": null @@ -2860,7 +3354,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createTextMessage"], + "sdkMethods": [ + "createTextMessage" + ], "sdkEvents": [], "locales": { "zh": { @@ -2869,28 +3365,38 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createTextMessage"], + "evidence": [ + "MessageManager.createTextMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } - } - }, - "redirectTo": null - }, - { - "currentPath": "/sdk/android/message/creating-messages/create-text-at-message", + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createTextMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-text-at-message", "targetPath": "/sdk/android/message/creating-messages/create-text-at-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createTextAtMessage"], + "sdkMethods": [ + "createTextAtMessage" + ], "sdkEvents": [], "locales": { "zh": { @@ -2899,15 +3405,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createTextAtMessage"], + "evidence": [ + "MessageManager.createTextAtMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createTextAtMessage" + ], + "reason": null + } } }, "redirectTo": null @@ -2920,7 +3434,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createCustomMessage"], + "sdkMethods": [ + "createCustomMessage" + ], "sdkEvents": [], "locales": { "zh": { @@ -2929,388 +3445,518 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createCustomMessage"], + "evidence": [ + "MessageManager.createCustomMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createCustomMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-image-message-by-file", - "targetPath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "currentPath": "/sdk/android/message/creating-messages/create-image-message", + "targetPath": "/sdk/android/message/creating-messages/create-image-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createImageMessage", "createImageMessageFromFullPath"], + "sdkMethods": [ + "createImageMessage" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createImageMessage"], + "evidence": [ + "MessageManager.createImageMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createImageMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-image-message-by-url", - "targetPath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "currentPath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-image-message-by-file", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createImageMessageByURL"], + "sdkMethods": [ + "createImageMessageFromFullPath" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createImageMessageByURL"], + "evidence": [ + "MessageManager.createImageMessageFromFullPath" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createImageMessageFromFullPath" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", - "targetPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "currentPath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-image-message-by-url", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createSoundMessage", "createSoundMessageFromFullPath"], + "sdkMethods": [ + "createImageMessageByURL" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createSoundMessage"], + "evidence": [ + "MessageManager.createImageMessageByURL" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createImageMessageByURL" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", - "targetPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "currentPath": "/sdk/android/message/creating-messages/create-sound-message", + "targetPath": "/sdk/android/message/creating-messages/create-sound-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createSoundMessageByURL"], + "sdkMethods": [ + "createSoundMessage" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createSoundMessageByURL"], + "evidence": [ + "MessageManager.createSoundMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createSoundMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-video-message-by-file", - "targetPath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "currentPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createVideoMessage", "createVideoMessageFromFullPath"], + "sdkMethods": [ + "createSoundMessageFromFullPath" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createVideoMessage"], + "evidence": [ + "MessageManager.createSoundMessageFromFullPath" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createSoundMessageFromFullPath" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-video-message-by-url", - "targetPath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "currentPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createVideoMessageByURL"], + "sdkMethods": [ + "createSoundMessageByURL" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createVideoMessageByURL"], + "evidence": [ + "MessageManager.createSoundMessageByURL" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createSoundMessageByURL" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-file-message-by-file", - "targetPath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "currentPath": "/sdk/android/message/creating-messages/create-video-message", + "targetPath": "/sdk/android/message/creating-messages/create-video-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createFileMessage", "createFileMessageFromFullPath"], + "sdkMethods": [ + "createVideoMessage" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createFileMessage"], + "evidence": [ + "MessageManager.createVideoMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createVideoMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-file-message-by-url", - "targetPath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "currentPath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-video-message-by-file", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createFileMessageByURL"], + "sdkMethods": [ + "createVideoMessageFromFullPath" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createFileMessageByURL"], + "evidence": [ + "MessageManager.createVideoMessageFromFullPath" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createVideoMessageFromFullPath" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-card-message", - "targetPath": "/sdk/android/message/creating-messages/create-card-message", + "currentPath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-video-message-by-url", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createCardMessage"], + "sdkMethods": [ + "createVideoMessageByURL" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createCardMessage"], + "evidence": [ + "MessageManager.createVideoMessageByURL" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createVideoMessageByURL" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-location-message", - "targetPath": "/sdk/android/message/creating-messages/create-location-message", + "currentPath": "/sdk/android/message/creating-messages/create-file-message", + "targetPath": "/sdk/android/message/creating-messages/create-file-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createLocationMessage"], + "sdkMethods": [ + "createFileMessage" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createLocationMessage"], + "evidence": [ + "MessageManager.createFileMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFileMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-face-message", - "targetPath": "/sdk/android/message/creating-messages/create-face-message", + "currentPath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-file-message-by-file", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createFaceMessage"], + "sdkMethods": [ + "createFileMessageFromFullPath" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createFaceMessage"], + "evidence": [ + "MessageManager.createFileMessageFromFullPath" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFileMessageFromFullPath" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-quote-message", - "targetPath": "/sdk/android/message/creating-messages/create-quote-message", + "currentPath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-file-message-by-url", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createQuoteMessage"], + "sdkMethods": [ + "createFileMessageByURL" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createQuoteMessage"], + "evidence": [ + "MessageManager.createFileMessageByURL" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFileMessageByURL" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-forward-message", - "targetPath": "/sdk/android/message/creating-messages/create-forward-message", + "currentPath": "/sdk/android/message/creating-messages/create-card-message", + "targetPath": "/sdk/android/message/creating-messages/create-card-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createForwardMessage"], + "sdkMethods": [ + "createCardMessage" + ], "sdkEvents": [], "locales": { "zh": { @@ -3319,28 +3965,38 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createForwardMessage"], + "evidence": [ + "MessageManager.createCardMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createCardMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/creating-messages/create-merger-message", - "targetPath": "/sdk/android/message/creating-messages/create-merger-message", + "currentPath": "/sdk/android/message/creating-messages/create-location-message", + "targetPath": "/sdk/android/message/creating-messages/create-location-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["createMergerMessage"], + "sdkMethods": [ + "createLocationMessage" + ], "sdkEvents": [], "locales": { "zh": { @@ -3349,28 +4005,38 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.createMergerMessage"], + "evidence": [ + "MessageManager.createLocationMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createLocationMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/sending-messages/send-message", - "targetPath": "/sdk/android/message/sending-messages/send-message", + "currentPath": "/sdk/android/message/creating-messages/create-face-message", + "targetPath": "/sdk/android/message/creating-messages/create-face-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["sendMessage"], + "sdkMethods": [ + "createFaceMessage" + ], "sdkEvents": [], "locales": { "zh": { @@ -3379,152 +4045,164 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.sendMessage"], - "reason": null + "evidence": [ + "MessageManager.createFaceMessage" + ], + "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFaceMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/sending-messages/send-message-not-oss", - "targetPath": "/sdk/android/message/sending-messages/send-message-not-oss", + "currentPath": "/sdk/android/message/creating-messages/create-quote-message", + "targetPath": "/sdk/android/message/creating-messages/create-quote-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["sendMessageNotOss"], + "sdkMethods": [ + "createQuoteMessage" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.sendMessageNotOss"], + "evidence": [ + "MessageManager.createQuoteMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createQuoteMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", - "targetPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "currentPath": "/sdk/android/message/creating-messages/create-advanced-text-message", + "targetPath": "/sdk/android/message/creating-messages/create-advanced-text-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnMsgSendCallback.java" + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/RichMessage.java" + ], + "sdkMethods": [ + "createAdvancedTextMessage" ], - "sdkMethods": [], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["OnMsgSendCallback"], + "evidence": [ + "MessageManager.createAdvancedTextMessage", + "RichMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } - } - }, - "redirectTo": null - }, - { - "currentPath": "/sdk/android/message/receiving-messages/receive-messages", - "targetPath": "/sdk/android/message/receiving-messages/receive-messages", - "sourceKind": "openim-specific", - "disposition": "adapt", - "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" - ], - "sdkMethods": [], - "sdkEvents": ["onRecvOfflineNewMessage", "onRecvOnlineOnlyMessage"], - "locales": { - "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["OnAdvanceMsgListener"], + "evidence": [ + "MessageManager.createAdvancedTextMessage", + "RichMessage" + ], "reason": null } - }, - "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", - "targetPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "currentPath": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "targetPath": "/sdk/android/message/creating-messages/create-advanced-quote-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnCustomBusinessListener.java" + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/RichMessage.java" + ], + "sdkMethods": [ + "createAdvancedQuoteMessage" ], - "sdkMethods": ["setCustomBusinessListener"], - "sdkEvents": ["onRecvCustomBusinessMessage"], + "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", "evidence": [ - "MessageManager.setCustomBusinessListener", - "OnCustomBusinessListener.onRecvCustomBusinessMessage" + "MessageManager.createAdvancedQuoteMessage", + "RichMessage" ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createAdvancedQuoteMessage", + "RichMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/retrieving-messages/load-older-messages", - "targetPath": "/sdk/android/message/retrieving-messages/load-older-messages", + "currentPath": "/sdk/android/message/creating-messages/create-forward-message", + "targetPath": "/sdk/android/message/creating-messages/create-forward-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["getAdvancedHistoryMessageList"], + "sdkMethods": [ + "createForwardMessage" + ], "sdkEvents": [], "locales": { "zh": { @@ -3533,28 +4211,38 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.getAdvancedHistoryMessageList"], + "evidence": [ + "MessageManager.createForwardMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createForwardMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/retrieving-messages/load-newer-messages", - "targetPath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "currentPath": "/sdk/android/message/creating-messages/create-merger-message", + "targetPath": "/sdk/android/message/creating-messages/create-merger-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["getAdvancedHistoryMessageListReverse"], + "sdkMethods": [ + "createMergerMessage" + ], "sdkEvents": [], "locales": { "zh": { @@ -3563,28 +4251,38 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.getAdvancedHistoryMessageListReverse"], + "evidence": [ + "MessageManager.createMergerMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createMergerMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", - "targetPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "currentPath": "/sdk/android/message/sending-messages/send-message", + "targetPath": "/sdk/android/message/sending-messages/send-message", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["findMessageList"], + "sdkMethods": [ + "sendMessage" + ], "sdkEvents": [], "locales": { "zh": { @@ -3593,94 +4291,118 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.findMessageList"], + "evidence": [ + "MessageManager.sendMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.sendMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/searching-messages/search-messages", - "targetPath": "/sdk/android/message/searching-messages/search-messages", + "currentPath": "/sdk/android/message/sending-messages/send-message-not-oss", + "targetPath": "/sdk/android/message/sending-messages/send-message-not-oss", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["searchLocalMessages"], + "sdkMethods": [ + "sendMessageNotOss" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.searchLocalMessages"], + "evidence": [ + "MessageManager.sendMessageNotOss" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.sendMessageNotOss" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/composing-messages/update-typing-status", - "targetPath": "/sdk/android/message/composing-messages/update-typing-status", + "currentPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "targetPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java", - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InputStatesChangedData.java" + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnMsgSendCallback.java" ], - "sdkMethods": ["typingStatusUpdate"], - "sdkEvents": ["onConversationUserInputStatusChanged"], + "sdkMethods": [], + "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", "evidence": [ - "MessageManager.typingStatusUpdate", - "OnConversationListener.onConversationUserInputStatusChanged" + "OnMsgSendCallback" ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OnMsgSendCallback" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/delete-local-message", - "targetPath": "/sdk/android/message/managing-messages/delete-local-message", + "currentPath": "/sdk/android/message/receiving-messages/receive-messages", + "targetPath": "/sdk/android/message/receiving-messages/receive-messages", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" + ], + "sdkMethods": [], + "sdkEvents": [ + "onRecvOfflineNewMessage", + "onRecvOnlineOnlyMessage" ], - "sdkMethods": ["deleteMessageFromLocalStorage"], - "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", @@ -3688,29 +4410,42 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.deleteMessageFromLocalStorage"], + "evidence": [ + "OnAdvanceMsgListener" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OnAdvanceMsgListener" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/delete-saved-messages", - "targetPath": "/sdk/android/message/managing-messages/delete-saved-messages", + "currentPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "targetPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnCustomBusinessListener.java" + ], + "sdkMethods": [ + "setCustomBusinessListener" + ], + "sdkEvents": [ + "onRecvCustomBusinessMessage" ], - "sdkMethods": ["deleteMessageFromLocalAndSvr"], - "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", @@ -3718,137 +4453,618 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.deleteMessageFromLocalAndSvr"], + "evidence": [ + "MessageManager.setCustomBusinessListener", + "OnCustomBusinessListener.onRecvCustomBusinessMessage" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setCustomBusinessListener", + "OnCustomBusinessListener.onRecvCustomBusinessMessage" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/revoke-a-message", - "targetPath": "/sdk/android/message/managing-messages/revoke-a-message", + "currentPath": "/sdk/android/message/retrieving-messages/load-older-messages", + "targetPath": "/sdk/android/message/retrieving-messages/load-older-messages", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["revokeMessageV2"], + "sdkMethods": [ + "getAdvancedHistoryMessageList" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.revokeMessageV2"], + "evidence": [ + "MessageManager.getAdvancedHistoryMessageList" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getAdvancedHistoryMessageList" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/modify-a-message", - "targetPath": "/sdk/android/message/managing-messages/modify-a-message", + "currentPath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "targetPath": "/sdk/android/message/retrieving-messages/load-newer-messages", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["modifyMessage"], + "sdkMethods": [ + "getAdvancedHistoryMessageListReverse" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.modifyMessage"], + "evidence": [ + "MessageManager.getAdvancedHistoryMessageListReverse" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getAdvancedHistoryMessageListReverse" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/get-pinned-messages", - "targetPath": "/sdk/android/message/managing-messages/get-pinned-messages", + "currentPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "targetPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["getConversationPinnedMsgs"], + "sdkMethods": [ + "findMessageList" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.getConversationPinnedMsgs"], + "evidence": [ + "MessageManager.findMessageList" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.findMessageList" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/set-message-pinned", - "targetPath": "/sdk/android/message/managing-messages/set-message-pinned", + "currentPath": "/sdk/android/message/retrieving-messages/load-message-context", + "targetPath": "/sdk/android/message/retrieving-messages/load-message-context", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/Messages.java" + ], + "sdkMethods": [ + "fetchSurroundingMessages" ], - "sdkMethods": ["setConversationPinnedMsg"], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.setConversationPinnedMsg"], + "evidence": [ + "MessageManager.fetchSurroundingMessages", + "Messages.getData" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } - } - }, + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.fetchSurroundingMessages", + "Messages.getData" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/searching-messages/search-messages", + "targetPath": "/sdk/android/message/searching-messages/search-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "searchLocalMessages" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.searchLocalMessages" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.searchLocalMessages" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/composing-messages/update-typing-status", + "targetPath": "/sdk/android/message/composing-messages/update-typing-status", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InputStatesChangedData.java" + ], + "sdkMethods": [ + "changeInputState" + ], + "sdkEvents": [ + "onConversationUserInputStatusChanged" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.changeInputState", + "OnConversationListener.onConversationUserInputStatusChanged" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.changeInputState", + "OnConversationListener.onConversationUserInputStatusChanged" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/composing-messages/get-typing-status", + "targetPath": "/sdk/android/message/composing-messages/get-typing-status", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": [ + "getInputState" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.getInputState" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.getInputState" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/delete-local-message", + "targetPath": "/sdk/android/message/managing-messages/delete-local-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "deleteMessageFromLocalStorage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteMessageFromLocalStorage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteMessageFromLocalStorage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/delete-saved-messages", + "targetPath": "/sdk/android/message/managing-messages/delete-saved-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "deleteMessages" + ], + "sdkEvents": [ + "onMsgDeleted" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteMessages", + "OnAdvanceMsgListener.onMsgDeleted" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteMessages", + "OnAdvanceMsgListener.onMsgDeleted" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/delete-user-messages", + "targetPath": "/sdk/android/message/managing-messages/delete-user-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/DeleteUserAllMsgsListenerMsg.java" + ], + "sdkMethods": [ + "deleteUserAllMessagesInConv" + ], + "sdkEvents": [ + "onDeleteUserAllMsgsInConv" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteUserAllMessagesInConv", + "OnAdvanceMsgListener.onDeleteUserAllMsgsInConv" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteUserAllMessagesInConv", + "OnAdvanceMsgListener.onDeleteUserAllMsgsInConv" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/revoke-a-message", + "targetPath": "/sdk/android/message/managing-messages/revoke-a-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "revokeMessageV2" + ], + "sdkEvents": [ + "onRecvMessageRevokedV2" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.revokeMessageV2", + "OnAdvanceMsgListener.onRecvMessageRevokedV2" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.revokeMessageV2", + "OnAdvanceMsgListener.onRecvMessageRevokedV2" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/modify-a-message", + "targetPath": "/sdk/android/message/managing-messages/modify-a-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "modifyMessage" + ], + "sdkEvents": [ + "onMessageModified" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.modifyMessage", + "OnAdvanceMsgListener.onMessageModified" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.modifyMessage", + "OnAdvanceMsgListener.onMessageModified" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/get-pinned-messages", + "targetPath": "/sdk/android/message/managing-messages/get-pinned-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "getConversationPinnedMsgs" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getConversationPinnedMsgs" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getConversationPinnedMsgs" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/set-message-pinned", + "targetPath": "/sdk/android/message/managing-messages/set-message-pinned", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "setConversationPinnedMsg" + ], + "sdkEvents": [ + "onChangedPinnedMsg" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setConversationPinnedMsg", + "OnAdvanceMsgListener.onChangedPinnedMsg" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setConversationPinnedMsg", + "OnAdvanceMsgListener.onChangedPinnedMsg" + ], + "reason": null + } + } + }, "redirectTo": null }, { @@ -3859,144 +5075,281 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["insertSingleMessageToLocalStorage"], + "sdkMethods": [ + "insertSingleMessageToLocalStorage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.insertSingleMessageToLocalStorage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.insertSingleMessageToLocalStorage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/insert-local-group-message", + "targetPath": "/sdk/android/message/managing-messages/insert-local-group-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "insertGroupMessageToLocalStorage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.insertGroupMessageToLocalStorage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.insertGroupMessageToLocalStorage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "targetPath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "deleteAllMsgFromLocal" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.insertSingleMessageToLocalStorage"], + "evidence": [ + "MessageManager.deleteAllMsgFromLocal" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteAllMsgFromLocal" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/insert-local-group-message", - "targetPath": "/sdk/android/message/managing-messages/insert-local-group-message", + "currentPath": "/sdk/android/message/managing-messages/clear-all-messages", + "targetPath": "/sdk/android/message/managing-messages/clear-all-messages", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["insertGroupMessageToLocalStorage"], + "sdkMethods": [ + "deleteAllMsgFromLocalAndSvr" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.insertGroupMessageToLocalStorage"], + "evidence": [ + "MessageManager.deleteAllMsgFromLocalAndSvr" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteAllMsgFromLocalAndSvr" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/clear-all-local-messages", - "targetPath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "currentPath": "/sdk/android/message/managing-messages/set-message-local-ex", + "targetPath": "/sdk/android/message/managing-messages/set-message-local-ex", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" ], - "sdkMethods": ["deleteAllMsgFromLocal"], + "sdkMethods": [ + "setMessageLocalEx" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.deleteAllMsgFromLocal"], + "evidence": [ + "MessageManager.setMessageLocalEx" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setMessageLocalEx" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/clear-all-messages", - "targetPath": "/sdk/android/message/managing-messages/clear-all-messages", + "currentPath": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "targetPath": "/sdk/android/message/managing-read-status/send-group-read-receipts", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/GroupMessageReceipt.java" + ], + "sdkMethods": [ + "sendGroupMessageReadReceipt" + ], + "sdkEvents": [ + "onRecvGroupMessageReadReceipt" ], - "sdkMethods": ["deleteAllMsgFromLocalAndSvr"], - "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.deleteAllMsgFromLocalAndSvr"], + "evidence": [ + "MessageManager.sendGroupMessageReadReceipt", + "OnAdvanceMsgListener.onRecvGroupMessageReadReceipt" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.sendGroupMessageReadReceipt", + "OnAdvanceMsgListener.onRecvGroupMessageReadReceipt" + ], + "reason": null + } } }, "redirectTo": null }, { - "currentPath": "/sdk/android/message/managing-messages/set-message-local-ex", - "targetPath": "/sdk/android/message/managing-messages/set-message-local-ex", + "currentPath": "/sdk/android/message/managing-read-status/get-group-message-readers", + "targetPath": "/sdk/android/message/managing-read-status/get-group-message-readers", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/GroupMembersInfo.java" + ], + "sdkMethods": [ + "getGroupMessageReaderList" ], - "sdkMethods": ["setMessageLocalEx"], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["MessageManager.setMessageLocalEx"], + "evidence": [ + "MessageManager.getGroupMessageReaderList" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getGroupMessageReaderList" + ], + "reason": null + } } }, "redirectTo": null @@ -4016,18 +5369,28 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-10", "exampleVerification": { "status": "verified", - "evidence": ["OpenIMClient.uploadFile", "OnPutFileListener"], + "evidence": [ + "OpenIMClient.uploadFile", + "OnPutFileListener" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OpenIMClient.uploadFile", + "OnPutFileListener" + ], + "reason": null + } } }, "redirectTo": null @@ -4042,7 +5405,9 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnPutFileListener.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/PutArgs.java" ], - "sdkMethods": ["uploadFile"], + "sdkMethods": [ + "uploadFile" + ], "sdkEvents": [], "locales": { "zh": { @@ -4051,15 +5416,27 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["OpenIMClient.uploadFile", "OnPutFileListener", "PutArgs"], + "evidence": [ + "OpenIMClient.uploadFile", + "OnPutFileListener", + "PutArgs" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OpenIMClient.uploadFile", + "OnPutFileListener", + "PutArgs" + ], + "reason": null + } } }, "redirectTo": null @@ -4088,10 +5465,14 @@ } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "Conceptual overview without a code example." + } } }, "redirectTo": null @@ -4105,7 +5486,9 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingInvitationInfo.java" ], - "sdkMethods": ["signalingInvite"], + "sdkMethods": [ + "signalingInvite" + ], "sdkEvents": [], "locales": { "zh": { @@ -4114,15 +5497,25 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.signalingInvite", "SignalingInvitationInfo"], + "evidence": [ + "SignalingManager.signalingInvite", + "SignalingInvitationInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingInvite", + "SignalingInvitationInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -4136,7 +5529,9 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingInvitationInfo.java" ], - "sdkMethods": ["signalingInviteInGroup"], + "sdkMethods": [ + "signalingInviteInGroup" + ], "sdkEvents": [], "locales": { "zh": { @@ -4145,15 +5540,25 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.signalingInviteInGroup", "SignalingInvitationInfo"], + "evidence": [ + "SignalingManager.signalingInviteInGroup", + "SignalingInvitationInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingInviteInGroup", + "SignalingInvitationInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -4166,7 +5571,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" ], - "sdkMethods": ["signalingAccept"], + "sdkMethods": [ + "signalingAccept" + ], "sdkEvents": [], "locales": { "zh": { @@ -4175,15 +5582,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.signalingAccept"], + "evidence": [ + "SignalingManager.signalingAccept" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingAccept" + ], + "reason": null + } } }, "redirectTo": null @@ -4196,7 +5611,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" ], - "sdkMethods": ["signalingReject"], + "sdkMethods": [ + "signalingReject" + ], "sdkEvents": [], "locales": { "zh": { @@ -4205,15 +5622,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.signalingReject"], + "evidence": [ + "SignalingManager.signalingReject" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingReject" + ], + "reason": null + } } }, "redirectTo": null @@ -4226,7 +5651,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" ], - "sdkMethods": ["signalingCancel"], + "sdkMethods": [ + "signalingCancel" + ], "sdkEvents": [], "locales": { "zh": { @@ -4235,15 +5662,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.signalingCancel"], + "evidence": [ + "SignalingManager.signalingCancel" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingCancel" + ], + "reason": null + } } }, "redirectTo": null @@ -4256,7 +5691,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" ], - "sdkMethods": ["signalingHungUp"], + "sdkMethods": [ + "signalingHungUp" + ], "sdkEvents": [], "locales": { "zh": { @@ -4265,15 +5702,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.signalingHungUp"], + "evidence": [ + "SignalingManager.signalingHungUp" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingHungUp" + ], + "reason": null + } } }, "redirectTo": null @@ -4288,7 +5733,9 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnSignalingListener.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/_SignalingListener.java" ], - "sdkMethods": ["setSignalingListener"], + "sdkMethods": [ + "setSignalingListener" + ], "sdkEvents": [ "onHangup", "onInvitationCancelled", @@ -4309,15 +5756,25 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.setSignalingListener", "_SignalingListener"], + "evidence": [ + "SignalingManager.setSignalingListener", + "_SignalingListener" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.setSignalingListener", + "_SignalingListener" + ], + "reason": null + } } }, "redirectTo": null @@ -4330,7 +5787,9 @@ "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" ], - "sdkMethods": ["getSignalingInvitationInfoStartApp"], + "sdkMethods": [ + "getSignalingInvitationInfoStartApp" + ], "sdkEvents": [], "locales": { "zh": { @@ -4339,15 +5798,23 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.getSignalingInvitationInfoStartApp"], + "evidence": [ + "SignalingManager.getSignalingInvitationInfoStartApp" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.getSignalingInvitationInfoStartApp" + ], + "reason": null + } } }, "redirectTo": null @@ -4361,7 +5828,9 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/RoomCallingInfo.java" ], - "sdkMethods": ["signalingGetRoomByGroupID"], + "sdkMethods": [ + "signalingGetRoomByGroupID" + ], "sdkEvents": [], "locales": { "zh": { @@ -4370,15 +5839,25 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.signalingGetRoomByGroupID", "RoomCallingInfo"], + "evidence": [ + "SignalingManager.signalingGetRoomByGroupID", + "RoomCallingInfo" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingGetRoomByGroupID", + "RoomCallingInfo" + ], + "reason": null + } } }, "redirectTo": null @@ -4392,7 +5871,9 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingCertificate.java" ], - "sdkMethods": ["signalingGetTokenByRoomID"], + "sdkMethods": [ + "signalingGetTokenByRoomID" + ], "sdkEvents": [], "locales": { "zh": { @@ -4401,15 +5882,25 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.signalingGetTokenByRoomID", "SignalingCertificate"], + "evidence": [ + "SignalingManager.signalingGetTokenByRoomID", + "SignalingCertificate" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingGetTokenByRoomID", + "SignalingCertificate" + ], + "reason": null + } } }, "redirectTo": null @@ -4424,8 +5915,12 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnSignalingListener.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/CustomSignalingInfo.java" ], - "sdkMethods": ["signalingSendCustomSignal"], - "sdkEvents": ["onReceiveCustomSignal"], + "sdkMethods": [ + "signalingSendCustomSignal" + ], + "sdkEvents": [ + "onReceiveCustomSignal" + ], "locales": { "zh": { "reviewStatus": "published", @@ -4433,15 +5928,25 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["SignalingManager.signalingSendCustomSignal", "OnSignalingListener.onReceiveCustomSignal"], + "evidence": [ + "SignalingManager.signalingSendCustomSignal", + "OnSignalingListener.onReceiveCustomSignal" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingSendCustomSignal", + "OnSignalingListener.onReceiveCustomSignal" + ], + "reason": null + } } }, "redirectTo": null @@ -4470,15 +5975,25 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["ConversationManager.setOnConversationListener", "OnConversationListener"], + "evidence": [ + "ConversationManager.setOnConversationListener", + "OnConversationListener" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.setOnConversationListener", + "OnConversationListener" + ], + "reason": null + } } }, "redirectTo": null @@ -4494,7 +6009,10 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/enums/LogLevel.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/utils/ParamsUtil.java" ], - "sdkMethods": ["logs", "uploadLogs"], + "sdkMethods": [ + "logs", + "uploadLogs" + ], "sdkEvents": [], "locales": { "zh": { @@ -4503,15 +6021,29 @@ "reviewedAt": "2026-08-07", "exampleVerification": { "status": "verified", - "evidence": ["OpenIMClient.logs", "OpenIMClient.uploadLogs", "InitConfig", "LogLevel"], + "evidence": [ + "OpenIMClient.logs", + "OpenIMClient.uploadLogs", + "InitConfig", + "LogLevel" + ], "reason": null } }, "en": { - "reviewStatus": "deferred", - "reviewer": null, - "reviewedAt": null, - "exampleVerification": { "status": "pending", "evidence": [], "reason": null } + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OpenIMClient.logs", + "OpenIMClient.uploadLogs", + "InitConfig", + "LogLevel" + ], + "reason": null + } } }, "redirectTo": null diff --git a/data/structure/android-navigation-labels.json b/data/structure/android-navigation-labels.json index 49d8fbb708..e75bc1a784 100644 --- a/data/structure/android-navigation-labels.json +++ b/data/structure/android-navigation-labels.json @@ -26,7 +26,7 @@ "get-users-info": "获取指定用户资料", "Get the current user profile": "获取当前用户资料", "get-self-local-user-info": "获取当前用户资料", - "Update the current user profile": "更新当前用户资料", + "Update your profile": "更新当前用户资料", "set-self-info": "更新当前用户资料", "Set global message reception": "设置全局消息接收方式", "set-global-message-reception": "设置全局消息接收方式", @@ -88,6 +88,8 @@ "Get subscribed user online status": "查询已订阅用户状态", "Refresh subscribed user status": "查询已订阅用户状态", "get-subscribe-online-users-status": "查询已订阅用户状态", + "Unsubscribe from user status": "取消用户状态订阅", + "unsubscribe-users-online-status": "取消用户状态订阅", "Conversation": "会话", "conversation": "会话", "Conversation overview": "会话概览", @@ -144,24 +146,24 @@ "profile-and-settings": "群资料与设置", "Create a group": "创建群组", "create-group": "创建群组", - "Update group profile": "更新群资料", - "update-group-profile": "更新群资料", - "Publish a group announcement": "发布群公告", - "set-group-announcement": "发布群公告", - "Set group extra data": "设置群扩展字段", - "set-group-extension": "设置群扩展字段", - "Group permissions": "群权限", - "permissions": "群权限", + "Update group profile": "更新群名称、简介和头像", + "update-group-profile": "更新群名称、简介和头像", + "Publish a group announcement": "发布或更新群公告", + "set-group-announcement": "发布或更新群公告", + "Set group extra data": "设置群组扩展字段", + "set-group-extension": "设置群组扩展字段", + "Group permissions": "群权限与管理", + "permissions": "群权限与管理", "Set group join verification": "设置入群验证方式", "set-group-join-verification": "设置入群验证方式", "Set member profile access": "设置成员资料查看权限", "set-group-member-profile-access": "设置成员资料查看权限", - "Set member friend request permission": "设置成员好友申请权限", - "set-group-member-friend-permission": "设置成员好友申请权限", - "Change group mute status": "设置全员禁言", - "change-group-mute": "设置全员禁言", - "Joining and leaving groups": "加入与退出群组", - "joining-and-leaving": "加入与退出群组", + "Set member friend request permission": "设置群内添加好友权限", + "set-group-member-friend-permission": "设置群内添加好友权限", + "Change group mute status": "设置群组全员禁言", + "change-group-mute": "设置群组全员禁言", + "Joining and leaving groups": "加入、退出与解散群组", + "joining-and-leaving": "加入、退出与解散群组", "Apply to join a group": "申请加入群组", "join-group": "申请加入群组", "Leave a group": "退出群组", @@ -170,58 +172,58 @@ "dismiss-group": "解散群组", "Retrieving groups": "查询群组", "retrieving-groups": "查询群组", - "Get group information": "获取群资料", - "get-specified-groups-info": "获取群资料", + "Get group information": "查询指定群组资料", + "get-specified-groups-info": "查询指定群组资料", "Get joined groups by page": "分页获取已加入群组", "get-joined-group-list-page": "分页获取已加入群组", - "Check group membership": "检查是否加入群组", - "is-join-group": "检查是否加入群组", + "Check group membership": "检查是否已加入群组", + "is-join-group": "检查是否已加入群组", "Search groups": "搜索群组", "search-groups": "搜索群组", - "Group applications": "群申请", - "group-applications": "群申请", - "Group applications overview": "群申请概览", - "overview-group-applications": "群申请概览", - "Get received group applications": "获取收到的群申请", - "get-group-application-list-as-recipient": "获取收到的群申请", - "Get sent group applications": "获取发出的群申请", - "get-group-application-list-as-applicant": "获取发出的群申请", - "Accept a group application": "同意群申请", - "accept-group-application": "同意群申请", - "Reject a group application": "拒绝群申请", - "refuse-group-application": "拒绝群申请", + "Group applications": "入群申请", + "group-applications": "入群申请", + "Group applications overview": "入群申请概览", + "overview-group-applications": "入群申请概览", + "Get received group applications": "获取收到的入群申请", + "get-group-application-list-as-recipient": "获取收到的入群申请", + "Get sent group applications": "获取发出的入群申请", + "get-group-application-list-as-applicant": "获取发出的入群申请", + "Accept a group application": "接受入群申请", + "accept-group-application": "接受入群申请", + "Reject a group application": "拒绝入群申请", + "refuse-group-application": "拒绝入群申请", "Retrieving group members": "查询群成员", "retrieving-group-members": "查询群成员", "Group member queries overview": "群成员查询概览", "overview-retrieving-group-members": "群成员查询概览", - "Get group members": "获取群成员列表", - "get-group-member-list": "获取群成员列表", - "Get group member profiles": "获取群成员资料", - "get-specified-group-members-info": "获取群成员资料", - "Check users in a group": "检查用户是否在群内", - "get-users-in-group": "检查用户是否在群内", + "Get group members": "分页查询群成员", + "get-group-member-list": "分页查询群成员", + "Get group member profiles": "查询指定群成员资料", + "get-specified-group-members-info": "查询指定群成员资料", + "Check users in a group": "查询用户入群状态", + "get-users-in-group": "查询用户入群状态", "Get group owners and admins": "获取群主和管理员", "get-group-member-owner-and-admin": "获取群主和管理员", "Search group members": "搜索群成员", "search-group-members": "搜索群成员", "Managing group members": "管理群成员", "managing-group-members": "管理群成员", - "Invite users to a group": "邀请用户入群", - "invite-user-to-group": "邀请用户入群", + "Invite users to a group": "邀请用户加入群组", + "invite-user-to-group": "邀请用户加入群组", "Remove group members": "移除群成员", "kick-group-member": "移除群成员", - "Update a group nickname": "更新群昵称", - "set-group-member-nickname": "更新群昵称", - "Manage group administrators": "管理群管理员", - "set-group-member-role-level": "管理群管理员", + "Update a group nickname": "修改群内昵称", + "set-group-member-nickname": "修改群内昵称", + "Manage group administrators": "设置管理员", + "set-group-member-role-level": "设置管理员", "Update a group member avatar": "更新群成员头像", "set-group-member-avatar": "更新群成员头像", "Set group member extra data": "设置群成员扩展字段", "set-group-member-extension": "设置群成员扩展字段", "Transfer group ownership": "转让群主", "transfer-group-owner": "转让群主", - "Mute or unmute a group member": "禁言或解除禁言群成员", - "change-group-member-mute": "禁言或解除禁言群成员", + "Mute or unmute a group member": "设置群成员禁言", + "change-group-member-mute": "设置群成员禁言", "Message": "消息", "message": "消息", "Message overview": "消息概览", @@ -234,30 +236,47 @@ "create-text-at-message": "创建 @ 消息", "Create a custom message": "创建自定义消息", "create-custom-message": "创建自定义消息", - "Create an image message from a file": "从文件创建图片消息", - "create-image-message-by-file": "从文件创建图片消息", - "Create an image message from a URL": "从 URL 创建图片消息", - "create-image-message-by-url": "从 URL 创建图片消息", - "Create an audio message from a file": "从文件创建音频消息", - "create-sound-message-by-file": "从文件创建音频消息", - "Create an audio message from a URL": "从 URL 创建音频消息", - "create-sound-message-by-url": "从 URL 创建音频消息", - "Create a video message from a file": "从文件创建视频消息", - "create-video-message-by-file": "从文件创建视频消息", - "Create a video message from a URL": "从 URL 创建视频消息", - "create-video-message-by-url": "从 URL 创建视频消息", - "Create a file message from a file": "从文件创建文件消息", - "create-file-message-by-file": "从文件创建文件消息", - "Create a file message from a URL": "从 URL 创建文件消息", - "create-file-message-by-url": "从 URL 创建文件消息", + "Create an image message": "创建图片消息", + "create-image-message": "创建图片消息", + "Create an image message from a file": "使用本地路径创建图片消息", + "Create an image message from a path": "使用本地路径创建图片消息", + "create-image-message-by-file": "使用本地路径创建图片消息", + "Create an image message from a URL": "使用 URL 创建图片消息", + "Create an image message from URLs": "使用 URL 创建图片消息", + "create-image-message-by-url": "使用 URL 创建图片消息", + "Create an audio message": "创建音频消息", + "create-sound-message": "创建音频消息", + "Create an audio message from a file": "使用本地路径创建音频消息", + "Create an audio message from a path": "使用本地路径创建音频消息", + "create-sound-message-by-file": "使用本地路径创建音频消息", + "Create an audio message from a URL": "使用 URL 创建音频消息", + "create-sound-message-by-url": "使用 URL 创建音频消息", + "Create a video message": "创建视频消息", + "create-video-message": "创建视频消息", + "Create a video message from a file": "使用本地路径创建视频消息", + "Create a video message from a path": "使用本地路径创建视频消息", + "create-video-message-by-file": "使用本地路径创建视频消息", + "Create a video message from a URL": "使用 URL 创建视频消息", + "create-video-message-by-url": "使用 URL 创建视频消息", + "Create a file message": "创建文件消息", + "create-file-message": "创建文件消息", + "Create a file message from a file": "使用本地路径创建文件消息", + "Create a file message from a path": "使用本地路径创建文件消息", + "create-file-message-by-file": "使用本地路径创建文件消息", + "Create a file message from a URL": "使用 URL 创建文件消息", + "create-file-message-by-url": "使用 URL 创建文件消息", "Create a contact card message": "创建名片消息", "create-card-message": "创建名片消息", "Create a location message": "创建位置消息", "create-location-message": "创建位置消息", "Create an emoji message": "创建表情消息", "create-face-message": "创建表情消息", - "Create a reply message": "创建引用消息", - "create-quote-message": "创建引用消息", + "Create a reply message": "创建回复消息", + "create-quote-message": "创建回复消息", + "Create rich text": "创建富文本消息", + "create-advanced-text-message": "创建富文本消息", + "Create a rich reply": "创建富文本回复", + "create-advanced-quote-message": "创建富文本回复", "Create a forwarded message": "创建转发消息", "create-forward-message": "创建转发消息", "Create a merged message": "创建合并消息", @@ -266,10 +285,10 @@ "sending-messages": "发送消息", "Send a message": "发送消息", "send-message": "发送消息", - "Send a message without OSS": "发送非 OSS 消息", - "send-message-not-oss": "发送非 OSS 消息", - "Track message sending progress": "跟踪消息发送进度", - "set-msg-send-progress-listener": "跟踪消息发送进度", + "Send a message without OSS": "发送不经 OSS 的消息", + "send-message-not-oss": "发送不经 OSS 的消息", + "Track message sending progress": "监听消息发送进度", + "set-msg-send-progress-listener": "监听消息发送进度", "Receiving messages": "接收消息", "receiving-messages": "接收消息", "Receive messages": "接收消息", @@ -278,60 +297,77 @@ "receive-custom-business-messages": "接收自定义业务消息", "Retrieving messages": "查询消息", "retrieving-messages": "查询消息", - "Load older messages": "加载更早消息", - "load-older-messages": "加载更早消息", - "Load newer messages": "加载更新消息", - "load-newer-messages": "加载更新消息", - "Find messages by ID": "按 ID 查询消息", - "find-messages-by-id": "按 ID 查询消息", + "Load older messages": "加载历史消息", + "load-older-messages": "加载历史消息", + "Load newer messages": "反向加载历史消息", + "load-newer-messages": "反向加载历史消息", + "Find messages by ID": "按 ID 查找消息", + "find-messages-by-id": "按 ID 查找消息", + "Load message context": "读取消息上下文", + "load-message-context": "读取消息上下文", "Search messages": "搜索消息", "search-messages": "搜索消息", "Composing messages": "编辑消息", "composing-messages": "编辑消息", - "Update typing status": "更新输入状态", - "update-typing-status": "更新输入状态", + "Update typing status": "上报输入状态", + "update-typing-status": "上报输入状态", + "Get typing status": "查询输入状态", + "get-typing-status": "查询输入状态", "Managing messages": "管理消息", "managing-messages": "管理消息", "Delete a local message": "删除本地消息", "delete-local-message": "删除本地消息", - "Delete saved messages": "删除已保存消息", - "delete-saved-messages": "删除已保存消息", + "Delete a message": "批量删除消息", + "Delete a saved message": "批量删除消息", + "Delete saved messages": "批量删除消息", + "Delete messages in a batch": "批量删除消息", + "delete-saved-messages": "批量删除消息", + "Delete messages from a user": "删除群聊中指定用户的全部消息", + "Delete all messages from a user in a group chat": "删除群聊中指定用户的全部消息", + "delete-user-messages": "删除群聊中指定用户的全部消息", "Revoke a message": "撤回消息", "revoke-a-message": "撤回消息", "Modify a message": "修改消息", "modify-a-message": "修改消息", - "View pinned messages": "查看置顶消息", - "get-pinned-messages": "查看置顶消息", + "View pinned messages": "查询会话置顶消息", + "get-pinned-messages": "查询会话置顶消息", "Pin or unpin a message": "置顶或取消置顶消息", "set-message-pinned": "置顶或取消置顶消息", "Insert a local direct message": "插入本地单聊消息", "insert-local-single-message": "插入本地单聊消息", "Insert a local group message": "插入本地群聊消息", "insert-local-group-message": "插入本地群聊消息", - "Clear all local messages": "清空全部本地消息", - "clear-all-local-messages": "清空全部本地消息", - "Clear all saved messages": "清空全部已保存消息", - "clear-all-messages": "清空全部已保存消息", - "Set local message extensions": "设置消息本地扩展字段", - "set-message-local-ex": "设置消息本地扩展字段", + "Clear all local messages": "清理全部本地消息", + "clear-all-local-messages": "清理全部本地消息", + "Clear all saved messages": "清理全部消息", + "clear-all-messages": "清理全部消息", + "Set local message extensions": "设置消息本地扩展", + "set-message-local-ex": "设置消息本地扩展", + "Group message read status": "群消息已读状态", + "group-message-read-status": "群消息已读状态", + "Send group read receipts": "上报群消息已读", + "Report group messages as read": "上报群消息已读", + "send-group-read-receipts": "上报群消息已读", + "View group message readers": "查询群消息已读成员", + "Get members who read a group message": "查询群消息已读成员", + "get-group-message-readers": "查询群消息已读成员", "Create an @ message": "创建 @ 消息", - "Create a video message from files": "从文件创建视频消息", - "Create a video message from URLs": "从 URL 创建视频消息", + "Create a video message from files": "使用本地路径创建视频消息", + "Create a video message from URLs": "使用 URL 创建视频消息", "Create a merged forward message": "创建合并转发消息", - "Send an uploaded media message": "发送已上传媒体消息", + "Send an uploaded media message": "发送不经 OSS 的消息", "Load message history": "加载历史消息", - "Load message history in reverse": "逆序加载历史消息", + "Load message history in reverse": "反向加载历史消息", "Report typing status": "上报输入状态", - "Delete messages in a batch": "批量删除消息", - "Get pinned messages in a conversation": "获取会话置顶消息", + "Get pinned messages in a conversation": "查询会话置顶消息", "Insert a local one-to-one message": "插入本地单聊消息", "Insert a local group message": "插入本地群聊消息", - "Clear local and server messages": "清空本地和服务端消息", - "Set a local message extension": "设置消息本地扩展字段", + "Clear local and server messages": "清理全部消息", + "Set a local message extension": "设置消息本地扩展", "File uploads": "文件上传", "file-uploads": "文件上传", - "Track file upload progress": "跟踪文件上传进度", - "track-file-upload-progress": "跟踪文件上传进度", + "Track file upload progress": "监听文件上传进度", + "track-file-upload-progress": "监听文件上传进度", "Upload a file": "上传文件", "upload-file": "上传文件", "Calling": "音视频通话", diff --git a/data/structure/android-sidebar.json b/data/structure/android-sidebar.json index 004995928a..c1cef64e32 100644 --- a/data/structure/android-sidebar.json +++ b/data/structure/android-sidebar.json @@ -44,6 +44,10 @@ { "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", "navigationTitle": "Refresh subscribed user status" + }, + { + "path": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "navigationTitle": "Unsubscribe from user status" } ] } @@ -407,18 +411,54 @@ "/sdk/android/message/creating-messages/create-text-message", "/sdk/android/message/creating-messages/create-text-at-message", "/sdk/android/message/creating-messages/create-custom-message", - "/sdk/android/message/creating-messages/create-image-message-by-file", + { + "path": "/sdk/android/message/creating-messages/create-image-message", + "navigationTitle": "Create an image message" + }, + { + "path": "/sdk/android/message/creating-messages/create-image-message-by-file", + "navigationTitle": "Create an image message from a path" + }, "/sdk/android/message/creating-messages/create-image-message-by-url", - "/sdk/android/message/creating-messages/create-sound-message-by-file", + { + "path": "/sdk/android/message/creating-messages/create-sound-message", + "navigationTitle": "Create an audio message" + }, + { + "path": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "navigationTitle": "Create an audio message from a path" + }, "/sdk/android/message/creating-messages/create-sound-message-by-url", - "/sdk/android/message/creating-messages/create-video-message-by-file", + { + "path": "/sdk/android/message/creating-messages/create-video-message", + "navigationTitle": "Create a video message" + }, + { + "path": "/sdk/android/message/creating-messages/create-video-message-by-file", + "navigationTitle": "Create a video message from a path" + }, "/sdk/android/message/creating-messages/create-video-message-by-url", - "/sdk/android/message/creating-messages/create-file-message-by-file", + { + "path": "/sdk/android/message/creating-messages/create-file-message", + "navigationTitle": "Create a file message" + }, + { + "path": "/sdk/android/message/creating-messages/create-file-message-by-file", + "navigationTitle": "Create a file message from a path" + }, "/sdk/android/message/creating-messages/create-file-message-by-url", "/sdk/android/message/creating-messages/create-card-message", "/sdk/android/message/creating-messages/create-location-message", "/sdk/android/message/creating-messages/create-face-message", "/sdk/android/message/creating-messages/create-quote-message", + { + "path": "/sdk/android/message/creating-messages/create-advanced-text-message", + "navigationTitle": "Create rich text" + }, + { + "path": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "navigationTitle": "Create a rich reply" + }, "/sdk/android/message/creating-messages/create-forward-message", "/sdk/android/message/creating-messages/create-merger-message" ] @@ -444,16 +484,40 @@ "/sdk/android/message/retrieving-messages/load-older-messages", "/sdk/android/message/retrieving-messages/load-newer-messages", "/sdk/android/message/retrieving-messages/find-messages-by-id", + { + "path": "/sdk/android/message/retrieving-messages/load-message-context", + "navigationTitle": "Load message context" + }, "/sdk/android/message/searching-messages/search-messages" ] }, - "/sdk/android/message/composing-messages/update-typing-status", + { + "id": "message/composing-messages", + "title": "Composing messages", + "children": [ + { + "path": "/sdk/android/message/composing-messages/update-typing-status", + "navigationTitle": "Update typing status" + }, + { + "path": "/sdk/android/message/composing-messages/get-typing-status", + "navigationTitle": "Get typing status" + } + ] + }, { "id": "message/managing-messages", "title": "Managing messages", "children": [ "/sdk/android/message/managing-messages/delete-local-message", - "/sdk/android/message/managing-messages/delete-saved-messages", + { + "path": "/sdk/android/message/managing-messages/delete-saved-messages", + "navigationTitle": "Delete saved messages" + }, + { + "path": "/sdk/android/message/managing-messages/delete-user-messages", + "navigationTitle": "Delete messages from a user" + }, "/sdk/android/message/managing-messages/revoke-a-message", "/sdk/android/message/managing-messages/modify-a-message", "/sdk/android/message/managing-messages/get-pinned-messages", @@ -464,6 +528,20 @@ "/sdk/android/message/managing-messages/clear-all-messages", "/sdk/android/message/managing-messages/set-message-local-ex" ] + }, + { + "id": "message/group-message-read-status", + "title": "Group message read status", + "children": [ + { + "path": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "navigationTitle": "Send group read receipts" + }, + { + "path": "/sdk/android/message/managing-read-status/get-group-message-readers", + "navigationTitle": "View group message readers" + } + ] } ] }, diff --git a/data/structure/chat-pages.json b/data/structure/chat-pages.json index 1388e302d1..8417219876 100644 --- a/data/structure/chat-pages.json +++ b/data/structure/chat-pages.json @@ -1,6579 +1,6675 @@ [ { - "sourcePath": "/sdk/ios/overview", - "openimPath": "/sdk/ios/overview", - "title": "OpenIM SDK for iOS", - "context": "chat/sdk/ios", + "sourcePath": "/platform-api/overview", + "openimPath": "/platform-api/overview", + "title": "Overview", + "context": "chat/platform-api", "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/overview.mdx" + "contentFile": "content/docs/chat/platform-api/overview.mdx" }, { - "sourcePath": "/sdk/ios/getting-started/before-you-start", - "openimPath": "/sdk/ios/getting-started/before-you-start", - "title": "Before you start", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/getting-started/before-you-start.mdx" + "sourcePath": "/platform-api/prepare-to-use-api", + "openimPath": "/platform-api/prepare-to-use-api", + "title": "Prepare to use the API", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/prepare-to-use-api.mdx" }, { - "sourcePath": "/sdk/ios/getting-started/environment-specific-implementation", - "openimPath": "/sdk/ios/getting-started/environment-specific-implementation", - "title": "Environment-specific implementation", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/getting-started/environment-specific-implementation.mdx" + "sourcePath": "/platform-api/user/overview", + "openimPath": "/platform-api/user/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/user/overview.mdx" }, { - "sourcePath": "/sdk/ios/getting-started/authenticate-and-manage-session", - "openimPath": "/sdk/ios/getting-started/authenticate-and-manage-session", - "title": "Authenticate and manage a session", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/getting-started/authenticate-and-manage-session.mdx" + "sourcePath": "/platform-api/user/listing-users/list-users", + "openimPath": "/platform-api/user/listing-users/list-users", + "title": "List users", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/listing-users/list-users.mdx" }, { - "sourcePath": "/sdk/ios/getting-started/send-first-message", - "openimPath": "/sdk/ios/getting-started/send-first-message", - "title": "Send your first message", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/getting-started/send-first-message.mdx" + "sourcePath": "/platform-api/user/listing-users/list-all-user-ids", + "openimPath": "/platform-api/user/listing-users/list-all-user-ids", + "title": "List all user IDs", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/listing-users/list-all-user-ids.mdx" }, { - "sourcePath": "/sdk/ios/user/overview-user", - "openimPath": "/sdk/ios/user/overview-user", - "title": "Overview", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/overview-user.mdx" + "sourcePath": "/platform-api/user/listing-users/check-user-accounts", + "openimPath": "/platform-api/user/listing-users/check-user-accounts", + "title": "Check user accounts", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/listing-users/check-user-accounts.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-users/retrieve-users", - "openimPath": "/sdk/ios/user/retrieving-users/retrieve-users", - "title": "Retrieve users", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-users/retrieve-users.mdx" + "sourcePath": "/platform-api/user/listing-users/get-a-user", + "openimPath": "/platform-api/user/listing-users/get-a-user", + "title": "Get a user", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/listing-users/get-a-user.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile", - "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile", - "title": "View your profile", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile.mdx" + "sourcePath": "/platform-api/user/creating-users/create-a-user", + "openimPath": "/platform-api/user/creating-users/create-a-user", + "title": "Create a user", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/creating-users/create-a-user.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile", - "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile", - "title": "Update your profile", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile.mdx" + "sourcePath": "/platform-api/user/managing-users/update-a-user", + "openimPath": "/platform-api/user/managing-users/update-a-user", + "title": "Update a user", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/managing-users/update-a-user.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception", - "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception", - "title": "Set global message reception", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception.mdx" + "sourcePath": "/platform-api/user/presence/get-users-online-status", + "openimPath": "/platform-api/user/presence/get-users-online-status", + "title": "Get users' online status", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/presence/get-users-online-status.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status", - "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status", - "title": "Subscribe to user status", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status.mdx" + "sourcePath": "/platform-api/user/presence/get-users-online-token-detail", + "openimPath": "/platform-api/user/presence/get-users-online-token-detail", + "title": "Get users online token details", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/presence/get-users-online-token-detail.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status", - "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status", - "title": "Refresh subscribed user status", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status.mdx" + "sourcePath": "/platform-api/user/notification-accounts/add-notification-account", + "openimPath": "/platform-api/user/notification-accounts/add-notification-account", + "title": "Add a notification account", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/notification-accounts/add-notification-account.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status", - "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status", - "title": "Unsubscribe from user status", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status.mdx" + "sourcePath": "/platform-api/user/notification-accounts/update-notification-account", + "openimPath": "/platform-api/user/notification-accounts/update-notification-account", + "title": "Update a notification account", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/notification-accounts/update-notification-account.mdx" }, { - "sourcePath": "/sdk/ios/user/friends/get-friend-list-page", - "openimPath": "/sdk/ios/user/friends/get-friend-list-page", - "title": "Get the friend list", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friends/get-friend-list-page.mdx" + "sourcePath": "/platform-api/user/notification-accounts/search-notification-account", + "openimPath": "/platform-api/user/notification-accounts/search-notification-account", + "title": "Search notification accounts", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/notification-accounts/search-notification-account.mdx" }, { - "sourcePath": "/sdk/ios/user/friends/search-friends", - "openimPath": "/sdk/ios/user/friends/search-friends", - "title": "Search friends", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friends/search-friends.mdx" + "sourcePath": "/platform-api/relation/overview", + "openimPath": "/platform-api/relation/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/relation/overview.mdx" }, { - "sourcePath": "/sdk/ios/user/friends/get-specified-friends-info", - "openimPath": "/sdk/ios/user/friends/get-specified-friends-info", - "title": "Get friend profiles", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friends/get-specified-friends-info.mdx" + "sourcePath": "/platform-api/relation/managing-friend-requests/apply-to-add-friend", + "openimPath": "/platform-api/relation/managing-friend-requests/apply-to-add-friend", + "title": "Apply to add a friend", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/apply-to-add-friend.mdx" }, { - "sourcePath": "/sdk/ios/user/friends/check-friend", - "openimPath": "/sdk/ios/user/friends/check-friend", - "title": "Check friendship status", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friends/check-friend.mdx" + "sourcePath": "/platform-api/relation/managing-friend-requests/respond-friend-apply", + "openimPath": "/platform-api/relation/managing-friend-requests/respond-friend-apply", + "title": "Respond to a friend request", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/respond-friend-apply.mdx" }, { - "sourcePath": "/sdk/ios/user/friends/update-friends", - "openimPath": "/sdk/ios/user/friends/update-friends", - "title": "Update friend information", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friends/update-friends.mdx" + "sourcePath": "/platform-api/relation/managing-friend-requests/list-received-friend-requests", + "openimPath": "/platform-api/relation/managing-friend-requests/list-received-friend-requests", + "title": "List received friend requests", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/list-received-friend-requests.mdx" }, { - "sourcePath": "/sdk/ios/user/friends/delete-friend", - "openimPath": "/sdk/ios/user/friends/delete-friend", - "title": "Delete a friend", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friends/delete-friend.mdx" + "sourcePath": "/platform-api/relation/managing-friend-requests/list-sent-friend-requests", + "openimPath": "/platform-api/relation/managing-friend-requests/list-sent-friend-requests", + "title": "List sent friend requests", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/list-sent-friend-requests.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/add-friend", - "openimPath": "/sdk/ios/user/friend-applications/add-friend", - "title": "Send a friend application", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/add-friend.mdx" + "sourcePath": "/platform-api/relation/listing-friends/list-friends", + "openimPath": "/platform-api/relation/listing-friends/list-friends", + "title": "List friends", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/listing-friends/list-friends.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient", - "openimPath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient", - "title": "Get received friend applications", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient.mdx" + "sourcePath": "/platform-api/relation/listing-friends/get-designated-friends", + "openimPath": "/platform-api/relation/listing-friends/get-designated-friends", + "title": "Get designated friends", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/listing-friends/get-designated-friends.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant", - "openimPath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant", - "title": "Get sent friend applications", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant.mdx" + "sourcePath": "/platform-api/relation/managing-friends/delete-friend", + "openimPath": "/platform-api/relation/managing-friends/delete-friend", + "title": "Delete a friend", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friends/delete-friend.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-unhandled-count", - "openimPath": "/sdk/ios/user/friend-applications/get-friend-application-unhandled-count", - "title": "Get pending application count", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-unhandled-count.mdx" + "sourcePath": "/platform-api/error-codes", + "openimPath": "/platform-api/error-codes", + "title": "Error codes", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/error-codes.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/accept-friend-application", - "openimPath": "/sdk/ios/user/friend-applications/accept-friend-application", - "title": "Accept a friend application", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/accept-friend-application.mdx" + "sourcePath": "/platform-api/relation/managing-friends/import-friends", + "openimPath": "/platform-api/relation/managing-friends/import-friends", + "title": "Import friends", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friends/import-friends.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/refuse-friend-application", - "openimPath": "/sdk/ios/user/friend-applications/refuse-friend-application", - "title": "Reject a friend application", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/refuse-friend-application.mdx" + "sourcePath": "/platform-api/relation/managing-friends/update-friends", + "openimPath": "/platform-api/relation/managing-friends/update-friends", + "title": "Update friends", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friends/update-friends.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/delete-friend-requests", - "openimPath": "/sdk/ios/user/friend-applications/delete-friend-requests", - "title": "Delete friend applications", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/delete-friend-requests.mdx" + "sourcePath": "/platform-api/relation/blacklist/add-black", + "openimPath": "/platform-api/relation/blacklist/add-black", + "title": "Add to blacklist", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/blacklist/add-black.mdx" }, { - "sourcePath": "/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "openimPath": "/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "title": "Retrieve a list of blocked users", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx" + "sourcePath": "/platform-api/relation/blacklist/list-blacks", + "openimPath": "/platform-api/relation/blacklist/list-blacks", + "title": "List blacklisted users", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/blacklist/list-blacks.mdx" }, { - "sourcePath": "/sdk/ios/user/moderating-a-user/block-user", - "openimPath": "/sdk/ios/user/moderating-a-user/block-user", - "title": "Block a user", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/block-user.mdx" + "sourcePath": "/platform-api/relation/blacklist/remove-black", + "openimPath": "/platform-api/relation/blacklist/remove-black", + "title": "Remove from blacklist", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/blacklist/remove-black.mdx" }, { - "sourcePath": "/sdk/ios/user/moderating-a-user/unblock-user", - "openimPath": "/sdk/ios/user/moderating-a-user/unblock-user", - "title": "Unblock a user", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/unblock-user.mdx" + "sourcePath": "/platform-api/group/overview", + "openimPath": "/platform-api/group/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/group/overview.mdx" }, { - "sourcePath": "/sdk/ios/conversation/overview-conversation", - "openimPath": "/sdk/ios/conversation/overview-conversation", - "title": "Conversation overview", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/overview-conversation.mdx" + "sourcePath": "/platform-api/group/managing-groups/create-group", + "openimPath": "/platform-api/group/managing-groups/create-group", + "title": "Create group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/managing-groups/create-group.mdx" }, { - "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target", - "openimPath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target", - "title": "Open a conversation", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target.mdx" + "sourcePath": "/platform-api/group/managing-groups/set-group-info-ex", + "openimPath": "/platform-api/group/managing-groups/set-group-info-ex", + "title": "Set group info extension", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/managing-groups/set-group-info-ex.mdx" }, { - "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-id", - "openimPath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-id", - "title": "Resolve a conversation ID", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversation-id.mdx" + "sourcePath": "/platform-api/group/group-applications/join-group", + "openimPath": "/platform-api/group/group-applications/join-group", + "title": "Join group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-applications/join-group.mdx" }, { - "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id", - "openimPath": "/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id", - "title": "Get conversations by ID", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id.mdx" + "sourcePath": "/platform-api/group/group-membership/quit-group", + "openimPath": "/platform-api/group/group-membership/quit-group", + "title": "Quit group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-membership/quit-group.mdx" }, { - "sourcePath": "/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list", - "openimPath": "/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list", - "title": "Retrieve a conversation list", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list.mdx" + "sourcePath": "/platform-api/group/group-applications/respond-group-application", + "openimPath": "/platform-api/group/group-applications/respond-group-application", + "title": "Respond to a group application", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-applications/respond-group-application.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/pin-conversation", - "openimPath": "/sdk/ios/conversation/managing-conversations/pin-conversation", - "title": "Pin or unpin a conversation", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/pin-conversation.mdx" + "sourcePath": "/platform-api/group/managing-groups/transfer-group-owner", + "openimPath": "/platform-api/group/managing-groups/transfer-group-owner", + "title": "Transfer group owner", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/managing-groups/transfer-group-owner.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-conversation-extension", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-conversation-extension", - "title": "Set conversation extra data", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-conversation-extension.mdx" + "sourcePath": "/platform-api/group/group-applications/list-received-group-applications", + "openimPath": "/platform-api/group/group-applications/list-received-group-applications", + "title": "List received group applications", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-applications/list-received-group-applications.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-conversation-draft", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-conversation-draft", - "title": "Set a conversation draft", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-conversation-draft.mdx" + "sourcePath": "/platform-api/group/group-applications/list-user-requested-group-applications", + "openimPath": "/platform-api/group/group-applications/list-user-requested-group-applications", + "title": "List user requested group applications", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-applications/list-user-requested-group-applications.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-receive-option", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-receive-option", - "title": "Set message reception", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-receive-option.mdx" + "sourcePath": "/platform-api/group/group-applications/list-group-users-request-applications", + "openimPath": "/platform-api/group/group-applications/list-group-users-request-applications", + "title": "List group users request applications", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-applications/list-group-users-request-applications.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/clear-group-mentions", - "openimPath": "/sdk/ios/conversation/managing-conversations/clear-group-mentions", - "title": "Reset group mention status", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/clear-group-mentions.mdx" + "sourcePath": "/platform-api/group/group-applications/get-specified-user-group-request-info", + "openimPath": "/platform-api/group/group-applications/get-specified-user-group-request-info", + "title": "Get specified user group request info", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-applications/get-specified-user-group-request-info.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/mark-conversation-read", - "openimPath": "/sdk/ios/conversation/managing-conversations/mark-conversation-read", - "title": "Mark a conversation as read", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/mark-conversation-read.mdx" + "sourcePath": "/platform-api/group/managing-groups/get-groups-info", + "openimPath": "/platform-api/group/managing-groups/get-groups-info", + "title": "Get groups info", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/managing-groups/get-groups-info.mdx" + }, + { + "sourcePath": "/platform-api/group/group-members/kick-group-members", + "openimPath": "/platform-api/group/group-members/kick-group-members", + "title": "Kick group members", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-members/kick-group-members.mdx" + }, + { + "sourcePath": "/platform-api/group/group-members/get-group-members-info", + "openimPath": "/platform-api/group/group-members/get-group-members-info", + "title": "Get group members info", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-members/get-group-members-info.mdx" + }, + { + "sourcePath": "/platform-api/group/group-members/get-group-member-list", + "openimPath": "/platform-api/group/group-members/get-group-member-list", + "title": "Get group member list", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-members/get-group-member-list.mdx" + }, + { + "sourcePath": "/platform-api/group/group-members/invite-users-to-group", + "openimPath": "/platform-api/group/group-members/invite-users-to-group", + "title": "Invite users to group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-members/invite-users-to-group.mdx" + }, + { + "sourcePath": "/platform-api/group/group-membership/get-joined-group-list", + "openimPath": "/platform-api/group/group-membership/get-joined-group-list", + "title": "Get joined group list", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-membership/get-joined-group-list.mdx" + }, + { + "sourcePath": "/platform-api/group/managing-groups/dismiss-group", + "openimPath": "/platform-api/group/managing-groups/dismiss-group", + "title": "Dismiss group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/managing-groups/dismiss-group.mdx" + }, + { + "sourcePath": "/platform-api/group/group-moderation/mute-group-member", + "openimPath": "/platform-api/group/group-moderation/mute-group-member", + "title": "Mute group member", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-moderation/mute-group-member.mdx" + }, + { + "sourcePath": "/platform-api/group/group-moderation/cancel-mute-group-member", + "openimPath": "/platform-api/group/group-moderation/cancel-mute-group-member", + "title": "Cancel mute group member", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-moderation/cancel-mute-group-member.mdx" + }, + { + "sourcePath": "/platform-api/group/group-moderation/mute-group", + "openimPath": "/platform-api/group/group-moderation/mute-group", + "title": "Mute group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-moderation/mute-group.mdx" + }, + { + "sourcePath": "/platform-api/group/group-moderation/cancel-mute-group", + "openimPath": "/platform-api/group/group-moderation/cancel-mute-group", + "title": "Cancel mute group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-moderation/cancel-mute-group.mdx" + }, + { + "sourcePath": "/platform-api/group/group-members/set-group-member-info", + "openimPath": "/platform-api/group/group-members/set-group-member-info", + "title": "Set group member info", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-members/set-group-member-info.mdx" + }, + { + "sourcePath": "/platform-api/auth/overview", + "openimPath": "/platform-api/auth/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/auth/overview.mdx" + }, + { + "sourcePath": "/platform-api/auth/tokens/get-admin-token", + "openimPath": "/platform-api/auth/tokens/get-admin-token", + "title": "Get an administrator token", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/auth/tokens/get-admin-token.mdx" + }, + { + "sourcePath": "/platform-api/auth/tokens/get-user-token", + "openimPath": "/platform-api/auth/tokens/get-user-token", + "title": "Get a user token", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/auth/tokens/get-user-token.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/get-total-unread-count", - "openimPath": "/sdk/ios/conversation/managing-conversations/get-total-unread-count", - "title": "Track the total unread count", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/get-total-unread-count.mdx" + "sourcePath": "/platform-api/auth/sessions/force-logout", + "openimPath": "/platform-api/auth/sessions/force-logout", + "title": "Force logout", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/auth/sessions/force-logout.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-private-chat", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-private-chat", - "title": "Set private chat", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-private-chat.mdx" + "sourcePath": "/platform-api/message/overview", + "openimPath": "/platform-api/message/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/message/overview.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-burn-duration", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-burn-duration", - "title": "Set the burn duration", - "context": "chat/sdk/ios", + "sourcePath": "/platform-api/message/message-content-types", + "openimPath": "/platform-api/message/message-content-types", + "title": "Message content types", + "context": "chat/platform-api", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-burn-duration.mdx" + "contentFile": "content/docs/chat/platform-api/message/message-content-types.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-destruct", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-destruct", - "title": "Schedule server message deletion", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-destruct.mdx" + "sourcePath": "/platform-api/message/sending-messages/send-msg", + "openimPath": "/platform-api/message/sending-messages/send-msg", + "title": "Send a message", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/message/sending-messages/send-msg.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-destruct-time", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-destruct-time", - "title": "Set server message deletion period", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-destruct-time.mdx" + "sourcePath": "/platform-api/message/sending-messages/batch-send-msg", + "openimPath": "/platform-api/message/sending-messages/batch-send-msg", + "title": "Batch send messages", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/message/sending-messages/batch-send-msg.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/hide-a-conversation", - "openimPath": "/sdk/ios/conversation/managing-conversations/hide-a-conversation", - "title": "Hide a conversation", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/hide-a-conversation.mdx" + "sourcePath": "/platform-api/message/sending-messages/send-business-notification", + "openimPath": "/platform-api/message/sending-messages/send-business-notification", + "title": "Send a business notification", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/message/sending-messages/send-business-notification.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages", - "openimPath": "/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages", - "title": "Delete a conversation and its messages", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages.mdx" + "sourcePath": "/platform-api/message/managing-messages/revoke-msg", + "openimPath": "/platform-api/message/managing-messages/revoke-msg", + "title": "Revoke a message", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/message/managing-messages/revoke-msg.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/clear-conversation-messages", - "openimPath": "/sdk/ios/conversation/managing-conversations/clear-conversation-messages", - "title": "Clear messages in a conversation", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/clear-conversation-messages.mdx" + "sourcePath": "/platform-api/message/retrieving-messages/get-server-time", + "openimPath": "/platform-api/message/retrieving-messages/get-server-time", + "title": "Get server time", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/message/retrieving-messages/get-server-time.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/hide-all-conversations", - "openimPath": "/sdk/ios/conversation/managing-conversations/hide-all-conversations", - "title": "Hide all conversations", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/hide-all-conversations.mdx" + "sourcePath": "/platform-api/conversation/overview", + "openimPath": "/platform-api/conversation/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/conversation/overview.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups", - "title": "Conversation group overview", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups.mdx" + "sourcePath": "/platform-api/conversation/listing-conversations/get-sorted-conversation-list", + "openimPath": "/platform-api/conversation/listing-conversations/get-sorted-conversation-list", + "title": "Get sorted conversation list", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-sorted-conversation-list.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/create-conversation-group", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/create-conversation-group", - "title": "Open_im_sdkCreateConversationGroup", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/create-conversation-group.mdx" + "sourcePath": "/platform-api/conversation/listing-conversations/get-conversation", + "openimPath": "/platform-api/conversation/listing-conversations/get-conversation", + "title": "Get conversation", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-conversation.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups", - "title": "Open_im_sdkGetConversationGroups", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups.mdx" + "sourcePath": "/platform-api/conversation/listing-conversations/get-conversations", + "openimPath": "/platform-api/conversation/listing-conversations/get-conversations", + "title": "Get conversations", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-conversations.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", - "title": "Open_im_sdkGetConversationGroupInfoWithConversations", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" + "sourcePath": "/platform-api/conversation/managing-conversations/set-conversations", + "openimPath": "/platform-api/conversation/managing-conversations/set-conversations", + "title": "Set conversations", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/conversation/managing-conversations/set-conversations.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", - "title": "Open_im_sdkGetConversationGroupByConversationID", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" + "sourcePath": "/platform-api/conversation/listing-conversations/get-owner-conversation", + "openimPath": "/platform-api/conversation/listing-conversations/get-owner-conversation", + "title": "Get owner conversation", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-owner-conversation.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/update-conversation-group", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/update-conversation-group", - "title": "Open_im_sdkUpdateConversationGroup", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/update-conversation-group.mdx" + "sourcePath": "/platform-api/migration-to-openim", + "openimPath": "/platform-api/migration-to-openim", + "title": "Migrate to OpenIM", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/migration-to-openim.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order", - "title": "Open_im_sdkSetConversationGroupOrder", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order.mdx" + "sourcePath": "/platform-api/logs/overview", + "openimPath": "/platform-api/logs/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/logs/overview.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups", - "title": "Open_im_sdkAddConversationsToGroups", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" + "sourcePath": "/platform-api/logs/upload-logs", + "openimPath": "/platform-api/logs/upload-logs", + "title": "Upload log records", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/logs/upload-logs.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups", - "title": "Open_im_sdkRemoveConversationsFromGroups", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" + "sourcePath": "/platform-api/logs/search-logs", + "openimPath": "/platform-api/logs/search-logs", + "title": "Search log records", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/logs/search-logs.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group", - "title": "Open_im_sdkDeleteConversationGroup", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group.mdx" + "sourcePath": "/platform-api/logs/delete-logs", + "openimPath": "/platform-api/logs/delete-logs", + "title": "Delete log records", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/logs/delete-logs.mdx" }, { - "sourcePath": "/sdk/ios/group/overview-group", - "openimPath": "/sdk/ios/group/overview-group", - "title": "Group overview", + "sourcePath": "/sdk/ios/overview", + "openimPath": "/sdk/ios/overview", + "title": "OpenIM SDK for iOS", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/overview-group.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/overview.mdx" }, { - "sourcePath": "/sdk/ios/group/create-group", - "openimPath": "/sdk/ios/group/create-group", - "title": "Create a group", + "sourcePath": "/sdk/ios/getting-started/before-you-start", + "openimPath": "/sdk/ios/getting-started/before-you-start", + "title": "Before you start", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/create-group.mdx" - }, - { - "sourcePath": "/sdk/ios/group/update-group-profile", - "openimPath": "/sdk/ios/group/update-group-profile", - "title": "Update group profile", + "contentFile": "content/docs/chat/sdk/ios/getting-started/before-you-start.mdx" + }, + { + "sourcePath": "/sdk/ios/getting-started/environment-specific-implementation", + "openimPath": "/sdk/ios/getting-started/environment-specific-implementation", + "title": "Environment-specific implementation", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/update-group-profile.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/getting-started/environment-specific-implementation.mdx" }, { - "sourcePath": "/sdk/ios/group/set-group-announcement", - "openimPath": "/sdk/ios/group/set-group-announcement", - "title": "Publish a group announcement", + "sourcePath": "/sdk/ios/getting-started/authenticate-and-manage-session", + "openimPath": "/sdk/ios/getting-started/authenticate-and-manage-session", + "title": "Authenticate and manage a session", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/set-group-announcement.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/getting-started/authenticate-and-manage-session.mdx" }, { - "sourcePath": "/sdk/ios/group/set-group-extension", - "openimPath": "/sdk/ios/group/set-group-extension", - "title": "Set group extra data", + "sourcePath": "/sdk/ios/getting-started/send-first-message", + "openimPath": "/sdk/ios/getting-started/send-first-message", + "title": "Send your first message", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/set-group-extension.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/getting-started/send-first-message.mdx" }, { - "sourcePath": "/sdk/ios/group/set-group-join-verification", - "openimPath": "/sdk/ios/group/set-group-join-verification", - "title": "Set group join verification", + "sourcePath": "/sdk/ios/user/overview-user", + "openimPath": "/sdk/ios/user/overview-user", + "title": "Overview", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/set-group-join-verification.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/user/overview-user.mdx" }, { - "sourcePath": "/sdk/ios/group/set-group-member-profile-access", - "openimPath": "/sdk/ios/group/set-group-member-profile-access", - "title": "Set member profile access", + "sourcePath": "/sdk/ios/user/retrieving-users/retrieve-users", + "openimPath": "/sdk/ios/user/retrieving-users/retrieve-users", + "title": "Retrieve users", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/set-group-member-profile-access.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-users/retrieve-users.mdx" }, { - "sourcePath": "/sdk/ios/group/set-group-member-friend-permission", - "openimPath": "/sdk/ios/group/set-group-member-friend-permission", - "title": "Set member friend request permission", + "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile", + "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile", + "title": "View your profile", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/set-group-member-friend-permission.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile.mdx" }, { - "sourcePath": "/sdk/ios/group/change-group-mute", - "openimPath": "/sdk/ios/group/change-group-mute", - "title": "Change group mute status", + "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile", + "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile", + "title": "Update your profile", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/change-group-mute.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile.mdx" }, { - "sourcePath": "/sdk/ios/group/join-group", - "openimPath": "/sdk/ios/group/join-group", - "title": "Apply to join a group", + "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception", + "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception", + "title": "Set global message reception", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/join-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception.mdx" }, { - "sourcePath": "/sdk/ios/group/quit-group", - "openimPath": "/sdk/ios/group/quit-group", - "title": "Leave a group", + "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status", + "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status", + "title": "Subscribe to user status", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/quit-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status.mdx" }, { - "sourcePath": "/sdk/ios/group/dismiss-group", - "openimPath": "/sdk/ios/group/dismiss-group", - "title": "Dismiss a group", + "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status", + "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status", + "title": "Refresh subscribed user status", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/dismiss-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-groups/get-specified-groups-info", - "openimPath": "/sdk/ios/group/retrieving-groups/get-specified-groups-info", - "title": "Get group information", + "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status", + "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status", + "title": "Unsubscribe from user status", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-specified-groups-info.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-groups/get-joined-group-list", - "openimPath": "/sdk/ios/group/retrieving-groups/get-joined-group-list", - "title": "Get joined groups", + "sourcePath": "/sdk/ios/user/friends/get-friend-list-page", + "openimPath": "/sdk/ios/user/friends/get-friend-list-page", + "title": "Get the friend list", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-joined-group-list.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friends/get-friend-list-page.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-groups/get-joined-group-list-page", - "openimPath": "/sdk/ios/group/retrieving-groups/get-joined-group-list-page", - "title": "Get joined groups by page", + "sourcePath": "/sdk/ios/user/friends/search-friends", + "openimPath": "/sdk/ios/user/friends/search-friends", + "title": "Search friends", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-joined-group-list-page.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friends/search-friends.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-groups/is-join-group", - "openimPath": "/sdk/ios/group/retrieving-groups/is-join-group", - "title": "Check group membership", + "sourcePath": "/sdk/ios/user/friends/get-specified-friends-info", + "openimPath": "/sdk/ios/user/friends/get-specified-friends-info", + "title": "Get friend profiles", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/is-join-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friends/get-specified-friends-info.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-groups/search-groups", - "openimPath": "/sdk/ios/group/retrieving-groups/search-groups", - "title": "Search groups", + "sourcePath": "/sdk/ios/user/friends/check-friend", + "openimPath": "/sdk/ios/user/friends/check-friend", + "title": "Check friendship status", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/search-groups.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friends/check-friend.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/overview-group-applications", - "openimPath": "/sdk/ios/group/group-applications/overview-group-applications", - "title": "Group applications overview", + "sourcePath": "/sdk/ios/user/friends/update-friends", + "openimPath": "/sdk/ios/user/friends/update-friends", + "title": "Update friend information", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/overview-group-applications.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friends/update-friends.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/get-group-application-list-as-recipient", - "openimPath": "/sdk/ios/group/group-applications/get-group-application-list-as-recipient", - "title": "Get received group applications", + "sourcePath": "/sdk/ios/user/friends/delete-friend", + "openimPath": "/sdk/ios/user/friends/delete-friend", + "title": "Delete a friend", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-list-as-recipient.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friends/delete-friend.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/get-group-application-list-as-applicant", - "openimPath": "/sdk/ios/group/group-applications/get-group-application-list-as-applicant", - "title": "Get sent group applications", + "sourcePath": "/sdk/ios/user/friend-applications/add-friend", + "openimPath": "/sdk/ios/user/friend-applications/add-friend", + "title": "Send a friend application", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-list-as-applicant.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/add-friend.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/get-group-application-unhandled-count", - "openimPath": "/sdk/ios/group/group-applications/get-group-application-unhandled-count", - "title": "Get pending group application count", + "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient", + "openimPath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient", + "title": "Get received friend applications", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-unhandled-count.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/accept-group-application", - "openimPath": "/sdk/ios/group/group-applications/accept-group-application", - "title": "Accept a group application", + "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant", + "openimPath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant", + "title": "Get sent friend applications", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/accept-group-application.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/refuse-group-application", - "openimPath": "/sdk/ios/group/group-applications/refuse-group-application", - "title": "Reject a group application", + "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-unhandled-count", + "openimPath": "/sdk/ios/user/friend-applications/get-friend-application-unhandled-count", + "title": "Get pending application count", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/refuse-group-application.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-unhandled-count.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/delete-group-requests", - "openimPath": "/sdk/ios/group/group-applications/delete-group-requests", - "title": "Delete group applications", + "sourcePath": "/sdk/ios/user/friend-applications/accept-friend-application", + "openimPath": "/sdk/ios/user/friend-applications/accept-friend-application", + "title": "Accept a friend application", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/delete-group-requests.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/accept-friend-application.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members", - "openimPath": "/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members", - "title": "Group member queries overview", + "sourcePath": "/sdk/ios/user/friend-applications/refuse-friend-application", + "openimPath": "/sdk/ios/user/friend-applications/refuse-friend-application", + "title": "Reject a friend application", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/refuse-friend-application.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-group-members/get-group-member-list", - "openimPath": "/sdk/ios/group/retrieving-group-members/get-group-member-list", - "title": "Get group members", + "sourcePath": "/sdk/ios/user/friend-applications/delete-friend-requests", + "openimPath": "/sdk/ios/user/friend-applications/delete-friend-requests", + "title": "Delete friend applications", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-group-member-list.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/delete-friend-requests.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-group-members/get-specified-group-members-info", - "openimPath": "/sdk/ios/group/retrieving-group-members/get-specified-group-members-info", - "title": "Get group member profiles", + "sourcePath": "/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users", + "openimPath": "/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users", + "title": "Retrieve a list of blocked users", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-specified-group-members-info.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-group-members/get-users-in-group", - "openimPath": "/sdk/ios/group/retrieving-group-members/get-users-in-group", - "title": "Check users in a group", + "sourcePath": "/sdk/ios/user/moderating-a-user/block-user", + "openimPath": "/sdk/ios/user/moderating-a-user/block-user", + "title": "Block a user", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-users-in-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/block-user.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin", - "openimPath": "/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin", - "title": "Get group owners and admins", + "sourcePath": "/sdk/ios/user/moderating-a-user/unblock-user", + "openimPath": "/sdk/ios/user/moderating-a-user/unblock-user", + "title": "Unblock a user", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/unblock-user.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-group-members/search-group-members", - "openimPath": "/sdk/ios/group/retrieving-group-members/search-group-members", - "title": "Search group members", + "sourcePath": "/sdk/ios/conversation/overview-conversation", + "openimPath": "/sdk/ios/conversation/overview-conversation", + "title": "Conversation overview", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/search-group-members.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/overview-conversation.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/invite-user-to-group", - "openimPath": "/sdk/ios/group/managing-group-members/invite-user-to-group", - "title": "Invite users to a group", + "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target", + "openimPath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target", + "title": "Open a conversation", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/invite-user-to-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/kick-group-member", - "openimPath": "/sdk/ios/group/managing-group-members/kick-group-member", - "title": "Remove group members", + "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-id", + "openimPath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/kick-group-member.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversation-id.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-nickname", - "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-nickname", - "title": "Update a group nickname", + "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id", + "openimPath": "/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-nickname.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-role-level", - "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-role-level", - "title": "Manage group administrators", + "sourcePath": "/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list", + "openimPath": "/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "Retrieve a conversation list", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-role-level.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-avatar", - "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-avatar", - "title": "Update a group member avatar", + "sourcePath": "/sdk/ios/conversation/managing-conversations/pin-conversation", + "openimPath": "/sdk/ios/conversation/managing-conversations/pin-conversation", + "title": "Pin or unpin a conversation", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-avatar.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/pin-conversation.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-extension", - "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-extension", - "title": "Set group member extra data", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-conversation-extension", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-conversation-extension", + "title": "Set conversation extra data", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-extension.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-conversation-extension.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/transfer-group-owner", - "openimPath": "/sdk/ios/group/managing-group-members/transfer-group-owner", - "title": "Transfer group owner", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-conversation-draft", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-conversation-draft", + "title": "Set a conversation draft", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/transfer-group-owner.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-conversation-draft.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/change-group-member-mute", - "openimPath": "/sdk/ios/group/managing-group-members/change-group-member-mute", - "title": "Mute or unmute a group member", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-receive-option", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-receive-option", + "title": "Set message reception", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/change-group-member-mute.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-receive-option.mdx" }, { - "sourcePath": "/sdk/ios/message/overview-message", - "openimPath": "/sdk/ios/message/overview-message", - "title": "Overview", + "sourcePath": "/sdk/ios/conversation/managing-conversations/clear-group-mentions", + "openimPath": "/sdk/ios/conversation/managing-conversations/clear-group-mentions", + "title": "Reset group mention status", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/overview-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/clear-group-mentions.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-text-message", - "openimPath": "/sdk/ios/message/creating-messages/create-text-message", - "title": "Create a text message", + "sourcePath": "/sdk/ios/conversation/managing-conversations/mark-conversation-read", + "openimPath": "/sdk/ios/conversation/managing-conversations/mark-conversation-read", + "title": "Mark a conversation as read", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/mark-conversation-read.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-text-at-message", - "openimPath": "/sdk/ios/message/creating-messages/create-text-at-message", - "title": "Create a mention message", + "sourcePath": "/sdk/ios/conversation/managing-conversations/get-total-unread-count", + "openimPath": "/sdk/ios/conversation/managing-conversations/get-total-unread-count", + "title": "Track the total unread count", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-at-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/get-total-unread-count.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-text-at-all-message", - "openimPath": "/sdk/ios/message/creating-messages/create-text-at-all-message", - "title": "Create an @all message", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-private-chat", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-private-chat", + "title": "Set private chat", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-at-all-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-private-chat.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-at-all-flag", - "openimPath": "/sdk/ios/message/creating-messages/create-at-all-flag", - "title": "Create an @all marker", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-burn-duration", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-at-all-flag.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-burn-duration.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/get-at-all-tag", - "openimPath": "/sdk/ios/message/creating-messages/get-at-all-tag", - "title": "Get the @all tag", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-destruct", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/get-at-all-tag.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-destruct.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-custom-message", - "openimPath": "/sdk/ios/message/creating-messages/create-custom-message", - "title": "Create a custom message", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-destruct-time", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-destruct-time", + "title": "Set server message deletion period", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-custom-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-destruct-time.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-image-message-from-full-path", - "openimPath": "/sdk/ios/message/creating-messages/create-image-message-from-full-path", - "title": "Create an image message from a path", + "sourcePath": "/sdk/ios/conversation/managing-conversations/hide-a-conversation", + "openimPath": "/sdk/ios/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-image-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/hide-a-conversation.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-image-message-by-url", - "openimPath": "/sdk/ios/message/creating-messages/create-image-message-by-url", - "title": "Create an image message from a URL", + "sourcePath": "/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages", + "openimPath": "/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-image-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-sound-message-from-full-path", - "openimPath": "/sdk/ios/message/creating-messages/create-sound-message-from-full-path", - "title": "Create an audio message from a path", + "sourcePath": "/sdk/ios/conversation/managing-conversations/clear-conversation-messages", + "openimPath": "/sdk/ios/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-sound-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/clear-conversation-messages.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-sound-message-by-url", - "openimPath": "/sdk/ios/message/creating-messages/create-sound-message-by-url", - "title": "Create an audio message from a URL", + "sourcePath": "/sdk/ios/conversation/managing-conversations/hide-all-conversations", + "openimPath": "/sdk/ios/conversation/managing-conversations/hide-all-conversations", + "title": "Hide all conversations", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-sound-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/hide-all-conversations.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-video-message-from-full-path", - "openimPath": "/sdk/ios/message/creating-messages/create-video-message-from-full-path", - "title": "Create a video message from a path", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups", + "title": "Conversation group overview", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-video-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-video-message-by-url", - "openimPath": "/sdk/ios/message/creating-messages/create-video-message-by-url", - "title": "Create a video message from a URL", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/create-conversation-group", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/create-conversation-group", + "title": "Open_im_sdkCreateConversationGroup", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-video-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/create-conversation-group.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-file-message-from-full-path", - "openimPath": "/sdk/ios/message/creating-messages/create-file-message-from-full-path", - "title": "Create a file message from a path", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups", + "title": "Open_im_sdkGetConversationGroups", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-file-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-file-message-by-url", - "openimPath": "/sdk/ios/message/creating-messages/create-file-message-by-url", - "title": "Create a file message from a URL", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", + "title": "Open_im_sdkGetConversationGroupInfoWithConversations", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-file-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-card-message", - "openimPath": "/sdk/ios/message/creating-messages/create-card-message", - "title": "Create a contact card message", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", + "title": "Open_im_sdkGetConversationGroupByConversationID", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-card-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-location-message", - "openimPath": "/sdk/ios/message/creating-messages/create-location-message", - "title": "Create a location message", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/update-conversation-group", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/update-conversation-group", + "title": "Open_im_sdkUpdateConversationGroup", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-location-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/update-conversation-group.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-face-message", - "openimPath": "/sdk/ios/message/creating-messages/create-face-message", - "title": "Create an emoji message", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order", + "title": "Open_im_sdkSetConversationGroupOrder", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-face-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-quote-message", - "openimPath": "/sdk/ios/message/creating-messages/create-quote-message", - "title": "Create a reply message", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups", + "title": "Open_im_sdkAddConversationsToGroups", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-quote-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-advanced-text-message", - "openimPath": "/sdk/ios/message/creating-messages/create-advanced-text-message", - "title": "Create rich text", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups", + "title": "Open_im_sdkRemoveConversationsFromGroups", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-advanced-text-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-markdown-message", - "openimPath": "/sdk/ios/message/creating-messages/create-markdown-message", - "title": "Create a Markdown message", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group", + "title": "Open_im_sdkDeleteConversationGroup", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-markdown-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-forward-message", - "openimPath": "/sdk/ios/message/creating-messages/create-forward-message", - "title": "Create a forwarded message", + "sourcePath": "/sdk/ios/group/overview-group", + "openimPath": "/sdk/ios/group/overview-group", + "title": "Group overview", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-forward-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/overview-group.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-merge-message", - "openimPath": "/sdk/ios/message/creating-messages/create-merge-message", - "title": "Create a merged message", + "sourcePath": "/sdk/ios/group/create-group", + "openimPath": "/sdk/ios/group/create-group", + "title": "Create a group", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-merge-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/create-group.mdx" }, { - "sourcePath": "/sdk/ios/message/sending-messages/send-message", - "openimPath": "/sdk/ios/message/sending-messages/send-message", - "title": "Send a message", + "sourcePath": "/sdk/ios/group/update-group-profile", + "openimPath": "/sdk/ios/group/update-group-profile", + "title": "Update group profile", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/sending-messages/send-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/update-group-profile.mdx" }, { - "sourcePath": "/sdk/ios/message/sending-messages/send-message-not-oss", - "openimPath": "/sdk/ios/message/sending-messages/send-message-not-oss", - "title": "Send a message without OSS", + "sourcePath": "/sdk/ios/group/set-group-announcement", + "openimPath": "/sdk/ios/group/set-group-announcement", + "title": "Publish a group announcement", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/sending-messages/send-message-not-oss.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-announcement.mdx" + }, + { + "sourcePath": "/sdk/ios/group/set-group-extension", + "openimPath": "/sdk/ios/group/set-group-extension", + "title": "Set group extra data", + "context": "chat/sdk/ios", + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-extension.mdx" }, { - "sourcePath": "/sdk/ios/message/receiving-messages/receive-messages", - "openimPath": "/sdk/ios/message/receiving-messages/receive-messages", - "title": "Receive messages", + "sourcePath": "/sdk/ios/group/set-group-join-verification", + "openimPath": "/sdk/ios/group/set-group-join-verification", + "title": "Set group join verification", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/receiving-messages/receive-messages.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-join-verification.mdx" }, { - "sourcePath": "/sdk/ios/message/receiving-messages/custom-business-listener", - "openimPath": "/sdk/ios/message/receiving-messages/custom-business-listener", - "title": "Receive custom business messages", + "sourcePath": "/sdk/ios/group/set-group-member-profile-access", + "openimPath": "/sdk/ios/group/set-group-member-profile-access", + "title": "Set member profile access", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/receiving-messages/custom-business-listener.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-member-profile-access.mdx" }, { - "sourcePath": "/sdk/ios/message/retrieving-messages/load-older-messages", - "openimPath": "/sdk/ios/message/retrieving-messages/load-older-messages", - "title": "Load older messages", + "sourcePath": "/sdk/ios/group/set-group-member-friend-permission", + "openimPath": "/sdk/ios/group/set-group-member-friend-permission", + "title": "Set member friend request permission", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-older-messages.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-member-friend-permission.mdx" }, { - "sourcePath": "/sdk/ios/message/retrieving-messages/load-newer-messages", - "openimPath": "/sdk/ios/message/retrieving-messages/load-newer-messages", - "title": "Load newer messages", + "sourcePath": "/sdk/ios/group/change-group-mute", + "openimPath": "/sdk/ios/group/change-group-mute", + "title": "Change group mute status", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-newer-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/change-group-mute.mdx" }, { - "sourcePath": "/sdk/ios/message/retrieving-messages/find-messages-by-id", - "openimPath": "/sdk/ios/message/retrieving-messages/find-messages-by-id", - "title": "Find messages by ID", + "sourcePath": "/sdk/ios/group/join-group", + "openimPath": "/sdk/ios/group/join-group", + "title": "Apply to join a group", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/find-messages-by-id.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/join-group.mdx" }, { - "sourcePath": "/sdk/ios/message/retrieving-messages/load-message-context", - "openimPath": "/sdk/ios/message/retrieving-messages/load-message-context", - "title": "Load message context", + "sourcePath": "/sdk/ios/group/quit-group", + "openimPath": "/sdk/ios/group/quit-group", + "title": "Leave a group", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-message-context.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/quit-group.mdx" }, { - "sourcePath": "/sdk/ios/message/searching-messages/search-messages", - "openimPath": "/sdk/ios/message/searching-messages/search-messages", - "title": "Search messages", + "sourcePath": "/sdk/ios/group/dismiss-group", + "openimPath": "/sdk/ios/group/dismiss-group", + "title": "Dismiss a group", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/searching-messages/search-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/dismiss-group.mdx" }, { - "sourcePath": "/sdk/ios/message/composing-messages/update-typing-status", - "openimPath": "/sdk/ios/message/composing-messages/update-typing-status", - "title": "Update typing status", + "sourcePath": "/sdk/ios/group/retrieving-groups/get-specified-groups-info", + "openimPath": "/sdk/ios/group/retrieving-groups/get-specified-groups-info", + "title": "Get group information", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/update-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-specified-groups-info.mdx" }, { - "sourcePath": "/sdk/ios/message/composing-messages/get-typing-status", - "openimPath": "/sdk/ios/message/composing-messages/get-typing-status", - "title": "Get typing status", + "sourcePath": "/sdk/ios/group/retrieving-groups/get-joined-group-list", + "openimPath": "/sdk/ios/group/retrieving-groups/get-joined-group-list", + "title": "Get joined groups", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/get-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-joined-group-list.mdx" }, { - "sourcePath": "/sdk/ios/message/composing-messages/check-speech-to-text", - "openimPath": "/sdk/ios/message/composing-messages/check-speech-to-text", - "title": "Check speech recognition support", + "sourcePath": "/sdk/ios/group/retrieving-groups/get-joined-group-list-page", + "openimPath": "/sdk/ios/group/retrieving-groups/get-joined-group-list-page", + "title": "Get joined groups by page", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/check-speech-to-text.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-joined-group-list-page.mdx" }, { - "sourcePath": "/sdk/ios/message/composing-messages/transcribe-audio", - "openimPath": "/sdk/ios/message/composing-messages/transcribe-audio", - "title": "Transcribe audio", + "sourcePath": "/sdk/ios/group/retrieving-groups/is-join-group", + "openimPath": "/sdk/ios/group/retrieving-groups/is-join-group", + "title": "Check group membership", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/transcribe-audio.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/is-join-group.mdx" }, { - "sourcePath": "/sdk/ios/message/composing-messages/save-local-transcript", - "openimPath": "/sdk/ios/message/composing-messages/save-local-transcript", - "title": "Save a local transcript", + "sourcePath": "/sdk/ios/group/retrieving-groups/search-groups", + "openimPath": "/sdk/ios/group/retrieving-groups/search-groups", + "title": "Search groups", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/save-local-transcript.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/search-groups.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/delete-local-message", - "openimPath": "/sdk/ios/message/managing-messages/delete-local-message", - "title": "Delete a local message", + "sourcePath": "/sdk/ios/group/group-applications/overview-group-applications", + "openimPath": "/sdk/ios/group/group-applications/overview-group-applications", + "title": "Group applications overview", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-local-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/overview-group-applications.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/delete-saved-message", - "openimPath": "/sdk/ios/message/managing-messages/delete-saved-message", - "title": "Delete a saved message", + "sourcePath": "/sdk/ios/group/group-applications/get-group-application-list-as-recipient", + "openimPath": "/sdk/ios/group/group-applications/get-group-application-list-as-recipient", + "title": "Get received group applications", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-saved-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/delete-saved-messages", - "openimPath": "/sdk/ios/message/managing-messages/delete-saved-messages", - "title": "Delete saved messages", + "sourcePath": "/sdk/ios/group/group-applications/get-group-application-list-as-applicant", + "openimPath": "/sdk/ios/group/group-applications/get-group-application-list-as-applicant", + "title": "Get sent group applications", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-saved-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/delete-user-messages", - "openimPath": "/sdk/ios/message/managing-messages/delete-user-messages", - "title": "Delete messages from a user", + "sourcePath": "/sdk/ios/group/group-applications/get-group-application-unhandled-count", + "openimPath": "/sdk/ios/group/group-applications/get-group-application-unhandled-count", + "title": "Get pending group application count", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-user-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-unhandled-count.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/revoke-a-message", - "openimPath": "/sdk/ios/message/managing-messages/revoke-a-message", - "title": "Revoke a message", + "sourcePath": "/sdk/ios/group/group-applications/accept-group-application", + "openimPath": "/sdk/ios/group/group-applications/accept-group-application", + "title": "Accept a group application", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/revoke-a-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/accept-group-application.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/modify-a-message", - "openimPath": "/sdk/ios/message/managing-messages/modify-a-message", - "title": "Modify a message", + "sourcePath": "/sdk/ios/group/group-applications/refuse-group-application", + "openimPath": "/sdk/ios/group/group-applications/refuse-group-application", + "title": "Reject a group application", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/modify-a-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/refuse-group-application.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/get-pinned-messages", - "openimPath": "/sdk/ios/message/managing-messages/get-pinned-messages", - "title": "View pinned messages", + "sourcePath": "/sdk/ios/group/group-applications/delete-group-requests", + "openimPath": "/sdk/ios/group/group-applications/delete-group-requests", + "title": "Delete group applications", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/get-pinned-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/delete-group-requests.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/set-message-pinned", - "openimPath": "/sdk/ios/message/managing-messages/set-message-pinned", - "title": "Pin or unpin a message", + "sourcePath": "/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members", + "openimPath": "/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members", + "title": "Group member queries overview", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/set-message-pinned.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/insert-local-single-message", - "openimPath": "/sdk/ios/message/managing-messages/insert-local-single-message", - "title": "Insert a local direct message", + "sourcePath": "/sdk/ios/group/retrieving-group-members/get-group-member-list", + "openimPath": "/sdk/ios/group/retrieving-group-members/get-group-member-list", + "title": "Get group members", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/insert-local-single-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-group-member-list.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/insert-local-group-message", - "openimPath": "/sdk/ios/message/managing-messages/insert-local-group-message", - "title": "Insert a local group message", + "sourcePath": "/sdk/ios/group/retrieving-group-members/get-specified-group-members-info", + "openimPath": "/sdk/ios/group/retrieving-group-members/get-specified-group-members-info", + "title": "Get group member profiles", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/insert-local-group-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-specified-group-members-info.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/clear-all-local-messages", - "openimPath": "/sdk/ios/message/managing-messages/clear-all-local-messages", - "title": "Clear all local messages", + "sourcePath": "/sdk/ios/group/retrieving-group-members/get-users-in-group", + "openimPath": "/sdk/ios/group/retrieving-group-members/get-users-in-group", + "title": "Check users in a group", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/clear-all-local-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-users-in-group.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/clear-all-messages", - "openimPath": "/sdk/ios/message/managing-messages/clear-all-messages", - "title": "Clear all saved messages", + "sourcePath": "/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin", + "openimPath": "/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "Get group owners and admins", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/clear-all-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/set-message-local-ex", - "openimPath": "/sdk/ios/message/managing-messages/set-message-local-ex", - "title": "Set local message extensions", + "sourcePath": "/sdk/ios/group/retrieving-group-members/search-group-members", + "openimPath": "/sdk/ios/group/retrieving-group-members/search-group-members", + "title": "Search group members", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/set-message-local-ex.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/search-group-members.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-read-status/get-group-message-readers", - "openimPath": "/sdk/ios/message/managing-read-status/get-group-message-readers", - "title": "View group message readers", + "sourcePath": "/sdk/ios/group/managing-group-members/invite-user-to-group", + "openimPath": "/sdk/ios/group/managing-group-members/invite-user-to-group", + "title": "Invite users to a group", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-read-status/get-group-message-readers.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/invite-user-to-group.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-read-status/send-group-read-receipts", - "openimPath": "/sdk/ios/message/managing-read-status/send-group-read-receipts", - "title": "Send group read receipts", + "sourcePath": "/sdk/ios/group/managing-group-members/kick-group-member", + "openimPath": "/sdk/ios/group/managing-group-members/kick-group-member", + "title": "Remove group members", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-read-status/send-group-read-receipts.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/kick-group-member.mdx" }, { - "sourcePath": "/sdk/ios/file-uploads/upload-file", - "openimPath": "/sdk/ios/file-uploads/upload-file", - "title": "Upload a file", + "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-nickname", + "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-nickname", + "title": "Update a group nickname", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/file-uploads/upload-file.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-nickname.mdx" }, { - "sourcePath": "/sdk/ios/calling/overview-calling", - "openimPath": "/sdk/ios/calling/overview-calling", - "title": "Calling overview", + "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-role-level", + "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-role-level", + "title": "Manage group administrators", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/overview-calling.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-role-level.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/start-single-call", - "openimPath": "/sdk/ios/calling/managing-calls/start-single-call", - "title": "Start a one-to-one call", + "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-avatar", + "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-avatar", + "title": "Update a group member avatar", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/start-single-call.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-avatar.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/start-group-call", - "openimPath": "/sdk/ios/calling/managing-calls/start-group-call", - "title": "Start a group call", + "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-extension", + "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-extension", + "title": "Set group member extra data", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/start-group-call.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-extension.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/accept-call", - "openimPath": "/sdk/ios/calling/managing-calls/accept-call", - "title": "Accept a call", + "sourcePath": "/sdk/ios/group/managing-group-members/transfer-group-owner", + "openimPath": "/sdk/ios/group/managing-group-members/transfer-group-owner", + "title": "Transfer group owner", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/accept-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/transfer-group-owner.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/reject-call", - "openimPath": "/sdk/ios/calling/managing-calls/reject-call", - "title": "Reject a call", + "sourcePath": "/sdk/ios/group/managing-group-members/change-group-member-mute", + "openimPath": "/sdk/ios/group/managing-group-members/change-group-member-mute", + "title": "Mute or unmute a group member", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/reject-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/change-group-member-mute.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/cancel-call", - "openimPath": "/sdk/ios/calling/managing-calls/cancel-call", - "title": "Cancel a call invitation", + "sourcePath": "/sdk/ios/message/overview-message", + "openimPath": "/sdk/ios/message/overview-message", + "title": "Overview", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/cancel-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/overview-message.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/hang-up-call", - "openimPath": "/sdk/ios/calling/managing-calls/hang-up-call", - "title": "Hang up a call", + "sourcePath": "/sdk/ios/message/creating-messages/create-text-message", + "openimPath": "/sdk/ios/message/creating-messages/create-text-message", + "title": "Create a text message", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/hang-up-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-message.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/handle-call-events", - "openimPath": "/sdk/ios/calling/managing-calls/handle-call-events", - "title": "Handle call events", + "sourcePath": "/sdk/ios/message/creating-messages/create-text-at-message", + "openimPath": "/sdk/ios/message/creating-messages/create-text-at-message", + "title": "Create a mention message", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/handle-call-events.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-at-message.mdx" }, { - "sourcePath": "/sdk/ios/calling/retrieving-call-information/restore-pending-invitation", - "openimPath": "/sdk/ios/calling/retrieving-call-information/restore-pending-invitation", - "title": "Restore a pending invitation", + "sourcePath": "/sdk/ios/message/creating-messages/create-text-at-all-message", + "openimPath": "/sdk/ios/message/creating-messages/create-text-at-all-message", + "title": "Create an @all message", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/restore-pending-invitation.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-at-all-message.mdx" }, { - "sourcePath": "/sdk/ios/calling/retrieving-call-information/get-room-by-group-id", - "openimPath": "/sdk/ios/calling/retrieving-call-information/get-room-by-group-id", - "title": "Get a group call room", + "sourcePath": "/sdk/ios/message/creating-messages/create-at-all-flag", + "openimPath": "/sdk/ios/message/creating-messages/create-at-all-flag", + "title": "Create an @all marker", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/get-room-by-group-id.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-at-all-flag.mdx" }, { - "sourcePath": "/sdk/ios/calling/retrieving-call-information/get-token-by-room-id", - "openimPath": "/sdk/ios/calling/retrieving-call-information/get-token-by-room-id", - "title": "Get room credentials", + "sourcePath": "/sdk/ios/message/creating-messages/get-at-all-tag", + "openimPath": "/sdk/ios/message/creating-messages/get-at-all-tag", + "title": "Get the @all tag", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/get-token-by-room-id.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/get-at-all-tag.mdx" }, { - "sourcePath": "/sdk/ios/calling/sending-custom-signals/send-a-custom-signal", - "openimPath": "/sdk/ios/calling/sending-custom-signals/send-a-custom-signal", - "title": "Send a custom signal", + "sourcePath": "/sdk/ios/message/creating-messages/create-custom-message", + "openimPath": "/sdk/ios/message/creating-messages/create-custom-message", + "title": "Create a custom message", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/sending-custom-signals/send-a-custom-signal.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-custom-message.mdx" }, { - "sourcePath": "/sdk/ios/events/overview-events", - "openimPath": "/sdk/ios/events/overview-events", - "title": "Events overview", + "sourcePath": "/sdk/ios/message/creating-messages/create-image-message-from-full-path", + "openimPath": "/sdk/ios/message/creating-messages/create-image-message-from-full-path", + "title": "Create an image message from a path", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/events/overview-events.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-image-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/ios/logger", - "openimPath": "/sdk/ios/logger", - "title": "Logger", + "sourcePath": "/sdk/ios/message/creating-messages/create-image-message-by-url", + "openimPath": "/sdk/ios/message/creating-messages/create-image-message-by-url", + "title": "Create an image message from a URL", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/logger.mdx" - }, - { - "sourcePath": "/sdk/android/overview", - "openimPath": "/sdk/android/overview", - "title": "OpenIM Android SDK overview", - "context": "chat/sdk/android", - "template": "overview", - "contentFile": "content/docs/chat/sdk/android/overview.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-image-message-by-url.mdx" }, { - "sourcePath": "/sdk/android/getting-started/before-you-start", - "openimPath": "/sdk/android/getting-started/before-you-start", - "title": "Before you start", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-sound-message-from-full-path", + "openimPath": "/sdk/ios/message/creating-messages/create-sound-message-from-full-path", + "title": "Create an audio message from a path", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/getting-started/before-you-start.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-sound-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/android/getting-started/environment-specific-implementation", - "openimPath": "/sdk/android/getting-started/environment-specific-implementation", - "title": "Integrate for Android", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-sound-message-by-url", + "openimPath": "/sdk/ios/message/creating-messages/create-sound-message-by-url", + "title": "Create an audio message from a URL", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-sound-message-by-url.mdx" }, { - "sourcePath": "/sdk/android/getting-started/authenticate-and-manage-session", - "openimPath": "/sdk/android/getting-started/authenticate-and-manage-session", - "title": "Authenticate and manage a session", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-video-message-from-full-path", + "openimPath": "/sdk/ios/message/creating-messages/create-video-message-from-full-path", + "title": "Create a video message from a path", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-video-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/android/getting-started/send-first-message", - "openimPath": "/sdk/android/getting-started/send-first-message", - "title": "Send your first message", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-video-message-by-url", + "openimPath": "/sdk/ios/message/creating-messages/create-video-message-by-url", + "title": "Create a video message from a URL", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/getting-started/send-first-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-video-message-by-url.mdx" }, { - "sourcePath": "/sdk/android/user/overview-user", - "openimPath": "/sdk/android/user/overview-user", - "title": "User overview", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-file-message-from-full-path", + "openimPath": "/sdk/ios/message/creating-messages/create-file-message-from-full-path", + "title": "Create a file message from a path", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/overview-user.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-file-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/android/user/user-profile/get-users-info", - "openimPath": "/sdk/android/user/user-profile/get-users-info", - "title": "Get specified user profiles", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-file-message-by-url", + "openimPath": "/sdk/ios/message/creating-messages/create-file-message-by-url", + "title": "Create a file message from a URL", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-file-message-by-url.mdx" }, { - "sourcePath": "/sdk/android/user/user-profile/get-self-local-user-info", - "openimPath": "/sdk/android/user/user-profile/get-self-local-user-info", - "title": "Get the current user profile", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-card-message", + "openimPath": "/sdk/ios/message/creating-messages/create-card-message", + "title": "Create a contact card message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-card-message.mdx" }, { - "sourcePath": "/sdk/android/user/user-profile/set-self-info", - "openimPath": "/sdk/android/user/user-profile/set-self-info", - "title": "Update the current user profile", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-location-message", + "openimPath": "/sdk/ios/message/creating-messages/create-location-message", + "title": "Create a location message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-location-message.mdx" }, { - "sourcePath": "/sdk/android/user/user-profile/set-global-message-reception", - "openimPath": "/sdk/android/user/user-profile/set-global-message-reception", - "title": "Set global message reception", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-face-message", + "openimPath": "/sdk/ios/message/creating-messages/create-face-message", + "title": "Create an emoji message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-face-message.mdx" }, { - "sourcePath": "/sdk/android/user/online-status/subscribe-users-online-status", - "openimPath": "/sdk/android/user/online-status/subscribe-users-online-status", - "title": "Subscribe to user online status", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-quote-message", + "openimPath": "/sdk/ios/message/creating-messages/create-quote-message", + "title": "Create a reply message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-quote-message.mdx" }, { - "sourcePath": "/sdk/android/user/online-status/get-subscribe-online-users-status", - "openimPath": "/sdk/android/user/online-status/get-subscribe-online-users-status", - "title": "Get subscribed user online status", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-advanced-text-message", + "openimPath": "/sdk/ios/message/creating-messages/create-advanced-text-message", + "title": "Create rich text", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-advanced-text-message.mdx" }, { - "sourcePath": "/sdk/android/user/friends/get-friend-list-page", - "openimPath": "/sdk/android/user/friends/get-friend-list-page", - "title": "Get the friend list by page", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-markdown-message", + "openimPath": "/sdk/ios/message/creating-messages/create-markdown-message", + "title": "Create a Markdown message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-markdown-message.mdx" }, { - "sourcePath": "/sdk/android/user/friends/search-friends", - "openimPath": "/sdk/android/user/friends/search-friends", - "title": "Search friends", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-forward-message", + "openimPath": "/sdk/ios/message/creating-messages/create-forward-message", + "title": "Create a forwarded message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friends/search-friends.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-forward-message.mdx" }, { - "sourcePath": "/sdk/android/user/friends/get-friends-info", - "openimPath": "/sdk/android/user/friends/get-friends-info", - "title": "Get specified friend profiles", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-merge-message", + "openimPath": "/sdk/ios/message/creating-messages/create-merge-message", + "title": "Create a merged message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friends/get-friends-info.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-merge-message.mdx" }, { - "sourcePath": "/sdk/android/user/friends/check-friend", - "openimPath": "/sdk/android/user/friends/check-friend", - "title": "Check friendship", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/sending-messages/send-message", + "openimPath": "/sdk/ios/message/sending-messages/send-message", + "title": "Send a message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friends/check-friend.mdx" - }, - { - "sourcePath": "/sdk/android/user/friends/update-friends", - "openimPath": "/sdk/android/user/friends/update-friends", - "title": "Update friend profiles", - "context": "chat/sdk/android", + "contentFile": "content/docs/chat/sdk/ios/message/sending-messages/send-message.mdx" + }, + { + "sourcePath": "/sdk/ios/message/sending-messages/send-message-not-oss", + "openimPath": "/sdk/ios/message/sending-messages/send-message-not-oss", + "title": "Send a message without OSS", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friends/update-friends.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/sending-messages/send-message-not-oss.mdx" }, { - "sourcePath": "/sdk/android/user/friends/delete-friend", - "openimPath": "/sdk/android/user/friends/delete-friend", - "title": "Delete a friend", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/receiving-messages/receive-messages", + "openimPath": "/sdk/ios/message/receiving-messages/receive-messages", + "title": "Receive messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friends/delete-friend.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/receiving-messages/receive-messages.mdx" }, { - "sourcePath": "/sdk/android/user/friend-applications/add-friend", - "openimPath": "/sdk/android/user/friend-applications/add-friend", - "title": "Send a friend request", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/receiving-messages/custom-business-listener", + "openimPath": "/sdk/ios/message/receiving-messages/custom-business-listener", + "title": "Receive custom business messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/receiving-messages/custom-business-listener.mdx" }, { - "sourcePath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", - "openimPath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", - "title": "Get received friend requests", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/retrieving-messages/load-older-messages", + "openimPath": "/sdk/ios/message/retrieving-messages/load-older-messages", + "title": "Load older messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-older-messages.mdx" }, { - "sourcePath": "/sdk/android/user/friend-applications/get-send-friend-application-list", - "openimPath": "/sdk/android/user/friend-applications/get-send-friend-application-list", - "title": "Get sent friend requests", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/retrieving-messages/load-newer-messages", + "openimPath": "/sdk/ios/message/retrieving-messages/load-newer-messages", + "title": "Load newer messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-newer-messages.mdx" }, { - "sourcePath": "/sdk/android/user/friend-applications/accept-friend-application", - "openimPath": "/sdk/android/user/friend-applications/accept-friend-application", - "title": "Accept a friend request", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/retrieving-messages/find-messages-by-id", + "openimPath": "/sdk/ios/message/retrieving-messages/find-messages-by-id", + "title": "Find messages by ID", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/find-messages-by-id.mdx" }, { - "sourcePath": "/sdk/android/user/friend-applications/refuse-friend-application", - "openimPath": "/sdk/android/user/friend-applications/refuse-friend-application", - "title": "Reject a friend request", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/retrieving-messages/load-message-context", + "openimPath": "/sdk/ios/message/retrieving-messages/load-message-context", + "title": "Load message context", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-message-context.mdx" }, { - "sourcePath": "/sdk/android/user/blacklist/get-blacklist", - "openimPath": "/sdk/android/user/blacklist/get-blacklist", - "title": "Get the blacklist", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/searching-messages/search-messages", + "openimPath": "/sdk/ios/message/searching-messages/search-messages", + "title": "Search messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/searching-messages/search-messages.mdx" }, { - "sourcePath": "/sdk/android/user/blacklist/add-blacklist", - "openimPath": "/sdk/android/user/blacklist/add-blacklist", - "title": "Block a user", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/composing-messages/update-typing-status", + "openimPath": "/sdk/ios/message/composing-messages/update-typing-status", + "title": "Update typing status", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/update-typing-status.mdx" }, { - "sourcePath": "/sdk/android/user/blacklist/remove-blacklist", - "openimPath": "/sdk/android/user/blacklist/remove-blacklist", - "title": "Unblock a user", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/composing-messages/get-typing-status", + "openimPath": "/sdk/ios/message/composing-messages/get-typing-status", + "title": "Get typing status", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/get-typing-status.mdx" }, { - "sourcePath": "/sdk/android/conversation/overview-conversation", - "openimPath": "/sdk/android/conversation/overview-conversation", - "title": "Conversation overview", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/composing-messages/check-speech-to-text", + "openimPath": "/sdk/ios/message/composing-messages/check-speech-to-text", + "title": "Check speech recognition support", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/overview-conversation.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/check-speech-to-text.mdx" }, { - "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", - "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", - "title": "Open a conversation", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/composing-messages/transcribe-audio", + "openimPath": "/sdk/ios/message/composing-messages/transcribe-audio", + "title": "Transcribe audio", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/transcribe-audio.mdx" }, { - "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", - "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", - "title": "Resolve a conversation ID", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/composing-messages/save-local-transcript", + "openimPath": "/sdk/ios/message/composing-messages/save-local-transcript", + "title": "Save a local transcript", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/save-local-transcript.mdx" }, { - "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", - "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", - "title": "Get conversations by ID", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/delete-local-message", + "openimPath": "/sdk/ios/message/managing-messages/delete-local-message", + "title": "Delete a local message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-local-message.mdx" }, { - "sourcePath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", - "openimPath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", - "title": "Get the conversation list", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/delete-saved-message", + "openimPath": "/sdk/ios/message/managing-messages/delete-saved-message", + "title": "Delete a saved message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-saved-message.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/pin-conversation", - "openimPath": "/sdk/android/conversation/managing-conversations/pin-conversation", - "title": "Pin or unpin a conversation", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/delete-saved-messages", + "openimPath": "/sdk/ios/message/managing-messages/delete-saved-messages", + "title": "Delete saved messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-saved-messages.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", - "openimPath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", - "title": "Set conversation extra data", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/delete-user-messages", + "openimPath": "/sdk/ios/message/managing-messages/delete-user-messages", + "title": "Delete messages from a user", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-user-messages.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", - "openimPath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", - "title": "Set a conversation draft", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/revoke-a-message", + "openimPath": "/sdk/ios/message/managing-messages/revoke-a-message", + "title": "Revoke a message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/revoke-a-message.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", - "openimPath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", - "title": "Set conversation message reception", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/modify-a-message", + "openimPath": "/sdk/ios/message/managing-messages/modify-a-message", + "title": "Modify a message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/modify-a-message.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", - "openimPath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", - "title": "Reset group mention status", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/get-pinned-messages", + "openimPath": "/sdk/ios/message/managing-messages/get-pinned-messages", + "title": "View pinned messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/get-pinned-messages.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", - "openimPath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", - "title": "Mark a conversation as read", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/set-message-pinned", + "openimPath": "/sdk/ios/message/managing-messages/set-message-pinned", + "title": "Pin or unpin a message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/set-message-pinned.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", - "openimPath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", - "title": "Track the total unread count", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/insert-local-single-message", + "openimPath": "/sdk/ios/message/managing-messages/insert-local-single-message", + "title": "Insert a local direct message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/insert-local-single-message.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/set-private-chat", - "openimPath": "/sdk/android/conversation/managing-conversations/set-private-chat", - "title": "Enable or disable burn after reading", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/insert-local-group-message", + "openimPath": "/sdk/ios/message/managing-messages/insert-local-group-message", + "title": "Insert a local group message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/insert-local-group-message.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/set-burn-duration", - "openimPath": "/sdk/android/conversation/managing-conversations/set-burn-duration", - "title": "Set the burn duration", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/clear-all-local-messages", + "openimPath": "/sdk/ios/message/managing-messages/clear-all-local-messages", + "title": "Clear all local messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/clear-all-local-messages.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-destruct", - "openimPath": "/sdk/android/conversation/managing-conversations/set-message-destruct", - "title": "Schedule server message deletion", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/clear-all-messages", + "openimPath": "/sdk/ios/message/managing-messages/clear-all-messages", + "title": "Clear all saved messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/clear-all-messages.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", - "openimPath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", - "title": "Hide a conversation", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/set-message-local-ex", + "openimPath": "/sdk/ios/message/managing-messages/set-message-local-ex", + "title": "Set local message extensions", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/set-message-local-ex.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", - "openimPath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", - "title": "Delete a conversation and its messages", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-read-status/get-group-message-readers", + "openimPath": "/sdk/ios/message/managing-read-status/get-group-message-readers", + "title": "View group message readers", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-read-status/get-group-message-readers.mdx" }, { - "sourcePath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", - "openimPath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", - "title": "Clear messages in a conversation", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-read-status/send-group-read-receipts", + "openimPath": "/sdk/ios/message/managing-read-status/send-group-read-receipts", + "title": "Send group read receipts", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-read-status/send-group-read-receipts.mdx" }, { - "sourcePath": "/sdk/android/group/overview-group", - "openimPath": "/sdk/android/group/overview-group", - "title": "Group overview", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/file-uploads/upload-file", + "openimPath": "/sdk/ios/file-uploads/upload-file", + "title": "Upload a file", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/overview-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/file-uploads/upload-file.mdx" }, { - "sourcePath": "/sdk/android/group/create-group", - "openimPath": "/sdk/android/group/create-group", - "title": "Create a group", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/overview-calling", + "openimPath": "/sdk/ios/calling/overview-calling", + "title": "Calling overview", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/create-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/overview-calling.mdx" }, { - "sourcePath": "/sdk/android/group/update-group-profile", - "openimPath": "/sdk/android/group/update-group-profile", - "title": "Update group profile", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/start-single-call", + "openimPath": "/sdk/ios/calling/managing-calls/start-single-call", + "title": "Start a one-to-one call", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/update-group-profile.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/start-single-call.mdx" }, { - "sourcePath": "/sdk/android/group/set-group-announcement", - "openimPath": "/sdk/android/group/set-group-announcement", - "title": "Publish a group announcement", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/start-group-call", + "openimPath": "/sdk/ios/calling/managing-calls/start-group-call", + "title": "Start a group call", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/set-group-announcement.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/start-group-call.mdx" }, { - "sourcePath": "/sdk/android/group/set-group-extension", - "openimPath": "/sdk/android/group/set-group-extension", - "title": "Set group extra data", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/accept-call", + "openimPath": "/sdk/ios/calling/managing-calls/accept-call", + "title": "Accept a call", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/set-group-extension.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/accept-call.mdx" }, { - "sourcePath": "/sdk/android/group/set-group-join-verification", - "openimPath": "/sdk/android/group/set-group-join-verification", - "title": "Set group join verification", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/reject-call", + "openimPath": "/sdk/ios/calling/managing-calls/reject-call", + "title": "Reject a call", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/set-group-join-verification.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/reject-call.mdx" }, { - "sourcePath": "/sdk/android/group/set-group-member-profile-access", - "openimPath": "/sdk/android/group/set-group-member-profile-access", - "title": "Set member profile access", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/cancel-call", + "openimPath": "/sdk/ios/calling/managing-calls/cancel-call", + "title": "Cancel a call invitation", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/cancel-call.mdx" }, { - "sourcePath": "/sdk/android/group/set-group-member-friend-permission", - "openimPath": "/sdk/android/group/set-group-member-friend-permission", - "title": "Set member friend request permission", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/hang-up-call", + "openimPath": "/sdk/ios/calling/managing-calls/hang-up-call", + "title": "Hang up a call", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/hang-up-call.mdx" }, { - "sourcePath": "/sdk/android/group/change-group-mute", - "openimPath": "/sdk/android/group/change-group-mute", - "title": "Change group mute status", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/handle-call-events", + "openimPath": "/sdk/ios/calling/managing-calls/handle-call-events", + "title": "Handle call events", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/change-group-mute.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/handle-call-events.mdx" }, { - "sourcePath": "/sdk/android/group/join-group", - "openimPath": "/sdk/android/group/join-group", - "title": "Apply to join a group", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/retrieving-call-information/restore-pending-invitation", + "openimPath": "/sdk/ios/calling/retrieving-call-information/restore-pending-invitation", + "title": "Restore a pending invitation", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/join-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/restore-pending-invitation.mdx" }, { - "sourcePath": "/sdk/android/group/quit-group", - "openimPath": "/sdk/android/group/quit-group", - "title": "Leave a group", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/retrieving-call-information/get-room-by-group-id", + "openimPath": "/sdk/ios/calling/retrieving-call-information/get-room-by-group-id", + "title": "Get a group call room", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/quit-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/get-room-by-group-id.mdx" }, { - "sourcePath": "/sdk/android/group/dismiss-group", - "openimPath": "/sdk/android/group/dismiss-group", - "title": "Dismiss a group", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/retrieving-call-information/get-token-by-room-id", + "openimPath": "/sdk/ios/calling/retrieving-call-information/get-token-by-room-id", + "title": "Get room credentials", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/dismiss-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/get-token-by-room-id.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", - "openimPath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", - "title": "Get group information", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/sending-custom-signals/send-a-custom-signal", + "openimPath": "/sdk/ios/calling/sending-custom-signals/send-a-custom-signal", + "title": "Send a custom signal", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/sending-custom-signals/send-a-custom-signal.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", - "openimPath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", - "title": "Get joined groups by page", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/events/overview-events", + "openimPath": "/sdk/ios/events/overview-events", + "title": "Events overview", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx" + "contentFile": "content/docs/chat/sdk/ios/events/overview-events.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", - "openimPath": "/sdk/android/group/retrieving-groups/is-join-group", - "title": "Check group membership", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/logger", + "openimPath": "/sdk/ios/logger", + "title": "Logger", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/logger.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-groups/search-groups", - "openimPath": "/sdk/android/group/retrieving-groups/search-groups", - "title": "Search groups", + "sourcePath": "/sdk/android/overview", + "openimPath": "/sdk/android/overview", + "title": "OpenIM Android SDK overview", "context": "chat/sdk/android", - "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/android/overview.mdx" }, { - "sourcePath": "/sdk/android/group/group-applications/overview-group-applications", - "openimPath": "/sdk/android/group/group-applications/overview-group-applications", - "title": "Group applications overview", + "sourcePath": "/sdk/android/getting-started/before-you-start", + "openimPath": "/sdk/android/getting-started/before-you-start", + "title": "Before you start", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/before-you-start.mdx" }, { - "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", - "openimPath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", - "title": "Get received group applications", + "sourcePath": "/sdk/android/getting-started/environment-specific-implementation", + "openimPath": "/sdk/android/getting-started/environment-specific-implementation", + "title": "Integrate for Android", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx" }, { - "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", - "openimPath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", - "title": "Get sent group applications", + "sourcePath": "/sdk/android/getting-started/authenticate-and-manage-session", + "openimPath": "/sdk/android/getting-started/authenticate-and-manage-session", + "title": "Authenticate and manage a session", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx" }, { - "sourcePath": "/sdk/android/group/group-applications/accept-group-application", - "openimPath": "/sdk/android/group/group-applications/accept-group-application", - "title": "Accept a group application", + "sourcePath": "/sdk/android/getting-started/send-first-message", + "openimPath": "/sdk/android/getting-started/send-first-message", + "title": "Send your first message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/send-first-message.mdx" }, { - "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", - "openimPath": "/sdk/android/group/group-applications/refuse-group-application", - "title": "Reject a group application", + "sourcePath": "/sdk/android/user/overview-user", + "openimPath": "/sdk/android/user/overview-user", + "title": "User overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx" + "contentFile": "content/docs/chat/sdk/android/user/overview-user.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", - "openimPath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", - "title": "Group member queries overview", + "sourcePath": "/sdk/android/user/user-profile/get-users-info", + "openimPath": "/sdk/android/user/user-profile/get-users-info", + "title": "Get specified user profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", - "openimPath": "/sdk/android/group/retrieving-group-members/get-group-member-list", - "title": "List group members", + "sourcePath": "/sdk/android/user/user-profile/get-self-local-user-info", + "openimPath": "/sdk/android/user/user-profile/get-self-local-user-info", + "title": "Get the current user profile", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", - "openimPath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", - "title": "Get specified group member profiles", + "sourcePath": "/sdk/android/user/user-profile/set-self-info", + "openimPath": "/sdk/android/user/user-profile/set-self-info", + "title": "Update your profile", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", - "openimPath": "/sdk/android/group/retrieving-group-members/get-users-in-group", - "title": "Check group membership", + "sourcePath": "/sdk/android/user/user-profile/set-global-message-reception", + "openimPath": "/sdk/android/user/user-profile/set-global-message-reception", + "title": "Set global message reception", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", - "openimPath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", - "title": "Get the group owner and administrators", + "sourcePath": "/sdk/android/user/online-status/subscribe-users-online-status", + "openimPath": "/sdk/android/user/online-status/subscribe-users-online-status", + "title": "Subscribe to user online status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" + "contentFile": "content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-group-members/search-group-members", - "openimPath": "/sdk/android/group/retrieving-group-members/search-group-members", - "title": "Search group members", + "sourcePath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "openimPath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "title": "Get subscribed user online status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx" + "contentFile": "content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx" }, { - "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", - "openimPath": "/sdk/android/group/managing-group-members/invite-user-to-group", - "title": "Invite users to a group", + "sourcePath": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "openimPath": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "title": "Unsubscribe from user status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx" + "contentFile": "content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx" }, { - "sourcePath": "/sdk/android/group/managing-group-members/kick-group-member", - "openimPath": "/sdk/android/group/managing-group-members/kick-group-member", - "title": "Remove group members", + "sourcePath": "/sdk/android/user/friends/get-friend-list-page", + "openimPath": "/sdk/android/user/friends/get-friend-list-page", + "title": "Get the friend list by page", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx" }, { - "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", - "openimPath": "/sdk/android/group/managing-group-members/set-group-member-nickname", - "title": "Update a member’s group nickname", + "sourcePath": "/sdk/android/user/friends/search-friends", + "openimPath": "/sdk/android/user/friends/search-friends", + "title": "Search friends", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/search-friends.mdx" }, { - "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", - "openimPath": "/sdk/android/group/managing-group-members/set-group-member-role-level", - "title": "Manage group administrators", + "sourcePath": "/sdk/android/user/friends/get-friends-info", + "openimPath": "/sdk/android/user/friends/get-friends-info", + "title": "Get specified friend profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/get-friends-info.mdx" }, { - "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-avatar", - "openimPath": "/sdk/android/group/managing-group-members/set-group-member-avatar", - "title": "Update a group member’s avatar", + "sourcePath": "/sdk/android/user/friends/check-friend", + "openimPath": "/sdk/android/user/friends/check-friend", + "title": "Check friendship", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/check-friend.mdx" }, { - "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-extension", - "openimPath": "/sdk/android/group/managing-group-members/set-group-member-extension", - "title": "Set a group member extension", + "sourcePath": "/sdk/android/user/friends/update-friends", + "openimPath": "/sdk/android/user/friends/update-friends", + "title": "Update friend profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/update-friends.mdx" }, { - "sourcePath": "/sdk/android/group/managing-group-members/transfer-group-owner", - "openimPath": "/sdk/android/group/managing-group-members/transfer-group-owner", - "title": "Transfer group ownership", + "sourcePath": "/sdk/android/user/friends/delete-friend", + "openimPath": "/sdk/android/user/friends/delete-friend", + "title": "Delete a friend", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/delete-friend.mdx" }, { - "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", - "openimPath": "/sdk/android/group/managing-group-members/change-group-member-mute", - "title": "Mute or unmute a group member", + "sourcePath": "/sdk/android/user/friend-applications/add-friend", + "openimPath": "/sdk/android/user/friend-applications/add-friend", + "title": "Send a friend request", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx" }, { - "sourcePath": "/sdk/android/message/overview-message", - "openimPath": "/sdk/android/message/overview-message", - "title": "Overview", + "sourcePath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "openimPath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "title": "Get received friend requests", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-text-message", - "openimPath": "/sdk/android/message/creating-messages/create-text-message", - "title": "Create a text message", + "sourcePath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "openimPath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "title": "Get sent friend requests", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-text-at-message", - "openimPath": "/sdk/android/message/creating-messages/create-text-at-message", - "title": "Create an @ message", + "sourcePath": "/sdk/android/user/friend-applications/accept-friend-application", + "openimPath": "/sdk/android/user/friend-applications/accept-friend-application", + "title": "Accept a friend request", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-custom-message", - "openimPath": "/sdk/android/message/creating-messages/create-custom-message", - "title": "Create a custom message", + "sourcePath": "/sdk/android/user/friend-applications/refuse-friend-application", + "openimPath": "/sdk/android/user/friend-applications/refuse-friend-application", + "title": "Reject a friend request", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-file", - "openimPath": "/sdk/android/message/creating-messages/create-image-message-by-file", - "title": "Create an image message from a file", + "sourcePath": "/sdk/android/user/blacklist/get-blacklist", + "openimPath": "/sdk/android/user/blacklist/get-blacklist", + "title": "Get the blacklist", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx" + "contentFile": "content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-url", - "openimPath": "/sdk/android/message/creating-messages/create-image-message-by-url", - "title": "Create an image message from a URL", + "sourcePath": "/sdk/android/user/blacklist/add-blacklist", + "openimPath": "/sdk/android/user/blacklist/add-blacklist", + "title": "Block a user", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-file", - "openimPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", - "title": "Create an audio message from a file", + "sourcePath": "/sdk/android/user/blacklist/remove-blacklist", + "openimPath": "/sdk/android/user/blacklist/remove-blacklist", + "title": "Unblock a user", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx" + "contentFile": "content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-url", - "openimPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", - "title": "Create an audio message from a URL", + "sourcePath": "/sdk/android/conversation/overview-conversation", + "openimPath": "/sdk/android/conversation/overview-conversation", + "title": "Conversation overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/overview-conversation.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-file", - "openimPath": "/sdk/android/message/creating-messages/create-video-message-by-file", - "title": "Create a video message from files", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "title": "Open a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-url", - "openimPath": "/sdk/android/message/creating-messages/create-video-message-by-url", - "title": "Create a video message from URLs", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-file", - "openimPath": "/sdk/android/message/creating-messages/create-file-message-by-file", - "title": "Create a file message from a file", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-url", - "openimPath": "/sdk/android/message/creating-messages/create-file-message-by-url", - "title": "Create a file message from a URL", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "openimPath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "Get the conversation list", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-card-message", - "openimPath": "/sdk/android/message/creating-messages/create-card-message", - "title": "Create a contact card message", + "sourcePath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "openimPath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "title": "Pin or unpin a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-location-message", - "openimPath": "/sdk/android/message/creating-messages/create-location-message", - "title": "Create a location message", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "openimPath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "title": "Set conversation extra data", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-face-message", - "openimPath": "/sdk/android/message/creating-messages/create-face-message", - "title": "Create an emoji message", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "openimPath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "title": "Set a conversation draft", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-quote-message", - "openimPath": "/sdk/android/message/creating-messages/create-quote-message", - "title": "Create a reply message", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "openimPath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "title": "Set conversation message reception", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-forward-message", - "openimPath": "/sdk/android/message/creating-messages/create-forward-message", - "title": "Create a forwarded message", + "sourcePath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "openimPath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "title": "Reset group mention status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx" }, { - "sourcePath": "/sdk/android/message/creating-messages/create-merger-message", - "openimPath": "/sdk/android/message/creating-messages/create-merger-message", - "title": "Create a merged forward message", + "sourcePath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "openimPath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "title": "Mark a conversation as read", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx" }, { - "sourcePath": "/sdk/android/message/sending-messages/send-message", - "openimPath": "/sdk/android/message/sending-messages/send-message", - "title": "Send a message", + "sourcePath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "openimPath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "title": "Track the total unread count", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx" }, { - "sourcePath": "/sdk/android/message/sending-messages/send-message-not-oss", - "openimPath": "/sdk/android/message/sending-messages/send-message-not-oss", - "title": "Send an uploaded media message", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "openimPath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "title": "Enable or disable burn after reading", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx" }, { - "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", - "openimPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", - "title": "Track message sending progress", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "openimPath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx" }, { - "sourcePath": "/sdk/android/message/receiving-messages/receive-messages", - "openimPath": "/sdk/android/message/receiving-messages/receive-messages", - "title": "Receive messages", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "openimPath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx" }, { - "sourcePath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", - "openimPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", - "title": "Receive custom business messages", + "sourcePath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "openimPath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-messages/load-older-messages", - "openimPath": "/sdk/android/message/retrieving-messages/load-older-messages", - "title": "Load message history", + "sourcePath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "openimPath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-messages/load-newer-messages", - "openimPath": "/sdk/android/message/retrieving-messages/load-newer-messages", - "title": "Load message history in reverse", + "sourcePath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "openimPath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", - "openimPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", - "title": "Find messages by ID", + "sourcePath": "/sdk/android/group/overview-group", + "openimPath": "/sdk/android/group/overview-group", + "title": "Group overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx" + "contentFile": "content/docs/chat/sdk/android/group/overview-group.mdx" }, { - "sourcePath": "/sdk/android/message/searching-messages/search-messages", - "openimPath": "/sdk/android/message/searching-messages/search-messages", - "title": "Search messages", + "sourcePath": "/sdk/android/group/create-group", + "openimPath": "/sdk/android/group/create-group", + "title": "Create a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/group/create-group.mdx" }, { - "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", - "openimPath": "/sdk/android/message/composing-messages/update-typing-status", - "title": "Report typing status", + "sourcePath": "/sdk/android/group/update-group-profile", + "openimPath": "/sdk/android/group/update-group-profile", + "title": "Update group profile", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/android/group/update-group-profile.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/delete-local-message", - "openimPath": "/sdk/android/message/managing-messages/delete-local-message", - "title": "Delete a local message", + "sourcePath": "/sdk/android/group/set-group-announcement", + "openimPath": "/sdk/android/group/set-group-announcement", + "title": "Publish a group announcement", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-announcement.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/delete-saved-messages", - "openimPath": "/sdk/android/message/managing-messages/delete-saved-messages", - "title": "Delete messages in a batch", + "sourcePath": "/sdk/android/group/set-group-extension", + "openimPath": "/sdk/android/group/set-group-extension", + "title": "Set group extra data", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-extension.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", - "openimPath": "/sdk/android/message/managing-messages/revoke-a-message", - "title": "Revoke a message", + "sourcePath": "/sdk/android/group/set-group-join-verification", + "openimPath": "/sdk/android/group/set-group-join-verification", + "title": "Set group join verification", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-join-verification.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", - "openimPath": "/sdk/android/message/managing-messages/modify-a-message", - "title": "Modify a message", + "sourcePath": "/sdk/android/group/set-group-member-profile-access", + "openimPath": "/sdk/android/group/set-group-member-profile-access", + "title": "Set member profile access", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", - "openimPath": "/sdk/android/message/managing-messages/get-pinned-messages", - "title": "Get pinned messages in a conversation", + "sourcePath": "/sdk/android/group/set-group-member-friend-permission", + "openimPath": "/sdk/android/group/set-group-member-friend-permission", + "title": "Set member friend request permission", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", - "openimPath": "/sdk/android/message/managing-messages/set-message-pinned", - "title": "Pin or unpin a message", + "sourcePath": "/sdk/android/group/change-group-mute", + "openimPath": "/sdk/android/group/change-group-mute", + "title": "Change group mute status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx" + "contentFile": "content/docs/chat/sdk/android/group/change-group-mute.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/insert-local-single-message", - "openimPath": "/sdk/android/message/managing-messages/insert-local-single-message", - "title": "Insert a local one-to-one message", + "sourcePath": "/sdk/android/group/join-group", + "openimPath": "/sdk/android/group/join-group", + "title": "Apply to join a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/join-group.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/insert-local-group-message", - "openimPath": "/sdk/android/message/managing-messages/insert-local-group-message", - "title": "Insert a local group message", + "sourcePath": "/sdk/android/group/quit-group", + "openimPath": "/sdk/android/group/quit-group", + "title": "Leave a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/quit-group.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/clear-all-local-messages", - "openimPath": "/sdk/android/message/managing-messages/clear-all-local-messages", - "title": "Clear all local messages", + "sourcePath": "/sdk/android/group/dismiss-group", + "openimPath": "/sdk/android/group/dismiss-group", + "title": "Dismiss a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/group/dismiss-group.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/clear-all-messages", - "openimPath": "/sdk/android/message/managing-messages/clear-all-messages", - "title": "Clear local and server messages", + "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "openimPath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "title": "Get group information", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx" }, { - "sourcePath": "/sdk/android/message/managing-messages/set-message-local-ex", - "openimPath": "/sdk/android/message/managing-messages/set-message-local-ex", - "title": "Set a local message extension", + "sourcePath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "openimPath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "title": "Get joined groups by page", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx" }, { - "sourcePath": "/sdk/android/file-uploads/track-file-upload-progress", - "openimPath": "/sdk/android/file-uploads/track-file-upload-progress", - "title": "Track file upload progress", + "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", + "openimPath": "/sdk/android/group/retrieving-groups/is-join-group", + "title": "Check group membership", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx" }, { - "sourcePath": "/sdk/android/file-uploads/upload-file", - "openimPath": "/sdk/android/file-uploads/upload-file", - "title": "Upload a file", + "sourcePath": "/sdk/android/group/retrieving-groups/search-groups", + "openimPath": "/sdk/android/group/retrieving-groups/search-groups", + "title": "Search groups", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/file-uploads/upload-file.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx" }, { - "sourcePath": "/sdk/android/calling/overview-calling", - "openimPath": "/sdk/android/calling/overview-calling", - "title": "Audio and video calling overview", + "sourcePath": "/sdk/android/group/group-applications/overview-group-applications", + "openimPath": "/sdk/android/group/group-applications/overview-group-applications", + "title": "Group applications overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/overview-calling.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx" }, { - "sourcePath": "/sdk/android/calling/managing-calls/start-single-call", - "openimPath": "/sdk/android/calling/managing-calls/start-single-call", - "title": "Start a one-to-one call", + "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "openimPath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "title": "Get received group applications", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/android/calling/managing-calls/start-group-call", - "openimPath": "/sdk/android/calling/managing-calls/start-group-call", - "title": "Start a group call", + "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "openimPath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "title": "Get sent group applications", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/android/calling/managing-calls/accept-call", - "openimPath": "/sdk/android/calling/managing-calls/accept-call", - "title": "Accept a call", + "sourcePath": "/sdk/android/group/group-applications/accept-group-application", + "openimPath": "/sdk/android/group/group-applications/accept-group-application", + "title": "Accept a group application", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx" }, { - "sourcePath": "/sdk/android/calling/managing-calls/reject-call", - "openimPath": "/sdk/android/calling/managing-calls/reject-call", - "title": "Reject a call", + "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", + "openimPath": "/sdk/android/group/group-applications/refuse-group-application", + "title": "Reject a group application", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx" }, { - "sourcePath": "/sdk/android/calling/managing-calls/cancel-call", - "openimPath": "/sdk/android/calling/managing-calls/cancel-call", - "title": "Cancel a call invitation", + "sourcePath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "openimPath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "title": "Group member queries overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx" }, { - "sourcePath": "/sdk/android/calling/managing-calls/hang-up-call", - "openimPath": "/sdk/android/calling/managing-calls/hang-up-call", - "title": "End a call", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "openimPath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "title": "Get group members", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx" }, { - "sourcePath": "/sdk/android/calling/managing-calls/handle-call-events", - "openimPath": "/sdk/android/calling/managing-calls/handle-call-events", - "title": "Handle call events", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "openimPath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "title": "Get group member profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx" }, { - "sourcePath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", - "openimPath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", - "title": "Restore a pending call invitation", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "openimPath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "title": "Check users in a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx" }, { - "sourcePath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", - "openimPath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", - "title": "Get a group call room", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "openimPath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "Get group owners and admins", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" }, { - "sourcePath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", - "openimPath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", - "title": "Get a call room token", + "sourcePath": "/sdk/android/group/retrieving-group-members/search-group-members", + "openimPath": "/sdk/android/group/retrieving-group-members/search-group-members", + "title": "Search group members", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx" }, { - "sourcePath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", - "openimPath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", - "title": "Send a custom signal", + "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "openimPath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "title": "Invite users to a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx" }, { - "sourcePath": "/sdk/android/events/overview-events", - "openimPath": "/sdk/android/events/overview-events", - "title": "Events overview", + "sourcePath": "/sdk/android/group/managing-group-members/kick-group-member", + "openimPath": "/sdk/android/group/managing-group-members/kick-group-member", + "title": "Remove group members", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/events/overview-events.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx" }, { - "sourcePath": "/sdk/android/logger", - "openimPath": "/sdk/android/logger", - "title": "Logger", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "title": "Update a group nickname", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/logger.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx" }, { - "sourcePath": "/sdk/flutter/overview", - "openimPath": "/sdk/flutter/overview", - "title": "OpenIM SDK for Flutter", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/overview.mdx" + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "title": "Manage group administrators", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx" }, { - "sourcePath": "/sdk/flutter/getting-started/before-you-start", - "openimPath": "/sdk/flutter/getting-started/before-you-start", - "title": "Before you start", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "title": "Update a group member avatar", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/getting-started/before-you-start.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx" }, { - "sourcePath": "/sdk/flutter/getting-started/environment-specific-implementation", - "openimPath": "/sdk/flutter/getting-started/environment-specific-implementation", - "title": "Environment-specific implementation", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "title": "Set group member extra data", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/getting-started/environment-specific-implementation.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx" }, { - "sourcePath": "/sdk/flutter/getting-started/authenticate-and-manage-session", - "openimPath": "/sdk/flutter/getting-started/authenticate-and-manage-session", - "title": "Authenticate and manage a session", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "openimPath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "title": "Transfer group ownership", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/getting-started/authenticate-and-manage-session.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx" }, { - "sourcePath": "/sdk/flutter/getting-started/send-first-message", - "openimPath": "/sdk/flutter/getting-started/send-first-message", - "title": "Send your first message", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "openimPath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "title": "Mute or unmute a group member", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/getting-started/send-first-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx" }, { - "sourcePath": "/sdk/flutter/user/overview-user", - "openimPath": "/sdk/flutter/user/overview-user", - "title": "Overview", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/overview-message", + "openimPath": "/sdk/android/message/overview-message", + "title": "Message overview", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/overview-user.mdx" + "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-users/retrieve-users", - "openimPath": "/sdk/flutter/user/retrieving-users/retrieve-users", - "title": "Retrieve users", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-text-message", + "openimPath": "/sdk/android/message/creating-messages/create-text-message", + "title": "Create a text message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-users/retrieve-users.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile", - "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile", - "title": "View your profile", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-text-at-message", + "openimPath": "/sdk/android/message/creating-messages/create-text-at-message", + "title": "Create a mention message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile", - "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile", - "title": "Update your profile", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-custom-message", + "openimPath": "/sdk/android/message/creating-messages/create-custom-message", + "title": "Create a custom message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception", - "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception", - "title": "Set global message reception", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception.mdx" + "sourcePath": "/sdk/android/message/creating-messages/create-image-message", + "openimPath": "/sdk/android/message/creating-messages/create-image-message", + "title": "Create an image message", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status", - "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status", - "title": "Subscribe to user status", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "title": "Create an image message from a local path", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status", - "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status", - "title": "Refresh subscribed user status", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "title": "Create an image message from URLs", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status", - "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status", - "title": "Unsubscribe from user status", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message", + "openimPath": "/sdk/android/message/creating-messages/create-sound-message", + "title": "Create an audio message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/friends/get-friend-list-page", - "openimPath": "/sdk/flutter/user/friends/get-friend-list-page", - "title": "Get the friend list", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "title": "Create an audio message from a local path", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friends/get-friend-list-page.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx" }, { - "sourcePath": "/sdk/flutter/user/friends/search-friends", - "openimPath": "/sdk/flutter/user/friends/search-friends", - "title": "Search friends", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "title": "Create an audio message from a URL", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friends/search-friends.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx" }, { - "sourcePath": "/sdk/flutter/user/friends/get-friends-info", - "openimPath": "/sdk/flutter/user/friends/get-friends-info", - "title": "Get friend profiles", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message", + "openimPath": "/sdk/android/message/creating-messages/create-video-message", + "title": "Create a video message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friends/get-friends-info.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/friends/check-friend", - "openimPath": "/sdk/flutter/user/friends/check-friend", - "title": "Check friendship status", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "title": "Create a video message from local paths", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friends/check-friend.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx" }, { - "sourcePath": "/sdk/flutter/user/friends/update-friends", - "openimPath": "/sdk/flutter/user/friends/update-friends", - "title": "Update friend information", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "title": "Create a video message from URLs", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friends/update-friends.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx" }, { - "sourcePath": "/sdk/flutter/user/friends/delete-friend", - "openimPath": "/sdk/flutter/user/friends/delete-friend", - "title": "Delete a friend", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message", + "openimPath": "/sdk/android/message/creating-messages/create-file-message", + "title": "Create a file message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friends/delete-friend.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/friend-applications/add-friend", - "openimPath": "/sdk/flutter/user/friend-applications/add-friend", - "title": "Send a friend application", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "title": "Create a file message from a local path", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/add-friend.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx" }, { - "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient", - "openimPath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient", - "title": "Get received friend applications", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "title": "Create a file message from a URL", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx" }, { - "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant", - "openimPath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant", - "title": "Get sent friend applications", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-card-message", + "openimPath": "/sdk/android/message/creating-messages/create-card-message", + "title": "Create a contact card message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count", - "openimPath": "/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count", - "title": "Get pending application count", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-location-message", + "openimPath": "/sdk/android/message/creating-messages/create-location-message", + "title": "Create a location message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/friend-applications/accept-friend-application", - "openimPath": "/sdk/flutter/user/friend-applications/accept-friend-application", - "title": "Accept a friend application", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-face-message", + "openimPath": "/sdk/android/message/creating-messages/create-face-message", + "title": "Create an emoji message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/accept-friend-application.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/friend-applications/refuse-friend-application", - "openimPath": "/sdk/flutter/user/friend-applications/refuse-friend-application", - "title": "Reject a friend application", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-quote-message", + "openimPath": "/sdk/android/message/creating-messages/create-quote-message", + "title": "Create a reply message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/refuse-friend-application.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "openimPath": "/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "title": "Retrieve a list of blocked users", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-advanced-text-message", + "openimPath": "/sdk/android/message/creating-messages/create-advanced-text-message", + "title": "Create a rich-text message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/moderating-a-user/block-user", - "openimPath": "/sdk/flutter/user/moderating-a-user/block-user", - "title": "Block a user", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "openimPath": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "title": "Create a rich-text reply", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/block-user.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/moderating-a-user/unblock-user", - "openimPath": "/sdk/flutter/user/moderating-a-user/unblock-user", - "title": "Unblock a user", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-forward-message", + "openimPath": "/sdk/android/message/creating-messages/create-forward-message", + "title": "Create a forwarded message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/unblock-user.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/overview-conversation", - "openimPath": "/sdk/flutter/conversation/overview-conversation", - "title": "Conversation overview", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-merger-message", + "openimPath": "/sdk/android/message/creating-messages/create-merger-message", + "title": "Create a merged message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/overview-conversation.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target", - "openimPath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target", - "title": "Open a conversation", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/sending-messages/send-message", + "openimPath": "/sdk/android/message/sending-messages/send-message", + "title": "Send a message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target.mdx" + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-id", - "openimPath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-id", - "title": "Resolve a conversation ID", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/sending-messages/send-message-not-oss", + "openimPath": "/sdk/android/message/sending-messages/send-message-not-oss", + "title": "Send a message without OSS", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversation-id.mdx" + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id", - "openimPath": "/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id", - "title": "Get conversations by ID", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "openimPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "title": "Track message sending progress", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id.mdx" + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list", - "openimPath": "/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list", - "title": "Retrieve a conversation list", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/receiving-messages/receive-messages", + "openimPath": "/sdk/android/message/receiving-messages/receive-messages", + "title": "Receive messages", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list.mdx" + "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/pin-conversation", - "openimPath": "/sdk/flutter/conversation/managing-conversations/pin-conversation", - "title": "Pin or unpin a conversation", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/pin-conversation.mdx" + "sourcePath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "openimPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "title": "Receive custom business messages", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-conversation-extension", - "openimPath": "/sdk/flutter/conversation/managing-conversations/set-conversation-extension", - "title": "Set conversation extra data", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-conversation-extension.mdx" + "sourcePath": "/sdk/android/message/retrieving-messages/load-older-messages", + "openimPath": "/sdk/android/message/retrieving-messages/load-older-messages", + "title": "Load older messages", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-conversation-draft", - "openimPath": "/sdk/flutter/conversation/managing-conversations/set-conversation-draft", - "title": "Set a conversation draft", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "openimPath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "title": "Load newer messages", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-conversation-draft.mdx" + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-message-receive-option", - "openimPath": "/sdk/flutter/conversation/managing-conversations/set-message-receive-option", - "title": "Set conversation message reception", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-message-receive-option.mdx" + "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "openimPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "title": "Find messages by ID", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/clear-group-mentions", - "openimPath": "/sdk/flutter/conversation/managing-conversations/clear-group-mentions", - "title": "Reset group mention status", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/clear-group-mentions.mdx" + "sourcePath": "/sdk/android/message/retrieving-messages/load-message-context", + "openimPath": "/sdk/android/message/retrieving-messages/load-message-context", + "title": "Load message context", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/mark-conversation-read", - "openimPath": "/sdk/flutter/conversation/managing-conversations/mark-conversation-read", - "title": "Mark a conversation as read", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/searching-messages/search-messages", + "openimPath": "/sdk/android/message/searching-messages/search-messages", + "title": "Search messages", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/mark-conversation-read.mdx" + "contentFile": "content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/get-total-unread-count", - "openimPath": "/sdk/flutter/conversation/managing-conversations/get-total-unread-count", - "title": "Track the total unread count", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", + "openimPath": "/sdk/android/message/composing-messages/update-typing-status", + "title": "Update typing status", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/get-total-unread-count.mdx" + "contentFile": "content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-private-chat", - "openimPath": "/sdk/flutter/conversation/managing-conversations/set-private-chat", - "title": "Enable or disable burn after reading", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-private-chat.mdx" + "sourcePath": "/sdk/android/message/composing-messages/get-typing-status", + "openimPath": "/sdk/android/message/composing-messages/get-typing-status", + "title": "Retrieve typing status", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-burn-duration", - "openimPath": "/sdk/flutter/conversation/managing-conversations/set-burn-duration", - "title": "Set the burn duration", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-burn-duration.mdx" + "sourcePath": "/sdk/android/message/managing-messages/delete-local-message", + "openimPath": "/sdk/android/message/managing-messages/delete-local-message", + "title": "Delete a local message", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-message-destruct", - "openimPath": "/sdk/flutter/conversation/managing-conversations/set-message-destruct", - "title": "Schedule server message deletion", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-message-destruct.mdx" + "sourcePath": "/sdk/android/message/managing-messages/delete-saved-messages", + "openimPath": "/sdk/android/message/managing-messages/delete-saved-messages", + "title": "Delete messages in a batch", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/hide-a-conversation", - "openimPath": "/sdk/flutter/conversation/managing-conversations/hide-a-conversation", - "title": "Hide a conversation", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/delete-user-messages", + "openimPath": "/sdk/android/message/managing-messages/delete-user-messages", + "title": "Delete all messages from a user in a group chat", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/hide-a-conversation.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages", - "openimPath": "/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages", - "title": "Delete a conversation and its messages", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", + "openimPath": "/sdk/android/message/managing-messages/revoke-a-message", + "title": "Revoke a message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/clear-conversation-messages", - "openimPath": "/sdk/flutter/conversation/managing-conversations/clear-conversation-messages", - "title": "Clear messages in a conversation", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", + "openimPath": "/sdk/android/message/managing-messages/modify-a-message", + "title": "Modify a message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/clear-conversation-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups", - "title": "Conversation group overview", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", + "openimPath": "/sdk/android/message/managing-messages/get-pinned-messages", + "title": "View pinned messages", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group", - "title": "createConversationGroup", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", + "openimPath": "/sdk/android/message/managing-messages/set-message-pinned", + "title": "Pin or unpin a message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups", - "title": "getConversationGroups", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/insert-local-single-message", + "openimPath": "/sdk/android/message/managing-messages/insert-local-single-message", + "title": "Insert a local direct message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", - "title": "getConversationGroupInfoWithConversations", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/insert-local-group-message", + "openimPath": "/sdk/android/message/managing-messages/insert-local-group-message", + "title": "Insert a local group message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", - "title": "getConversationGroupByConversationID", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "openimPath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "title": "Clear all local messages", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group", - "title": "updateConversationGroup", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/clear-all-messages", + "openimPath": "/sdk/android/message/managing-messages/clear-all-messages", + "title": "Clear all saved messages", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order", - "title": "setConversationGroupOrder", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/set-message-local-ex", + "openimPath": "/sdk/android/message/managing-messages/set-message-local-ex", + "title": "Set local message extensions", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups", - "title": "addConversationsToGroups", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "openimPath": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "title": "Report group messages as read", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups", - "title": "removeConversationsFromGroups", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-read-status/get-group-message-readers", + "openimPath": "/sdk/android/message/managing-read-status/get-group-message-readers", + "title": "Get members who read a group message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group", - "title": "deleteConversationGroup", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/file-uploads/track-file-upload-progress", + "openimPath": "/sdk/android/file-uploads/track-file-upload-progress", + "title": "Track file upload progress", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx" }, { - "sourcePath": "/sdk/flutter/group/overview-group", - "openimPath": "/sdk/flutter/group/overview-group", - "title": "Group overview", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/file-uploads/upload-file", + "openimPath": "/sdk/android/file-uploads/upload-file", + "title": "Upload a file", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/overview-group.mdx" + "contentFile": "content/docs/chat/sdk/android/file-uploads/upload-file.mdx" }, { - "sourcePath": "/sdk/flutter/group/create-group", - "openimPath": "/sdk/flutter/group/create-group", - "title": "Create a group", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/overview-calling", + "openimPath": "/sdk/android/calling/overview-calling", + "title": "Audio and video calling overview", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/create-group.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/overview-calling.mdx" }, { - "sourcePath": "/sdk/flutter/group/update-group-profile", - "openimPath": "/sdk/flutter/group/update-group-profile", - "title": "Update group profile", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/update-group-profile.mdx" + "sourcePath": "/sdk/android/calling/managing-calls/start-single-call", + "openimPath": "/sdk/android/calling/managing-calls/start-single-call", + "title": "Start a one-to-one call", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx" }, { - "sourcePath": "/sdk/flutter/group/set-group-announcement", - "openimPath": "/sdk/flutter/group/set-group-announcement", - "title": "Publish a group announcement", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/set-group-announcement.mdx" + "sourcePath": "/sdk/android/calling/managing-calls/start-group-call", + "openimPath": "/sdk/android/calling/managing-calls/start-group-call", + "title": "Start a group call", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx" }, { - "sourcePath": "/sdk/flutter/group/set-group-extension", - "openimPath": "/sdk/flutter/group/set-group-extension", - "title": "Set group extra data", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/set-group-extension.mdx" + "sourcePath": "/sdk/android/calling/managing-calls/accept-call", + "openimPath": "/sdk/android/calling/managing-calls/accept-call", + "title": "Accept a call", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx" }, { - "sourcePath": "/sdk/flutter/group/set-group-join-verification", - "openimPath": "/sdk/flutter/group/set-group-join-verification", - "title": "Set group join verification", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/set-group-join-verification.mdx" + "sourcePath": "/sdk/android/calling/managing-calls/reject-call", + "openimPath": "/sdk/android/calling/managing-calls/reject-call", + "title": "Reject a call", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx" }, { - "sourcePath": "/sdk/flutter/group/set-group-member-profile-access", - "openimPath": "/sdk/flutter/group/set-group-member-profile-access", - "title": "Set member profile access", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/set-group-member-profile-access.mdx" + "sourcePath": "/sdk/android/calling/managing-calls/cancel-call", + "openimPath": "/sdk/android/calling/managing-calls/cancel-call", + "title": "Cancel a call invitation", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx" }, { - "sourcePath": "/sdk/flutter/group/set-group-member-friend-permission", - "openimPath": "/sdk/flutter/group/set-group-member-friend-permission", - "title": "Set member friend request permission", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/set-group-member-friend-permission.mdx" + "sourcePath": "/sdk/android/calling/managing-calls/hang-up-call", + "openimPath": "/sdk/android/calling/managing-calls/hang-up-call", + "title": "Hang up a call", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx" }, { - "sourcePath": "/sdk/flutter/group/change-group-mute", - "openimPath": "/sdk/flutter/group/change-group-mute", - "title": "Change group mute status", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/managing-calls/handle-call-events", + "openimPath": "/sdk/android/calling/managing-calls/handle-call-events", + "title": "Handle call events", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/change-group-mute.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx" }, { - "sourcePath": "/sdk/flutter/group/join-group", - "openimPath": "/sdk/flutter/group/join-group", - "title": "Apply to join a group", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "openimPath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "title": "Restore a pending invitation", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/join-group.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx" }, { - "sourcePath": "/sdk/flutter/group/quit-group", - "openimPath": "/sdk/flutter/group/quit-group", - "title": "Leave a group", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "openimPath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "title": "Get a group call room", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/quit-group.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx" }, { - "sourcePath": "/sdk/flutter/group/dismiss-group", - "openimPath": "/sdk/flutter/group/dismiss-group", - "title": "Dismiss a group", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "openimPath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "title": "Get room credentials", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/dismiss-group.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-groups/get-specified-groups-info", - "openimPath": "/sdk/flutter/group/retrieving-groups/get-specified-groups-info", - "title": "Get group information", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "openimPath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "title": "Send a custom signal", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-specified-groups-info.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list", - "openimPath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list", - "title": "Get joined groups", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/events/overview-events", + "openimPath": "/sdk/android/events/overview-events", + "title": "Events overview", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-joined-group-list.mdx" + "contentFile": "content/docs/chat/sdk/android/events/overview-events.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list-page", - "openimPath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list-page", - "title": "Get joined groups by page", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/logger", + "openimPath": "/sdk/android/logger", + "title": "Logging", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-joined-group-list-page.mdx" + "contentFile": "content/docs/chat/sdk/android/logger.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-groups/is-join-group", - "openimPath": "/sdk/flutter/group/retrieving-groups/is-join-group", - "title": "Check group membership", + "sourcePath": "/sdk/flutter/overview", + "openimPath": "/sdk/flutter/overview", + "title": "OpenIM SDK for Flutter", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/is-join-group.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/overview.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-groups/search-groups", - "openimPath": "/sdk/flutter/group/retrieving-groups/search-groups", - "title": "Search groups", + "sourcePath": "/sdk/flutter/getting-started/before-you-start", + "openimPath": "/sdk/flutter/getting-started/before-you-start", + "title": "Before you start", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/search-groups.mdx" + "contentFile": "content/docs/chat/sdk/flutter/getting-started/before-you-start.mdx" }, { - "sourcePath": "/sdk/flutter/group/group-applications/overview-group-applications", - "openimPath": "/sdk/flutter/group/group-applications/overview-group-applications", - "title": "Group applications overview", + "sourcePath": "/sdk/flutter/getting-started/environment-specific-implementation", + "openimPath": "/sdk/flutter/getting-started/environment-specific-implementation", + "title": "Environment-specific implementation", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/overview-group-applications.mdx" + "contentFile": "content/docs/chat/sdk/flutter/getting-started/environment-specific-implementation.mdx" }, { - "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-list-as-recipient", - "openimPath": "/sdk/flutter/group/group-applications/get-group-application-list-as-recipient", - "title": "Get received group applications", + "sourcePath": "/sdk/flutter/getting-started/authenticate-and-manage-session", + "openimPath": "/sdk/flutter/getting-started/authenticate-and-manage-session", + "title": "Authenticate and manage a session", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-list-as-recipient.mdx" + "contentFile": "content/docs/chat/sdk/flutter/getting-started/authenticate-and-manage-session.mdx" }, { - "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-list-as-applicant", - "openimPath": "/sdk/flutter/group/group-applications/get-group-application-list-as-applicant", - "title": "Get sent group applications", + "sourcePath": "/sdk/flutter/getting-started/send-first-message", + "openimPath": "/sdk/flutter/getting-started/send-first-message", + "title": "Send your first message", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-list-as-applicant.mdx" + "contentFile": "content/docs/chat/sdk/flutter/getting-started/send-first-message.mdx" }, { - "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-unhandled-count", - "openimPath": "/sdk/flutter/group/group-applications/get-group-application-unhandled-count", - "title": "Get pending group application count", + "sourcePath": "/sdk/flutter/user/overview-user", + "openimPath": "/sdk/flutter/user/overview-user", + "title": "Overview", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-unhandled-count.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/overview-user.mdx" }, { - "sourcePath": "/sdk/flutter/group/group-applications/accept-group-application", - "openimPath": "/sdk/flutter/group/group-applications/accept-group-application", - "title": "Accept a group application", + "sourcePath": "/sdk/flutter/user/retrieving-users/retrieve-users", + "openimPath": "/sdk/flutter/user/retrieving-users/retrieve-users", + "title": "Retrieve users", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/accept-group-application.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-users/retrieve-users.mdx" }, { - "sourcePath": "/sdk/flutter/group/group-applications/refuse-group-application", - "openimPath": "/sdk/flutter/group/group-applications/refuse-group-application", - "title": "Reject a group application", + "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile", + "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile", + "title": "View your profile", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/refuse-group-application.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members", - "openimPath": "/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members", - "title": "Group member queries overview", + "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile", + "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile", + "title": "Update your profile", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-member-list", - "openimPath": "/sdk/flutter/group/retrieving-group-members/get-group-member-list", - "title": "Get group members", + "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception", + "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception", + "title": "Set global message reception", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-member-list.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-members-info", - "openimPath": "/sdk/flutter/group/retrieving-group-members/get-group-members-info", - "title": "Get group member profiles", + "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status", + "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status", + "title": "Subscribe to user status", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-members-info.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-users-in-group", - "openimPath": "/sdk/flutter/group/retrieving-group-members/get-users-in-group", - "title": "Check users in a group", + "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status", + "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status", + "title": "Refresh subscribed user status", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-users-in-group.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin", - "openimPath": "/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin", - "title": "Get group owners and admins", + "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status", + "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status", + "title": "Unsubscribe from user status", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-group-members/search-group-members", - "openimPath": "/sdk/flutter/group/retrieving-group-members/search-group-members", - "title": "Search group members", + "sourcePath": "/sdk/flutter/user/friends/get-friend-list-page", + "openimPath": "/sdk/flutter/user/friends/get-friend-list-page", + "title": "Get the friend list", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/search-group-members.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friends/get-friend-list-page.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/invite-user-to-group", - "openimPath": "/sdk/flutter/group/managing-group-members/invite-user-to-group", - "title": "Invite users to a group", + "sourcePath": "/sdk/flutter/user/friends/search-friends", + "openimPath": "/sdk/flutter/user/friends/search-friends", + "title": "Search friends", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/invite-user-to-group.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friends/search-friends.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/kick-group-member", - "openimPath": "/sdk/flutter/group/managing-group-members/kick-group-member", - "title": "Remove group members", + "sourcePath": "/sdk/flutter/user/friends/get-friends-info", + "openimPath": "/sdk/flutter/user/friends/get-friends-info", + "title": "Get friend profiles", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/kick-group-member.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friends/get-friends-info.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-nickname", - "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-nickname", - "title": "Update a group nickname", + "sourcePath": "/sdk/flutter/user/friends/check-friend", + "openimPath": "/sdk/flutter/user/friends/check-friend", + "title": "Check friendship status", "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-nickname.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/user/friends/check-friend.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-role-level", - "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-role-level", - "title": "Manage group administrators", + "sourcePath": "/sdk/flutter/user/friends/update-friends", + "openimPath": "/sdk/flutter/user/friends/update-friends", + "title": "Update friend information", "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-role-level.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/user/friends/update-friends.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-avatar", - "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-avatar", - "title": "Update a group member avatar", + "sourcePath": "/sdk/flutter/user/friends/delete-friend", + "openimPath": "/sdk/flutter/user/friends/delete-friend", + "title": "Delete a friend", "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-avatar.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/user/friends/delete-friend.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-extension", - "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-extension", - "title": "Set group member extra data", + "sourcePath": "/sdk/flutter/user/friend-applications/add-friend", + "openimPath": "/sdk/flutter/user/friend-applications/add-friend", + "title": "Send a friend application", "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-extension.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/add-friend.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/transfer-group-owner", - "openimPath": "/sdk/flutter/group/managing-group-members/transfer-group-owner", - "title": "Transfer group owner", + "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient", + "openimPath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient", + "title": "Get received friend applications", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/transfer-group-owner.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/change-group-member-mute", - "openimPath": "/sdk/flutter/group/managing-group-members/change-group-member-mute", - "title": "Mute or unmute a group member", + "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant", + "openimPath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant", + "title": "Get sent friend applications", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/change-group-member-mute.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/flutter/message/overview-message", - "openimPath": "/sdk/flutter/message/overview-message", - "title": "Overview", + "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count", + "openimPath": "/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count", + "title": "Get pending application count", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/overview-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-text-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-text-message", - "title": "Create a text message", + "sourcePath": "/sdk/flutter/user/friend-applications/accept-friend-application", + "openimPath": "/sdk/flutter/user/friend-applications/accept-friend-application", + "title": "Accept a friend application", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-text-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/accept-friend-application.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-text-at-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-text-at-message", - "title": "Create a mention message", + "sourcePath": "/sdk/flutter/user/friend-applications/refuse-friend-application", + "openimPath": "/sdk/flutter/user/friend-applications/refuse-friend-application", + "title": "Reject a friend application", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-text-at-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/refuse-friend-application.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-custom-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-custom-message", - "title": "Create a custom message", + "sourcePath": "/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users", + "openimPath": "/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users", + "title": "Retrieve a list of blocked users", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-custom-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-image-message", - "title": "Create an image message", + "sourcePath": "/sdk/flutter/user/moderating-a-user/block-user", + "openimPath": "/sdk/flutter/user/moderating-a-user/block-user", + "title": "Block a user", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/block-user.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message-from-full-path", - "openimPath": "/sdk/flutter/message/creating-messages/create-image-message-from-full-path", - "title": "Create an image message from a path", + "sourcePath": "/sdk/flutter/user/moderating-a-user/unblock-user", + "openimPath": "/sdk/flutter/user/moderating-a-user/unblock-user", + "title": "Unblock a user", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/unblock-user.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message-by-url", - "openimPath": "/sdk/flutter/message/creating-messages/create-image-message-by-url", - "title": "Create an image message from a URL", + "sourcePath": "/sdk/flutter/conversation/overview-conversation", + "openimPath": "/sdk/flutter/conversation/overview-conversation", + "title": "Conversation overview", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/overview-conversation.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-sound-message", - "title": "Create an audio message", + "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target", + "openimPath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target", + "title": "Open a conversation", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message-from-full-path", - "openimPath": "/sdk/flutter/message/creating-messages/create-sound-message-from-full-path", - "title": "Create an audio message from a path", + "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-id", + "openimPath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversation-id.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message-by-url", - "openimPath": "/sdk/flutter/message/creating-messages/create-sound-message-by-url", - "title": "Create an audio message from a URL", + "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id", + "openimPath": "/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-video-message", - "title": "Create a video message", + "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list", + "openimPath": "/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "Retrieve a conversation list", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message-from-full-path", - "openimPath": "/sdk/flutter/message/creating-messages/create-video-message-from-full-path", - "title": "Create a video message from a path", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/pin-conversation", + "openimPath": "/sdk/flutter/conversation/managing-conversations/pin-conversation", + "title": "Pin or unpin a conversation", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message-from-full-path.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/pin-conversation.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message-by-url", - "openimPath": "/sdk/flutter/message/creating-messages/create-video-message-by-url", - "title": "Create a video message from a URL", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-conversation-extension", + "openimPath": "/sdk/flutter/conversation/managing-conversations/set-conversation-extension", + "title": "Set conversation extra data", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message-by-url.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-conversation-extension.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-file-message", - "title": "Create a file message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-conversation-draft", + "openimPath": "/sdk/flutter/conversation/managing-conversations/set-conversation-draft", + "title": "Set a conversation draft", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-conversation-draft.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message-from-full-path", - "openimPath": "/sdk/flutter/message/creating-messages/create-file-message-from-full-path", - "title": "Create a file message from a path", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-message-receive-option", + "openimPath": "/sdk/flutter/conversation/managing-conversations/set-message-receive-option", + "title": "Set conversation message reception", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message-from-full-path.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-message-receive-option.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message-by-url", - "openimPath": "/sdk/flutter/message/creating-messages/create-file-message-by-url", - "title": "Create a file message from a URL", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/clear-group-mentions", + "openimPath": "/sdk/flutter/conversation/managing-conversations/clear-group-mentions", + "title": "Reset group mention status", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message-by-url.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/clear-group-mentions.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-location-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-location-message", - "title": "Create a location message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/mark-conversation-read", + "openimPath": "/sdk/flutter/conversation/managing-conversations/mark-conversation-read", + "title": "Mark a conversation as read", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-location-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/mark-conversation-read.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-card-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-card-message", - "title": "Create a contact card message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/get-total-unread-count", + "openimPath": "/sdk/flutter/conversation/managing-conversations/get-total-unread-count", + "title": "Track the total unread count", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-card-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/get-total-unread-count.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-face-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-face-message", - "title": "Create an emoji message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-private-chat", + "openimPath": "/sdk/flutter/conversation/managing-conversations/set-private-chat", + "title": "Enable or disable burn after reading", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-face-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-private-chat.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-quote-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-quote-message", - "title": "Create a reply message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-burn-duration", + "openimPath": "/sdk/flutter/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-quote-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-burn-duration.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-advanced-text-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-advanced-text-message", - "title": "Create rich text", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-message-destruct", + "openimPath": "/sdk/flutter/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-advanced-text-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-message-destruct.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-advanced-quote-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-advanced-quote-message", - "title": "Create a rich reply", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/hide-a-conversation", + "openimPath": "/sdk/flutter/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-advanced-quote-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/hide-a-conversation.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-forward-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-forward-message", - "title": "Create a forwarded message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages", + "openimPath": "/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-forward-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-merger-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-merger-message", - "title": "Create a merged message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/clear-conversation-messages", + "openimPath": "/sdk/flutter/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-merger-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/clear-conversation-messages.mdx" }, { - "sourcePath": "/sdk/flutter/message/sending-messages/send-message", - "openimPath": "/sdk/flutter/message/sending-messages/send-message", - "title": "Send a message", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups", + "title": "Conversation group overview", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/send-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups.mdx" }, { - "sourcePath": "/sdk/flutter/message/sending-messages/send-message-not-oss", - "openimPath": "/sdk/flutter/message/sending-messages/send-message-not-oss", - "title": "Send a message without OSS", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group", + "title": "createConversationGroup", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/send-message-not-oss.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/sending-messages/set-msg-send-progress-listener", - "openimPath": "/sdk/flutter/message/sending-messages/set-msg-send-progress-listener", - "title": "Track message sending progress", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups", + "title": "getConversationGroups", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/set-msg-send-progress-listener.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups.mdx" }, { - "sourcePath": "/sdk/flutter/message/receiving-messages/receive-messages", - "openimPath": "/sdk/flutter/message/receiving-messages/receive-messages", - "title": "Receive messages", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", + "title": "getConversationGroupInfoWithConversations", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/receiving-messages/receive-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" }, { - "sourcePath": "/sdk/flutter/message/receiving-messages/custom-business-listener", - "openimPath": "/sdk/flutter/message/receiving-messages/custom-business-listener", - "title": "Receive custom business messages", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", + "title": "getConversationGroupByConversationID", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/receiving-messages/custom-business-listener.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" }, { - "sourcePath": "/sdk/flutter/message/retrieving-messages/load-older-messages", - "openimPath": "/sdk/flutter/message/retrieving-messages/load-older-messages", - "title": "Load older messages", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group", + "title": "updateConversationGroup", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/load-older-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/retrieving-messages/load-newer-messages", - "openimPath": "/sdk/flutter/message/retrieving-messages/load-newer-messages", - "title": "Load newer messages", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order", + "title": "setConversationGroupOrder", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/load-newer-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order.mdx" }, { - "sourcePath": "/sdk/flutter/message/retrieving-messages/locate-messages-by-id", - "openimPath": "/sdk/flutter/message/retrieving-messages/locate-messages-by-id", - "title": "Locate messages by ID", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups", + "title": "addConversationsToGroups", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/locate-messages-by-id.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" }, { - "sourcePath": "/sdk/flutter/message/searching-messages/search-messages", - "openimPath": "/sdk/flutter/message/searching-messages/search-messages", - "title": "Search messages", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups", + "title": "removeConversationsFromGroups", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/searching-messages/search-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" }, { - "sourcePath": "/sdk/flutter/message/composing-messages/update-typing-status", - "openimPath": "/sdk/flutter/message/composing-messages/update-typing-status", - "title": "Update typing status", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group", + "title": "deleteConversationGroup", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/update-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/composing-messages/get-typing-status", - "openimPath": "/sdk/flutter/message/composing-messages/get-typing-status", - "title": "Get typing status", + "sourcePath": "/sdk/flutter/group/overview-group", + "openimPath": "/sdk/flutter/group/overview-group", + "title": "Group overview", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/get-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/overview-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/composing-messages/check-speech-to-text", - "openimPath": "/sdk/flutter/message/composing-messages/check-speech-to-text", - "title": "Check speech recognition support", + "sourcePath": "/sdk/flutter/group/create-group", + "openimPath": "/sdk/flutter/group/create-group", + "title": "Create a group", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/check-speech-to-text.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/create-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/composing-messages/transcribe-audio", - "openimPath": "/sdk/flutter/message/composing-messages/transcribe-audio", - "title": "Transcribe audio", + "sourcePath": "/sdk/flutter/group/update-group-profile", + "openimPath": "/sdk/flutter/group/update-group-profile", + "title": "Update group profile", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/transcribe-audio.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/update-group-profile.mdx" }, { - "sourcePath": "/sdk/flutter/message/composing-messages/save-local-transcript", - "openimPath": "/sdk/flutter/message/composing-messages/save-local-transcript", - "title": "Save a local transcript", + "sourcePath": "/sdk/flutter/group/set-group-announcement", + "openimPath": "/sdk/flutter/group/set-group-announcement", + "title": "Publish a group announcement", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/save-local-transcript.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/set-group-announcement.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/delete-local-message", - "openimPath": "/sdk/flutter/message/managing-messages/delete-local-message", - "title": "Delete a local message", + "sourcePath": "/sdk/flutter/group/set-group-extension", + "openimPath": "/sdk/flutter/group/set-group-extension", + "title": "Set group extra data", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/delete-local-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/set-group-extension.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/delete-saved-message", - "openimPath": "/sdk/flutter/message/managing-messages/delete-saved-message", - "title": "Delete a saved message", + "sourcePath": "/sdk/flutter/group/set-group-join-verification", + "openimPath": "/sdk/flutter/group/set-group-join-verification", + "title": "Set group join verification", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/delete-saved-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/set-group-join-verification.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/revoke-a-message", - "openimPath": "/sdk/flutter/message/managing-messages/revoke-a-message", - "title": "Revoke a message", + "sourcePath": "/sdk/flutter/group/set-group-member-profile-access", + "openimPath": "/sdk/flutter/group/set-group-member-profile-access", + "title": "Set member profile access", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/revoke-a-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/set-group-member-profile-access.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/modify-a-message", - "openimPath": "/sdk/flutter/message/managing-messages/modify-a-message", - "title": "Modify a message", + "sourcePath": "/sdk/flutter/group/set-group-member-friend-permission", + "openimPath": "/sdk/flutter/group/set-group-member-friend-permission", + "title": "Set member friend request permission", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/modify-a-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/set-group-member-friend-permission.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/get-pinned-messages", - "openimPath": "/sdk/flutter/message/managing-messages/get-pinned-messages", - "title": "View pinned messages", + "sourcePath": "/sdk/flutter/group/change-group-mute", + "openimPath": "/sdk/flutter/group/change-group-mute", + "title": "Change group mute status", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/get-pinned-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/change-group-mute.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/set-message-pinned", - "openimPath": "/sdk/flutter/message/managing-messages/set-message-pinned", - "title": "Pin or unpin a message", + "sourcePath": "/sdk/flutter/group/join-group", + "openimPath": "/sdk/flutter/group/join-group", + "title": "Apply to join a group", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/set-message-pinned.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/join-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/insert-local-single-message", - "openimPath": "/sdk/flutter/message/managing-messages/insert-local-single-message", - "title": "Insert a local direct message", + "sourcePath": "/sdk/flutter/group/quit-group", + "openimPath": "/sdk/flutter/group/quit-group", + "title": "Leave a group", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/insert-local-single-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/quit-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/insert-local-group-message", - "openimPath": "/sdk/flutter/message/managing-messages/insert-local-group-message", - "title": "Insert a local group message", + "sourcePath": "/sdk/flutter/group/dismiss-group", + "openimPath": "/sdk/flutter/group/dismiss-group", + "title": "Dismiss a group", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/insert-local-group-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/dismiss-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/clear-all-local-messages", - "openimPath": "/sdk/flutter/message/managing-messages/clear-all-local-messages", - "title": "Clear all local messages", + "sourcePath": "/sdk/flutter/group/retrieving-groups/get-specified-groups-info", + "openimPath": "/sdk/flutter/group/retrieving-groups/get-specified-groups-info", + "title": "Get group information", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/clear-all-local-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-specified-groups-info.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/clear-all-messages", - "openimPath": "/sdk/flutter/message/managing-messages/clear-all-messages", - "title": "Clear all saved messages", + "sourcePath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list", + "openimPath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list", + "title": "Get joined groups", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/clear-all-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-joined-group-list.mdx" }, - { - "sourcePath": "/sdk/flutter/message/managing-messages/set-message-local-ex", - "openimPath": "/sdk/flutter/message/managing-messages/set-message-local-ex", - "title": "Set local message extensions", + { + "sourcePath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list-page", + "openimPath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list-page", + "title": "Get joined groups by page", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/set-message-local-ex.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-joined-group-list-page.mdx" }, { - "sourcePath": "/sdk/flutter/file-uploads/set-upload-file-listener", - "openimPath": "/sdk/flutter/file-uploads/set-upload-file-listener", - "title": "Track file upload progress", + "sourcePath": "/sdk/flutter/group/retrieving-groups/is-join-group", + "openimPath": "/sdk/flutter/group/retrieving-groups/is-join-group", + "title": "Check group membership", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/file-uploads/set-upload-file-listener.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/is-join-group.mdx" }, { - "sourcePath": "/sdk/flutter/file-uploads/upload-file", - "openimPath": "/sdk/flutter/file-uploads/upload-file", - "title": "Upload a file", + "sourcePath": "/sdk/flutter/group/retrieving-groups/search-groups", + "openimPath": "/sdk/flutter/group/retrieving-groups/search-groups", + "title": "Search groups", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/file-uploads/upload-file.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/search-groups.mdx" }, { - "sourcePath": "/sdk/flutter/calling/overview-calling", - "openimPath": "/sdk/flutter/calling/overview-calling", - "title": "Calling overview", + "sourcePath": "/sdk/flutter/group/group-applications/overview-group-applications", + "openimPath": "/sdk/flutter/group/group-applications/overview-group-applications", + "title": "Group applications overview", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/overview-calling.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/overview-group-applications.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/start-single-call", - "openimPath": "/sdk/flutter/calling/managing-calls/start-single-call", - "title": "Start a one-to-one call", + "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-list-as-recipient", + "openimPath": "/sdk/flutter/group/group-applications/get-group-application-list-as-recipient", + "title": "Get received group applications", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/start-single-call.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/start-group-call", - "openimPath": "/sdk/flutter/calling/managing-calls/start-group-call", - "title": "Start a group call", + "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-list-as-applicant", + "openimPath": "/sdk/flutter/group/group-applications/get-group-application-list-as-applicant", + "title": "Get sent group applications", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/start-group-call.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/accept-call", - "openimPath": "/sdk/flutter/calling/managing-calls/accept-call", - "title": "Accept a call", + "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-unhandled-count", + "openimPath": "/sdk/flutter/group/group-applications/get-group-application-unhandled-count", + "title": "Get pending group application count", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/accept-call.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-unhandled-count.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/reject-call", - "openimPath": "/sdk/flutter/calling/managing-calls/reject-call", - "title": "Reject a call", + "sourcePath": "/sdk/flutter/group/group-applications/accept-group-application", + "openimPath": "/sdk/flutter/group/group-applications/accept-group-application", + "title": "Accept a group application", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/reject-call.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/accept-group-application.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/cancel-call", - "openimPath": "/sdk/flutter/calling/managing-calls/cancel-call", - "title": "Cancel a call invitation", + "sourcePath": "/sdk/flutter/group/group-applications/refuse-group-application", + "openimPath": "/sdk/flutter/group/group-applications/refuse-group-application", + "title": "Reject a group application", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/cancel-call.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/refuse-group-application.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/hang-up-call", - "openimPath": "/sdk/flutter/calling/managing-calls/hang-up-call", - "title": "Hang up a call", + "sourcePath": "/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members", + "openimPath": "/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members", + "title": "Group member queries overview", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/hang-up-call.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/handle-call-events", - "openimPath": "/sdk/flutter/calling/managing-calls/handle-call-events", - "title": "Handle call events", + "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-member-list", + "openimPath": "/sdk/flutter/group/retrieving-group-members/get-group-member-list", + "title": "Get group members", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/handle-call-events.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-member-list.mdx" }, { - "sourcePath": "/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation", - "openimPath": "/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation", - "title": "Restore a pending invitation", + "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-members-info", + "openimPath": "/sdk/flutter/group/retrieving-group-members/get-group-members-info", + "title": "Get group member profiles", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-members-info.mdx" }, { - "sourcePath": "/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id", - "openimPath": "/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id", - "title": "Get a group call room", + "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-users-in-group", + "openimPath": "/sdk/flutter/group/retrieving-group-members/get-users-in-group", + "title": "Check users in a group", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-users-in-group.mdx" }, { - "sourcePath": "/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id", - "openimPath": "/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id", - "title": "Get room credentials", + "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin", + "openimPath": "/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin", + "title": "Get group owners and admins", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin.mdx" }, { - "sourcePath": "/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal", - "openimPath": "/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal", - "title": "Send a custom signal", + "sourcePath": "/sdk/flutter/group/retrieving-group-members/search-group-members", + "openimPath": "/sdk/flutter/group/retrieving-group-members/search-group-members", + "title": "Search group members", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/search-group-members.mdx" }, { - "sourcePath": "/sdk/flutter/events/overview-events", - "openimPath": "/sdk/flutter/events/overview-events", - "title": "Events overview", + "sourcePath": "/sdk/flutter/group/managing-group-members/invite-user-to-group", + "openimPath": "/sdk/flutter/group/managing-group-members/invite-user-to-group", + "title": "Invite users to a group", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/events/overview-events.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/invite-user-to-group.mdx" }, { - "sourcePath": "/sdk/flutter/logger", - "openimPath": "/sdk/flutter/logger", - "title": "Logger", + "sourcePath": "/sdk/flutter/group/managing-group-members/kick-group-member", + "openimPath": "/sdk/flutter/group/managing-group-members/kick-group-member", + "title": "Remove group members", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/logger.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/kick-group-member.mdx" }, { - "sourcePath": "/sdk/uniapp/overview", - "openimPath": "/sdk/uniapp/overview", - "title": "OpenIM SDK for uni-app", - "context": "chat/sdk/uniapp", + "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-nickname", + "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-nickname", + "title": "Update a group nickname", + "context": "chat/sdk/flutter", "template": "overview", - "contentFile": "content/docs/chat/sdk/uniapp/overview.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-nickname.mdx" }, { - "sourcePath": "/sdk/electron/overview", - "openimPath": "/sdk/electron/overview", - "title": "OpenIM SDK for Electron", - "context": "chat/sdk/electron", + "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-role-level", + "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-role-level", + "title": "Manage group administrators", + "context": "chat/sdk/flutter", "template": "overview", - "contentFile": "content/docs/chat/sdk/electron/overview.mdx" - }, - { - "sourcePath": "/sdk/electron/getting-started/authenticate-and-init", - "openimPath": "/sdk/electron/getting-started/authenticate-and-init", - "title": "Authenticate and init", - "context": "chat/sdk/electron", - "template": "guide", - "contentFile": "content/docs/chat/sdk/electron/getting-started/authenticate-and-init.mdx" - }, - { - "sourcePath": "/sdk/electron/message/create-media-from-full-path", - "openimPath": "/sdk/electron/message/create-media-from-full-path", - "title": "Create media from full path", - "context": "chat/sdk/electron", - "template": "guide", - "contentFile": "content/docs/chat/sdk/electron/message/create-media-from-full-path.mdx" - }, - { - "sourcePath": "/sdk/electron/logger/upload-logs", - "openimPath": "/sdk/electron/logger/upload-logs", - "title": "Upload logs", - "context": "chat/sdk/electron", - "template": "guide", - "contentFile": "content/docs/chat/sdk/electron/logger/upload-logs.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-role-level.mdx" }, { - "sourcePath": "/sdk/miniprogram/overview", - "openimPath": "/sdk/miniprogram/overview", - "title": "OpenIM SDK for Mini Program", - "context": "chat/sdk/miniprogram", + "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-avatar", + "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-avatar", + "title": "Update a group member avatar", + "context": "chat/sdk/flutter", "template": "overview", - "contentFile": "content/docs/chat/sdk/miniprogram/overview.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-avatar.mdx" }, { - "sourcePath": "/sdk/react-native/overview", - "openimPath": "/sdk/react-native/overview", - "title": "OpenIM SDK for React Native", - "context": "chat/sdk/react-native", + "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-extension", + "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-extension", + "title": "Set group member extra data", + "context": "chat/sdk/flutter", "template": "overview", - "contentFile": "content/docs/chat/sdk/react-native/overview.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-extension.mdx" }, { - "sourcePath": "/sdk/wasm/overview", - "openimPath": "/sdk/wasm/overview", - "title": "OpenIM SDK for WASM", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/overview.mdx" + "sourcePath": "/sdk/flutter/group/managing-group-members/transfer-group-owner", + "openimPath": "/sdk/flutter/group/managing-group-members/transfer-group-owner", + "title": "Transfer group owner", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/transfer-group-owner.mdx" }, { - "sourcePath": "/sdk/wasm/getting-started/before-you-start", - "openimPath": "/sdk/wasm/getting-started/before-you-start", - "title": "Before you start", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/group/managing-group-members/change-group-member-mute", + "openimPath": "/sdk/flutter/group/managing-group-members/change-group-member-mute", + "title": "Mute or unmute a group member", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/getting-started/before-you-start.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/change-group-member-mute.mdx" }, { - "sourcePath": "/sdk/wasm/getting-started/environment-specific-implementation", - "openimPath": "/sdk/wasm/getting-started/environment-specific-implementation", - "title": "Environment-specific implementation", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/overview-message", + "openimPath": "/sdk/flutter/message/overview-message", + "title": "Overview", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/getting-started/environment-specific-implementation.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/overview-message.mdx" }, { - "sourcePath": "/sdk/wasm/getting-started/authenticate-and-manage-session", - "openimPath": "/sdk/wasm/getting-started/authenticate-and-manage-session", - "title": "Authenticate and manage a session", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-text-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-text-message", + "title": "Create a text message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/getting-started/authenticate-and-manage-session.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-text-message.mdx" }, { - "sourcePath": "/sdk/wasm/getting-started/send-first-message", - "openimPath": "/sdk/wasm/getting-started/send-first-message", - "title": "Send your first message", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-text-at-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-text-at-message", + "title": "Create a mention message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/getting-started/send-first-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-text-at-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/overview-user", - "openimPath": "/sdk/wasm/user/overview-user", - "title": "User overview", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-custom-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-custom-message", + "title": "Create a custom message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/overview-user.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-custom-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/profile/get-users-info", - "openimPath": "/sdk/wasm/user/profile/get-users-info", - "title": "Get user profiles", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-image-message", + "title": "Create an image message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/profile/get-users-info.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/profile/get-self-user-info", - "openimPath": "/sdk/wasm/user/profile/get-self-user-info", - "title": "Get your profile", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message-from-full-path", + "openimPath": "/sdk/flutter/message/creating-messages/create-image-message-from-full-path", + "title": "Create an image message from a path", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/profile/get-self-user-info.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/wasm/user/profile/set-self-info", - "openimPath": "/sdk/wasm/user/profile/set-self-info", - "title": "Update your profile", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message-by-url", + "openimPath": "/sdk/flutter/message/creating-messages/create-image-message-by-url", + "title": "Create an image message from a URL", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/profile/set-self-info.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message-by-url.mdx" }, { - "sourcePath": "/sdk/wasm/user/profile/set-global-message-reception", - "openimPath": "/sdk/wasm/user/profile/set-global-message-reception", - "title": "Set global message reception", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/user/profile/set-global-message-reception.mdx" + "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-sound-message", + "title": "Create an audio message", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/profile/set-friend-add-permission", - "openimPath": "/sdk/wasm/user/profile/set-friend-add-permission", - "title": "Set friend request permissions", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message-from-full-path", + "openimPath": "/sdk/flutter/message/creating-messages/create-sound-message-from-full-path", + "title": "Create an audio message from a path", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/profile/set-friend-add-permission.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/wasm/user/online-status/subscribe-users-status", - "openimPath": "/sdk/wasm/user/online-status/subscribe-users-status", - "title": "Subscribe to online status", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message-by-url", + "openimPath": "/sdk/flutter/message/creating-messages/create-sound-message-by-url", + "title": "Create an audio message from a URL", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/online-status/subscribe-users-status.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message-by-url.mdx" }, { - "sourcePath": "/sdk/wasm/user/online-status/get-subscribe-users-status", - "openimPath": "/sdk/wasm/user/online-status/get-subscribe-users-status", - "title": "Get subscribed user status", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-video-message", + "title": "Create a video message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/online-status/get-subscribe-users-status.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/online-status/unsubscribe-users-status", - "openimPath": "/sdk/wasm/user/online-status/unsubscribe-users-status", - "title": "Unsubscribe from online status", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message-from-full-path", + "openimPath": "/sdk/flutter/message/creating-messages/create-video-message-from-full-path", + "title": "Create a video message from a path", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/online-status/unsubscribe-users-status.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/wasm/user/friends/get-friend-list-page", - "openimPath": "/sdk/wasm/user/friends/get-friend-list-page", - "title": "Get the friend list", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message-by-url", + "openimPath": "/sdk/flutter/message/creating-messages/create-video-message-by-url", + "title": "Create a video message from a URL", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friends/get-friend-list-page.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message-by-url.mdx" }, { - "sourcePath": "/sdk/wasm/user/friends/search-friends", - "openimPath": "/sdk/wasm/user/friends/search-friends", - "title": "Search friends", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-file-message", + "title": "Create a file message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friends/search-friends.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friends/get-specified-friends-info", - "openimPath": "/sdk/wasm/user/friends/get-specified-friends-info", - "title": "Get friend profiles", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message-from-full-path", + "openimPath": "/sdk/flutter/message/creating-messages/create-file-message-from-full-path", + "title": "Create a file message from a path", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friends/get-specified-friends-info.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/wasm/user/friends/check-friend", - "openimPath": "/sdk/wasm/user/friends/check-friend", - "title": "Check friendship status", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message-by-url", + "openimPath": "/sdk/flutter/message/creating-messages/create-file-message-by-url", + "title": "Create a file message from a URL", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friends/check-friend.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message-by-url.mdx" }, { - "sourcePath": "/sdk/wasm/user/friends/update-friends", - "openimPath": "/sdk/wasm/user/friends/update-friends", - "title": "Update friend information", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-location-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-location-message", + "title": "Create a location message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friends/update-friends.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-location-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friends/delete-friend", - "openimPath": "/sdk/wasm/user/friends/delete-friend", - "title": "Delete a friend", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-card-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-card-message", + "title": "Create a contact card message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friends/delete-friend.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-card-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/add-friend", - "openimPath": "/sdk/wasm/user/friend-applications/add-friend", - "title": "Send a friend application", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-face-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-face-message", + "title": "Create an emoji message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/add-friend.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-face-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-recipient", - "openimPath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-recipient", - "title": "Get received friend applications", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-quote-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-quote-message", + "title": "Create a reply message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/get-friend-application-list-as-recipient.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-quote-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-applicant", - "openimPath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-applicant", - "title": "Get sent friend applications", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-advanced-text-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-advanced-text-message", + "title": "Create rich text", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/get-friend-application-list-as-applicant.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-advanced-text-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/get-friend-application-unhandled-count", - "openimPath": "/sdk/wasm/user/friend-applications/get-friend-application-unhandled-count", - "title": "Get pending application count", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-advanced-quote-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-advanced-quote-message", + "title": "Create a rich reply", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/get-friend-application-unhandled-count.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-advanced-quote-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/accept-friend-application", - "openimPath": "/sdk/wasm/user/friend-applications/accept-friend-application", - "title": "Accept a friend application", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-forward-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-forward-message", + "title": "Create a forwarded message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/accept-friend-application.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-forward-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/refuse-friend-application", - "openimPath": "/sdk/wasm/user/friend-applications/refuse-friend-application", - "title": "Reject a friend application", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-merger-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-merger-message", + "title": "Create a merged message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/refuse-friend-application.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-merger-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/delete-friend-requests", - "openimPath": "/sdk/wasm/user/friend-applications/delete-friend-requests", - "title": "Delete friend applications", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/sending-messages/send-message", + "openimPath": "/sdk/flutter/message/sending-messages/send-message", + "title": "Send a message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/delete-friend-requests.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/send-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/blacklist/get-black-list", - "openimPath": "/sdk/wasm/user/blacklist/get-black-list", - "title": "Get the blacklist", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/sending-messages/send-message-not-oss", + "openimPath": "/sdk/flutter/message/sending-messages/send-message-not-oss", + "title": "Send a message without OSS", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/blacklist/get-black-list.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/send-message-not-oss.mdx" }, { - "sourcePath": "/sdk/wasm/user/blacklist/add-black", - "openimPath": "/sdk/wasm/user/blacklist/add-black", - "title": "Add a user to the blacklist", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/sending-messages/set-msg-send-progress-listener", + "openimPath": "/sdk/flutter/message/sending-messages/set-msg-send-progress-listener", + "title": "Track message sending progress", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/blacklist/add-black.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/set-msg-send-progress-listener.mdx" }, { - "sourcePath": "/sdk/wasm/user/blacklist/remove-black", - "openimPath": "/sdk/wasm/user/blacklist/remove-black", - "title": "Remove a user from the blacklist", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/receiving-messages/receive-messages", + "openimPath": "/sdk/flutter/message/receiving-messages/receive-messages", + "title": "Receive messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/blacklist/remove-black.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/receiving-messages/receive-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/overview-conversation", - "openimPath": "/sdk/wasm/conversation/overview-conversation", - "title": "Conversation overview", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/receiving-messages/custom-business-listener", + "openimPath": "/sdk/flutter/message/receiving-messages/custom-business-listener", + "title": "Receive custom business messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/overview-conversation.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/receiving-messages/custom-business-listener.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-by-target", - "openimPath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-by-target", - "title": "Open a conversation", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/retrieving-messages/load-older-messages", + "openimPath": "/sdk/flutter/message/retrieving-messages/load-older-messages", + "title": "Load older messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/get-conversation-by-target.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/load-older-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-id", - "openimPath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-id", - "title": "Resolve a conversation ID", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/retrieving-messages/load-newer-messages", + "openimPath": "/sdk/flutter/message/retrieving-messages/load-newer-messages", + "title": "Load newer messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/get-conversation-id.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/load-newer-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/get-conversations-by-id", - "openimPath": "/sdk/wasm/conversation/retrieving-conversations/get-conversations-by-id", - "title": "Get conversations by ID", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/retrieving-messages/locate-messages-by-id", + "openimPath": "/sdk/flutter/message/retrieving-messages/locate-messages-by-id", + "title": "Locate messages by ID", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/get-conversations-by-id.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/locate-messages-by-id.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/retrieve-conversation-list", - "openimPath": "/sdk/wasm/conversation/retrieving-conversations/retrieve-conversation-list", - "title": "Retrieve a conversation list", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/searching-messages/search-messages", + "openimPath": "/sdk/flutter/message/searching-messages/search-messages", + "title": "Search messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/retrieve-conversation-list.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/searching-messages/search-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/search-conversations", - "openimPath": "/sdk/wasm/conversation/retrieving-conversations/search-conversations", - "title": "Search conversations", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/composing-messages/update-typing-status", + "openimPath": "/sdk/flutter/message/composing-messages/update-typing-status", + "title": "Update typing status", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/search-conversations.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/update-typing-status.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/pin-conversation", - "openimPath": "/sdk/wasm/conversation/managing-conversations/pin-conversation", - "title": "Pin or unpin a conversation", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/pin-conversation.mdx" + "sourcePath": "/sdk/flutter/message/composing-messages/get-typing-status", + "openimPath": "/sdk/flutter/message/composing-messages/get-typing-status", + "title": "Get typing status", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/get-typing-status.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/mark-conversation", - "openimPath": "/sdk/wasm/conversation/managing-conversations/mark-conversation", - "title": "Mark or unmark a conversation", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/mark-conversation.mdx" + "sourcePath": "/sdk/flutter/message/composing-messages/check-speech-to-text", + "openimPath": "/sdk/flutter/message/composing-messages/check-speech-to-text", + "title": "Check speech recognition support", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/check-speech-to-text.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-conversation-remark", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-conversation-remark", - "title": "Set a conversation remark", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-conversation-remark.mdx" + "sourcePath": "/sdk/flutter/message/composing-messages/transcribe-audio", + "openimPath": "/sdk/flutter/message/composing-messages/transcribe-audio", + "title": "Transcribe audio", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/transcribe-audio.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-conversation-extension", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-conversation-extension", - "title": "Set conversation extra data", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-conversation-extension.mdx" + "sourcePath": "/sdk/flutter/message/composing-messages/save-local-transcript", + "openimPath": "/sdk/flutter/message/composing-messages/save-local-transcript", + "title": "Save a local transcript", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/save-local-transcript.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-conversation-draft", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-conversation-draft", - "title": "Set a conversation draft", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/managing-messages/delete-local-message", + "openimPath": "/sdk/flutter/message/managing-messages/delete-local-message", + "title": "Delete a local message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-conversation-draft.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/delete-local-message.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-message-receive-option", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-message-receive-option", - "title": "Set conversation message reception", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-message-receive-option.mdx" + "sourcePath": "/sdk/flutter/message/managing-messages/delete-saved-message", + "openimPath": "/sdk/flutter/message/managing-messages/delete-saved-message", + "title": "Delete a saved message", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/delete-saved-message.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/clear-group-mentions", - "openimPath": "/sdk/wasm/conversation/managing-conversations/clear-group-mentions", - "title": "Reset group mention status", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/clear-group-mentions.mdx" + "sourcePath": "/sdk/flutter/message/managing-messages/revoke-a-message", + "openimPath": "/sdk/flutter/message/managing-messages/revoke-a-message", + "title": "Revoke a message", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/revoke-a-message.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/mark-conversation-read", - "openimPath": "/sdk/wasm/conversation/managing-conversations/mark-conversation-read", - "title": "Mark a conversation as read", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/managing-messages/modify-a-message", + "openimPath": "/sdk/flutter/message/managing-messages/modify-a-message", + "title": "Modify a message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/mark-conversation-read.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/modify-a-message.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/mark-all-conversations-read", - "openimPath": "/sdk/wasm/conversation/managing-conversations/mark-all-conversations-read", - "title": "Mark all conversations as read", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/managing-messages/get-pinned-messages", + "openimPath": "/sdk/flutter/message/managing-messages/get-pinned-messages", + "title": "View pinned messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/mark-all-conversations-read.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/get-pinned-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/get-total-unread-count", - "openimPath": "/sdk/wasm/conversation/managing-conversations/get-total-unread-count", - "title": "Track the total unread count", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/managing-messages/set-message-pinned", + "openimPath": "/sdk/flutter/message/managing-messages/set-message-pinned", + "title": "Pin or unpin a message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/get-total-unread-count.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/set-message-pinned.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-private-chat", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-private-chat", - "title": "Enable or disable burn after reading", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-private-chat.mdx" + "sourcePath": "/sdk/flutter/message/managing-messages/insert-local-single-message", + "openimPath": "/sdk/flutter/message/managing-messages/insert-local-single-message", + "title": "Insert a local direct message", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/insert-local-single-message.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-burn-duration", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-burn-duration", - "title": "Set the burn duration", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-burn-duration.mdx" + "sourcePath": "/sdk/flutter/message/managing-messages/insert-local-group-message", + "openimPath": "/sdk/flutter/message/managing-messages/insert-local-group-message", + "title": "Insert a local group message", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/insert-local-group-message.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-message-destruct", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-message-destruct", - "title": "Schedule server message deletion", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-message-destruct.mdx" + "sourcePath": "/sdk/flutter/message/managing-messages/clear-all-local-messages", + "openimPath": "/sdk/flutter/message/managing-messages/clear-all-local-messages", + "title": "Clear all local messages", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/clear-all-local-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/hide-a-conversation", - "openimPath": "/sdk/wasm/conversation/managing-conversations/hide-a-conversation", - "title": "Hide a conversation", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/managing-messages/clear-all-messages", + "openimPath": "/sdk/flutter/message/managing-messages/clear-all-messages", + "title": "Clear all saved messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/hide-a-conversation.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/clear-all-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/hide-all-conversations", - "openimPath": "/sdk/wasm/conversation/managing-conversations/hide-all-conversations", - "title": "Hide all conversations", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/managing-messages/set-message-local-ex", + "openimPath": "/sdk/flutter/message/managing-messages/set-message-local-ex", + "title": "Set local message extensions", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/hide-all-conversations.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/set-message-local-ex.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/delete-conversation", - "openimPath": "/sdk/wasm/conversation/managing-conversations/delete-conversation", - "title": "Delete a conversation", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/file-uploads/set-upload-file-listener", + "openimPath": "/sdk/flutter/file-uploads/set-upload-file-listener", + "title": "Track file upload progress", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/delete-conversation.mdx" + "contentFile": "content/docs/chat/sdk/flutter/file-uploads/set-upload-file-listener.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/delete-conversation-with-messages", - "openimPath": "/sdk/wasm/conversation/managing-conversations/delete-conversation-with-messages", - "title": "Delete a conversation and its messages", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/file-uploads/upload-file", + "openimPath": "/sdk/flutter/file-uploads/upload-file", + "title": "Upload a file", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/delete-conversation-with-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/file-uploads/upload-file.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/clear-conversation-messages", - "openimPath": "/sdk/wasm/conversation/managing-conversations/clear-conversation-messages", - "title": "Clear messages in a conversation", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/overview-calling", + "openimPath": "/sdk/flutter/calling/overview-calling", + "title": "Calling overview", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/clear-conversation-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/overview-calling.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/clear-local-conversations", - "openimPath": "/sdk/wasm/conversation/managing-conversations/clear-local-conversations", - "title": "Clear all local conversations", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/start-single-call", + "openimPath": "/sdk/flutter/calling/managing-calls/start-single-call", + "title": "Start a one-to-one call", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/clear-local-conversations.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/start-single-call.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/overview-conversation-groups", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/overview-conversation-groups", - "title": "Conversation group overview", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/start-group-call", + "openimPath": "/sdk/flutter/calling/managing-calls/start-group-call", + "title": "Start a group call", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/overview-conversation-groups.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/start-group-call.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/create-conversation-group", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/create-conversation-group", - "title": "createConversationGroup", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/accept-call", + "openimPath": "/sdk/flutter/calling/managing-calls/accept-call", + "title": "Accept a call", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/create-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/accept-call.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-groups", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-groups", - "title": "getConversationGroups", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/reject-call", + "openimPath": "/sdk/flutter/calling/managing-calls/reject-call", + "title": "Reject a call", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/get-conversation-groups.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/reject-call.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", - "title": "getConversationGroupInfoWithConversations", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/cancel-call", + "openimPath": "/sdk/flutter/calling/managing-calls/cancel-call", + "title": "Cancel a call invitation", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/cancel-call.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", - "title": "getConversationGroupIDsByConversationID", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/hang-up-call", + "openimPath": "/sdk/flutter/calling/managing-calls/hang-up-call", + "title": "Hang up a call", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/hang-up-call.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/update-conversation-group", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/update-conversation-group", - "title": "updateConversationGroup", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/handle-call-events", + "openimPath": "/sdk/flutter/calling/managing-calls/handle-call-events", + "title": "Handle call events", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/update-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/handle-call-events.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/set-conversation-group-order", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/set-conversation-group-order", - "title": "setConversationGroupOrder", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation", + "openimPath": "/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation", + "title": "Restore a pending invitation", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/set-conversation-group-order.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/add-conversations-to-groups", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/add-conversations-to-groups", - "title": "addConversationsToGroups", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id", + "openimPath": "/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id", + "title": "Get a group call room", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/remove-conversations-from-groups", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/remove-conversations-from-groups", - "title": "removeConversationsFromGroups", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id", + "openimPath": "/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id", + "title": "Get room credentials", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/delete-conversation-group", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/delete-conversation-group", - "title": "deleteConversationGroup", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal", + "openimPath": "/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal", + "title": "Send a custom signal", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/delete-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal.mdx" }, { - "sourcePath": "/sdk/wasm/group/overview-group", - "openimPath": "/sdk/wasm/group/overview-group", - "title": "Group overview", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/events/overview-events", + "openimPath": "/sdk/flutter/events/overview-events", + "title": "Events overview", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/overview-group.mdx" + "contentFile": "content/docs/chat/sdk/flutter/events/overview-events.mdx" }, { - "sourcePath": "/sdk/wasm/group/create-group", - "openimPath": "/sdk/wasm/group/create-group", - "title": "Create a group", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/logger", + "openimPath": "/sdk/flutter/logger", + "title": "Logger", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/create-group.mdx" - }, - { - "sourcePath": "/sdk/wasm/group/update-group-profile", - "openimPath": "/sdk/wasm/group/update-group-profile", - "title": "Update group profile", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/update-group-profile.mdx" + "contentFile": "content/docs/chat/sdk/flutter/logger.mdx" }, { - "sourcePath": "/sdk/wasm/group/set-group-announcement", - "openimPath": "/sdk/wasm/group/set-group-announcement", - "title": "Publish a group announcement", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/uniapp/overview", + "openimPath": "/sdk/uniapp/overview", + "title": "OpenIM SDK for uni-app", + "context": "chat/sdk/uniapp", "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/set-group-announcement.mdx" + "contentFile": "content/docs/chat/sdk/uniapp/overview.mdx" }, { - "sourcePath": "/sdk/wasm/group/set-group-extension", - "openimPath": "/sdk/wasm/group/set-group-extension", - "title": "Set group extra data", + "sourcePath": "/sdk/wasm/overview", + "openimPath": "/sdk/wasm/overview", + "title": "OpenIM SDK for WASM", "context": "chat/sdk/wasm", "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/set-group-extension.mdx" + "contentFile": "content/docs/chat/sdk/wasm/overview.mdx" }, { - "sourcePath": "/sdk/wasm/group/set-group-join-verification", - "openimPath": "/sdk/wasm/group/set-group-join-verification", - "title": "Set group join verification", + "sourcePath": "/sdk/wasm/getting-started/before-you-start", + "openimPath": "/sdk/wasm/getting-started/before-you-start", + "title": "Before you start", "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/set-group-join-verification.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/getting-started/before-you-start.mdx" }, { - "sourcePath": "/sdk/wasm/group/set-group-member-profile-access", - "openimPath": "/sdk/wasm/group/set-group-member-profile-access", - "title": "Set member profile access", + "sourcePath": "/sdk/wasm/getting-started/environment-specific-implementation", + "openimPath": "/sdk/wasm/getting-started/environment-specific-implementation", + "title": "Environment-specific implementation", "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/set-group-member-profile-access.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/getting-started/environment-specific-implementation.mdx" }, { - "sourcePath": "/sdk/wasm/group/set-group-member-friend-permission", - "openimPath": "/sdk/wasm/group/set-group-member-friend-permission", - "title": "Set member friend request permission", + "sourcePath": "/sdk/wasm/getting-started/authenticate-and-manage-session", + "openimPath": "/sdk/wasm/getting-started/authenticate-and-manage-session", + "title": "Authenticate and manage a session", "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/set-group-member-friend-permission.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/getting-started/authenticate-and-manage-session.mdx" }, { - "sourcePath": "/sdk/wasm/group/change-group-mute", - "openimPath": "/sdk/wasm/group/change-group-mute", - "title": "Change group mute status", + "sourcePath": "/sdk/wasm/getting-started/send-first-message", + "openimPath": "/sdk/wasm/getting-started/send-first-message", + "title": "Send your first message", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/change-group-mute.mdx" + "contentFile": "content/docs/chat/sdk/wasm/getting-started/send-first-message.mdx" }, { - "sourcePath": "/sdk/wasm/group/join-group", - "openimPath": "/sdk/wasm/group/join-group", - "title": "Apply to join a group", + "sourcePath": "/sdk/wasm/user/overview-user", + "openimPath": "/sdk/wasm/user/overview-user", + "title": "User overview", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/join-group.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/overview-user.mdx" }, { - "sourcePath": "/sdk/wasm/group/quit-group", - "openimPath": "/sdk/wasm/group/quit-group", - "title": "Leave a group", + "sourcePath": "/sdk/wasm/user/profile/get-users-info", + "openimPath": "/sdk/wasm/user/profile/get-users-info", + "title": "Get user profiles", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/quit-group.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/profile/get-users-info.mdx" }, { - "sourcePath": "/sdk/wasm/group/dismiss-group", - "openimPath": "/sdk/wasm/group/dismiss-group", - "title": "Dismiss a group", + "sourcePath": "/sdk/wasm/user/profile/get-self-user-info", + "openimPath": "/sdk/wasm/user/profile/get-self-user-info", + "title": "Get your profile", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/dismiss-group.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/profile/get-self-user-info.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-groups/get-specified-groups-info", - "openimPath": "/sdk/wasm/group/retrieving-groups/get-specified-groups-info", - "title": "Get group information", + "sourcePath": "/sdk/wasm/user/profile/set-self-info", + "openimPath": "/sdk/wasm/user/profile/set-self-info", + "title": "Update your profile", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/get-specified-groups-info.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/profile/set-self-info.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list", - "openimPath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list", - "title": "Get joined groups", + "sourcePath": "/sdk/wasm/user/profile/set-global-message-reception", + "openimPath": "/sdk/wasm/user/profile/set-global-message-reception", + "title": "Set global message reception", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/get-joined-group-list.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/user/profile/set-global-message-reception.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list-page", - "openimPath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list-page", - "title": "Get joined groups by page", + "sourcePath": "/sdk/wasm/user/profile/set-friend-add-permission", + "openimPath": "/sdk/wasm/user/profile/set-friend-add-permission", + "title": "Set friend request permissions", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/get-joined-group-list-page.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/profile/set-friend-add-permission.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-groups/is-join-group", - "openimPath": "/sdk/wasm/group/retrieving-groups/is-join-group", - "title": "Check group membership", + "sourcePath": "/sdk/wasm/user/online-status/subscribe-users-status", + "openimPath": "/sdk/wasm/user/online-status/subscribe-users-status", + "title": "Subscribe to online status", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/is-join-group.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/online-status/subscribe-users-status.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-groups/search-groups", - "openimPath": "/sdk/wasm/group/retrieving-groups/search-groups", - "title": "Search groups", + "sourcePath": "/sdk/wasm/user/online-status/get-subscribe-users-status", + "openimPath": "/sdk/wasm/user/online-status/get-subscribe-users-status", + "title": "Get subscribed user status", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/search-groups.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/online-status/get-subscribe-users-status.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-list-as-recipient", - "openimPath": "/sdk/wasm/group/group-applications/get-group-application-list-as-recipient", - "title": "Get received group applications", + "sourcePath": "/sdk/wasm/user/online-status/unsubscribe-users-status", + "openimPath": "/sdk/wasm/user/online-status/unsubscribe-users-status", + "title": "Unsubscribe from online status", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-list-as-recipient.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/online-status/unsubscribe-users-status.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-list-as-applicant", - "openimPath": "/sdk/wasm/group/group-applications/get-group-application-list-as-applicant", - "title": "Get sent group applications", + "sourcePath": "/sdk/wasm/user/friends/get-friend-list-page", + "openimPath": "/sdk/wasm/user/friends/get-friend-list-page", + "title": "Get the friend list", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-list-as-applicant.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friends/get-friend-list-page.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-unhandled-count", - "openimPath": "/sdk/wasm/group/group-applications/get-group-application-unhandled-count", - "title": "Get pending group application count", + "sourcePath": "/sdk/wasm/user/friends/search-friends", + "openimPath": "/sdk/wasm/user/friends/search-friends", + "title": "Search friends", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-unhandled-count.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friends/search-friends.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-badge-count", - "openimPath": "/sdk/wasm/group/group-applications/get-group-application-badge-count", - "title": "Get group application badge count", + "sourcePath": "/sdk/wasm/user/friends/get-specified-friends-info", + "openimPath": "/sdk/wasm/user/friends/get-specified-friends-info", + "title": "Get friend profiles", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-badge-count.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friends/get-specified-friends-info.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/clear-group-application-badge-count", - "openimPath": "/sdk/wasm/group/group-applications/clear-group-application-badge-count", - "title": "Clear the group application badge", + "sourcePath": "/sdk/wasm/user/friends/check-friend", + "openimPath": "/sdk/wasm/user/friends/check-friend", + "title": "Check friendship status", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/clear-group-application-badge-count.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friends/check-friend.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/accept-group-application", - "openimPath": "/sdk/wasm/group/group-applications/accept-group-application", - "title": "Accept a group application", + "sourcePath": "/sdk/wasm/user/friends/update-friends", + "openimPath": "/sdk/wasm/user/friends/update-friends", + "title": "Update friend information", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/accept-group-application.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friends/update-friends.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/refuse-group-application", - "openimPath": "/sdk/wasm/group/group-applications/refuse-group-application", - "title": "Reject a group application", + "sourcePath": "/sdk/wasm/user/friends/delete-friend", + "openimPath": "/sdk/wasm/user/friends/delete-friend", + "title": "Delete a friend", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/refuse-group-application.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friends/delete-friend.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/delete-group-requests", - "openimPath": "/sdk/wasm/group/group-applications/delete-group-requests", - "title": "Delete group applications", + "sourcePath": "/sdk/wasm/user/friend-applications/add-friend", + "openimPath": "/sdk/wasm/user/friend-applications/add-friend", + "title": "Send a friend application", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/delete-group-requests.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/add-friend.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-group-member-list", - "openimPath": "/sdk/wasm/group/retrieving-group-members/get-group-member-list", - "title": "Get group members", + "sourcePath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-recipient", + "openimPath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-recipient", + "title": "Get received friend applications", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-group-member-list.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/get-friend-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-specified-group-members-info", - "openimPath": "/sdk/wasm/group/retrieving-group-members/get-specified-group-members-info", - "title": "Get group member profiles", + "sourcePath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-applicant", + "openimPath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-applicant", + "title": "Get sent friend applications", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-specified-group-members-info.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/get-friend-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-users-in-group", - "openimPath": "/sdk/wasm/group/retrieving-group-members/get-users-in-group", - "title": "Check users in a group", + "sourcePath": "/sdk/wasm/user/friend-applications/get-friend-application-unhandled-count", + "openimPath": "/sdk/wasm/user/friend-applications/get-friend-application-unhandled-count", + "title": "Get pending application count", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-users-in-group.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/get-friend-application-unhandled-count.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-group-member-owner-and-admin", - "openimPath": "/sdk/wasm/group/retrieving-group-members/get-group-member-owner-and-admin", - "title": "Get group owners and admins", + "sourcePath": "/sdk/wasm/user/friend-applications/accept-friend-application", + "openimPath": "/sdk/wasm/user/friend-applications/accept-friend-application", + "title": "Accept a friend application", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/accept-friend-application.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-group-members/search-group-members", - "openimPath": "/sdk/wasm/group/retrieving-group-members/search-group-members", - "title": "Search group members", + "sourcePath": "/sdk/wasm/user/friend-applications/refuse-friend-application", + "openimPath": "/sdk/wasm/user/friend-applications/refuse-friend-application", + "title": "Reject a friend application", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/search-group-members.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/refuse-friend-application.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/invite-user-to-group", - "openimPath": "/sdk/wasm/group/managing-group-members/invite-user-to-group", - "title": "Invite users to a group", + "sourcePath": "/sdk/wasm/user/friend-applications/delete-friend-requests", + "openimPath": "/sdk/wasm/user/friend-applications/delete-friend-requests", + "title": "Delete friend applications", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/invite-user-to-group.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/delete-friend-requests.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/kick-group-member", - "openimPath": "/sdk/wasm/group/managing-group-members/kick-group-member", - "title": "Remove group members", + "sourcePath": "/sdk/wasm/user/blacklist/get-black-list", + "openimPath": "/sdk/wasm/user/blacklist/get-black-list", + "title": "Get the blacklist", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/kick-group-member.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/blacklist/get-black-list.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-nickname", - "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-nickname", - "title": "Update a group nickname", + "sourcePath": "/sdk/wasm/user/blacklist/add-black", + "openimPath": "/sdk/wasm/user/blacklist/add-black", + "title": "Add a user to the blacklist", "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-nickname.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/user/blacklist/add-black.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-role-level", - "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-role-level", - "title": "Manage group administrators", + "sourcePath": "/sdk/wasm/user/blacklist/remove-black", + "openimPath": "/sdk/wasm/user/blacklist/remove-black", + "title": "Remove a user from the blacklist", "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-role-level.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/user/blacklist/remove-black.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-avatar", - "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-avatar", - "title": "Update a group member avatar", + "sourcePath": "/sdk/wasm/conversation/overview-conversation", + "openimPath": "/sdk/wasm/conversation/overview-conversation", + "title": "Conversation overview", "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-avatar.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/conversation/overview-conversation.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-extension", - "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-extension", - "title": "Set group member extra data", + "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-by-target", + "openimPath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-by-target", + "title": "Open a conversation", "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-extension.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/get-conversation-by-target.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/transfer-group-owner", - "openimPath": "/sdk/wasm/group/managing-group-members/transfer-group-owner", - "title": "Transfer group owner", + "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-id", + "openimPath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/transfer-group-owner.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/get-conversation-id.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/change-group-member-mute", - "openimPath": "/sdk/wasm/group/managing-group-members/change-group-member-mute", - "title": "Mute or unmute a group member", + "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/get-conversations-by-id", + "openimPath": "/sdk/wasm/conversation/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/change-group-member-mute.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/get-conversations-by-id.mdx" }, { - "sourcePath": "/sdk/wasm/message/overview-message", - "openimPath": "/sdk/wasm/message/overview-message", - "title": "Message overview", + "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/retrieve-conversation-list", + "openimPath": "/sdk/wasm/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "Retrieve a conversation list", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/overview-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/retrieve-conversation-list.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-text-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-text-message", - "title": "Create a text message", + "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/search-conversations", + "openimPath": "/sdk/wasm/conversation/retrieving-conversations/search-conversations", + "title": "Search conversations", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-text-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/search-conversations.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-text-at-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-text-at-message", - "title": "Create a mention message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/pin-conversation", + "openimPath": "/sdk/wasm/conversation/managing-conversations/pin-conversation", + "title": "Pin or unpin a conversation", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-text-at-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/pin-conversation.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-custom-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-custom-message", - "title": "Create a custom message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/mark-conversation", + "openimPath": "/sdk/wasm/conversation/managing-conversations/mark-conversation", + "title": "Mark or unmark a conversation", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-custom-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/mark-conversation.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-image-message-by-file", - "openimPath": "/sdk/wasm/message/creating-messages/create-image-message-by-file", - "title": "Create an image message from a file", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-conversation-remark", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-conversation-remark", + "title": "Set a conversation remark", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-image-message-by-file.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-conversation-remark.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-image-message-by-url", - "openimPath": "/sdk/wasm/message/creating-messages/create-image-message-by-url", - "title": "Create an image message from a URL", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-conversation-extension", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-conversation-extension", + "title": "Set conversation extra data", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-image-message-by-url.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-conversation-extension.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-sound-message-by-file", - "openimPath": "/sdk/wasm/message/creating-messages/create-sound-message-by-file", - "title": "Create an audio message from a file", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-conversation-draft", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-conversation-draft", + "title": "Set a conversation draft", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-sound-message-by-file.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-conversation-draft.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-sound-message-by-url", - "openimPath": "/sdk/wasm/message/creating-messages/create-sound-message-by-url", - "title": "Create an audio message from a URL", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-message-receive-option", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-message-receive-option", + "title": "Set conversation message reception", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-sound-message-by-url.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-message-receive-option.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-video-message-by-file", - "openimPath": "/sdk/wasm/message/creating-messages/create-video-message-by-file", - "title": "Create a video message from a file", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/clear-group-mentions", + "openimPath": "/sdk/wasm/conversation/managing-conversations/clear-group-mentions", + "title": "Reset group mention status", + "context": "chat/sdk/wasm", + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/clear-group-mentions.mdx" + }, + { + "sourcePath": "/sdk/wasm/conversation/managing-conversations/mark-conversation-read", + "openimPath": "/sdk/wasm/conversation/managing-conversations/mark-conversation-read", + "title": "Mark a conversation as read", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-video-message-by-file.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/mark-conversation-read.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-video-message-by-url", - "openimPath": "/sdk/wasm/message/creating-messages/create-video-message-by-url", - "title": "Create a video message from a URL", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/mark-all-conversations-read", + "openimPath": "/sdk/wasm/conversation/managing-conversations/mark-all-conversations-read", + "title": "Mark all conversations as read", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-video-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/mark-all-conversations-read.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-file-message-by-file", - "openimPath": "/sdk/wasm/message/creating-messages/create-file-message-by-file", - "title": "Create a file message from a file", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/get-total-unread-count", + "openimPath": "/sdk/wasm/conversation/managing-conversations/get-total-unread-count", + "title": "Track the total unread count", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-file-message-by-file.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/get-total-unread-count.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-file-message-by-url", - "openimPath": "/sdk/wasm/message/creating-messages/create-file-message-by-url", - "title": "Create a file message from a URL", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-private-chat", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-private-chat", + "title": "Enable or disable burn after reading", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-file-message-by-url.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-private-chat.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-card-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-card-message", - "title": "Create a contact card message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-burn-duration", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-card-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-burn-duration.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-location-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-location-message", - "title": "Create a location message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-message-destruct", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-location-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-message-destruct.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-face-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-face-message", - "title": "Create an emoji message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/hide-a-conversation", + "openimPath": "/sdk/wasm/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-face-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/hide-a-conversation.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-quote-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-quote-message", - "title": "Create a reply message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/hide-all-conversations", + "openimPath": "/sdk/wasm/conversation/managing-conversations/hide-all-conversations", + "title": "Hide all conversations", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-quote-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/hide-all-conversations.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-markdown-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-markdown-message", - "title": "Create a Markdown message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/delete-conversation", + "openimPath": "/sdk/wasm/conversation/managing-conversations/delete-conversation", + "title": "Delete a conversation", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-markdown-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/delete-conversation.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-forward-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-forward-message", - "title": "Create a forwarded message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/delete-conversation-with-messages", + "openimPath": "/sdk/wasm/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-forward-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/delete-conversation-with-messages.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-merger-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-merger-message", - "title": "Create a merged message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/clear-conversation-messages", + "openimPath": "/sdk/wasm/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-merger-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/clear-conversation-messages.mdx" }, { - "sourcePath": "/sdk/wasm/message/sending-messages/send-message", - "openimPath": "/sdk/wasm/message/sending-messages/send-message", - "title": "Send a message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/clear-local-conversations", + "openimPath": "/sdk/wasm/conversation/managing-conversations/clear-local-conversations", + "title": "Clear all local conversations", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/sending-messages/send-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/clear-local-conversations.mdx" }, { - "sourcePath": "/sdk/wasm/message/sending-messages/send-message-not-oss", - "openimPath": "/sdk/wasm/message/sending-messages/send-message-not-oss", - "title": "Send a message without OSS", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/overview-conversation-groups", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/overview-conversation-groups", + "title": "Conversation group overview", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/sending-messages/send-message-not-oss.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/overview-conversation-groups.mdx" }, { - "sourcePath": "/sdk/wasm/message/receiving-messages/receive-messages", - "openimPath": "/sdk/wasm/message/receiving-messages/receive-messages", - "title": "Receive messages", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/create-conversation-group", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/create-conversation-group", + "title": "createConversationGroup", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/receiving-messages/receive-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/create-conversation-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/receiving-messages/receive-custom-business-messages", - "openimPath": "/sdk/wasm/message/receiving-messages/receive-custom-business-messages", - "title": "Receive custom business messages", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-groups", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-groups", + "title": "getConversationGroups", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/receiving-messages/receive-custom-business-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/get-conversation-groups.mdx" }, { - "sourcePath": "/sdk/wasm/message/retrieving-messages/load-older-messages", - "openimPath": "/sdk/wasm/message/retrieving-messages/load-older-messages", - "title": "Load older messages", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", + "title": "getConversationGroupInfoWithConversations", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/load-older-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" }, { - "sourcePath": "/sdk/wasm/message/retrieving-messages/load-newer-messages", - "openimPath": "/sdk/wasm/message/retrieving-messages/load-newer-messages", - "title": "Load newer messages", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", + "title": "getConversationGroupIDsByConversationID", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/load-newer-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" }, { - "sourcePath": "/sdk/wasm/message/retrieving-messages/find-messages-by-id", - "openimPath": "/sdk/wasm/message/retrieving-messages/find-messages-by-id", - "title": "Find messages by ID", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/update-conversation-group", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/update-conversation-group", + "title": "updateConversationGroup", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/find-messages-by-id.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/update-conversation-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/retrieving-messages/load-message-context", - "openimPath": "/sdk/wasm/message/retrieving-messages/load-message-context", - "title": "Load message context", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/set-conversation-group-order", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/set-conversation-group-order", + "title": "setConversationGroupOrder", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/load-message-context.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/set-conversation-group-order.mdx" }, { - "sourcePath": "/sdk/wasm/message/searching-messages/search-messages", - "openimPath": "/sdk/wasm/message/searching-messages/search-messages", - "title": "Search messages", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/add-conversations-to-groups", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/add-conversations-to-groups", + "title": "addConversationsToGroups", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/searching-messages/search-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" }, { - "sourcePath": "/sdk/wasm/message/composing-messages/update-typing-status", - "openimPath": "/sdk/wasm/message/composing-messages/update-typing-status", - "title": "Update typing status", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/remove-conversations-from-groups", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/remove-conversations-from-groups", + "title": "removeConversationsFromGroups", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/update-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" }, { - "sourcePath": "/sdk/wasm/message/composing-messages/get-typing-status", - "openimPath": "/sdk/wasm/message/composing-messages/get-typing-status", - "title": "Get typing status", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/delete-conversation-group", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/delete-conversation-group", + "title": "deleteConversationGroup", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/get-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/delete-conversation-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/composing-messages/check-speech-to-text", - "openimPath": "/sdk/wasm/message/composing-messages/check-speech-to-text", - "title": "Check speech recognition support", + "sourcePath": "/sdk/wasm/group/overview-group", + "openimPath": "/sdk/wasm/group/overview-group", + "title": "Group overview", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/check-speech-to-text.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/overview-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/composing-messages/transcribe-audio", - "openimPath": "/sdk/wasm/message/composing-messages/transcribe-audio", - "title": "Transcribe audio", + "sourcePath": "/sdk/wasm/group/create-group", + "openimPath": "/sdk/wasm/group/create-group", + "title": "Create a group", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/transcribe-audio.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/create-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/composing-messages/save-local-transcript", - "openimPath": "/sdk/wasm/message/composing-messages/save-local-transcript", - "title": "Save a local transcript", + "sourcePath": "/sdk/wasm/group/update-group-profile", + "openimPath": "/sdk/wasm/group/update-group-profile", + "title": "Update group profile", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/save-local-transcript.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/update-group-profile.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/delete-local-message", - "openimPath": "/sdk/wasm/message/managing-messages/delete-local-message", - "title": "Delete a local message", + "sourcePath": "/sdk/wasm/group/set-group-announcement", + "openimPath": "/sdk/wasm/group/set-group-announcement", + "title": "Publish a group announcement", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/delete-local-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/set-group-announcement.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/delete-saved-messages", - "openimPath": "/sdk/wasm/message/managing-messages/delete-saved-messages", - "title": "Delete saved messages", + "sourcePath": "/sdk/wasm/group/set-group-extension", + "openimPath": "/sdk/wasm/group/set-group-extension", + "title": "Set group extra data", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/delete-saved-messages.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/set-group-extension.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/delete-user-messages", - "openimPath": "/sdk/wasm/message/managing-messages/delete-user-messages", - "title": "Delete messages from a user", + "sourcePath": "/sdk/wasm/group/set-group-join-verification", + "openimPath": "/sdk/wasm/group/set-group-join-verification", + "title": "Set group join verification", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/delete-user-messages.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/set-group-join-verification.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/revoke-a-message", - "openimPath": "/sdk/wasm/message/managing-messages/revoke-a-message", - "title": "Revoke a message", + "sourcePath": "/sdk/wasm/group/set-group-member-profile-access", + "openimPath": "/sdk/wasm/group/set-group-member-profile-access", + "title": "Set member profile access", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/revoke-a-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/set-group-member-profile-access.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/modify-a-message", - "openimPath": "/sdk/wasm/message/managing-messages/modify-a-message", - "title": "Modify a message", + "sourcePath": "/sdk/wasm/group/set-group-member-friend-permission", + "openimPath": "/sdk/wasm/group/set-group-member-friend-permission", + "title": "Set member friend request permission", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/modify-a-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/set-group-member-friend-permission.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/get-pinned-messages", - "openimPath": "/sdk/wasm/message/managing-messages/get-pinned-messages", - "title": "View pinned messages", + "sourcePath": "/sdk/wasm/group/change-group-mute", + "openimPath": "/sdk/wasm/group/change-group-mute", + "title": "Change group mute status", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/get-pinned-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/change-group-mute.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/set-message-pinned", - "openimPath": "/sdk/wasm/message/managing-messages/set-message-pinned", - "title": "Pin or unpin a message", + "sourcePath": "/sdk/wasm/group/join-group", + "openimPath": "/sdk/wasm/group/join-group", + "title": "Apply to join a group", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/set-message-pinned.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/join-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/insert-local-single-message", - "openimPath": "/sdk/wasm/message/managing-messages/insert-local-single-message", - "title": "Insert a local direct message", + "sourcePath": "/sdk/wasm/group/quit-group", + "openimPath": "/sdk/wasm/group/quit-group", + "title": "Leave a group", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/insert-local-single-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/quit-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/insert-local-group-message", - "openimPath": "/sdk/wasm/message/managing-messages/insert-local-group-message", - "title": "Insert a local group message", + "sourcePath": "/sdk/wasm/group/dismiss-group", + "openimPath": "/sdk/wasm/group/dismiss-group", + "title": "Dismiss a group", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/insert-local-group-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/dismiss-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/clear-all-local-messages", - "openimPath": "/sdk/wasm/message/managing-messages/clear-all-local-messages", - "title": "Clear all local messages", + "sourcePath": "/sdk/wasm/group/retrieving-groups/get-specified-groups-info", + "openimPath": "/sdk/wasm/group/retrieving-groups/get-specified-groups-info", + "title": "Get group information", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/clear-all-local-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/get-specified-groups-info.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/clear-all-messages", - "openimPath": "/sdk/wasm/message/managing-messages/clear-all-messages", - "title": "Clear all saved messages", + "sourcePath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list", + "openimPath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list", + "title": "Get joined groups", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/clear-all-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/get-joined-group-list.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/set-message-local-ex", - "openimPath": "/sdk/wasm/message/managing-messages/set-message-local-ex", - "title": "Set local message extensions", + "sourcePath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list-page", + "openimPath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list-page", + "title": "Get joined groups by page", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/set-message-local-ex.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/get-joined-group-list-page.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-read-status/get-group-message-readers", - "openimPath": "/sdk/wasm/message/managing-read-status/get-group-message-readers", - "title": "View group message readers", + "sourcePath": "/sdk/wasm/group/retrieving-groups/is-join-group", + "openimPath": "/sdk/wasm/group/retrieving-groups/is-join-group", + "title": "Check group membership", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-read-status/get-group-message-readers.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/is-join-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-read-status/send-group-read-receipts", - "openimPath": "/sdk/wasm/message/managing-read-status/send-group-read-receipts", - "title": "Send group read receipts", + "sourcePath": "/sdk/wasm/group/retrieving-groups/search-groups", + "openimPath": "/sdk/wasm/group/retrieving-groups/search-groups", + "title": "Search groups", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-read-status/send-group-read-receipts.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/search-groups.mdx" }, { - "sourcePath": "/sdk/wasm/file-uploads/upload-file", - "openimPath": "/sdk/wasm/file-uploads/upload-file", - "title": "Upload a file", + "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-list-as-recipient", + "openimPath": "/sdk/wasm/group/group-applications/get-group-application-list-as-recipient", + "title": "Get received group applications", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/file-uploads/upload-file.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/wasm/calling/overview-calling", - "openimPath": "/sdk/wasm/calling/overview-calling", - "title": "Calling overview", + "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-list-as-applicant", + "openimPath": "/sdk/wasm/group/group-applications/get-group-application-list-as-applicant", + "title": "Get sent group applications", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/overview-calling.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/start-single-call", - "openimPath": "/sdk/wasm/calling/managing-calls/start-single-call", - "title": "Start a one-to-one call", + "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-unhandled-count", + "openimPath": "/sdk/wasm/group/group-applications/get-group-application-unhandled-count", + "title": "Get pending group application count", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/start-single-call.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-unhandled-count.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/start-group-call", - "openimPath": "/sdk/wasm/calling/managing-calls/start-group-call", - "title": "Start a group call", + "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-badge-count", + "openimPath": "/sdk/wasm/group/group-applications/get-group-application-badge-count", + "title": "Get group application badge count", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/start-group-call.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-badge-count.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/accept-call", - "openimPath": "/sdk/wasm/calling/managing-calls/accept-call", - "title": "Accept a call", + "sourcePath": "/sdk/wasm/group/group-applications/clear-group-application-badge-count", + "openimPath": "/sdk/wasm/group/group-applications/clear-group-application-badge-count", + "title": "Clear the group application badge", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/accept-call.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/clear-group-application-badge-count.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/reject-call", - "openimPath": "/sdk/wasm/calling/managing-calls/reject-call", - "title": "Reject a call", + "sourcePath": "/sdk/wasm/group/group-applications/accept-group-application", + "openimPath": "/sdk/wasm/group/group-applications/accept-group-application", + "title": "Accept a group application", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/reject-call.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/accept-group-application.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/cancel-call", - "openimPath": "/sdk/wasm/calling/managing-calls/cancel-call", - "title": "Cancel a call invitation", + "sourcePath": "/sdk/wasm/group/group-applications/refuse-group-application", + "openimPath": "/sdk/wasm/group/group-applications/refuse-group-application", + "title": "Reject a group application", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/cancel-call.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/refuse-group-application.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/hang-up-call", - "openimPath": "/sdk/wasm/calling/managing-calls/hang-up-call", - "title": "Hang up a call", + "sourcePath": "/sdk/wasm/group/group-applications/delete-group-requests", + "openimPath": "/sdk/wasm/group/group-applications/delete-group-requests", + "title": "Delete group applications", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/hang-up-call.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/delete-group-requests.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/handle-call-events", - "openimPath": "/sdk/wasm/calling/managing-calls/handle-call-events", - "title": "Handle call events", + "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-group-member-list", + "openimPath": "/sdk/wasm/group/retrieving-group-members/get-group-member-list", + "title": "Get group members", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/handle-call-events.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-group-member-list.mdx" }, { - "sourcePath": "/sdk/wasm/calling/retrieving-call-information/restore-pending-invitation", - "openimPath": "/sdk/wasm/calling/retrieving-call-information/restore-pending-invitation", - "title": "Restore a pending invitation", + "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-specified-group-members-info", + "openimPath": "/sdk/wasm/group/retrieving-group-members/get-specified-group-members-info", + "title": "Get group member profiles", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/retrieving-call-information/restore-pending-invitation.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-specified-group-members-info.mdx" }, { - "sourcePath": "/sdk/wasm/calling/retrieving-call-information/get-room-by-group-id", - "openimPath": "/sdk/wasm/calling/retrieving-call-information/get-room-by-group-id", - "title": "Get a group call room", + "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-users-in-group", + "openimPath": "/sdk/wasm/group/retrieving-group-members/get-users-in-group", + "title": "Check users in a group", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/retrieving-call-information/get-room-by-group-id.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-users-in-group.mdx" }, { - "sourcePath": "/sdk/wasm/calling/retrieving-call-information/get-token-by-room-id", - "openimPath": "/sdk/wasm/calling/retrieving-call-information/get-token-by-room-id", - "title": "Get room credentials", + "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-group-member-owner-and-admin", + "openimPath": "/sdk/wasm/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "Get group owners and admins", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/retrieving-call-information/get-token-by-room-id.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" }, { - "sourcePath": "/sdk/wasm/calling/sending-custom-signals/send-a-custom-signal", - "openimPath": "/sdk/wasm/calling/sending-custom-signals/send-a-custom-signal", - "title": "Send a custom signal", + "sourcePath": "/sdk/wasm/group/retrieving-group-members/search-group-members", + "openimPath": "/sdk/wasm/group/retrieving-group-members/search-group-members", + "title": "Search group members", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/sending-custom-signals/send-a-custom-signal.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/search-group-members.mdx" }, { - "sourcePath": "/sdk/wasm/events/overview-events", - "openimPath": "/sdk/wasm/events/overview-events", - "title": "Events overview", + "sourcePath": "/sdk/wasm/group/managing-group-members/invite-user-to-group", + "openimPath": "/sdk/wasm/group/managing-group-members/invite-user-to-group", + "title": "Invite users to a group", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/events/overview-events.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/invite-user-to-group.mdx" }, { - "sourcePath": "/sdk/wasm/logger", - "openimPath": "/sdk/wasm/logger", - "title": "Logger", + "sourcePath": "/sdk/wasm/group/managing-group-members/kick-group-member", + "openimPath": "/sdk/wasm/group/managing-group-members/kick-group-member", + "title": "Remove group members", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/logger.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/kick-group-member.mdx" }, { - "sourcePath": "/platform-api/overview", - "openimPath": "/platform-api/overview", - "title": "Overview", - "context": "chat/platform-api", + "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-nickname", + "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-nickname", + "title": "Update a group nickname", + "context": "chat/sdk/wasm", "template": "overview", - "contentFile": "content/docs/chat/platform-api/overview.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-nickname.mdx" }, { - "sourcePath": "/platform-api/prepare-to-use-api", - "openimPath": "/platform-api/prepare-to-use-api", - "title": "Prepare to use the API", - "context": "chat/platform-api", + "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-role-level", + "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-role-level", + "title": "Manage group administrators", + "context": "chat/sdk/wasm", "template": "overview", - "contentFile": "content/docs/chat/platform-api/prepare-to-use-api.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-role-level.mdx" }, { - "sourcePath": "/platform-api/user/overview", - "openimPath": "/platform-api/user/overview", - "title": "Overview", - "context": "chat/platform-api", + "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-avatar", + "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-avatar", + "title": "Update a group member avatar", + "context": "chat/sdk/wasm", "template": "overview", - "contentFile": "content/docs/chat/platform-api/user/overview.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-avatar.mdx" }, { - "sourcePath": "/platform-api/user/listing-users/list-users", - "openimPath": "/platform-api/user/listing-users/list-users", - "title": "List users", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/listing-users/list-users.mdx" + "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-extension", + "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-extension", + "title": "Set group member extra data", + "context": "chat/sdk/wasm", + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-extension.mdx" }, { - "sourcePath": "/platform-api/user/listing-users/list-all-user-ids", - "openimPath": "/platform-api/user/listing-users/list-all-user-ids", - "title": "List all user IDs", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/listing-users/list-all-user-ids.mdx" + "sourcePath": "/sdk/wasm/group/managing-group-members/transfer-group-owner", + "openimPath": "/sdk/wasm/group/managing-group-members/transfer-group-owner", + "title": "Transfer group owner", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/transfer-group-owner.mdx" }, { - "sourcePath": "/platform-api/user/listing-users/check-user-accounts", - "openimPath": "/platform-api/user/listing-users/check-user-accounts", - "title": "Check user accounts", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/listing-users/check-user-accounts.mdx" + "sourcePath": "/sdk/wasm/group/managing-group-members/change-group-member-mute", + "openimPath": "/sdk/wasm/group/managing-group-members/change-group-member-mute", + "title": "Mute or unmute a group member", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/change-group-member-mute.mdx" }, { - "sourcePath": "/platform-api/user/listing-users/get-a-user", - "openimPath": "/platform-api/user/listing-users/get-a-user", - "title": "Get a user", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/listing-users/get-a-user.mdx" + "sourcePath": "/sdk/wasm/message/overview-message", + "openimPath": "/sdk/wasm/message/overview-message", + "title": "Message overview", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/overview-message.mdx" }, { - "sourcePath": "/platform-api/user/creating-users/create-a-user", - "openimPath": "/platform-api/user/creating-users/create-a-user", - "title": "Create a user", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/creating-users/create-a-user.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-text-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-text-message", + "title": "Create a text message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-text-message.mdx" }, { - "sourcePath": "/platform-api/user/managing-users/update-a-user", - "openimPath": "/platform-api/user/managing-users/update-a-user", - "title": "Update a user", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/managing-users/update-a-user.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-text-at-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-text-at-message", + "title": "Create a mention message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-text-at-message.mdx" }, { - "sourcePath": "/platform-api/user/presence/get-users-online-status", - "openimPath": "/platform-api/user/presence/get-users-online-status", - "title": "Get users' online status", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/presence/get-users-online-status.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-custom-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-custom-message", + "title": "Create a custom message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-custom-message.mdx" }, { - "sourcePath": "/platform-api/user/presence/get-users-online-token-detail", - "openimPath": "/platform-api/user/presence/get-users-online-token-detail", - "title": "Get users online token details", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/presence/get-users-online-token-detail.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-image-message-by-file", + "openimPath": "/sdk/wasm/message/creating-messages/create-image-message-by-file", + "title": "Create an image message from a file", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-image-message-by-file.mdx" }, { - "sourcePath": "/platform-api/user/notification-accounts/add-notification-account", - "openimPath": "/platform-api/user/notification-accounts/add-notification-account", - "title": "Add a notification account", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/notification-accounts/add-notification-account.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-image-message-by-url", + "openimPath": "/sdk/wasm/message/creating-messages/create-image-message-by-url", + "title": "Create an image message from a URL", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-image-message-by-url.mdx" }, { - "sourcePath": "/platform-api/user/notification-accounts/update-notification-account", - "openimPath": "/platform-api/user/notification-accounts/update-notification-account", - "title": "Update a notification account", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/notification-accounts/update-notification-account.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-sound-message-by-file", + "openimPath": "/sdk/wasm/message/creating-messages/create-sound-message-by-file", + "title": "Create an audio message from a file", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-sound-message-by-file.mdx" }, { - "sourcePath": "/platform-api/user/notification-accounts/search-notification-account", - "openimPath": "/platform-api/user/notification-accounts/search-notification-account", - "title": "Search notification accounts", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/notification-accounts/search-notification-account.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-sound-message-by-url", + "openimPath": "/sdk/wasm/message/creating-messages/create-sound-message-by-url", + "title": "Create an audio message from a URL", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-sound-message-by-url.mdx" }, { - "sourcePath": "/platform-api/relation/overview", - "openimPath": "/platform-api/relation/overview", - "title": "Overview", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/relation/overview.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-video-message-by-file", + "openimPath": "/sdk/wasm/message/creating-messages/create-video-message-by-file", + "title": "Create a video message from a file", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-video-message-by-file.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friend-requests/apply-to-add-friend", - "openimPath": "/platform-api/relation/managing-friend-requests/apply-to-add-friend", - "title": "Apply to add a friend", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/apply-to-add-friend.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-video-message-by-url", + "openimPath": "/sdk/wasm/message/creating-messages/create-video-message-by-url", + "title": "Create a video message from a URL", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-video-message-by-url.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friend-requests/respond-friend-apply", - "openimPath": "/platform-api/relation/managing-friend-requests/respond-friend-apply", - "title": "Respond to a friend request", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/respond-friend-apply.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-file-message-by-file", + "openimPath": "/sdk/wasm/message/creating-messages/create-file-message-by-file", + "title": "Create a file message from a file", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-file-message-by-file.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friend-requests/list-received-friend-requests", - "openimPath": "/platform-api/relation/managing-friend-requests/list-received-friend-requests", - "title": "List received friend requests", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/list-received-friend-requests.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-file-message-by-url", + "openimPath": "/sdk/wasm/message/creating-messages/create-file-message-by-url", + "title": "Create a file message from a URL", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-file-message-by-url.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friend-requests/list-sent-friend-requests", - "openimPath": "/platform-api/relation/managing-friend-requests/list-sent-friend-requests", - "title": "List sent friend requests", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/list-sent-friend-requests.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-card-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-card-message", + "title": "Create a contact card message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-card-message.mdx" }, { - "sourcePath": "/platform-api/relation/listing-friends/list-friends", - "openimPath": "/platform-api/relation/listing-friends/list-friends", - "title": "List friends", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/listing-friends/list-friends.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-location-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-location-message", + "title": "Create a location message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-location-message.mdx" }, { - "sourcePath": "/platform-api/relation/listing-friends/get-designated-friends", - "openimPath": "/platform-api/relation/listing-friends/get-designated-friends", - "title": "Get designated friends", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/listing-friends/get-designated-friends.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-face-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-face-message", + "title": "Create an emoji message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-face-message.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friends/delete-friend", - "openimPath": "/platform-api/relation/managing-friends/delete-friend", - "title": "Delete a friend", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friends/delete-friend.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-quote-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-quote-message", + "title": "Create a reply message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-quote-message.mdx" }, { - "sourcePath": "/platform-api/error-codes", - "openimPath": "/platform-api/error-codes", - "title": "Error codes", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/error-codes.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-markdown-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-markdown-message", + "title": "Create a Markdown message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-markdown-message.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friends/import-friends", - "openimPath": "/platform-api/relation/managing-friends/import-friends", - "title": "Import friends", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friends/import-friends.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-forward-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-forward-message", + "title": "Create a forwarded message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-forward-message.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friends/update-friends", - "openimPath": "/platform-api/relation/managing-friends/update-friends", - "title": "Update friends", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friends/update-friends.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-merger-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-merger-message", + "title": "Create a merged message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-merger-message.mdx" }, { - "sourcePath": "/platform-api/relation/blacklist/add-black", - "openimPath": "/platform-api/relation/blacklist/add-black", - "title": "Add to blacklist", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/blacklist/add-black.mdx" + "sourcePath": "/sdk/wasm/message/sending-messages/send-message", + "openimPath": "/sdk/wasm/message/sending-messages/send-message", + "title": "Send a message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/sending-messages/send-message.mdx" }, { - "sourcePath": "/platform-api/relation/blacklist/list-blacks", - "openimPath": "/platform-api/relation/blacklist/list-blacks", - "title": "List blacklisted users", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/blacklist/list-blacks.mdx" + "sourcePath": "/sdk/wasm/message/sending-messages/send-message-not-oss", + "openimPath": "/sdk/wasm/message/sending-messages/send-message-not-oss", + "title": "Send a message without OSS", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/sending-messages/send-message-not-oss.mdx" + }, + { + "sourcePath": "/sdk/wasm/message/receiving-messages/receive-messages", + "openimPath": "/sdk/wasm/message/receiving-messages/receive-messages", + "title": "Receive messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/receiving-messages/receive-messages.mdx" }, { - "sourcePath": "/platform-api/relation/blacklist/remove-black", - "openimPath": "/platform-api/relation/blacklist/remove-black", - "title": "Remove from blacklist", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/blacklist/remove-black.mdx" + "sourcePath": "/sdk/wasm/message/receiving-messages/receive-custom-business-messages", + "openimPath": "/sdk/wasm/message/receiving-messages/receive-custom-business-messages", + "title": "Receive custom business messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/receiving-messages/receive-custom-business-messages.mdx" }, { - "sourcePath": "/platform-api/group/overview", - "openimPath": "/platform-api/group/overview", - "title": "Overview", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/group/overview.mdx" + "sourcePath": "/sdk/wasm/message/retrieving-messages/load-older-messages", + "openimPath": "/sdk/wasm/message/retrieving-messages/load-older-messages", + "title": "Load older messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/load-older-messages.mdx" }, { - "sourcePath": "/platform-api/group/managing-groups/create-group", - "openimPath": "/platform-api/group/managing-groups/create-group", - "title": "Create group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/managing-groups/create-group.mdx" + "sourcePath": "/sdk/wasm/message/retrieving-messages/load-newer-messages", + "openimPath": "/sdk/wasm/message/retrieving-messages/load-newer-messages", + "title": "Load newer messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/load-newer-messages.mdx" }, { - "sourcePath": "/platform-api/group/managing-groups/set-group-info-ex", - "openimPath": "/platform-api/group/managing-groups/set-group-info-ex", - "title": "Set group info extension", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/managing-groups/set-group-info-ex.mdx" + "sourcePath": "/sdk/wasm/message/retrieving-messages/find-messages-by-id", + "openimPath": "/sdk/wasm/message/retrieving-messages/find-messages-by-id", + "title": "Find messages by ID", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/find-messages-by-id.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/join-group", - "openimPath": "/platform-api/group/group-applications/join-group", - "title": "Join group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-applications/join-group.mdx" + "sourcePath": "/sdk/wasm/message/retrieving-messages/load-message-context", + "openimPath": "/sdk/wasm/message/retrieving-messages/load-message-context", + "title": "Load message context", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/load-message-context.mdx" }, { - "sourcePath": "/platform-api/group/group-membership/quit-group", - "openimPath": "/platform-api/group/group-membership/quit-group", - "title": "Quit group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-membership/quit-group.mdx" + "sourcePath": "/sdk/wasm/message/searching-messages/search-messages", + "openimPath": "/sdk/wasm/message/searching-messages/search-messages", + "title": "Search messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/searching-messages/search-messages.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/respond-group-application", - "openimPath": "/platform-api/group/group-applications/respond-group-application", - "title": "Respond to a group application", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-applications/respond-group-application.mdx" + "sourcePath": "/sdk/wasm/message/composing-messages/update-typing-status", + "openimPath": "/sdk/wasm/message/composing-messages/update-typing-status", + "title": "Update typing status", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/update-typing-status.mdx" }, { - "sourcePath": "/platform-api/group/managing-groups/transfer-group-owner", - "openimPath": "/platform-api/group/managing-groups/transfer-group-owner", - "title": "Transfer group owner", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/managing-groups/transfer-group-owner.mdx" + "sourcePath": "/sdk/wasm/message/composing-messages/get-typing-status", + "openimPath": "/sdk/wasm/message/composing-messages/get-typing-status", + "title": "Get typing status", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/get-typing-status.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/list-received-group-applications", - "openimPath": "/platform-api/group/group-applications/list-received-group-applications", - "title": "List received group applications", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-applications/list-received-group-applications.mdx" + "sourcePath": "/sdk/wasm/message/composing-messages/check-speech-to-text", + "openimPath": "/sdk/wasm/message/composing-messages/check-speech-to-text", + "title": "Check speech recognition support", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/check-speech-to-text.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/list-user-requested-group-applications", - "openimPath": "/platform-api/group/group-applications/list-user-requested-group-applications", - "title": "List user requested group applications", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-applications/list-user-requested-group-applications.mdx" + "sourcePath": "/sdk/wasm/message/composing-messages/transcribe-audio", + "openimPath": "/sdk/wasm/message/composing-messages/transcribe-audio", + "title": "Transcribe audio", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/transcribe-audio.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/list-group-users-request-applications", - "openimPath": "/platform-api/group/group-applications/list-group-users-request-applications", - "title": "List group users request applications", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-applications/list-group-users-request-applications.mdx" + "sourcePath": "/sdk/wasm/message/composing-messages/save-local-transcript", + "openimPath": "/sdk/wasm/message/composing-messages/save-local-transcript", + "title": "Save a local transcript", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/save-local-transcript.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/get-specified-user-group-request-info", - "openimPath": "/platform-api/group/group-applications/get-specified-user-group-request-info", - "title": "Get specified user group request info", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-applications/get-specified-user-group-request-info.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/delete-local-message", + "openimPath": "/sdk/wasm/message/managing-messages/delete-local-message", + "title": "Delete a local message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/delete-local-message.mdx" }, { - "sourcePath": "/platform-api/group/managing-groups/get-groups-info", - "openimPath": "/platform-api/group/managing-groups/get-groups-info", - "title": "Get groups info", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/managing-groups/get-groups-info.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/delete-saved-messages", + "openimPath": "/sdk/wasm/message/managing-messages/delete-saved-messages", + "title": "Delete saved messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/delete-saved-messages.mdx" }, { - "sourcePath": "/platform-api/group/group-members/kick-group-members", - "openimPath": "/platform-api/group/group-members/kick-group-members", - "title": "Kick group members", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-members/kick-group-members.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/delete-user-messages", + "openimPath": "/sdk/wasm/message/managing-messages/delete-user-messages", + "title": "Delete messages from a user", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/delete-user-messages.mdx" }, { - "sourcePath": "/platform-api/group/group-members/get-group-members-info", - "openimPath": "/platform-api/group/group-members/get-group-members-info", - "title": "Get group members info", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-members/get-group-members-info.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/revoke-a-message", + "openimPath": "/sdk/wasm/message/managing-messages/revoke-a-message", + "title": "Revoke a message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/revoke-a-message.mdx" }, { - "sourcePath": "/platform-api/group/group-members/get-group-member-list", - "openimPath": "/platform-api/group/group-members/get-group-member-list", - "title": "Get group member list", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-members/get-group-member-list.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/modify-a-message", + "openimPath": "/sdk/wasm/message/managing-messages/modify-a-message", + "title": "Modify a message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/modify-a-message.mdx" }, { - "sourcePath": "/platform-api/group/group-members/invite-users-to-group", - "openimPath": "/platform-api/group/group-members/invite-users-to-group", - "title": "Invite users to group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-members/invite-users-to-group.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/get-pinned-messages", + "openimPath": "/sdk/wasm/message/managing-messages/get-pinned-messages", + "title": "View pinned messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/get-pinned-messages.mdx" }, { - "sourcePath": "/platform-api/group/group-membership/get-joined-group-list", - "openimPath": "/platform-api/group/group-membership/get-joined-group-list", - "title": "Get joined group list", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-membership/get-joined-group-list.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/set-message-pinned", + "openimPath": "/sdk/wasm/message/managing-messages/set-message-pinned", + "title": "Pin or unpin a message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/set-message-pinned.mdx" }, { - "sourcePath": "/platform-api/group/managing-groups/dismiss-group", - "openimPath": "/platform-api/group/managing-groups/dismiss-group", - "title": "Dismiss group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/managing-groups/dismiss-group.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/insert-local-single-message", + "openimPath": "/sdk/wasm/message/managing-messages/insert-local-single-message", + "title": "Insert a local direct message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/insert-local-single-message.mdx" }, { - "sourcePath": "/platform-api/group/group-moderation/mute-group-member", - "openimPath": "/platform-api/group/group-moderation/mute-group-member", - "title": "Mute group member", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-moderation/mute-group-member.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/insert-local-group-message", + "openimPath": "/sdk/wasm/message/managing-messages/insert-local-group-message", + "title": "Insert a local group message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/insert-local-group-message.mdx" }, { - "sourcePath": "/platform-api/group/group-moderation/cancel-mute-group-member", - "openimPath": "/platform-api/group/group-moderation/cancel-mute-group-member", - "title": "Cancel mute group member", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-moderation/cancel-mute-group-member.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/clear-all-local-messages", + "openimPath": "/sdk/wasm/message/managing-messages/clear-all-local-messages", + "title": "Clear all local messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/clear-all-local-messages.mdx" }, { - "sourcePath": "/platform-api/group/group-moderation/mute-group", - "openimPath": "/platform-api/group/group-moderation/mute-group", - "title": "Mute group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-moderation/mute-group.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/clear-all-messages", + "openimPath": "/sdk/wasm/message/managing-messages/clear-all-messages", + "title": "Clear all saved messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/clear-all-messages.mdx" }, { - "sourcePath": "/platform-api/group/group-moderation/cancel-mute-group", - "openimPath": "/platform-api/group/group-moderation/cancel-mute-group", - "title": "Cancel mute group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-moderation/cancel-mute-group.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/set-message-local-ex", + "openimPath": "/sdk/wasm/message/managing-messages/set-message-local-ex", + "title": "Set local message extensions", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/set-message-local-ex.mdx" }, { - "sourcePath": "/platform-api/group/group-members/set-group-member-info", - "openimPath": "/platform-api/group/group-members/set-group-member-info", - "title": "Set group member info", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-members/set-group-member-info.mdx" + "sourcePath": "/sdk/wasm/message/managing-read-status/get-group-message-readers", + "openimPath": "/sdk/wasm/message/managing-read-status/get-group-message-readers", + "title": "View group message readers", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-read-status/get-group-message-readers.mdx" }, { - "sourcePath": "/platform-api/auth/overview", - "openimPath": "/platform-api/auth/overview", - "title": "Overview", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/auth/overview.mdx" + "sourcePath": "/sdk/wasm/message/managing-read-status/send-group-read-receipts", + "openimPath": "/sdk/wasm/message/managing-read-status/send-group-read-receipts", + "title": "Send group read receipts", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-read-status/send-group-read-receipts.mdx" }, { - "sourcePath": "/platform-api/auth/tokens/get-admin-token", - "openimPath": "/platform-api/auth/tokens/get-admin-token", - "title": "Get an administrator token", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/auth/tokens/get-admin-token.mdx" + "sourcePath": "/sdk/wasm/file-uploads/upload-file", + "openimPath": "/sdk/wasm/file-uploads/upload-file", + "title": "Upload a file", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/file-uploads/upload-file.mdx" }, { - "sourcePath": "/platform-api/auth/tokens/get-user-token", - "openimPath": "/platform-api/auth/tokens/get-user-token", - "title": "Get a user token", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/auth/tokens/get-user-token.mdx" + "sourcePath": "/sdk/wasm/calling/overview-calling", + "openimPath": "/sdk/wasm/calling/overview-calling", + "title": "Calling overview", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/overview-calling.mdx" }, { - "sourcePath": "/platform-api/auth/sessions/force-logout", - "openimPath": "/platform-api/auth/sessions/force-logout", - "title": "Force logout", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/auth/sessions/force-logout.mdx" + "sourcePath": "/sdk/wasm/calling/managing-calls/start-single-call", + "openimPath": "/sdk/wasm/calling/managing-calls/start-single-call", + "title": "Start a one-to-one call", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/start-single-call.mdx" }, { - "sourcePath": "/platform-api/message/overview", - "openimPath": "/platform-api/message/overview", - "title": "Overview", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/message/overview.mdx" + "sourcePath": "/sdk/wasm/calling/managing-calls/start-group-call", + "openimPath": "/sdk/wasm/calling/managing-calls/start-group-call", + "title": "Start a group call", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/start-group-call.mdx" }, { - "sourcePath": "/platform-api/message/message-content-types", - "openimPath": "/platform-api/message/message-content-types", - "title": "Message content types", - "context": "chat/platform-api", + "sourcePath": "/sdk/wasm/calling/managing-calls/accept-call", + "openimPath": "/sdk/wasm/calling/managing-calls/accept-call", + "title": "Accept a call", + "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/platform-api/message/message-content-types.mdx" + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/accept-call.mdx" }, { - "sourcePath": "/platform-api/message/sending-messages/send-msg", - "openimPath": "/platform-api/message/sending-messages/send-msg", - "title": "Send a message", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/message/sending-messages/send-msg.mdx" + "sourcePath": "/sdk/wasm/calling/managing-calls/reject-call", + "openimPath": "/sdk/wasm/calling/managing-calls/reject-call", + "title": "Reject a call", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/reject-call.mdx" }, { - "sourcePath": "/platform-api/message/sending-messages/batch-send-msg", - "openimPath": "/platform-api/message/sending-messages/batch-send-msg", - "title": "Batch send messages", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/message/sending-messages/batch-send-msg.mdx" + "sourcePath": "/sdk/wasm/calling/managing-calls/cancel-call", + "openimPath": "/sdk/wasm/calling/managing-calls/cancel-call", + "title": "Cancel a call invitation", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/cancel-call.mdx" }, { - "sourcePath": "/platform-api/message/sending-messages/send-business-notification", - "openimPath": "/platform-api/message/sending-messages/send-business-notification", - "title": "Send a business notification", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/message/sending-messages/send-business-notification.mdx" + "sourcePath": "/sdk/wasm/calling/managing-calls/hang-up-call", + "openimPath": "/sdk/wasm/calling/managing-calls/hang-up-call", + "title": "Hang up a call", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/hang-up-call.mdx" }, { - "sourcePath": "/platform-api/message/managing-messages/revoke-msg", - "openimPath": "/platform-api/message/managing-messages/revoke-msg", - "title": "Revoke a message", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/message/managing-messages/revoke-msg.mdx" + "sourcePath": "/sdk/wasm/calling/managing-calls/handle-call-events", + "openimPath": "/sdk/wasm/calling/managing-calls/handle-call-events", + "title": "Handle call events", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/handle-call-events.mdx" }, { - "sourcePath": "/platform-api/message/retrieving-messages/get-server-time", - "openimPath": "/platform-api/message/retrieving-messages/get-server-time", - "title": "Get server time", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/message/retrieving-messages/get-server-time.mdx" + "sourcePath": "/sdk/wasm/calling/retrieving-call-information/restore-pending-invitation", + "openimPath": "/sdk/wasm/calling/retrieving-call-information/restore-pending-invitation", + "title": "Restore a pending invitation", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/retrieving-call-information/restore-pending-invitation.mdx" }, { - "sourcePath": "/platform-api/conversation/overview", - "openimPath": "/platform-api/conversation/overview", - "title": "Overview", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/conversation/overview.mdx" + "sourcePath": "/sdk/wasm/calling/retrieving-call-information/get-room-by-group-id", + "openimPath": "/sdk/wasm/calling/retrieving-call-information/get-room-by-group-id", + "title": "Get a group call room", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/retrieving-call-information/get-room-by-group-id.mdx" }, { - "sourcePath": "/platform-api/conversation/listing-conversations/get-sorted-conversation-list", - "openimPath": "/platform-api/conversation/listing-conversations/get-sorted-conversation-list", - "title": "Get sorted conversation list", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-sorted-conversation-list.mdx" + "sourcePath": "/sdk/wasm/calling/retrieving-call-information/get-token-by-room-id", + "openimPath": "/sdk/wasm/calling/retrieving-call-information/get-token-by-room-id", + "title": "Get room credentials", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/retrieving-call-information/get-token-by-room-id.mdx" }, { - "sourcePath": "/platform-api/conversation/listing-conversations/get-conversation", - "openimPath": "/platform-api/conversation/listing-conversations/get-conversation", - "title": "Get conversation", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-conversation.mdx" + "sourcePath": "/sdk/wasm/calling/sending-custom-signals/send-a-custom-signal", + "openimPath": "/sdk/wasm/calling/sending-custom-signals/send-a-custom-signal", + "title": "Send a custom signal", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/sending-custom-signals/send-a-custom-signal.mdx" }, { - "sourcePath": "/platform-api/conversation/listing-conversations/get-conversations", - "openimPath": "/platform-api/conversation/listing-conversations/get-conversations", - "title": "Get conversations", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-conversations.mdx" + "sourcePath": "/sdk/wasm/events/overview-events", + "openimPath": "/sdk/wasm/events/overview-events", + "title": "Events overview", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/events/overview-events.mdx" }, { - "sourcePath": "/platform-api/conversation/managing-conversations/set-conversations", - "openimPath": "/platform-api/conversation/managing-conversations/set-conversations", - "title": "Set conversations", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/conversation/managing-conversations/set-conversations.mdx" + "sourcePath": "/sdk/wasm/logger", + "openimPath": "/sdk/wasm/logger", + "title": "Logger", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/logger.mdx" }, { - "sourcePath": "/platform-api/conversation/listing-conversations/get-owner-conversation", - "openimPath": "/platform-api/conversation/listing-conversations/get-owner-conversation", - "title": "Get owner conversation", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-owner-conversation.mdx" + "sourcePath": "/sdk/electron/overview", + "openimPath": "/sdk/electron/overview", + "title": "OpenIM SDK for Electron", + "context": "chat/sdk/electron", + "template": "overview", + "contentFile": "content/docs/chat/sdk/electron/overview.mdx" }, { - "sourcePath": "/platform-api/migration-to-openim", - "openimPath": "/platform-api/migration-to-openim", - "title": "Migrate to OpenIM", - "context": "chat/platform-api", + "sourcePath": "/sdk/miniprogram/overview", + "openimPath": "/sdk/miniprogram/overview", + "title": "OpenIM SDK for Mini Program", + "context": "chat/sdk/miniprogram", + "template": "overview", + "contentFile": "content/docs/chat/sdk/miniprogram/overview.mdx" + }, + { + "sourcePath": "/sdk/react-native/overview", + "openimPath": "/sdk/react-native/overview", + "title": "OpenIM SDK for React Native", + "context": "chat/sdk/react-native", "template": "overview", - "contentFile": "content/docs/chat/platform-api/migration-to-openim.mdx" + "contentFile": "content/docs/chat/sdk/react-native/overview.mdx" }, { - "sourcePath": "/platform-api/logs/overview", - "openimPath": "/platform-api/logs/overview", - "title": "Overview", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/logs/overview.mdx" + "sourcePath": "/sdk/electron/getting-started/authenticate-and-init", + "openimPath": "/sdk/electron/getting-started/authenticate-and-init", + "title": "Authenticate and init", + "context": "chat/sdk/electron", + "template": "guide", + "contentFile": "content/docs/chat/sdk/electron/getting-started/authenticate-and-init.mdx" }, { - "sourcePath": "/platform-api/logs/upload-logs", - "openimPath": "/platform-api/logs/upload-logs", - "title": "Upload log records", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/logs/upload-logs.mdx" + "sourcePath": "/sdk/electron/message/create-media-from-full-path", + "openimPath": "/sdk/electron/message/create-media-from-full-path", + "title": "Create media from full path", + "context": "chat/sdk/electron", + "template": "guide", + "contentFile": "content/docs/chat/sdk/electron/message/create-media-from-full-path.mdx" }, { - "sourcePath": "/platform-api/logs/search-logs", - "openimPath": "/platform-api/logs/search-logs", - "title": "Search log records", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/logs/search-logs.mdx" + "sourcePath": "/sdk/electron/logger/upload-logs", + "openimPath": "/sdk/electron/logger/upload-logs", + "title": "Upload logs", + "context": "chat/sdk/electron", + "template": "guide", + "contentFile": "content/docs/chat/sdk/electron/logger/upload-logs.mdx" }, { - "sourcePath": "/platform-api/logs/delete-logs", - "openimPath": "/platform-api/logs/delete-logs", - "title": "Delete log records", + "sourcePath": "/platform-api/webhooks/overview", + "openimPath": "/platform-api/webhooks/overview", "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/logs/delete-logs.mdx" + "template": "overview", + "title": "Overview", + "contentFile": "content/docs/chat/platform-api/webhooks/overview.mdx" }, { - "sourcePath": "/platform-api/message/managing-messages/modify-message", - "openimPath": "/platform-api/message/managing-messages/modify-message", + "sourcePath": "/platform-api/webhooks/user/before-user-register", + "openimPath": "/platform-api/webhooks/user/before-user-register", "context": "chat/platform-api", "template": "api", - "title": "Modify a message", - "contentFile": "content/docs/chat/platform-api/message/managing-messages/modify-message.mdx" + "title": "Before user registration", + "contentFile": "content/docs/chat/platform-api/webhooks/user/before-user-register.mdx" }, { - "sourcePath": "/platform-api/user/account-governance/ban-user", - "openimPath": "/platform-api/user/account-governance/ban-user", + "sourcePath": "/platform-api/webhooks/user/after-user-register", + "openimPath": "/platform-api/webhooks/user/after-user-register", "context": "chat/platform-api", "template": "api", - "title": "Ban users", - "contentFile": "content/docs/chat/platform-api/user/account-governance/ban-user.mdx" + "title": "After user registration", + "contentFile": "content/docs/chat/platform-api/webhooks/user/after-user-register.mdx" }, { - "sourcePath": "/platform-api/user/account-governance/list-disabled-users", - "openimPath": "/platform-api/user/account-governance/list-disabled-users", + "sourcePath": "/platform-api/webhooks/user/before-update-user-info", + "openimPath": "/platform-api/webhooks/user/before-update-user-info", "context": "chat/platform-api", "template": "api", - "title": "List disabled users", - "contentFile": "content/docs/chat/platform-api/user/account-governance/list-disabled-users.mdx" + "title": "Before updating user information", + "contentFile": "content/docs/chat/platform-api/webhooks/user/before-update-user-info.mdx" }, { - "sourcePath": "/platform-api/user/account-governance/unban-user", - "openimPath": "/platform-api/user/account-governance/unban-user", + "sourcePath": "/platform-api/webhooks/user/after-update-user-info", + "openimPath": "/platform-api/webhooks/user/after-update-user-info", "context": "chat/platform-api", "template": "api", - "title": "Unban users", - "contentFile": "content/docs/chat/platform-api/user/account-governance/unban-user.mdx" + "title": "After updating user information", + "contentFile": "content/docs/chat/platform-api/webhooks/user/after-update-user-info.mdx" }, { - "sourcePath": "/platform-api/user/account-governance/unregister-user", - "openimPath": "/platform-api/user/account-governance/unregister-user", + "sourcePath": "/platform-api/webhooks/user/before-update-user-info-ex", + "openimPath": "/platform-api/webhooks/user/before-update-user-info-ex", "context": "chat/platform-api", "template": "api", - "title": "Unregister users", - "contentFile": "content/docs/chat/platform-api/user/account-governance/unregister-user.mdx" + "title": "Before updating selected user fields", + "contentFile": "content/docs/chat/platform-api/webhooks/user/before-update-user-info-ex.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friend-requests/delete-received-friend-requests", - "openimPath": "/platform-api/relation/managing-friend-requests/delete-received-friend-requests", + "sourcePath": "/platform-api/webhooks/user/after-update-user-info-ex", + "openimPath": "/platform-api/webhooks/user/after-update-user-info-ex", "context": "chat/platform-api", "template": "api", - "title": "Delete received friend requests", - "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/delete-received-friend-requests.mdx" + "title": "After updating selected user fields", + "contentFile": "content/docs/chat/platform-api/webhooks/user/after-update-user-info-ex.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friend-requests/delete-sent-friend-requests", - "openimPath": "/platform-api/relation/managing-friend-requests/delete-sent-friend-requests", + "sourcePath": "/platform-api/webhooks/relation/before-add-friend", + "openimPath": "/platform-api/webhooks/relation/before-add-friend", "context": "chat/platform-api", "template": "api", - "title": "Delete sent friend requests", - "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/delete-sent-friend-requests.mdx" + "title": "Before adding a friend", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-add-friend.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/clear-group-application-badge-count", - "openimPath": "/platform-api/group/group-applications/clear-group-application-badge-count", + "sourcePath": "/platform-api/webhooks/relation/after-add-friend", + "openimPath": "/platform-api/webhooks/relation/after-add-friend", "context": "chat/platform-api", "template": "api", - "title": "Clear the group application badge count", - "contentFile": "content/docs/chat/platform-api/group/group-applications/clear-group-application-badge-count.mdx" + "title": "After adding a friend", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-add-friend.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/delete-group-received-requests", - "openimPath": "/platform-api/group/group-applications/delete-group-received-requests", + "sourcePath": "/platform-api/webhooks/relation/before-add-friend-agree", + "openimPath": "/platform-api/webhooks/relation/before-add-friend-agree", "context": "chat/platform-api", "template": "api", - "title": "Delete applications received by a group", - "contentFile": "content/docs/chat/platform-api/group/group-applications/delete-group-received-requests.mdx" + "title": "Before accepting a friend request", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-add-friend-agree.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/delete-user-group-requests", - "openimPath": "/platform-api/group/group-applications/delete-user-group-requests", + "sourcePath": "/platform-api/webhooks/relation/after-add-friend-agree", + "openimPath": "/platform-api/webhooks/relation/after-add-friend-agree", "context": "chat/platform-api", "template": "api", - "title": "Delete applications sent by a user", - "contentFile": "content/docs/chat/platform-api/group/group-applications/delete-user-group-requests.mdx" + "title": "After accepting a friend request", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-add-friend-agree.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/get-group-application-badge-count", - "openimPath": "/platform-api/group/group-applications/get-group-application-badge-count", + "sourcePath": "/platform-api/webhooks/relation/after-delete-friend", + "openimPath": "/platform-api/webhooks/relation/after-delete-friend", "context": "chat/platform-api", "template": "api", - "title": "Get the group application badge count", - "contentFile": "content/docs/chat/platform-api/group/group-applications/get-group-application-badge-count.mdx" + "title": "After deleting a friend", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-delete-friend.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/add-conversations-to-groups", - "openimPath": "/platform-api/conversation/conversation-groups/add-conversations-to-groups", + "sourcePath": "/platform-api/webhooks/relation/before-set-friend-remark", + "openimPath": "/platform-api/webhooks/relation/before-set-friend-remark", "context": "chat/platform-api", "template": "api", - "title": "Add conversations to groups", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/add-conversations-to-groups.mdx" + "title": "Before setting a friend remark", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-set-friend-remark.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/create-conversation-group", - "openimPath": "/platform-api/conversation/conversation-groups/create-conversation-group", + "sourcePath": "/platform-api/webhooks/relation/after-set-friend-remark", + "openimPath": "/platform-api/webhooks/relation/after-set-friend-remark", "context": "chat/platform-api", "template": "api", - "title": "Create a conversation group", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/create-conversation-group.mdx" + "title": "After setting a friend remark", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-set-friend-remark.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/delete-conversation-group", - "openimPath": "/platform-api/conversation/conversation-groups/delete-conversation-group", + "sourcePath": "/platform-api/webhooks/relation/before-add-black", + "openimPath": "/platform-api/webhooks/relation/before-add-black", "context": "chat/platform-api", "template": "api", - "title": "Delete a conversation group", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/delete-conversation-group.mdx" + "title": "Before adding to the blacklist", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-add-black.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/list-conversation-groups", - "openimPath": "/platform-api/conversation/conversation-groups/list-conversation-groups", + "sourcePath": "/platform-api/webhooks/relation/after-remove-black", + "openimPath": "/platform-api/webhooks/relation/after-remove-black", "context": "chat/platform-api", "template": "api", - "title": "List conversation groups", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/list-conversation-groups.mdx" + "title": "After removing from the blacklist", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-remove-black.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/remove-conversations-from-groups", - "openimPath": "/platform-api/conversation/conversation-groups/remove-conversations-from-groups", + "sourcePath": "/platform-api/webhooks/relation/before-import-friends", + "openimPath": "/platform-api/webhooks/relation/before-import-friends", "context": "chat/platform-api", "template": "api", - "title": "Remove conversations from groups", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/remove-conversations-from-groups.mdx" + "title": "Before importing friends", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-import-friends.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/set-conversation-group-order", - "openimPath": "/platform-api/conversation/conversation-groups/set-conversation-group-order", + "sourcePath": "/platform-api/webhooks/relation/after-import-friends", + "openimPath": "/platform-api/webhooks/relation/after-import-friends", "context": "chat/platform-api", "template": "api", - "title": "Set conversation group order", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/set-conversation-group-order.mdx" + "title": "After importing friends", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-import-friends.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/update-conversation-group", - "openimPath": "/platform-api/conversation/conversation-groups/update-conversation-group", + "sourcePath": "/platform-api/webhooks/group/before-create-group", + "openimPath": "/platform-api/webhooks/group/before-create-group", "context": "chat/platform-api", "template": "api", - "title": "Update a conversation group", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/update-conversation-group.mdx" + "title": "Before creating a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-create-group.mdx" }, { - "sourcePath": "/platform-api/message/content-processing/translate-text", - "openimPath": "/platform-api/message/content-processing/translate-text", + "sourcePath": "/platform-api/webhooks/group/after-create-group", + "openimPath": "/platform-api/webhooks/group/after-create-group", "context": "chat/platform-api", "template": "api", - "title": "Translate text", - "contentFile": "content/docs/chat/platform-api/message/content-processing/translate-text.mdx" + "title": "After creating a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-create-group.mdx" }, { - "sourcePath": "/platform-api/message/read-status/mark-conversation-read", - "openimPath": "/platform-api/message/read-status/mark-conversation-read", + "sourcePath": "/platform-api/webhooks/group/before-member-join-group", + "openimPath": "/platform-api/webhooks/group/before-member-join-group", "context": "chat/platform-api", "template": "api", - "title": "Mark a conversation read through a Seq", - "contentFile": "content/docs/chat/platform-api/message/read-status/mark-conversation-read.mdx" + "title": "Before members join a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-member-join-group.mdx" }, { - "sourcePath": "/platform-api/message/streaming-messages/append-stream-message", - "openimPath": "/platform-api/message/streaming-messages/append-stream-message", + "sourcePath": "/platform-api/webhooks/group/before-invite-user-to-group", + "openimPath": "/platform-api/webhooks/group/before-invite-user-to-group", "context": "chat/platform-api", "template": "api", - "title": "Append stream-message packets", - "contentFile": "content/docs/chat/platform-api/message/streaming-messages/append-stream-message.mdx" + "title": "Before inviting users to a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-invite-user-to-group.mdx" }, { - "sourcePath": "/platform-api/message/streaming-messages/put-stream-message", - "openimPath": "/platform-api/message/streaming-messages/put-stream-message", + "sourcePath": "/platform-api/webhooks/group/before-apply-join-group", + "openimPath": "/platform-api/webhooks/group/before-apply-join-group", "context": "chat/platform-api", "template": "api", - "title": "Upload stream-message content", - "contentFile": "content/docs/chat/platform-api/message/streaming-messages/put-stream-message.mdx" + "title": "Before applying to join a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-apply-join-group.mdx" }, { - "sourcePath": "/platform-api/message/unread-count/clear-conversations-unread-count", - "openimPath": "/platform-api/message/unread-count/clear-conversations-unread-count", + "sourcePath": "/platform-api/webhooks/group/after-join-group", + "openimPath": "/platform-api/webhooks/group/after-join-group", "context": "chat/platform-api", "template": "api", - "title": "Clear conversation unread counts", - "contentFile": "content/docs/chat/platform-api/message/unread-count/clear-conversations-unread-count.mdx" + "title": "After joining a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-join-group.mdx" }, { - "sourcePath": "/platform-api/message/unread-count/get-conversations-unread-count", - "openimPath": "/platform-api/message/unread-count/get-conversations-unread-count", + "sourcePath": "/platform-api/webhooks/group/after-quit-group", + "openimPath": "/platform-api/webhooks/group/after-quit-group", "context": "chat/platform-api", "template": "api", - "title": "Get conversation unread counts", - "contentFile": "content/docs/chat/platform-api/message/unread-count/get-conversations-unread-count.mdx" + "title": "After leaving a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-quit-group.mdx" }, { - "sourcePath": "/platform-api/message/unread-count/reset-conversation-unread", - "openimPath": "/platform-api/message/unread-count/reset-conversation-unread", + "sourcePath": "/platform-api/webhooks/group/after-kick-group-member", + "openimPath": "/platform-api/webhooks/group/after-kick-group-member", "context": "chat/platform-api", "template": "api", - "title": "Set a conversation unread count", - "contentFile": "content/docs/chat/platform-api/message/unread-count/reset-conversation-unread.mdx" - }, - { - "sourcePath": "/platform-api/timer/overview", - "openimPath": "/platform-api/timer/overview", - "context": "chat/platform-api", - "template": "overview", - "title": "Overview", - "contentFile": "content/docs/chat/platform-api/timer/overview.mdx" + "title": "After removing group members", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-kick-group-member.mdx" }, { - "sourcePath": "/platform-api/timer/managing-tasks/create-timer-task", - "openimPath": "/platform-api/timer/managing-tasks/create-timer-task", + "sourcePath": "/platform-api/webhooks/group/after-dismiss-group", + "openimPath": "/platform-api/webhooks/group/after-dismiss-group", "context": "chat/platform-api", "template": "api", - "title": "Create a timer task", - "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/create-timer-task.mdx" + "title": "After dismissing a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-dismiss-group.mdx" }, { - "sourcePath": "/platform-api/timer/managing-tasks/delete-timer-task", - "openimPath": "/platform-api/timer/managing-tasks/delete-timer-task", + "sourcePath": "/platform-api/webhooks/group/after-transfer-group-owner", + "openimPath": "/platform-api/webhooks/group/after-transfer-group-owner", "context": "chat/platform-api", "template": "api", - "title": "Delete a timer task", - "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/delete-timer-task.mdx" + "title": "After transferring group ownership", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-transfer-group-owner.mdx" }, { - "sourcePath": "/platform-api/timer/managing-tasks/get-timer-task", - "openimPath": "/platform-api/timer/managing-tasks/get-timer-task", + "sourcePath": "/platform-api/webhooks/group/before-set-group-member-info", + "openimPath": "/platform-api/webhooks/group/before-set-group-member-info", "context": "chat/platform-api", "template": "api", - "title": "Get a timer task", - "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/get-timer-task.mdx" + "title": "Before updating group member information", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-set-group-member-info.mdx" }, { - "sourcePath": "/platform-api/timer/managing-tasks/list-timer-tasks", - "openimPath": "/platform-api/timer/managing-tasks/list-timer-tasks", + "sourcePath": "/platform-api/webhooks/group/after-set-group-member-info", + "openimPath": "/platform-api/webhooks/group/after-set-group-member-info", "context": "chat/platform-api", "template": "api", - "title": "List timer tasks", - "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/list-timer-tasks.mdx" + "title": "After updating group member information", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-set-group-member-info.mdx" }, { - "sourcePath": "/platform-api/timer/managing-tasks/update-timer-task", - "openimPath": "/platform-api/timer/managing-tasks/update-timer-task", + "sourcePath": "/platform-api/webhooks/group/before-set-group-info", + "openimPath": "/platform-api/webhooks/group/before-set-group-info", "context": "chat/platform-api", "template": "api", - "title": "Update a timer task", - "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/update-timer-task.mdx" + "title": "Before updating group information", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-set-group-info.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-chat/pull-meeting-chat", - "openimPath": "/platform-api/meeting/meeting-chat/pull-meeting-chat", + "sourcePath": "/platform-api/webhooks/group/after-set-group-info", + "openimPath": "/platform-api/webhooks/group/after-set-group-info", "context": "chat/platform-api", "template": "api", - "title": "Pull meeting chat messages", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-chat/pull-meeting-chat.mdx" + "title": "After updating group information", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-set-group-info.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-chat/revoke-meeting-chat", - "openimPath": "/platform-api/meeting/meeting-chat/revoke-meeting-chat", + "sourcePath": "/platform-api/webhooks/group/before-set-group-info-ex", + "openimPath": "/platform-api/webhooks/group/before-set-group-info-ex", "context": "chat/platform-api", "template": "api", - "title": "Revoke a meeting chat message", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-chat/revoke-meeting-chat.mdx" + "title": "Before updating selected group fields", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-set-group-info-ex.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-chat/send-meeting-chat", - "openimPath": "/platform-api/meeting/meeting-chat/send-meeting-chat", + "sourcePath": "/platform-api/webhooks/group/after-set-group-info-ex", + "openimPath": "/platform-api/webhooks/group/after-set-group-info-ex", "context": "chat/platform-api", "template": "api", - "title": "Send a meeting chat message", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-chat/send-meeting-chat.mdx" + "title": "After updating selected group fields", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-set-group-info-ex.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/book-meeting", - "openimPath": "/platform-api/meeting/meeting-management/book-meeting", + "sourcePath": "/platform-api/webhooks/message/before-send-single-message", + "openimPath": "/platform-api/webhooks/message/before-send-single-message", "context": "chat/platform-api", "template": "api", - "title": "Schedule a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/book-meeting.mdx" + "title": "Before sending a one-to-one message", + "contentFile": "content/docs/chat/platform-api/webhooks/message/before-send-single-message.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/create-immediate-meeting", - "openimPath": "/platform-api/meeting/meeting-management/create-immediate-meeting", + "sourcePath": "/platform-api/webhooks/message/after-send-single-message", + "openimPath": "/platform-api/webhooks/message/after-send-single-message", "context": "chat/platform-api", "template": "api", - "title": "Create an immediate meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/create-immediate-meeting.mdx" + "title": "After sending a one-to-one message", + "contentFile": "content/docs/chat/platform-api/webhooks/message/after-send-single-message.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/end-meeting", - "openimPath": "/platform-api/meeting/meeting-management/end-meeting", + "sourcePath": "/platform-api/webhooks/message/before-send-group-message", + "openimPath": "/platform-api/webhooks/message/before-send-group-message", "context": "chat/platform-api", "template": "api", - "title": "End or cancel a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/end-meeting.mdx" + "title": "Before sending a group message", + "contentFile": "content/docs/chat/platform-api/webhooks/message/before-send-group-message.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/get-meeting-token", - "openimPath": "/platform-api/meeting/meeting-management/get-meeting-token", + "sourcePath": "/platform-api/webhooks/message/after-send-group-message", + "openimPath": "/platform-api/webhooks/message/after-send-group-message", "context": "chat/platform-api", "template": "api", - "title": "Get a meeting token", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/get-meeting-token.mdx" + "title": "After sending a group message", + "contentFile": "content/docs/chat/platform-api/webhooks/message/after-send-group-message.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/get-meeting", - "openimPath": "/platform-api/meeting/meeting-management/get-meeting", + "sourcePath": "/platform-api/webhooks/message/before-message-modify", + "openimPath": "/platform-api/webhooks/message/before-message-modify", "context": "chat/platform-api", "template": "api", - "title": "Get a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/get-meeting.mdx" + "title": "Before writing a message", + "contentFile": "content/docs/chat/platform-api/webhooks/message/before-message-modify.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/get-user-related-meetings", - "openimPath": "/platform-api/meeting/meeting-management/get-user-related-meetings", + "sourcePath": "/platform-api/webhooks/message/after-single-message-read", + "openimPath": "/platform-api/webhooks/message/after-single-message-read", "context": "chat/platform-api", "template": "api", - "title": "Get user-related meetings", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/get-user-related-meetings.mdx" + "title": "After one-to-one messages are read", + "contentFile": "content/docs/chat/platform-api/webhooks/message/after-single-message-read.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/invite-meeting-users", - "openimPath": "/platform-api/meeting/meeting-management/invite-meeting-users", + "sourcePath": "/platform-api/webhooks/message/after-group-message-read", + "openimPath": "/platform-api/webhooks/message/after-group-message-read", "context": "chat/platform-api", "template": "api", - "title": "Invite users to a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/invite-meeting-users.mdx" + "title": "After group messages are read", + "contentFile": "content/docs/chat/platform-api/webhooks/message/after-group-message-read.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/join-meeting", - "openimPath": "/platform-api/meeting/meeting-management/join-meeting", + "sourcePath": "/platform-api/webhooks/message/after-revoke-message", + "openimPath": "/platform-api/webhooks/message/after-revoke-message", "context": "chat/platform-api", "template": "api", - "title": "Join a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/join-meeting.mdx" + "title": "After revoking a message", + "contentFile": "content/docs/chat/platform-api/webhooks/message/after-revoke-message.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/leave-meeting", - "openimPath": "/platform-api/meeting/meeting-management/leave-meeting", + "sourcePath": "/platform-api/webhooks/push/before-online-push", + "openimPath": "/platform-api/webhooks/push/before-online-push", "context": "chat/platform-api", "template": "api", - "title": "Leave a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/leave-meeting.mdx" + "title": "Before one-to-one online push", + "contentFile": "content/docs/chat/platform-api/webhooks/push/before-online-push.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/list-meetings", - "openimPath": "/platform-api/meeting/meeting-management/list-meetings", + "sourcePath": "/platform-api/webhooks/push/before-group-online-push", + "openimPath": "/platform-api/webhooks/push/before-group-online-push", "context": "chat/platform-api", "template": "api", - "title": "List a user's meetings", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/list-meetings.mdx" + "title": "Before group online push", + "contentFile": "content/docs/chat/platform-api/webhooks/push/before-group-online-push.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/update-meeting", - "openimPath": "/platform-api/meeting/meeting-management/update-meeting", + "sourcePath": "/platform-api/webhooks/push/before-offline-push", + "openimPath": "/platform-api/webhooks/push/before-offline-push", "context": "chat/platform-api", "template": "api", - "title": "Update a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/update-meeting.mdx" + "title": "Before offline push", + "contentFile": "content/docs/chat/platform-api/webhooks/push/before-offline-push.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-records/delete-meeting-records", - "openimPath": "/platform-api/meeting/meeting-records/delete-meeting-records", + "sourcePath": "/platform-api/webhooks/push/after-user-online", + "openimPath": "/platform-api/webhooks/push/after-user-online", "context": "chat/platform-api", "template": "api", - "title": "Delete meeting recordings", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/delete-meeting-records.mdx" + "title": "After a user comes online", + "contentFile": "content/docs/chat/platform-api/webhooks/push/after-user-online.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-records/get-meeting-attendance", - "openimPath": "/platform-api/meeting/meeting-records/get-meeting-attendance", + "sourcePath": "/platform-api/webhooks/push/after-user-offline", + "openimPath": "/platform-api/webhooks/push/after-user-offline", "context": "chat/platform-api", "template": "api", - "title": "Get meeting attendance", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-meeting-attendance.mdx" + "title": "After a user goes offline", + "contentFile": "content/docs/chat/platform-api/webhooks/push/after-user-offline.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-records/get-meeting-records", - "openimPath": "/platform-api/meeting/meeting-records/get-meeting-records", + "sourcePath": "/platform-api/webhooks/push/after-user-kick-off", + "openimPath": "/platform-api/webhooks/push/after-user-kick-off", "context": "chat/platform-api", "template": "api", - "title": "Get meeting recordings", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-meeting-records.mdx" + "title": "After a user is forced offline", + "contentFile": "content/docs/chat/platform-api/webhooks/push/after-user-kick-off.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-records/get-records-by-meeting-ids", - "openimPath": "/platform-api/meeting/meeting-records/get-records-by-meeting-ids", + "sourcePath": "/platform-api/webhooks/conversation/before-create-single-chat-conversations", + "openimPath": "/platform-api/webhooks/conversation/before-create-single-chat-conversations", "context": "chat/platform-api", "template": "api", - "title": "Get recordings by meeting IDs", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-records-by-meeting-ids.mdx" + "title": "Before creating one-to-one conversations", + "contentFile": "content/docs/chat/platform-api/webhooks/conversation/before-create-single-chat-conversations.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-records/get-user-hosted-meetings", - "openimPath": "/platform-api/meeting/meeting-records/get-user-hosted-meetings", + "sourcePath": "/platform-api/webhooks/conversation/after-create-single-chat-conversations", + "openimPath": "/platform-api/webhooks/conversation/after-create-single-chat-conversations", "context": "chat/platform-api", "template": "api", - "title": "Get meetings hosted by a user", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-user-hosted-meetings.mdx" + "title": "After creating one-to-one conversations", + "contentFile": "content/docs/chat/platform-api/webhooks/conversation/after-create-single-chat-conversations.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-records/get-user-meeting-histories", - "openimPath": "/platform-api/meeting/meeting-records/get-user-meeting-histories", + "sourcePath": "/platform-api/webhooks/conversation/before-create-group-chat-conversations", + "openimPath": "/platform-api/webhooks/conversation/before-create-group-chat-conversations", "context": "chat/platform-api", "template": "api", - "title": "Get a user's meeting history", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-user-meeting-histories.mdx" + "title": "Before creating group conversations", + "contentFile": "content/docs/chat/platform-api/webhooks/conversation/before-create-group-chat-conversations.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/clean-previous-meetings", - "openimPath": "/platform-api/meeting/meeting-settings/clean-previous-meetings", + "sourcePath": "/platform-api/webhooks/conversation/after-create-group-chat-conversations", + "openimPath": "/platform-api/webhooks/conversation/after-create-group-chat-conversations", "context": "chat/platform-api", "template": "api", - "title": "Clean previous meeting state", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/clean-previous-meetings.mdx" + "title": "After creating group conversations", + "contentFile": "content/docs/chat/platform-api/webhooks/conversation/after-create-group-chat-conversations.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/get-personal-setting", - "openimPath": "/platform-api/meeting/meeting-settings/get-personal-setting", + "sourcePath": "/platform-api/timer/overview", + "openimPath": "/platform-api/timer/overview", "context": "chat/platform-api", - "template": "api", - "title": "Get personal meeting preferences", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/get-personal-setting.mdx" + "template": "overview", + "title": "Overview", + "contentFile": "content/docs/chat/platform-api/timer/overview.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/modify-participant-name", - "openimPath": "/platform-api/meeting/meeting-settings/modify-participant-name", + "sourcePath": "/platform-api/meeting/overview", + "openimPath": "/platform-api/meeting/overview", "context": "chat/platform-api", - "template": "api", - "title": "Modify a participant name", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/modify-participant-name.mdx" + "template": "overview", + "title": "Overview", + "contentFile": "content/docs/chat/platform-api/meeting/overview.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/operate-all-streams", - "openimPath": "/platform-api/meeting/meeting-settings/operate-all-streams", + "sourcePath": "/platform-api/user/account-governance/ban-user", + "openimPath": "/platform-api/user/account-governance/ban-user", "context": "chat/platform-api", "template": "api", - "title": "Control participant media streams", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/operate-all-streams.mdx" + "title": "Ban users", + "contentFile": "content/docs/chat/platform-api/user/account-governance/ban-user.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/remove-participants", - "openimPath": "/platform-api/meeting/meeting-settings/remove-participants", + "sourcePath": "/platform-api/user/account-governance/unban-user", + "openimPath": "/platform-api/user/account-governance/unban-user", "context": "chat/platform-api", "template": "api", - "title": "Remove meeting participants", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/remove-participants.mdx" + "title": "Unban users", + "contentFile": "content/docs/chat/platform-api/user/account-governance/unban-user.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/set-meeting-host", - "openimPath": "/platform-api/meeting/meeting-settings/set-meeting-host", + "sourcePath": "/platform-api/user/account-governance/unregister-user", + "openimPath": "/platform-api/user/account-governance/unregister-user", "context": "chat/platform-api", "template": "api", - "title": "Set meeting hosts", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/set-meeting-host.mdx" + "title": "Unregister users", + "contentFile": "content/docs/chat/platform-api/user/account-governance/unregister-user.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/set-personal-setting", - "openimPath": "/platform-api/meeting/meeting-settings/set-personal-setting", + "sourcePath": "/platform-api/user/account-governance/list-disabled-users", + "openimPath": "/platform-api/user/account-governance/list-disabled-users", "context": "chat/platform-api", "template": "api", - "title": "Set personal meeting preferences", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/set-personal-setting.mdx" + "title": "List disabled users", + "contentFile": "content/docs/chat/platform-api/user/account-governance/list-disabled-users.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-signaling/get-room-by-group-id", - "openimPath": "/platform-api/meeting/meeting-signaling/get-room-by-group-id", + "sourcePath": "/platform-api/relation/managing-friend-requests/delete-sent-friend-requests", + "openimPath": "/platform-api/relation/managing-friend-requests/delete-sent-friend-requests", "context": "chat/platform-api", "template": "api", - "title": "Get a call room by group ID", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-room-by-group-id.mdx" + "title": "Delete sent friend requests", + "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/delete-sent-friend-requests.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-signaling/get-signal-invitation", - "openimPath": "/platform-api/meeting/meeting-signaling/get-signal-invitation", + "sourcePath": "/platform-api/relation/managing-friend-requests/delete-received-friend-requests", + "openimPath": "/platform-api/relation/managing-friend-requests/delete-received-friend-requests", "context": "chat/platform-api", "template": "api", - "title": "Get a call invitation", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-signal-invitation.mdx" + "title": "Delete received friend requests", + "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/delete-received-friend-requests.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-signaling/get-signal-rooms", - "openimPath": "/platform-api/meeting/meeting-signaling/get-signal-rooms", + "sourcePath": "/platform-api/group/group-applications/get-group-application-badge-count", + "openimPath": "/platform-api/group/group-applications/get-group-application-badge-count", "context": "chat/platform-api", "template": "api", - "title": "Get call rooms", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-signal-rooms.mdx" + "title": "Get the group application badge count", + "contentFile": "content/docs/chat/platform-api/group/group-applications/get-group-application-badge-count.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-signaling/get-startup-invitation", - "openimPath": "/platform-api/meeting/meeting-signaling/get-startup-invitation", + "sourcePath": "/platform-api/group/group-applications/clear-group-application-badge-count", + "openimPath": "/platform-api/group/group-applications/clear-group-application-badge-count", "context": "chat/platform-api", "template": "api", - "title": "Get a startup call invitation", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-startup-invitation.mdx" + "title": "Clear the group application badge count", + "contentFile": "content/docs/chat/platform-api/group/group-applications/clear-group-application-badge-count.mdx" }, { - "sourcePath": "/platform-api/meeting/overview", - "openimPath": "/platform-api/meeting/overview", + "sourcePath": "/platform-api/group/group-applications/delete-user-group-requests", + "openimPath": "/platform-api/group/group-applications/delete-user-group-requests", "context": "chat/platform-api", - "template": "overview", - "title": "Overview", - "contentFile": "content/docs/chat/platform-api/meeting/overview.mdx" + "template": "api", + "title": "Delete applications sent by a user", + "contentFile": "content/docs/chat/platform-api/group/group-applications/delete-user-group-requests.mdx" }, { - "sourcePath": "/platform-api/meeting/recurring-meetings/create-repeat-meeting", - "openimPath": "/platform-api/meeting/recurring-meetings/create-repeat-meeting", + "sourcePath": "/platform-api/group/group-applications/delete-group-received-requests", + "openimPath": "/platform-api/group/group-applications/delete-group-received-requests", "context": "chat/platform-api", "template": "api", - "title": "Create a recurring meeting", - "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/create-repeat-meeting.mdx" + "title": "Delete applications received by a group", + "contentFile": "content/docs/chat/platform-api/group/group-applications/delete-group-received-requests.mdx" }, { - "sourcePath": "/platform-api/meeting/recurring-meetings/delete-repeat-meeting", - "openimPath": "/platform-api/meeting/recurring-meetings/delete-repeat-meeting", + "sourcePath": "/platform-api/message/content-processing/translate-text", + "openimPath": "/platform-api/message/content-processing/translate-text", "context": "chat/platform-api", "template": "api", - "title": "Delete a recurring meeting", - "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/delete-repeat-meeting.mdx" + "title": "Translate text", + "contentFile": "content/docs/chat/platform-api/message/content-processing/translate-text.mdx" }, { - "sourcePath": "/platform-api/meeting/recurring-meetings/get-repeat-meeting", - "openimPath": "/platform-api/meeting/recurring-meetings/get-repeat-meeting", + "sourcePath": "/platform-api/message/streaming-messages/append-stream-message", + "openimPath": "/platform-api/message/streaming-messages/append-stream-message", "context": "chat/platform-api", "template": "api", - "title": "Get a recurring meeting", - "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/get-repeat-meeting.mdx" + "title": "Append stream-message packets", + "contentFile": "content/docs/chat/platform-api/message/streaming-messages/append-stream-message.mdx" }, { - "sourcePath": "/platform-api/meeting/recurring-meetings/list-repeat-meeting-instances", - "openimPath": "/platform-api/meeting/recurring-meetings/list-repeat-meeting-instances", + "sourcePath": "/platform-api/message/streaming-messages/put-stream-message", + "openimPath": "/platform-api/message/streaming-messages/put-stream-message", "context": "chat/platform-api", "template": "api", - "title": "List recurring meeting instances", - "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/list-repeat-meeting-instances.mdx" + "title": "Upload stream-message content", + "contentFile": "content/docs/chat/platform-api/message/streaming-messages/put-stream-message.mdx" }, { - "sourcePath": "/platform-api/meeting/recurring-meetings/list-repeat-meetings", - "openimPath": "/platform-api/meeting/recurring-meetings/list-repeat-meetings", + "sourcePath": "/platform-api/message/read-status/mark-conversation-read", + "openimPath": "/platform-api/message/read-status/mark-conversation-read", "context": "chat/platform-api", "template": "api", - "title": "List recurring meetings", - "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/list-repeat-meetings.mdx" + "title": "Mark a conversation read through a Seq", + "contentFile": "content/docs/chat/platform-api/message/read-status/mark-conversation-read.mdx" }, { - "sourcePath": "/platform-api/meeting/recurring-meetings/update-repeat-meeting", - "openimPath": "/platform-api/meeting/recurring-meetings/update-repeat-meeting", + "sourcePath": "/platform-api/message/managing-messages/modify-message", + "openimPath": "/platform-api/message/managing-messages/modify-message", "context": "chat/platform-api", "template": "api", - "title": "Update a recurring meeting", - "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/update-repeat-meeting.mdx" + "title": "Modify a message", + "contentFile": "content/docs/chat/platform-api/message/managing-messages/modify-message.mdx" }, { - "sourcePath": "/platform-api/webhooks/conversation/after-create-group-chat-conversations", - "openimPath": "/platform-api/webhooks/conversation/after-create-group-chat-conversations", + "sourcePath": "/platform-api/message/unread-count/get-conversations-unread-count", + "openimPath": "/platform-api/message/unread-count/get-conversations-unread-count", "context": "chat/platform-api", "template": "api", - "title": "After creating group conversations", - "contentFile": "content/docs/chat/platform-api/webhooks/conversation/after-create-group-chat-conversations.mdx" + "title": "Get conversation unread counts", + "contentFile": "content/docs/chat/platform-api/message/unread-count/get-conversations-unread-count.mdx" }, { - "sourcePath": "/platform-api/webhooks/conversation/after-create-single-chat-conversations", - "openimPath": "/platform-api/webhooks/conversation/after-create-single-chat-conversations", + "sourcePath": "/platform-api/message/unread-count/clear-conversations-unread-count", + "openimPath": "/platform-api/message/unread-count/clear-conversations-unread-count", "context": "chat/platform-api", "template": "api", - "title": "After creating one-to-one conversations", - "contentFile": "content/docs/chat/platform-api/webhooks/conversation/after-create-single-chat-conversations.mdx" + "title": "Clear conversation unread counts", + "contentFile": "content/docs/chat/platform-api/message/unread-count/clear-conversations-unread-count.mdx" }, { - "sourcePath": "/platform-api/webhooks/conversation/before-create-group-chat-conversations", - "openimPath": "/platform-api/webhooks/conversation/before-create-group-chat-conversations", + "sourcePath": "/platform-api/message/unread-count/reset-conversation-unread", + "openimPath": "/platform-api/message/unread-count/reset-conversation-unread", "context": "chat/platform-api", "template": "api", - "title": "Before creating group conversations", - "contentFile": "content/docs/chat/platform-api/webhooks/conversation/before-create-group-chat-conversations.mdx" + "title": "Set a conversation unread count", + "contentFile": "content/docs/chat/platform-api/message/unread-count/reset-conversation-unread.mdx" }, { - "sourcePath": "/platform-api/webhooks/conversation/before-create-single-chat-conversations", - "openimPath": "/platform-api/webhooks/conversation/before-create-single-chat-conversations", + "sourcePath": "/platform-api/conversation/conversation-groups/create-conversation-group", + "openimPath": "/platform-api/conversation/conversation-groups/create-conversation-group", "context": "chat/platform-api", "template": "api", - "title": "Before creating one-to-one conversations", - "contentFile": "content/docs/chat/platform-api/webhooks/conversation/before-create-single-chat-conversations.mdx" + "title": "Create a conversation group", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/create-conversation-group.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-create-group", - "openimPath": "/platform-api/webhooks/group/after-create-group", + "sourcePath": "/platform-api/conversation/conversation-groups/update-conversation-group", + "openimPath": "/platform-api/conversation/conversation-groups/update-conversation-group", "context": "chat/platform-api", "template": "api", - "title": "After creating a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-create-group.mdx" + "title": "Update a conversation group", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/update-conversation-group.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-dismiss-group", - "openimPath": "/platform-api/webhooks/group/after-dismiss-group", + "sourcePath": "/platform-api/conversation/conversation-groups/delete-conversation-group", + "openimPath": "/platform-api/conversation/conversation-groups/delete-conversation-group", "context": "chat/platform-api", "template": "api", - "title": "After dismissing a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-dismiss-group.mdx" + "title": "Delete a conversation group", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/delete-conversation-group.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-join-group", - "openimPath": "/platform-api/webhooks/group/after-join-group", + "sourcePath": "/platform-api/conversation/conversation-groups/list-conversation-groups", + "openimPath": "/platform-api/conversation/conversation-groups/list-conversation-groups", "context": "chat/platform-api", "template": "api", - "title": "After joining a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-join-group.mdx" + "title": "List conversation groups", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/list-conversation-groups.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-kick-group-member", - "openimPath": "/platform-api/webhooks/group/after-kick-group-member", + "sourcePath": "/platform-api/conversation/conversation-groups/set-conversation-group-order", + "openimPath": "/platform-api/conversation/conversation-groups/set-conversation-group-order", "context": "chat/platform-api", "template": "api", - "title": "After removing group members", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-kick-group-member.mdx" + "title": "Set conversation group order", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/set-conversation-group-order.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-quit-group", - "openimPath": "/platform-api/webhooks/group/after-quit-group", + "sourcePath": "/platform-api/conversation/conversation-groups/add-conversations-to-groups", + "openimPath": "/platform-api/conversation/conversation-groups/add-conversations-to-groups", "context": "chat/platform-api", "template": "api", - "title": "After leaving a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-quit-group.mdx" + "title": "Add conversations to groups", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/add-conversations-to-groups.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-set-group-info", - "openimPath": "/platform-api/webhooks/group/after-set-group-info", + "sourcePath": "/platform-api/conversation/conversation-groups/remove-conversations-from-groups", + "openimPath": "/platform-api/conversation/conversation-groups/remove-conversations-from-groups", "context": "chat/platform-api", "template": "api", - "title": "After updating group information", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-set-group-info.mdx" + "title": "Remove conversations from groups", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/remove-conversations-from-groups.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-set-group-info-ex", - "openimPath": "/platform-api/webhooks/group/after-set-group-info-ex", + "sourcePath": "/platform-api/timer/managing-tasks/create-timer-task", + "openimPath": "/platform-api/timer/managing-tasks/create-timer-task", "context": "chat/platform-api", "template": "api", - "title": "After updating selected group fields", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-set-group-info-ex.mdx" + "title": "Create a timer task", + "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/create-timer-task.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-set-group-member-info", - "openimPath": "/platform-api/webhooks/group/after-set-group-member-info", + "sourcePath": "/platform-api/timer/managing-tasks/update-timer-task", + "openimPath": "/platform-api/timer/managing-tasks/update-timer-task", "context": "chat/platform-api", "template": "api", - "title": "After updating group member information", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-set-group-member-info.mdx" + "title": "Update a timer task", + "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/update-timer-task.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-transfer-group-owner", - "openimPath": "/platform-api/webhooks/group/after-transfer-group-owner", + "sourcePath": "/platform-api/timer/managing-tasks/delete-timer-task", + "openimPath": "/platform-api/timer/managing-tasks/delete-timer-task", "context": "chat/platform-api", "template": "api", - "title": "After transferring group ownership", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-transfer-group-owner.mdx" + "title": "Delete a timer task", + "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/delete-timer-task.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-apply-join-group", - "openimPath": "/platform-api/webhooks/group/before-apply-join-group", + "sourcePath": "/platform-api/timer/managing-tasks/get-timer-task", + "openimPath": "/platform-api/timer/managing-tasks/get-timer-task", "context": "chat/platform-api", "template": "api", - "title": "Before applying to join a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-apply-join-group.mdx" + "title": "Get a timer task", + "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/get-timer-task.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-create-group", - "openimPath": "/platform-api/webhooks/group/before-create-group", + "sourcePath": "/platform-api/timer/managing-tasks/list-timer-tasks", + "openimPath": "/platform-api/timer/managing-tasks/list-timer-tasks", "context": "chat/platform-api", "template": "api", - "title": "Before creating a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-create-group.mdx" + "title": "List timer tasks", + "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/list-timer-tasks.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-invite-user-to-group", - "openimPath": "/platform-api/webhooks/group/before-invite-user-to-group", + "sourcePath": "/platform-api/meeting/meeting-management/book-meeting", + "openimPath": "/platform-api/meeting/meeting-management/book-meeting", "context": "chat/platform-api", "template": "api", - "title": "Before inviting users to a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-invite-user-to-group.mdx" + "title": "Schedule a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/book-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-member-join-group", - "openimPath": "/platform-api/webhooks/group/before-member-join-group", + "sourcePath": "/platform-api/meeting/meeting-management/create-immediate-meeting", + "openimPath": "/platform-api/meeting/meeting-management/create-immediate-meeting", "context": "chat/platform-api", "template": "api", - "title": "Before members join a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-member-join-group.mdx" + "title": "Create an immediate meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/create-immediate-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-set-group-info", - "openimPath": "/platform-api/webhooks/group/before-set-group-info", + "sourcePath": "/platform-api/meeting/meeting-management/join-meeting", + "openimPath": "/platform-api/meeting/meeting-management/join-meeting", "context": "chat/platform-api", "template": "api", - "title": "Before updating group information", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-set-group-info.mdx" + "title": "Join a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/join-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-set-group-info-ex", - "openimPath": "/platform-api/webhooks/group/before-set-group-info-ex", + "sourcePath": "/platform-api/meeting/meeting-management/get-meeting-token", + "openimPath": "/platform-api/meeting/meeting-management/get-meeting-token", "context": "chat/platform-api", "template": "api", - "title": "Before updating selected group fields", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-set-group-info-ex.mdx" + "title": "Get a meeting token", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/get-meeting-token.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-set-group-member-info", - "openimPath": "/platform-api/webhooks/group/before-set-group-member-info", + "sourcePath": "/platform-api/meeting/meeting-management/update-meeting", + "openimPath": "/platform-api/meeting/meeting-management/update-meeting", "context": "chat/platform-api", "template": "api", - "title": "Before updating group member information", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-set-group-member-info.mdx" + "title": "Update a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/update-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/after-group-message-read", - "openimPath": "/platform-api/webhooks/message/after-group-message-read", + "sourcePath": "/platform-api/meeting/meeting-management/get-meeting", + "openimPath": "/platform-api/meeting/meeting-management/get-meeting", "context": "chat/platform-api", "template": "api", - "title": "After group messages are read", - "contentFile": "content/docs/chat/platform-api/webhooks/message/after-group-message-read.mdx" + "title": "Get a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/get-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/after-revoke-message", - "openimPath": "/platform-api/webhooks/message/after-revoke-message", + "sourcePath": "/platform-api/meeting/meeting-management/list-meetings", + "openimPath": "/platform-api/meeting/meeting-management/list-meetings", "context": "chat/platform-api", "template": "api", - "title": "After revoking a message", - "contentFile": "content/docs/chat/platform-api/webhooks/message/after-revoke-message.mdx" + "title": "List a user's meetings", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/list-meetings.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/after-send-group-message", - "openimPath": "/platform-api/webhooks/message/after-send-group-message", + "sourcePath": "/platform-api/meeting/meeting-management/invite-meeting-users", + "openimPath": "/platform-api/meeting/meeting-management/invite-meeting-users", "context": "chat/platform-api", "template": "api", - "title": "After sending a group message", - "contentFile": "content/docs/chat/platform-api/webhooks/message/after-send-group-message.mdx" + "title": "Invite users to a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/invite-meeting-users.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/after-send-single-message", - "openimPath": "/platform-api/webhooks/message/after-send-single-message", + "sourcePath": "/platform-api/meeting/meeting-management/leave-meeting", + "openimPath": "/platform-api/meeting/meeting-management/leave-meeting", "context": "chat/platform-api", "template": "api", - "title": "After sending a one-to-one message", - "contentFile": "content/docs/chat/platform-api/webhooks/message/after-send-single-message.mdx" + "title": "Leave a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/leave-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/after-single-message-read", - "openimPath": "/platform-api/webhooks/message/after-single-message-read", + "sourcePath": "/platform-api/meeting/meeting-management/end-meeting", + "openimPath": "/platform-api/meeting/meeting-management/end-meeting", "context": "chat/platform-api", "template": "api", - "title": "After one-to-one messages are read", - "contentFile": "content/docs/chat/platform-api/webhooks/message/after-single-message-read.mdx" + "title": "End or cancel a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/end-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/before-message-modify", - "openimPath": "/platform-api/webhooks/message/before-message-modify", + "sourcePath": "/platform-api/meeting/meeting-management/get-user-related-meetings", + "openimPath": "/platform-api/meeting/meeting-management/get-user-related-meetings", "context": "chat/platform-api", "template": "api", - "title": "Before writing a message", - "contentFile": "content/docs/chat/platform-api/webhooks/message/before-message-modify.mdx" + "title": "Get user-related meetings", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/get-user-related-meetings.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/before-send-group-message", - "openimPath": "/platform-api/webhooks/message/before-send-group-message", + "sourcePath": "/platform-api/meeting/meeting-settings/set-personal-setting", + "openimPath": "/platform-api/meeting/meeting-settings/set-personal-setting", "context": "chat/platform-api", "template": "api", - "title": "Before sending a group message", - "contentFile": "content/docs/chat/platform-api/webhooks/message/before-send-group-message.mdx" + "title": "Set personal meeting preferences", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/set-personal-setting.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/before-send-single-message", - "openimPath": "/platform-api/webhooks/message/before-send-single-message", + "sourcePath": "/platform-api/meeting/meeting-settings/get-personal-setting", + "openimPath": "/platform-api/meeting/meeting-settings/get-personal-setting", "context": "chat/platform-api", "template": "api", - "title": "Before sending a one-to-one message", - "contentFile": "content/docs/chat/platform-api/webhooks/message/before-send-single-message.mdx" + "title": "Get personal meeting preferences", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/get-personal-setting.mdx" }, { - "sourcePath": "/platform-api/webhooks/overview", - "openimPath": "/platform-api/webhooks/overview", + "sourcePath": "/platform-api/meeting/meeting-settings/operate-all-streams", + "openimPath": "/platform-api/meeting/meeting-settings/operate-all-streams", "context": "chat/platform-api", - "template": "overview", - "title": "Overview", - "contentFile": "content/docs/chat/platform-api/webhooks/overview.mdx" + "template": "api", + "title": "Control participant media streams", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/operate-all-streams.mdx" }, { - "sourcePath": "/platform-api/webhooks/push/after-user-kick-off", - "openimPath": "/platform-api/webhooks/push/after-user-kick-off", + "sourcePath": "/platform-api/meeting/meeting-settings/modify-participant-name", + "openimPath": "/platform-api/meeting/meeting-settings/modify-participant-name", "context": "chat/platform-api", "template": "api", - "title": "After a user is forced offline", - "contentFile": "content/docs/chat/platform-api/webhooks/push/after-user-kick-off.mdx" + "title": "Modify a participant name", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/modify-participant-name.mdx" }, { - "sourcePath": "/platform-api/webhooks/push/after-user-offline", - "openimPath": "/platform-api/webhooks/push/after-user-offline", + "sourcePath": "/platform-api/meeting/meeting-settings/remove-participants", + "openimPath": "/platform-api/meeting/meeting-settings/remove-participants", "context": "chat/platform-api", "template": "api", - "title": "After a user goes offline", - "contentFile": "content/docs/chat/platform-api/webhooks/push/after-user-offline.mdx" + "title": "Remove meeting participants", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/remove-participants.mdx" }, { - "sourcePath": "/platform-api/webhooks/push/after-user-online", - "openimPath": "/platform-api/webhooks/push/after-user-online", + "sourcePath": "/platform-api/meeting/meeting-settings/set-meeting-host", + "openimPath": "/platform-api/meeting/meeting-settings/set-meeting-host", "context": "chat/platform-api", "template": "api", - "title": "After a user comes online", - "contentFile": "content/docs/chat/platform-api/webhooks/push/after-user-online.mdx" + "title": "Set meeting hosts", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/set-meeting-host.mdx" }, { - "sourcePath": "/platform-api/webhooks/push/before-group-online-push", - "openimPath": "/platform-api/webhooks/push/before-group-online-push", + "sourcePath": "/platform-api/meeting/meeting-settings/clean-previous-meetings", + "openimPath": "/platform-api/meeting/meeting-settings/clean-previous-meetings", "context": "chat/platform-api", "template": "api", - "title": "Before group online push", - "contentFile": "content/docs/chat/platform-api/webhooks/push/before-group-online-push.mdx" + "title": "Clean previous meeting state", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/clean-previous-meetings.mdx" }, { - "sourcePath": "/platform-api/webhooks/push/before-offline-push", - "openimPath": "/platform-api/webhooks/push/before-offline-push", + "sourcePath": "/platform-api/meeting/recurring-meetings/create-repeat-meeting", + "openimPath": "/platform-api/meeting/recurring-meetings/create-repeat-meeting", "context": "chat/platform-api", "template": "api", - "title": "Before offline push", - "contentFile": "content/docs/chat/platform-api/webhooks/push/before-offline-push.mdx" + "title": "Create a recurring meeting", + "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/create-repeat-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/push/before-online-push", - "openimPath": "/platform-api/webhooks/push/before-online-push", + "sourcePath": "/platform-api/meeting/recurring-meetings/update-repeat-meeting", + "openimPath": "/platform-api/meeting/recurring-meetings/update-repeat-meeting", "context": "chat/platform-api", "template": "api", - "title": "Before one-to-one online push", - "contentFile": "content/docs/chat/platform-api/webhooks/push/before-online-push.mdx" + "title": "Update a recurring meeting", + "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/update-repeat-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/after-add-friend", - "openimPath": "/platform-api/webhooks/relation/after-add-friend", + "sourcePath": "/platform-api/meeting/recurring-meetings/delete-repeat-meeting", + "openimPath": "/platform-api/meeting/recurring-meetings/delete-repeat-meeting", "context": "chat/platform-api", "template": "api", - "title": "After adding a friend", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-add-friend.mdx" + "title": "Delete a recurring meeting", + "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/delete-repeat-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/after-add-friend-agree", - "openimPath": "/platform-api/webhooks/relation/after-add-friend-agree", + "sourcePath": "/platform-api/meeting/recurring-meetings/get-repeat-meeting", + "openimPath": "/platform-api/meeting/recurring-meetings/get-repeat-meeting", "context": "chat/platform-api", "template": "api", - "title": "After accepting a friend request", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-add-friend-agree.mdx" + "title": "Get a recurring meeting", + "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/get-repeat-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/after-delete-friend", - "openimPath": "/platform-api/webhooks/relation/after-delete-friend", + "sourcePath": "/platform-api/meeting/recurring-meetings/list-repeat-meetings", + "openimPath": "/platform-api/meeting/recurring-meetings/list-repeat-meetings", "context": "chat/platform-api", "template": "api", - "title": "After deleting a friend", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-delete-friend.mdx" + "title": "List recurring meetings", + "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/list-repeat-meetings.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/after-import-friends", - "openimPath": "/platform-api/webhooks/relation/after-import-friends", + "sourcePath": "/platform-api/meeting/recurring-meetings/list-repeat-meeting-instances", + "openimPath": "/platform-api/meeting/recurring-meetings/list-repeat-meeting-instances", "context": "chat/platform-api", "template": "api", - "title": "After importing friends", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-import-friends.mdx" + "title": "List recurring meeting instances", + "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/list-repeat-meeting-instances.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/after-remove-black", - "openimPath": "/platform-api/webhooks/relation/after-remove-black", + "sourcePath": "/platform-api/meeting/meeting-records/get-user-meeting-histories", + "openimPath": "/platform-api/meeting/meeting-records/get-user-meeting-histories", "context": "chat/platform-api", "template": "api", - "title": "After removing from the blacklist", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-remove-black.mdx" + "title": "Get a user's meeting history", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-user-meeting-histories.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/after-set-friend-remark", - "openimPath": "/platform-api/webhooks/relation/after-set-friend-remark", + "sourcePath": "/platform-api/meeting/meeting-records/get-user-hosted-meetings", + "openimPath": "/platform-api/meeting/meeting-records/get-user-hosted-meetings", "context": "chat/platform-api", "template": "api", - "title": "After setting a friend remark", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-set-friend-remark.mdx" + "title": "Get meetings hosted by a user", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-user-hosted-meetings.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/before-add-black", - "openimPath": "/platform-api/webhooks/relation/before-add-black", + "sourcePath": "/platform-api/meeting/meeting-records/get-meeting-records", + "openimPath": "/platform-api/meeting/meeting-records/get-meeting-records", "context": "chat/platform-api", "template": "api", - "title": "Before adding to the blacklist", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-add-black.mdx" + "title": "Get meeting recordings", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-meeting-records.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/before-add-friend", - "openimPath": "/platform-api/webhooks/relation/before-add-friend", + "sourcePath": "/platform-api/meeting/meeting-records/get-records-by-meeting-ids", + "openimPath": "/platform-api/meeting/meeting-records/get-records-by-meeting-ids", "context": "chat/platform-api", "template": "api", - "title": "Before adding a friend", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-add-friend.mdx" + "title": "Get recordings by meeting IDs", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-records-by-meeting-ids.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/before-add-friend-agree", - "openimPath": "/platform-api/webhooks/relation/before-add-friend-agree", + "sourcePath": "/platform-api/meeting/meeting-records/get-meeting-attendance", + "openimPath": "/platform-api/meeting/meeting-records/get-meeting-attendance", "context": "chat/platform-api", "template": "api", - "title": "Before accepting a friend request", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-add-friend-agree.mdx" + "title": "Get meeting attendance", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-meeting-attendance.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/before-import-friends", - "openimPath": "/platform-api/webhooks/relation/before-import-friends", + "sourcePath": "/platform-api/meeting/meeting-records/delete-meeting-records", + "openimPath": "/platform-api/meeting/meeting-records/delete-meeting-records", "context": "chat/platform-api", "template": "api", - "title": "Before importing friends", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-import-friends.mdx" + "title": "Delete meeting recordings", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/delete-meeting-records.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/before-set-friend-remark", - "openimPath": "/platform-api/webhooks/relation/before-set-friend-remark", + "sourcePath": "/platform-api/meeting/meeting-signaling/get-room-by-group-id", + "openimPath": "/platform-api/meeting/meeting-signaling/get-room-by-group-id", "context": "chat/platform-api", "template": "api", - "title": "Before setting a friend remark", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-set-friend-remark.mdx" + "title": "Get a call room by group ID", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-room-by-group-id.mdx" }, { - "sourcePath": "/platform-api/webhooks/user/after-update-user-info", - "openimPath": "/platform-api/webhooks/user/after-update-user-info", + "sourcePath": "/platform-api/meeting/meeting-signaling/get-signal-rooms", + "openimPath": "/platform-api/meeting/meeting-signaling/get-signal-rooms", "context": "chat/platform-api", "template": "api", - "title": "After updating user information", - "contentFile": "content/docs/chat/platform-api/webhooks/user/after-update-user-info.mdx" + "title": "Get call rooms", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-signal-rooms.mdx" }, { - "sourcePath": "/platform-api/webhooks/user/after-update-user-info-ex", - "openimPath": "/platform-api/webhooks/user/after-update-user-info-ex", + "sourcePath": "/platform-api/meeting/meeting-signaling/get-signal-invitation", + "openimPath": "/platform-api/meeting/meeting-signaling/get-signal-invitation", "context": "chat/platform-api", "template": "api", - "title": "After updating selected user fields", - "contentFile": "content/docs/chat/platform-api/webhooks/user/after-update-user-info-ex.mdx" + "title": "Get a call invitation", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-signal-invitation.mdx" }, { - "sourcePath": "/platform-api/webhooks/user/after-user-register", - "openimPath": "/platform-api/webhooks/user/after-user-register", + "sourcePath": "/platform-api/meeting/meeting-signaling/get-startup-invitation", + "openimPath": "/platform-api/meeting/meeting-signaling/get-startup-invitation", "context": "chat/platform-api", "template": "api", - "title": "After user registration", - "contentFile": "content/docs/chat/platform-api/webhooks/user/after-user-register.mdx" + "title": "Get a startup call invitation", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-startup-invitation.mdx" }, { - "sourcePath": "/platform-api/webhooks/user/before-update-user-info", - "openimPath": "/platform-api/webhooks/user/before-update-user-info", + "sourcePath": "/platform-api/meeting/meeting-chat/send-meeting-chat", + "openimPath": "/platform-api/meeting/meeting-chat/send-meeting-chat", "context": "chat/platform-api", "template": "api", - "title": "Before updating user information", - "contentFile": "content/docs/chat/platform-api/webhooks/user/before-update-user-info.mdx" + "title": "Send a meeting chat message", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-chat/send-meeting-chat.mdx" }, { - "sourcePath": "/platform-api/webhooks/user/before-update-user-info-ex", - "openimPath": "/platform-api/webhooks/user/before-update-user-info-ex", + "sourcePath": "/platform-api/meeting/meeting-chat/pull-meeting-chat", + "openimPath": "/platform-api/meeting/meeting-chat/pull-meeting-chat", "context": "chat/platform-api", "template": "api", - "title": "Before updating selected user fields", - "contentFile": "content/docs/chat/platform-api/webhooks/user/before-update-user-info-ex.mdx" + "title": "Pull meeting chat messages", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-chat/pull-meeting-chat.mdx" }, { - "sourcePath": "/platform-api/webhooks/user/before-user-register", - "openimPath": "/platform-api/webhooks/user/before-user-register", + "sourcePath": "/platform-api/meeting/meeting-chat/revoke-meeting-chat", + "openimPath": "/platform-api/meeting/meeting-chat/revoke-meeting-chat", "context": "chat/platform-api", "template": "api", - "title": "Before user registration", - "contentFile": "content/docs/chat/platform-api/webhooks/user/before-user-register.mdx" + "title": "Revoke a meeting chat message", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-chat/revoke-meeting-chat.mdx" }, { "sourcePath": "/sdk/error-codes", diff --git a/scripts/__tests__/client-sdk-sidebar.test.mjs b/scripts/__tests__/client-sdk-sidebar.test.mjs index c848b78925..9d40d1b91c 100644 --- a/scripts/__tests__/client-sdk-sidebar.test.mjs +++ b/scripts/__tests__/client-sdk-sidebar.test.mjs @@ -93,6 +93,7 @@ test('keeps relationships beside users and account settings beside user profiles ? [ '/sdk/android/user/online-status/subscribe-users-online-status', '/sdk/android/user/online-status/get-subscribe-online-users-status', + '/sdk/android/user/online-status/unsubscribe-users-online-status', ] : [ `/sdk/${platform}/user/retrieving-and-updating-user-information/subscribe-user-status`, diff --git a/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs b/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs index 8bd14b6654..0d79f9b171 100644 --- a/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs +++ b/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs @@ -95,6 +95,53 @@ test('uses each native SDK method name while preserving the shared WASM route su ); }); +test('uses Flutter-aligned titles for Android media message routes', () => { + const expectedTitles = { + 'message/creating-messages/create-image-message': 'Create an image message', + 'message/creating-messages/create-image-message-by-file': + 'Create an image message from a local path', + 'message/creating-messages/create-image-message-by-url': + 'Create an image message from URLs', + 'message/creating-messages/create-sound-message': 'Create an audio message', + 'message/creating-messages/create-sound-message-by-file': + 'Create an audio message from a local path', + 'message/creating-messages/create-sound-message-by-url': + 'Create an audio message from a URL', + 'message/creating-messages/create-video-message': 'Create a video message', + 'message/creating-messages/create-video-message-by-file': + 'Create a video message from local paths', + 'message/creating-messages/create-video-message-by-url': + 'Create a video message from URLs', + 'message/creating-messages/create-file-message': 'Create a file message', + 'message/creating-messages/create-file-message-by-file': + 'Create a file message from a local path', + 'message/creating-messages/create-file-message-by-url': + 'Create a file message from a URL', + }; + + for (const [suffix, expectedTitle] of Object.entries(expectedTitles)) { + assert.equal( + resolveClientSdkRouteTitle({ + platformId: 'android', + suffix, + baselineTitle: 'Create a message from a file', + }), + expectedTitle, + ); + } +}); + +test('uses the batch-message deletion title for Android', () => { + assert.equal( + resolveClientSdkRouteTitle({ + platformId: 'android', + suffix: 'message/managing-messages/delete-saved-messages', + baselineTitle: 'Delete messages in a batch', + }), + 'Delete messages in a batch', + ); +}); + test('supports reviewed Android extension routes outside the WASM tree', () => { const routes = readJson('src/generated/routes.json'); const sidebar = readJson('data/structure/android-sidebar.json'); diff --git a/scripts/__tests__/wasm-commercial.test.mjs b/scripts/__tests__/wasm-commercial.test.mjs index c6575d761e..70266d7356 100644 --- a/scripts/__tests__/wasm-commercial.test.mjs +++ b/scripts/__tests__/wasm-commercial.test.mjs @@ -83,7 +83,9 @@ const nonCommercialEvents = [ ]; const platformSymbolAliases = { - android: {}, + android: { + getConversationPinnedMsgs: 'getConversationPinnedMsg', + }, flutter: { getConversationGroupByConversationID: 'getConversationGroupIDsByConversationID', onHangup: 'OnHangUp', @@ -126,6 +128,11 @@ const partialCommercialConceptSources = { '/sdk/ios/calling/managing-calls/handle-call-events', '/sdk/ios/calling/retrieving-call-information/restore-pending-invitation', ], + '/sdk/android/calling/overview-calling': [ + '/sdk/android/calling/managing-calls/start-single-call', + '/sdk/android/calling/managing-calls/handle-call-events', + '/sdk/android/calling/retrieving-call-information/restore-pending-invitation', + ], }; const fullCommercialConceptPages = new Set([ @@ -422,6 +429,12 @@ test('applies the WASM commercial presentation to verified Flutter and iOS capab assert.ok(flutterPinned.methods.includes('setConversationPinnedMsg')); assert.ok(flutterPinned.events.includes('onChangedPinnedMsg')); + const androidPinned = getPageCommercialInfo( + '/sdk/android/message/managing-messages/get-pinned-messages', + ); + assert.equal(androidPinned.kind, 'full'); + assert.ok(androidPinned.methods.includes('getConversationPinnedMsgs')); + const flutterTranscription = getPageCommercialInfo( '/sdk/flutter/message/composing-messages/transcribe-audio', ); @@ -446,6 +459,11 @@ test('marks calling overviews as mixed while preserving verified platform symbol assert.ok( iosOverview.methods.includes('getSignalingInvitationInfoStartAppWithOnSuccess:onFailure:'), ); + + const androidOverview = getPageCommercialInfo('/sdk/android/calling/overview-calling'); + assert.equal(androidOverview.kind, 'partial'); + assert.ok(androidOverview.methods.includes('signalingInvite')); + assert.ok(androidOverview.methods.includes('getSignalingInvitationInfoStartApp')); }); test('does not infer commercial presentation for absent or open-source native capabilities', () => { @@ -500,6 +518,24 @@ test('classifies mixed commercial pages', () => { getPageCommercialInfo('/sdk/wasm/group/group-applications/delete-group-requests').kind, 'full', ); + + for (const pagePath of [ + '/sdk/android/message/managing-messages/delete-saved-messages', + '/sdk/android/message/retrieving-messages/load-message-context', + '/sdk/android/message/managing-read-status/send-group-read-receipts', + '/sdk/android/message/managing-read-status/get-group-message-readers', + ]) { + assert.equal(getPageCommercialInfo(pagePath).kind, 'full'); + } + + assert.equal( + getPageCommercialInfo('/sdk/android/message/managing-messages/delete-user-messages').kind, + 'none', + ); + assert.equal( + getPageCommercialInfo('/sdk/android/message/composing-messages/update-typing-status').kind, + 'none', + ); }); test('matches commercial symbols in inline code text', () => { diff --git a/scripts/__tests__/wasm-full-capability-structure.test.mjs b/scripts/__tests__/wasm-full-capability-structure.test.mjs index a62662ae69..1fc9e3bb71 100644 --- a/scripts/__tests__/wasm-full-capability-structure.test.mjs +++ b/scripts/__tests__/wasm-full-capability-structure.test.mjs @@ -663,16 +663,19 @@ test('the rendered WASM overview links only to active capability pages', () => { assert.match(source, /OpenIM WASM SDK 为浏览器应用/); }); -test('custom SDK overviews render for Chinese pages and the reviewed English WASM overview', () => { +test('custom SDK overviews render for Chinese pages and reviewed English WASM and Android overviews', () => { const source = readFileSync('src/components/docs/documentation-page.tsx', 'utf8'); + const overviewSource = readFileSync('src/components/docs/sdk-overview-page.tsx', 'utf8'); const wasmOverview = readFileSync( 'content/zh/docs/chat/sdk/wasm/overview.mdx', 'utf8', ); assert.match(source, /candidateSdkOverviewPlatform === 'wasm'/); + assert.match(source, /candidateSdkOverviewPlatform === 'android'/); assert.match(source, /'\/sdk\/flutter\/overview': 'flutter'/); assert.match(source, /'\/sdk\/ios\/overview': 'ios'/); assert.match(source, /'\/sdk\/wasm\/overview': 'wasm'/); + assert.match(overviewSource, /OpenIM Android SDK provides users, conversations, groups/); assert.equal(wasmOverview.replace(/^---\n[\s\S]*?\n---\n?/, '').trim(), ''); }); diff --git a/scripts/sync-client-sdk-route-skeletons.mjs b/scripts/sync-client-sdk-route-skeletons.mjs index a611e3ac20..6d7826555d 100644 --- a/scripts/sync-client-sdk-route-skeletons.mjs +++ b/scripts/sync-client-sdk-route-skeletons.mjs @@ -29,10 +29,35 @@ const androidRouteTitles = { 'user/blacklist/remove-blacklist': 'Unblock a user', 'user/online-status/subscribe-users-online-status': 'Subscribe to user online status', 'user/online-status/get-subscribe-online-users-status': 'Get subscribed user online status', + 'user/online-status/unsubscribe-users-online-status': 'Unsubscribe from user status', 'group/group-applications/overview-group-applications': 'Group applications overview', 'group/retrieving-group-members/overview-retrieving-group-members': 'Group member queries overview', 'message/sending-messages/set-msg-send-progress-listener': 'Track message sending progress', + 'message/managing-messages/delete-saved-messages': 'Delete messages in a batch', + 'message/creating-messages/create-image-message': 'Create an image message', + 'message/creating-messages/create-image-message-by-file': + 'Create an image message from a local path', + 'message/creating-messages/create-image-message-by-url': + 'Create an image message from URLs', + 'message/creating-messages/create-sound-message': 'Create an audio message', + 'message/creating-messages/create-sound-message-by-file': + 'Create an audio message from a local path', + 'message/creating-messages/create-sound-message-by-url': + 'Create an audio message from a URL', + 'message/creating-messages/create-video-message': 'Create a video message', + 'message/creating-messages/create-video-message-by-file': + 'Create a video message from local paths', + 'message/creating-messages/create-video-message-by-url': + 'Create a video message from URLs', + 'message/creating-messages/create-file-message': 'Create a file message', + 'message/creating-messages/create-file-message-by-file': + 'Create a file message from a local path', + 'message/creating-messages/create-file-message-by-url': + 'Create a file message from a URL', + 'message/creating-messages/create-advanced-text-message': 'Create a rich-text message', + 'message/creating-messages/create-advanced-quote-message': 'Create a rich-text reply', + 'message/composing-messages/get-typing-status': 'Retrieve typing status', 'file-uploads/track-file-upload-progress': 'Track file upload progress', }; diff --git a/src/components/docs/documentation-page.tsx b/src/components/docs/documentation-page.tsx index 1e16f03ed2..45cd87f1b8 100644 --- a/src/components/docs/documentation-page.tsx +++ b/src/components/docs/documentation-page.tsx @@ -212,7 +212,9 @@ export async function renderDocumentationPage( const candidateSdkOverviewPlatform = getSdkOverviewPlatform(effectiveRoute.path); const sdkOverviewPlatform = - locale === 'zh' || candidateSdkOverviewPlatform === 'wasm' + locale === 'zh' || + candidateSdkOverviewPlatform === 'wasm' || + candidateSdkOverviewPlatform === 'android' ? candidateSdkOverviewPlatform : undefined; diff --git a/src/components/docs/sdk-overview-page.tsx b/src/components/docs/sdk-overview-page.tsx index f51dabfc25..6649482ee1 100644 --- a/src/components/docs/sdk-overview-page.tsx +++ b/src/components/docs/sdk-overview-page.tsx @@ -357,6 +357,102 @@ const mobileCopy = { }, } satisfies Record, OverviewCopy>; +const androidEnglishCopy = { + eyebrow: 'Version 4', + intro: + 'OpenIM Android SDK provides users, conversations, groups, messages, realtime events, and local storage for native Android applications. Configure the Android project and sign in first, then connect business data to application state through manager APIs and listeners.', + mostPopular: 'Most popular', + recommended: 'Recommended features', + resources: 'Resources', + popular: [ + { + title: 'Manage conversations', + description: + 'Configure conversation state, drafts, unread counts, hiding, and deletion.', + href: '/sdk/android/conversation/overview-conversation', + visual: 'migration', + }, + { + title: 'Unread message count', + description: + 'Read conversation unread counts and synchronize chat lists, badges, and global unread state.', + href: '/sdk/android/conversation/managing-conversations/mark-conversation-read', + visual: 'unread', + }, + { + title: 'Conversation read status', + description: + 'Clear conversation unread counts and handle one-to-one message read receipts.', + href: '/sdk/android/conversation/managing-conversations/mark-conversation-read', + visual: 'receipt', + }, + { + title: 'Send messages', + description: 'Create text, file, or custom messages and send them to users or groups.', + href: '/sdk/android/message/sending-messages/send-message', + visual: 'message', + }, + { + title: 'Receive messages', + description: + 'Subscribe to new-message events and merge incremental messages into application state.', + href: '/sdk/android/message/receiving-messages/receive-messages', + visual: 'events', + }, + { + title: 'Message history', + description: + 'Retrieve local and synchronized message history with conversation identifiers and message cursors.', + href: '/sdk/android/message/retrieving-messages/load-older-messages', + visual: 'history', + }, + ], + features: [ + { + title: 'Authentication', + description: + 'Sign in with a backend-issued token and handle connection, expiration, and forced-logout events.', + href: '/sdk/android/getting-started/authenticate-and-manage-session', + }, + { + title: 'Groups', + description: + 'Manage group profiles, members, applications, permissions, and group events.', + href: '/sdk/android/group/overview-group', + }, + { + title: 'Events', + description: + 'Register listeners on each manager and merge incremental data by stable identifiers.', + href: '/sdk/android/events/overview-events', + }, + ], + links: [ + { + title: 'Send your first message', + description: 'Complete integration, initialization, sign-in, target selection, and sending.', + href: '/sdk/android/getting-started/send-first-message', + }, + { + title: 'Android integration', + description: + 'Configure the Android project, SDK initialization, network permissions, and application data directory.', + href: '/sdk/android/getting-started/environment-specific-implementation', + }, + { + title: 'Logging and diagnostics', + description: + 'Configure SDK logging and retain error codes and messages for diagnosis.', + href: '/sdk/android/logger', + }, + { + title: 'Client SDK error codes', + description: 'Look up common client errors and choose a handling path by error source.', + href: '/sdk/error-codes', + }, + ], +} satisfies OverviewCopy; + function createMobilePopularCards( platform: Exclude, ): OverviewCard[] { @@ -421,7 +517,12 @@ export function SdkOverviewPage({ route: RouteRecord; showVersion: boolean; }) { - const text = platform === 'wasm' ? copy[locale] : mobileCopy[platform]; + const text = + platform === 'wasm' + ? copy[locale] + : platform === 'android' && locale === 'en' + ? androidEnglishCopy + : mobileCopy[platform]; return (
diff --git a/src/generated/android-sdk-zh-content.json b/src/generated/android-sdk-zh-content.json index 93cc315043..e5f04071b4 100644 --- a/src/generated/android-sdk-zh-content.json +++ b/src/generated/android-sdk-zh-content.json @@ -1,8 +1,8 @@ { "sourceContext": "chat/sdk/android", "sourceRoot": "content/zh/docs/chat/sdk/android", - "pageCount": 134, - "manualPageCount": 134, + "pageCount": 146, + "manualPageCount": 146, "pendingPaths": [], "reviewStates": { "/sdk/android/overview": "published", @@ -17,6 +17,7 @@ "/sdk/android/user/user-profile/set-global-message-reception": "published", "/sdk/android/user/online-status/subscribe-users-online-status": "published", "/sdk/android/user/online-status/get-subscribe-online-users-status": "published", + "/sdk/android/user/online-status/unsubscribe-users-online-status": "published", "/sdk/android/user/friends/get-friend-list-page": "published", "/sdk/android/user/friends/search-friends": "published", "/sdk/android/user/friends/get-friends-info": "published", @@ -88,18 +89,24 @@ "/sdk/android/message/creating-messages/create-text-message": "published", "/sdk/android/message/creating-messages/create-text-at-message": "published", "/sdk/android/message/creating-messages/create-custom-message": "published", + "/sdk/android/message/creating-messages/create-image-message": "published", "/sdk/android/message/creating-messages/create-image-message-by-file": "published", "/sdk/android/message/creating-messages/create-image-message-by-url": "published", + "/sdk/android/message/creating-messages/create-sound-message": "published", "/sdk/android/message/creating-messages/create-sound-message-by-file": "published", "/sdk/android/message/creating-messages/create-sound-message-by-url": "published", + "/sdk/android/message/creating-messages/create-video-message": "published", "/sdk/android/message/creating-messages/create-video-message-by-file": "published", "/sdk/android/message/creating-messages/create-video-message-by-url": "published", + "/sdk/android/message/creating-messages/create-file-message": "published", "/sdk/android/message/creating-messages/create-file-message-by-file": "published", "/sdk/android/message/creating-messages/create-file-message-by-url": "published", "/sdk/android/message/creating-messages/create-card-message": "published", "/sdk/android/message/creating-messages/create-location-message": "published", "/sdk/android/message/creating-messages/create-face-message": "published", "/sdk/android/message/creating-messages/create-quote-message": "published", + "/sdk/android/message/creating-messages/create-advanced-text-message": "published", + "/sdk/android/message/creating-messages/create-advanced-quote-message": "published", "/sdk/android/message/creating-messages/create-forward-message": "published", "/sdk/android/message/creating-messages/create-merger-message": "published", "/sdk/android/message/sending-messages/send-message": "published", @@ -110,10 +117,13 @@ "/sdk/android/message/retrieving-messages/load-older-messages": "published", "/sdk/android/message/retrieving-messages/load-newer-messages": "published", "/sdk/android/message/retrieving-messages/find-messages-by-id": "published", + "/sdk/android/message/retrieving-messages/load-message-context": "published", "/sdk/android/message/searching-messages/search-messages": "published", "/sdk/android/message/composing-messages/update-typing-status": "published", + "/sdk/android/message/composing-messages/get-typing-status": "published", "/sdk/android/message/managing-messages/delete-local-message": "published", "/sdk/android/message/managing-messages/delete-saved-messages": "published", + "/sdk/android/message/managing-messages/delete-user-messages": "published", "/sdk/android/message/managing-messages/revoke-a-message": "published", "/sdk/android/message/managing-messages/modify-a-message": "published", "/sdk/android/message/managing-messages/get-pinned-messages": "published", @@ -123,6 +133,8 @@ "/sdk/android/message/managing-messages/clear-all-local-messages": "published", "/sdk/android/message/managing-messages/clear-all-messages": "published", "/sdk/android/message/managing-messages/set-message-local-ex": "published", + "/sdk/android/message/managing-read-status/send-group-read-receipts": "published", + "/sdk/android/message/managing-read-status/get-group-message-readers": "published", "/sdk/android/file-uploads/track-file-upload-progress": "published", "/sdk/android/file-uploads/upload-file": "published", "/sdk/android/calling/overview-calling": "published", @@ -168,7 +180,7 @@ "get-users-info": "获取指定用户资料", "Get the current user profile": "获取当前用户资料", "get-self-local-user-info": "获取当前用户资料", - "Update the current user profile": "更新当前用户资料", + "Update your profile": "更新当前用户资料", "set-self-info": "更新当前用户资料", "Set global message reception": "设置全局消息接收方式", "set-global-message-reception": "设置全局消息接收方式", @@ -230,6 +242,8 @@ "Get subscribed user online status": "查询已订阅用户状态", "Refresh subscribed user status": "查询已订阅用户状态", "get-subscribe-online-users-status": "查询已订阅用户状态", + "Unsubscribe from user status": "取消用户状态订阅", + "unsubscribe-users-online-status": "取消用户状态订阅", "Conversation": "会话", "conversation": "会话", "Conversation overview": "会话概览", @@ -286,24 +300,24 @@ "profile-and-settings": "群资料与设置", "Create a group": "创建群组", "create-group": "创建群组", - "Update group profile": "更新群资料", - "update-group-profile": "更新群资料", - "Publish a group announcement": "发布群公告", - "set-group-announcement": "发布群公告", - "Set group extra data": "设置群扩展字段", - "set-group-extension": "设置群扩展字段", - "Group permissions": "群权限", - "permissions": "群权限", + "Update group profile": "更新群名称、简介和头像", + "update-group-profile": "更新群名称、简介和头像", + "Publish a group announcement": "发布或更新群公告", + "set-group-announcement": "发布或更新群公告", + "Set group extra data": "设置群组扩展字段", + "set-group-extension": "设置群组扩展字段", + "Group permissions": "群权限与管理", + "permissions": "群权限与管理", "Set group join verification": "设置入群验证方式", "set-group-join-verification": "设置入群验证方式", "Set member profile access": "设置成员资料查看权限", "set-group-member-profile-access": "设置成员资料查看权限", - "Set member friend request permission": "设置成员好友申请权限", - "set-group-member-friend-permission": "设置成员好友申请权限", - "Change group mute status": "设置全员禁言", - "change-group-mute": "设置全员禁言", - "Joining and leaving groups": "加入与退出群组", - "joining-and-leaving": "加入与退出群组", + "Set member friend request permission": "设置群内添加好友权限", + "set-group-member-friend-permission": "设置群内添加好友权限", + "Change group mute status": "设置群组全员禁言", + "change-group-mute": "设置群组全员禁言", + "Joining and leaving groups": "加入、退出与解散群组", + "joining-and-leaving": "加入、退出与解散群组", "Apply to join a group": "申请加入群组", "join-group": "申请加入群组", "Leave a group": "退出群组", @@ -312,58 +326,58 @@ "dismiss-group": "解散群组", "Retrieving groups": "查询群组", "retrieving-groups": "查询群组", - "Get group information": "获取群资料", - "get-specified-groups-info": "获取群资料", + "Get group information": "查询指定群组资料", + "get-specified-groups-info": "查询指定群组资料", "Get joined groups by page": "分页获取已加入群组", "get-joined-group-list-page": "分页获取已加入群组", - "Check group membership": "检查是否加入群组", - "is-join-group": "检查是否加入群组", + "Check group membership": "检查是否已加入群组", + "is-join-group": "检查是否已加入群组", "Search groups": "搜索群组", "search-groups": "搜索群组", - "Group applications": "群申请", - "group-applications": "群申请", - "Group applications overview": "群申请概览", - "overview-group-applications": "群申请概览", - "Get received group applications": "获取收到的群申请", - "get-group-application-list-as-recipient": "获取收到的群申请", - "Get sent group applications": "获取发出的群申请", - "get-group-application-list-as-applicant": "获取发出的群申请", - "Accept a group application": "同意群申请", - "accept-group-application": "同意群申请", - "Reject a group application": "拒绝群申请", - "refuse-group-application": "拒绝群申请", + "Group applications": "入群申请", + "group-applications": "入群申请", + "Group applications overview": "入群申请概览", + "overview-group-applications": "入群申请概览", + "Get received group applications": "获取收到的入群申请", + "get-group-application-list-as-recipient": "获取收到的入群申请", + "Get sent group applications": "获取发出的入群申请", + "get-group-application-list-as-applicant": "获取发出的入群申请", + "Accept a group application": "接受入群申请", + "accept-group-application": "接受入群申请", + "Reject a group application": "拒绝入群申请", + "refuse-group-application": "拒绝入群申请", "Retrieving group members": "查询群成员", "retrieving-group-members": "查询群成员", "Group member queries overview": "群成员查询概览", "overview-retrieving-group-members": "群成员查询概览", - "Get group members": "获取群成员列表", - "get-group-member-list": "获取群成员列表", - "Get group member profiles": "获取群成员资料", - "get-specified-group-members-info": "获取群成员资料", - "Check users in a group": "检查用户是否在群内", - "get-users-in-group": "检查用户是否在群内", + "Get group members": "分页查询群成员", + "get-group-member-list": "分页查询群成员", + "Get group member profiles": "查询指定群成员资料", + "get-specified-group-members-info": "查询指定群成员资料", + "Check users in a group": "查询用户入群状态", + "get-users-in-group": "查询用户入群状态", "Get group owners and admins": "获取群主和管理员", "get-group-member-owner-and-admin": "获取群主和管理员", "Search group members": "搜索群成员", "search-group-members": "搜索群成员", "Managing group members": "管理群成员", "managing-group-members": "管理群成员", - "Invite users to a group": "邀请用户入群", - "invite-user-to-group": "邀请用户入群", + "Invite users to a group": "邀请用户加入群组", + "invite-user-to-group": "邀请用户加入群组", "Remove group members": "移除群成员", "kick-group-member": "移除群成员", - "Update a group nickname": "更新群昵称", - "set-group-member-nickname": "更新群昵称", - "Manage group administrators": "管理群管理员", - "set-group-member-role-level": "管理群管理员", + "Update a group nickname": "修改群内昵称", + "set-group-member-nickname": "修改群内昵称", + "Manage group administrators": "设置管理员", + "set-group-member-role-level": "设置管理员", "Update a group member avatar": "更新群成员头像", "set-group-member-avatar": "更新群成员头像", "Set group member extra data": "设置群成员扩展字段", "set-group-member-extension": "设置群成员扩展字段", "Transfer group ownership": "转让群主", "transfer-group-owner": "转让群主", - "Mute or unmute a group member": "禁言或解除禁言群成员", - "change-group-member-mute": "禁言或解除禁言群成员", + "Mute or unmute a group member": "设置群成员禁言", + "change-group-member-mute": "设置群成员禁言", "Message": "消息", "message": "消息", "Message overview": "消息概览", @@ -376,30 +390,47 @@ "create-text-at-message": "创建 @ 消息", "Create a custom message": "创建自定义消息", "create-custom-message": "创建自定义消息", - "Create an image message from a file": "从文件创建图片消息", - "create-image-message-by-file": "从文件创建图片消息", - "Create an image message from a URL": "从 URL 创建图片消息", - "create-image-message-by-url": "从 URL 创建图片消息", - "Create an audio message from a file": "从文件创建音频消息", - "create-sound-message-by-file": "从文件创建音频消息", - "Create an audio message from a URL": "从 URL 创建音频消息", - "create-sound-message-by-url": "从 URL 创建音频消息", - "Create a video message from a file": "从文件创建视频消息", - "create-video-message-by-file": "从文件创建视频消息", - "Create a video message from a URL": "从 URL 创建视频消息", - "create-video-message-by-url": "从 URL 创建视频消息", - "Create a file message from a file": "从文件创建文件消息", - "create-file-message-by-file": "从文件创建文件消息", - "Create a file message from a URL": "从 URL 创建文件消息", - "create-file-message-by-url": "从 URL 创建文件消息", + "Create an image message": "创建图片消息", + "create-image-message": "创建图片消息", + "Create an image message from a file": "使用本地路径创建图片消息", + "Create an image message from a path": "使用本地路径创建图片消息", + "create-image-message-by-file": "使用本地路径创建图片消息", + "Create an image message from a URL": "使用 URL 创建图片消息", + "Create an image message from URLs": "使用 URL 创建图片消息", + "create-image-message-by-url": "使用 URL 创建图片消息", + "Create an audio message": "创建音频消息", + "create-sound-message": "创建音频消息", + "Create an audio message from a file": "使用本地路径创建音频消息", + "Create an audio message from a path": "使用本地路径创建音频消息", + "create-sound-message-by-file": "使用本地路径创建音频消息", + "Create an audio message from a URL": "使用 URL 创建音频消息", + "create-sound-message-by-url": "使用 URL 创建音频消息", + "Create a video message": "创建视频消息", + "create-video-message": "创建视频消息", + "Create a video message from a file": "使用本地路径创建视频消息", + "Create a video message from a path": "使用本地路径创建视频消息", + "create-video-message-by-file": "使用本地路径创建视频消息", + "Create a video message from a URL": "使用 URL 创建视频消息", + "create-video-message-by-url": "使用 URL 创建视频消息", + "Create a file message": "创建文件消息", + "create-file-message": "创建文件消息", + "Create a file message from a file": "使用本地路径创建文件消息", + "Create a file message from a path": "使用本地路径创建文件消息", + "create-file-message-by-file": "使用本地路径创建文件消息", + "Create a file message from a URL": "使用 URL 创建文件消息", + "create-file-message-by-url": "使用 URL 创建文件消息", "Create a contact card message": "创建名片消息", "create-card-message": "创建名片消息", "Create a location message": "创建位置消息", "create-location-message": "创建位置消息", "Create an emoji message": "创建表情消息", "create-face-message": "创建表情消息", - "Create a reply message": "创建引用消息", - "create-quote-message": "创建引用消息", + "Create a reply message": "创建回复消息", + "create-quote-message": "创建回复消息", + "Create rich text": "创建富文本消息", + "create-advanced-text-message": "创建富文本消息", + "Create a rich reply": "创建富文本回复", + "create-advanced-quote-message": "创建富文本回复", "Create a forwarded message": "创建转发消息", "create-forward-message": "创建转发消息", "Create a merged message": "创建合并消息", @@ -408,10 +439,10 @@ "sending-messages": "发送消息", "Send a message": "发送消息", "send-message": "发送消息", - "Send a message without OSS": "发送非 OSS 消息", - "send-message-not-oss": "发送非 OSS 消息", - "Track message sending progress": "跟踪消息发送进度", - "set-msg-send-progress-listener": "跟踪消息发送进度", + "Send a message without OSS": "发送不经 OSS 的消息", + "send-message-not-oss": "发送不经 OSS 的消息", + "Track message sending progress": "监听消息发送进度", + "set-msg-send-progress-listener": "监听消息发送进度", "Receiving messages": "接收消息", "receiving-messages": "接收消息", "Receive messages": "接收消息", @@ -420,59 +451,76 @@ "receive-custom-business-messages": "接收自定义业务消息", "Retrieving messages": "查询消息", "retrieving-messages": "查询消息", - "Load older messages": "加载更早消息", - "load-older-messages": "加载更早消息", - "Load newer messages": "加载更新消息", - "load-newer-messages": "加载更新消息", - "Find messages by ID": "按 ID 查询消息", - "find-messages-by-id": "按 ID 查询消息", + "Load older messages": "加载历史消息", + "load-older-messages": "加载历史消息", + "Load newer messages": "反向加载历史消息", + "load-newer-messages": "反向加载历史消息", + "Find messages by ID": "按 ID 查找消息", + "find-messages-by-id": "按 ID 查找消息", + "Load message context": "读取消息上下文", + "load-message-context": "读取消息上下文", "Search messages": "搜索消息", "search-messages": "搜索消息", "Composing messages": "编辑消息", "composing-messages": "编辑消息", - "Update typing status": "更新输入状态", - "update-typing-status": "更新输入状态", + "Update typing status": "上报输入状态", + "update-typing-status": "上报输入状态", + "Get typing status": "查询输入状态", + "get-typing-status": "查询输入状态", "Managing messages": "管理消息", "managing-messages": "管理消息", "Delete a local message": "删除本地消息", "delete-local-message": "删除本地消息", - "Delete saved messages": "删除已保存消息", - "delete-saved-messages": "删除已保存消息", + "Delete a message": "批量删除消息", + "Delete a saved message": "批量删除消息", + "Delete saved messages": "批量删除消息", + "Delete messages in a batch": "批量删除消息", + "delete-saved-messages": "批量删除消息", + "Delete messages from a user": "删除群聊中指定用户的全部消息", + "Delete all messages from a user in a group chat": "删除群聊中指定用户的全部消息", + "delete-user-messages": "删除群聊中指定用户的全部消息", "Revoke a message": "撤回消息", "revoke-a-message": "撤回消息", "Modify a message": "修改消息", "modify-a-message": "修改消息", - "View pinned messages": "查看置顶消息", - "get-pinned-messages": "查看置顶消息", + "View pinned messages": "查询会话置顶消息", + "get-pinned-messages": "查询会话置顶消息", "Pin or unpin a message": "置顶或取消置顶消息", "set-message-pinned": "置顶或取消置顶消息", "Insert a local direct message": "插入本地单聊消息", "insert-local-single-message": "插入本地单聊消息", "Insert a local group message": "插入本地群聊消息", "insert-local-group-message": "插入本地群聊消息", - "Clear all local messages": "清空全部本地消息", - "clear-all-local-messages": "清空全部本地消息", - "Clear all saved messages": "清空全部已保存消息", - "clear-all-messages": "清空全部已保存消息", - "Set local message extensions": "设置消息本地扩展字段", - "set-message-local-ex": "设置消息本地扩展字段", + "Clear all local messages": "清理全部本地消息", + "clear-all-local-messages": "清理全部本地消息", + "Clear all saved messages": "清理全部消息", + "clear-all-messages": "清理全部消息", + "Set local message extensions": "设置消息本地扩展", + "set-message-local-ex": "设置消息本地扩展", + "Group message read status": "群消息已读状态", + "group-message-read-status": "群消息已读状态", + "Send group read receipts": "上报群消息已读", + "Report group messages as read": "上报群消息已读", + "send-group-read-receipts": "上报群消息已读", + "View group message readers": "查询群消息已读成员", + "Get members who read a group message": "查询群消息已读成员", + "get-group-message-readers": "查询群消息已读成员", "Create an @ message": "创建 @ 消息", - "Create a video message from files": "从文件创建视频消息", - "Create a video message from URLs": "从 URL 创建视频消息", + "Create a video message from files": "使用本地路径创建视频消息", + "Create a video message from URLs": "使用 URL 创建视频消息", "Create a merged forward message": "创建合并转发消息", - "Send an uploaded media message": "发送已上传媒体消息", + "Send an uploaded media message": "发送不经 OSS 的消息", "Load message history": "加载历史消息", - "Load message history in reverse": "逆序加载历史消息", + "Load message history in reverse": "反向加载历史消息", "Report typing status": "上报输入状态", - "Delete messages in a batch": "批量删除消息", - "Get pinned messages in a conversation": "获取会话置顶消息", + "Get pinned messages in a conversation": "查询会话置顶消息", "Insert a local one-to-one message": "插入本地单聊消息", - "Clear local and server messages": "清空本地和服务端消息", - "Set a local message extension": "设置消息本地扩展字段", + "Clear local and server messages": "清理全部消息", + "Set a local message extension": "设置消息本地扩展", "File uploads": "文件上传", "file-uploads": "文件上传", - "Track file upload progress": "跟踪文件上传进度", - "track-file-upload-progress": "跟踪文件上传进度", + "Track file upload progress": "监听文件上传进度", + "track-file-upload-progress": "监听文件上传进度", "Upload a file": "上传文件", "upload-file": "上传文件", "Calling": "音视频通话", @@ -673,7 +721,7 @@ "title": "发送第一条消息" }, "/sdk/android/user/overview-user": { - "body": "OpenIM Android SDK 使用 `userID` 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。\n\n群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。\n\n## 用户类型\n\nAndroid SDK 会根据使用场景返回不同的用户对象:\n\n| 类型 | 适用场景 | 主要 API |\n| ----------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------- |\n| `LocalUser` | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | `getSelfLocalUserInfo()`、`setSelfInfo()` |\n| `PublicUserInfo` | 查询应用用户、查找好友候选人和展示陌生人资料卡 | `getUsersInfo()` |\n| `UserInfo` | Android wrapper 返回的组合对象,可承载公开资料、好友资料或黑名单资料 | `getFriendListPage()`、`getFriendsInfo()`、`getBlacklist()` |\n| `FriendInfo` | 当前用户的好友列表、好友备注和关系扩展字段 | `searchFriends()`、`getFriendListPage()` |\n| `FriendApplicationInfo` | 好友申请双方、处理状态和附言 | 好友申请查询与 listener |\n| `BlacklistInfo` | 当前用户拉黑的用户及黑名单关系字段 | `getBlacklist()`、`addBlacklist()`、`removeBlacklist()` |\n| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()` |\n\n同一个 `userID` 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 `UserInfo.getFriendInfo()`;只需要账号公开资料时使用 `PublicUserInfo`;黑名单页面使用 `UserInfo.getBlackInfo()`。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。\n\n所有列表和事件都应使用 `userID` 作为稳定标识。好友申请同时包含申请方和接收方,应使用 `fromUserID:toUserID` 标识一条申请。\n\n## 功能入口\n\n下表列出了用户相关的常见需求和对应页面:\n\n| 需求 | 推荐页面 |\n| -------------------------------------------------------- | -------------------------------------------------------------------------------------------- |\n| 按 `userID` 查询公开资料,用于查找好友候选人或展示资料卡 | [获取指定用户资料](/sdk/android/user/user-profile/get-users-info) |\n| 分页、搜索或按 ID 查询好友关系 | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) |\n| 发送、查询、接受或拒绝好友申请 | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) |\n| 修改好友资料 | [更新好友资料](/sdk/android/user/friends/update-friends) |\n| 删除好友关系 | [删除好友](/sdk/android/user/friends/delete-friend) |\n| 查看和维护当前用户黑名单 | [获取黑名单列表](/sdk/android/user/blacklist/get-blacklist) |\n| 读取或更新当前用户的昵称、头像和扩展资料 | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) |\n| 设置账号级消息接收和通知策略 | [设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception) |\n| 订阅和读取在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) |\n\n## 状态更新\n\n用户相关事件由对应能力页负责监听和合并:\n\n- 当前用户资料变化:见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。\n- 好友申请变化:见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。\n- 好友关系和好友资料变化:见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。\n- 黑名单变化:见[拉黑用户](/sdk/android/user/blacklist/add-blacklist)。\n- 在线状态变化:见[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。\n\nAndroid SDK 的 `UserInfoManager` 和 `FriendshipManager` 各保存一个 listener,`setOnUserListener()` 和 `setOnFriendshipListener()` 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。", + "body": "OpenIM Android SDK 使用 `userID` 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。\n\n群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。\n\n## 用户类型\n\nAndroid SDK 会根据使用场景返回不同的用户对象:\n\n| 类型 | 适用场景 | 主要 API |\n| ----------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------- |\n| `LocalUser` | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | `getSelfLocalUserInfo()`、`setSelfInfo()` |\n| `PublicUserInfo` | 查询应用用户、查找好友候选人和展示陌生人资料卡 | `getUsersInfo()` |\n| `UserInfo` | Android wrapper 返回的组合对象,可承载公开资料、好友资料或黑名单资料 | `getFriendListPage()`、`getFriendsInfo()`、`getBlacklist()` |\n| `FriendInfo` | 当前用户的好友列表、好友备注和关系扩展字段 | `searchFriends()`、`getFriendListPage()` |\n| `FriendApplicationInfo` | 好友申请双方、处理状态和附言 | 好友申请查询与 listener |\n| `BlacklistInfo` | 当前用户拉黑的用户及黑名单关系字段 | `getBlacklist()`、`addBlacklist()`、`removeBlacklist()` |\n| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()`、`unsubscribeOnlineUsersStatus()` |\n\n同一个 `userID` 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 `UserInfo.getFriendInfo()`;只需要账号公开资料时使用 `PublicUserInfo`;黑名单页面使用 `UserInfo.getBlackInfo()`。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。\n\n所有列表和事件都应使用 `userID` 作为稳定标识。好友申请同时包含申请方和接收方,应使用 `fromUserID:toUserID` 标识一条申请。\n\n## 功能入口\n\n下表列出了用户相关的常见需求和对应页面:\n\n| 需求 | 推荐页面 |\n| -------------------------------------------------------- | -------------------------------------------------------------------------------------------- |\n| 按 `userID` 查询公开资料,用于查找好友候选人或展示资料卡 | [获取指定用户资料](/sdk/android/user/user-profile/get-users-info) |\n| 分页、搜索或按 ID 查询好友关系 | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) |\n| 发送、查询、接受或拒绝好友申请 | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) |\n| 修改好友资料 | [更新好友资料](/sdk/android/user/friends/update-friends) |\n| 删除好友关系 | [删除好友](/sdk/android/user/friends/delete-friend) |\n| 查看和维护当前用户黑名单 | [获取黑名单列表](/sdk/android/user/blacklist/get-blacklist) |\n| 读取或更新当前用户的昵称、头像和扩展资料 | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) |\n| 设置账号级消息接收和通知策略 | [设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception) |\n| 订阅、读取和取消在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)、[取消用户状态订阅](/sdk/android/user/online-status/unsubscribe-users-online-status) |\n\n## 状态更新\n\n用户相关事件由对应能力页负责监听和合并:\n\n- 当前用户资料变化:见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。\n- 好友申请变化:见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。\n- 好友关系和好友资料变化:见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。\n- 黑名单变化:见[拉黑用户](/sdk/android/user/blacklist/add-blacklist)。\n- 在线状态变化:见[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。\n\nAndroid SDK 的 `UserInfoManager` 和 `FriendshipManager` 各保存一个 listener,`setOnUserListener()` 和 `setOnFriendshipListener()` 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。", "description": "了解 Android SDK 中的用户资料、好友关系、好友申请、黑名单和在线状态 API。", "headings": [ { @@ -747,7 +795,7 @@ "title": "设置全局消息接收方式" }, "/sdk/android/user/online-status/subscribe-users-online-status": { - "body": "```java\nList userIDs = Arrays.asList(\"user_a\", \"user_b\");\n\nOpenIMClient.getInstance().userInfoManager.subscribeUsersOnlineStatus(\n new OnBase>() {\n @Override\n public void onSuccess(List states) {\n mergeOnlineStates(states);\n }\n\n @Override\n public void onError(int code, String error) {\n recordStatusSubscriptionFailure(code, error);\n }\n },\n userIDs\n);\n```\n\n调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 `List` 快照,每项包含 `userID`、`status` 和 `platformIDs`。重复订阅同一个用户时,应由应用层去重并保留一份状态。\n\n## 状态字段\n\n| 字段 | 说明 |\n| ------------- | ------------------------------------------ |\n| `userID` | 目标用户 ID。 |\n| `status` | 在线状态值,具体枚举含义以服务端契约为准。 |\n| `platformIDs` | 当前在线的平台 ID 列表。 |\n\n`onUserStatusChanged` 由本页归属,应组合进应用唯一的 `OnUserListener`,并按 `userID` 合并:\n\n```java\n@Override\npublic void onUserStatusChanged(UsersOnlineStatus status) {\n onlineStatusStore.put(status.getUserID(), status);\n}\n```\n\n订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合;Android API 未提供可验证的取消订阅入口,因此不在文档中记录取消订阅调用。", + "body": "```java\nList userIDs = Arrays.asList(\"user_a\", \"user_b\");\n\nOpenIMClient.getInstance().userInfoManager.subscribeUsersOnlineStatus(\n new OnBase>() {\n @Override\n public void onSuccess(List states) {\n mergeOnlineStates(states);\n }\n\n @Override\n public void onError(int code, String error) {\n recordStatusSubscriptionFailure(code, error);\n }\n },\n userIDs\n);\n```\n\n调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 `List` 快照,每项包含 `userID`、`status` 和 `platformIDs`。重复订阅同一个用户时,应由应用层去重并保留一份状态。\n\n## 状态字段\n\n| 字段 | 说明 |\n| ------------- | ------------------------------------------ |\n| `userID` | 目标用户 ID。 |\n| `status` | 在线状态值,具体枚举含义以服务端契约为准。 |\n| `platformIDs` | 当前在线的平台 ID 列表。 |\n\n`onUserStatusChanged` 由本页归属,应组合进应用唯一的 `OnUserListener`,并按 `userID` 合并:\n\n```java\n@Override\npublic void onUserStatusChanged(UsersOnlineStatus status) {\n onlineStatusStore.put(status.getUserID(), status);\n}\n```\n\n订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合,并通过[取消用户状态订阅](/sdk/android/user/online-status/unsubscribe-users-online-status)移除不再需要的用户。", "description": "使用 subscribeUsersOnlineStatus() 订阅指定用户的在线状态。", "headings": [ { @@ -766,6 +814,13 @@ "sourcePath": "/sdk/android/user/online-status/get-subscribe-online-users-status", "title": "查询已订阅用户状态" }, + "/sdk/android/user/online-status/unsubscribe-users-online-status": { + "body": "用户离开可见范围、页面结束或切换账号时,取消不再需要的在线状态订阅。调用前应去除空值和重复 ID。\n\n```java\nList userIDs = Arrays.asList(\"user_a\", \"user_b\");\n\nOpenIMClient.getInstance().userInfoManager.unsubscribeOnlineUsersStatus(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n for (String userID : userIDs) {\n presenceByUserID.remove(userID);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordStatusUnsubscribeFailure(code, error);\n }\n },\n userIDs\n);\n```\n\n成功 callback 表示取消订阅请求已完成。此后再从应用维护的订阅集合和在线状态缓存中移除这些 `userID`;失败时保留原状态,以便重试。该操作不会修改用户资料或好友关系。\n\n需要再次跟踪用户状态时,重新调用[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。", + "description": "使用 unsubscribeOnlineUsersStatus 取消指定用户的在线状态订阅。", + "headings": [], + "sourcePath": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "title": "取消用户状态订阅" + }, "/sdk/android/user/friends/get-friend-list-page": { "body": "```java\nOpenIMClient.getInstance().friendshipManager.getFriendListPage(\n new OnBase>() {\n @Override\n public void onSuccess(List friends) {\n for (UserInfo friend : friends) {\n friendStore.put(friend.getUserID(), friend);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendListFailure(code, error);\n }\n },\n 0,\n 40,\n true\n);\n```\n\n参数依次为 `offset`、`count` 和 `filterBlack`。`offset` 从 `0` 开始,`count` 是页大小,`filterBlack` 为 `true` 时过滤黑名单用户。成功 callback 返回当前页 `List`,好友关系详情可通过 `getFriendInfo()` 读取。继续加载下一页时按实际请求数量增加 `offset`;返回数量小于 `count` 时通常表示到达末页。\n\n只使用分页 API,不使用非分页的 `getFriendList()`。快照和增量都应按 `userID` 合并。\n\n## 好友资料字段\n\n`UserInfo` 是 Android wrapper 的组合对象。好友列表中的 `getFriendInfo()` 返回 `FriendInfo`,常用字段如下:\n\n| 字段 | 说明 |\n| ---------------- | ------------------------------------- |\n| `userID` | 好友用户 ID,也是好友列表的稳定标识。 |\n| `nickname` | 好友账号昵称。 |\n| `faceURL` | 好友账号头像地址。 |\n| `remark` | 当前账号设置的好友备注。 |\n| `ex` | 好友关系扩展字符串。 |\n| `addSource` | 好友关系添加来源。 |\n| `operatorUserID` | 建立或更新关系的操作用户 ID。 |\n| `createTime` | 好友关系创建时间。 |\n\n`nickname` 和 `faceURL` 是账号资料,`remark` 和 `ex` 属于好友关系。`UpdateFriendsReq` 支持提交 `isPinned`,但当前 Android `FriendInfo` 模型不提供对应读取字段,置顶状态应由业务层单独维护。不要用好友对象覆盖陌生人的 `PublicUserInfo`,也不要把好友备注写回账号昵称。\n\n本页归属好友新增、资料变化和删除事件。以下 callback 应组合进应用唯一的 `OnFriendshipListener`:\n\n```java\n@Override\npublic void onFriendAdded(FriendInfo friend) {\n friendStore.put(friend.getUserID(), friend);\n}\n\n@Override\npublic void onFriendInfoChanged(FriendInfo friend) {\n friendStore.put(friend.getUserID(), friend);\n}\n\n@Override\npublic void onFriendDeleted(FriendInfo friend) {\n friendStore.remove(friend.getUserID());\n}\n```", "description": "使用 getFriendListPage() 分页获取当前用户的好友列表。", @@ -1064,21 +1119,21 @@ "description": "使用 setGroupInfo 更新群名称、头像、简介和其他群资料字段。", "headings": [], "sourcePath": "/sdk/android/group/update-group-profile", - "title": "更新群资料" + "title": "更新群名称、简介和头像" }, "/sdk/android/group/set-group-announcement": { "body": "Android SDK 没有独立的公告方法。构造包含 `groupID` 与 `notification` 的 `GroupInfo`,再调用 `setGroupInfo()`。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setNotification(\"今晚 20:00 进行版本发布确认。\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { refreshAnnouncement(groupID); }\n @Override public void onError(int code, String error) { showAnnouncementError(error); }\n});\n```\n\n公告的更新时间和更新人由返回的 `GroupInfo` 中 `notificationUpdateTime`、`notificationUserID` 表示。权限由服务端校验。", "description": "通过 GroupInfo.notification 发布或更新群公告。", "headings": [], "sourcePath": "/sdk/android/group/set-group-announcement", - "title": "发布群公告" + "title": "发布或更新群公告" }, "/sdk/android/group/set-group-extension": { "body": "`GroupInfo.ex` 是完整字符串,SDK 不会合并 JSON。多个业务模块共用该字段时,应由应用读取旧值、合并自己的命名空间后再提交。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setEx(\"{\\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false}\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markExtensionSubmitted(groupID); }\n @Override public void onError(int code, String error) { showExtensionError(error); }\n});\n```\n\n不要将访问令牌、密钥或仅适合本机的 UI 状态写入群扩展字段。", "description": "通过 GroupInfo.ex 保存应用定义的群组扩展数据。", "headings": [], "sourcePath": "/sdk/android/group/set-group-extension", - "title": "设置群扩展字段" + "title": "设置群组扩展字段" }, "/sdk/android/group/set-group-join-verification": { "body": "入群验证写入 `GroupInfo.needVerification`,再调用 `setGroupInfo()`。可使用 `GroupVerification` 常量:`APPLY_NEED_VERIFICATION_INVITE_DIRECTLY`、`ALL_NEED_VERIFICATION` 和 `DIRECTLY`。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setNeedVerification(GroupVerification.ALL_NEED_VERIFICATION);\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markVerificationSubmitted(groupID); }\n @Override public void onError(int code, String error) { showVerificationError(error); }\n});\n```\n\n该设置影响后续入群请求,不替代对已存在申请的同意或拒绝处理。", @@ -1099,14 +1154,14 @@ "description": "通过 GroupInfo.applyMemberFriend 设置是否允许从群成员发起好友申请。", "headings": [], "sourcePath": "/sdk/android/group/set-group-member-friend-permission", - "title": "设置成员好友申请权限" + "title": "设置群内添加好友权限" }, "/sdk/android/group/change-group-mute": { "body": "使用 `changeGroupMute()` 切换全员禁言。`true` 开启,`false` 关闭;成员级禁言见“禁言或解除禁言群成员”。\n\n```java\nOpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() {\n @Override public void onSuccess(String data) { markGroupMuteSubmitted(groupID, true); }\n @Override public void onError(int code, String error) { showGroupMuteError(error); }\n}, groupID, true);\n```\n\n群主和管理员的实际发言权限以及服务端权限校验以部署策略为准。", "description": "使用 changeGroupMute 开启或关闭群组全员禁言。", "headings": [], "sourcePath": "/sdk/android/group/change-group-mute", - "title": "设置全员禁言" + "title": "设置群组全员禁言" }, "/sdk/android/group/join-group": { "body": "使用 `joinGroup()` 提交入群请求。`joinSource` 使用群组来源值,例如邀请、搜索或二维码;带扩展数据时使用五参数重载。\n\n```java\nOpenIMClient.getInstance().groupManager.joinGroup(new OnBase() {\n @Override public void onSuccess(String data) { markJoinSubmitted(groupID); }\n @Override public void onError(int code, String error) { showJoinError(error); }\n}, groupID, \"希望加入项目讨论\", 3, \"{\\\"from\\\":\\\"search\\\"}\");\n```\n\n验证方式决定请求是否立即加入。后续通过 `onJoinedGroupAdded` 或群申请事件更新本地状态。", @@ -1134,7 +1189,7 @@ "description": "使用 getGroupsInfo 批量查询指定群组的最新资料。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", - "title": "获取群资料" + "title": "查询指定群组资料" }, "/sdk/android/group/retrieving-groups/get-joined-group-list-page": { "body": "Android SDK 仅提供分页版本。`offset` 从 `0` 开始,后续页按已经成功合并的条目数推进;返回为空时停止加载。\n\n```java\nOpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() {\n @Override public void onSuccess(List groups) { appendJoinedGroups(groups); }\n @Override public void onError(int code, String error) { showPageError(error); }\n}, offset, 20);\n```\n\n使用 `onJoinedGroupAdded` 与 `onJoinedGroupDeleted` 合并增量,不要仅依赖已加载分页作为完整群列表。", @@ -1148,7 +1203,7 @@ "description": "使用 isJoinGroup 查询当前登录用户是否已经加入指定群组。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", - "title": "检查是否加入群组" + "title": "检查是否已加入群组" }, "/sdk/android/group/retrieving-groups/search-groups": { "body": "`searchGroups()` 接收关键词列表,并分别指定是否搜索群 ID、群名称。两个开关都关闭时没有有效搜索范围。\n\n```java\nOpenIMClient.getInstance().groupManager.searchGroups(new OnBase>() {\n @Override public void onSuccess(List groups) { showSearchResults(groups); }\n @Override public void onError(int code, String error) { showSearchError(error); }\n}, Collections.singletonList(keyword), true, true);\n```\n\n搜索结果不是成员资格证明。进入群组前可使用“检查是否加入群组”确认当前状态。", @@ -1162,35 +1217,35 @@ "description": "说明 Android SDK 中收到和发出的群申请、处理结果及状态事件。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/overview-group-applications", - "title": "群申请概览" + "title": "入群申请概览" }, "/sdk/android/group/group-applications/get-group-application-list-as-recipient": { "body": "使用非废弃重载并传入 `GetGroupApplicationListAsRecipientReq`。可设置 `offset`、`count`、`groupIDs` 和 `handleResults` 筛选条件。\n\n```java\nGetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq(0, 20);\nOpenIMClient.getInstance().groupManager.getRecvGroupApplicationList(\n new OnBase>() {\n @Override public void onSuccess(List items) { mergeReceivedApplications(items); }\n @Override public void onError(int code, String error) { showApplicationError(error); }\n }, request);\n```\n\n收到事件后按申请中的 `groupID` 和 `userID` 合并,不要把列表下标作为申请标识。", "description": "使用 getRecvGroupApplicationList 分页读取当前用户可处理的入群申请。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", - "title": "获取收到的群申请" + "title": "获取收到的入群申请" }, "/sdk/android/group/group-applications/get-group-application-list-as-applicant": { "body": "使用 `GetGroupApplicationListAsApplicantReq` 设置分页和筛选条件,再调用 `getSendGroupApplicationList()`。\n\n```java\nGetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq(0, 20);\nOpenIMClient.getInstance().groupManager.getSendGroupApplicationList(\n new OnBase>() {\n @Override public void onSuccess(List items) { mergeSentApplications(items); }\n @Override public void onError(int code, String error) { showApplicationError(error); }\n }, request);\n```\n\n申请被同意后,群列表变化以 `onJoinedGroupAdded` 为准。", "description": "使用 getSendGroupApplicationList 分页读取当前用户发出的入群申请。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", - "title": "获取发出的群申请" + "title": "获取发出的入群申请" }, "/sdk/android/group/group-applications/accept-group-application": { "body": "调用时同时传入申请的 `groupID`、申请人 `userID` 和处理说明。服务端负责校验当前用户是否有审批权限。\n\n```java\nOpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() {\n @Override public void onSuccess(String data) { markApplicationHandled(groupID, applicantUserID); }\n @Override public void onError(int code, String error) { showHandleError(error); }\n}, groupID, applicantUserID, \"欢迎加入\");\n```\n\n同意后通过群申请事件与 `onGroupMemberAdded` 更新申请列表和成员列表。", "description": "使用 acceptGroupApplication 同意指定用户的入群申请。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/accept-group-application", - "title": "同意群申请" + "title": "接受入群申请" }, "/sdk/android/group/group-applications/refuse-group-application": { "body": "拒绝操作同样使用申请所属 `groupID`、申请人 `userID` 和处理说明。\n\n```java\nOpenIMClient.getInstance().groupManager.refuseGroupApplication(new OnBase() {\n @Override public void onSuccess(String data) { markApplicationRejected(groupID, applicantUserID); }\n @Override public void onError(int code, String error) { showHandleError(error); }\n}, groupID, applicantUserID, \"当前群组人数已满\");\n```\n\n成功 callback 后不要直接删除本地申请记录;以 `onGroupApplicationRejected` 或重新查询结果更新。", "description": "使用 refuseGroupApplication 拒绝指定用户的入群申请。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", - "title": "拒绝群申请" + "title": "拒绝入群申请" }, "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members": { "body": "成员查询使用 `groupID` 限定范围,结果为 `GroupMembersInfo` 或用户 ID 列表。成员列表提供角色过滤和 offset 分页;指定成员资料、在群检查、群主管理员和关键词搜索各有独立接口。\n\n成员增删和资料变化由[群组概览](/sdk/android/group/overview-group)归属的 `OnGroupListener` 统一合并。查询只建立快照,不能替代事件处理。", @@ -1204,21 +1259,21 @@ "description": "使用 getGroupMemberList 按角色和分页条件读取群成员。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", - "title": "获取群成员列表" + "title": "分页查询群成员" }, "/sdk/android/group/retrieving-group-members/get-specified-group-members-info": { "body": "`getGroupMembersInfo()` 接收一个 `groupID` 和目标用户 ID 列表,返回这些用户在群内的 `GroupMembersInfo`。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMembersInfo(\n new OnBase>() {\n @Override public void onSuccess(List members) { mergeMembers(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID, userIDs);\n```\n\n返回空列表可能表示目标未在群内或无读取权限,应按业务需求处理。", "description": "使用 getGroupMembersInfo 批量读取指定成员在群内的资料。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", - "title": "获取群成员资料" + "title": "查询指定群成员资料" }, "/sdk/android/group/retrieving-group-members/get-users-in-group": { "body": "`getUsersInGroup()` 返回传入用户中已在指定群内的 ID 列表,不返回成员资料。\n\n```java\nOpenIMClient.getInstance().groupManager.getUsersInGroup(new OnBase>() {\n @Override public void onSuccess(List joinedUserIDs) { updateMembership(joinedUserIDs); }\n @Override public void onError(int code, String error) { showMembershipError(error); }\n}, groupID, candidateUserIDs);\n```\n\n需要昵称、角色或禁言状态时,再调用“获取群成员资料”。", "description": "使用 getUsersInGroup 从候选用户中筛出当前在群内的用户 ID。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", - "title": "检查用户是否在群内" + "title": "查询用户入群状态" }, "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin": { "body": "使用 `getGroupMemberOwnerAndAdmin()` 获取需要展示或校验管理身份的成员记录。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMemberOwnerAndAdmin(\n new OnBase>() {\n @Override public void onSuccess(List members) { showModerators(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID);\n```\n\n`roleLevel` 的群主、管理员和普通成员常量见 `GroupRole`;实际操作权限仍由服务端决定。", @@ -1239,7 +1294,7 @@ "description": "使用 inviteUserToGroup 邀请一组用户加入指定群组。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", - "title": "邀请用户入群" + "title": "邀请用户加入群组" }, "/sdk/android/group/managing-group-members/kick-group-member": { "body": "`kickGroupMember()` 接收成员 ID 列表和移除说明。产品层应先防止当前用户误移除自身,并遵守群主、管理员权限边界。\n\n```java\nOpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() {\n @Override public void onSuccess(String data) { markRemovalSubmitted(groupID); }\n @Override public void onError(int code, String error) { showRemovalError(error); }\n}, groupID, memberUserIDs, \"已不再参与该项目\");\n```\n\n收到 `onGroupMemberDeleted` 后再从成员缓存中移除目标成员。", @@ -1253,14 +1308,14 @@ "description": "使用 SetGroupMemberInfo.nickname 更新成员在指定群中的显示昵称。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", - "title": "更新群昵称" + "title": "修改群内昵称" }, "/sdk/android/group/managing-group-members/set-group-member-role-level": { "body": "`roleLevel` 使用 `GroupRole` 常量:`OWNER`、`ADMIN` 和 `MEMBER`。群主转让使用独立接口,不应通过本接口推测转让流程。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setRoleLevel(GroupRole.ADMIN);\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markRoleSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showRoleError(error); }\n});\n```\n\n实际角色变更和权限由服务端校验,以成员资料变化事件为准。", "description": "使用 SetGroupMemberInfo.roleLevel 设置成员的群内角色。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", - "title": "管理群管理员" + "title": "设置管理员" }, "/sdk/android/group/managing-group-members/set-group-member-avatar": { "body": "群成员头像是群内资料字段,不修改用户全局头像。传入已可访问的头像 URL。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setFaceURL(avatarURL);\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markAvatarSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberUpdateError(error); }\n});\n```\n\n事件到达前保留原头像或使用本地乐观状态,并按最新成员资料校准。", @@ -1288,7 +1343,7 @@ "description": "使用 changeGroupMemberMute 设置指定成员的禁言时长。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", - "title": "禁言或解除禁言群成员" + "title": "设置群成员禁言" }, "/sdk/android/message/overview-message": { "body": "Android 消息以 `Message` 表示,使用 `clientMsgID` 去重,使用 `sessionType`、`recvID` 和 `groupID` 区分单聊与群聊。消息内容由对应的 element 字段承载,发送、接收、撤回和删除是不同的状态变化。\n\n```java\nOpenIMClient.getInstance().messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); }\n});\n```\n\n查询建立快照,`OnAdvanceMsgListener` 合并增量;`MessageManager` 的 listener 设置会替换当前 listener。", @@ -1318,61 +1373,89 @@ "sourcePath": "/sdk/android/message/creating-messages/create-custom-message", "title": "创建自定义消息" }, + "/sdk/android/message/creating-messages/create-image-message": { + "body": "```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createImageMessage(imagePath);\n```\n\n图片文件应位于 SDK 初始化时配置的数据目录内,`imagePath` 传入相对于该目录的路径。本方法只创建待发送对象,普通发送流程负责上传图片。", + "description": "使用相对于 SDK 初始化数据目录的路径创建图片消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-image-message", + "title": "创建图片消息" + }, "/sdk/android/message/creating-messages/create-image-message-by-file": { - "body": "缓存目录内使用 `createImageMessage()`,绝对路径使用 `createImageMessageFromFullPath()`。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createImageMessageFromFullPath(filePath);\n```", - "description": "使用相对路径或绝对路径创建图片消息。", + "body": "```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createImageMessageFromFullPath(absolutePath);\n```\n\n绝对路径必须可读。本方法只创建待发送对象,普通发送流程负责上传图片。", + "description": "使用绝对路径创建图片消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-file", - "title": "从文件创建图片消息" + "title": "使用本地路径创建图片消息" }, "/sdk/android/message/creating-messages/create-image-message-by-url": { "body": "准备 `PictureInfo` 的原图、大图和缩略图信息后创建消息。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createImageMessageByURL(\n sourceURL, sourcePicture, bigPicture, snapshotPicture);\n```", "description": "使用 createImageMessageByURL 创建已上传资源的图片消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-url", - "title": "从 URL 创建图片消息" + "title": "使用 URL 创建图片消息" + }, + "/sdk/android/message/creating-messages/create-sound-message": { + "body": "```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createSoundMessage(soundPath, durationSeconds);\n```\n\n音频文件应位于 SDK 初始化时配置的数据目录内,`soundPath` 传入相对于该目录的路径,时长单位为秒。本方法只创建待发送对象。", + "description": "使用相对于 SDK 初始化数据目录的路径创建音频消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message", + "title": "创建音频消息" }, "/sdk/android/message/creating-messages/create-sound-message-by-file": { - "body": "音频时长单位为秒;根据文件位置选择相对路径或绝对路径方法。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createSoundMessageFromFullPath(soundPath, durationSeconds);\n```", - "description": "使用相对路径或绝对路径创建音频消息。", + "body": "```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createSoundMessageFromFullPath(absolutePath, durationSeconds);\n```\n\n绝对路径必须可读,音频时长单位为秒。本方法只创建待发送对象。", + "description": "使用绝对路径创建音频消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-file", - "title": "从文件创建音频消息" + "title": "使用本地路径创建音频消息" }, "/sdk/android/message/creating-messages/create-sound-message-by-url": { "body": "`createSoundMessageByURL()` 接收已经包含 URL、时长和大小的 `SoundElem`。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createSoundMessageByURL(soundElem);\n```", "description": "使用 SoundElem 创建已上传资源的音频消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-url", - "title": "从 URL 创建音频消息" + "title": "使用 URL 创建音频消息" + }, + "/sdk/android/message/creating-messages/create-video-message": { + "body": "```java\nMessage message = OpenIMClient.getInstance().messageManager.createVideoMessage(\n videoPath,\n mimeType,\n durationSeconds,\n snapshotPath\n);\n```\n\n视频和快照文件应位于 SDK 初始化时配置的数据目录内,两个路径均相对于该目录。视频时长单位为秒。本方法只创建待发送对象。", + "description": "使用相对于 SDK 初始化数据目录的路径创建视频消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-video-message", + "title": "创建视频消息" }, "/sdk/android/message/creating-messages/create-video-message-by-file": { - "body": "视频方法需要 MIME 类型、时长和缩略图路径。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createVideoMessageFromFullPath(\n videoPath, mimeType, durationSeconds, snapshotPath);\n```", - "description": "使用相对路径或绝对路径创建视频消息及缩略图。", + "body": "```java\nMessage message = OpenIMClient.getInstance().messageManager.createVideoMessageFromFullPath(\n absoluteVideoPath,\n mimeType,\n durationSeconds,\n absoluteSnapshotPath\n);\n```\n\n视频和缩略图的绝对路径必须可读,视频时长单位为秒。本方法只创建待发送对象。", + "description": "使用视频和缩略图的绝对路径创建视频消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-file", - "title": "从文件创建视频消息" + "title": "使用本地路径创建视频消息" }, "/sdk/android/message/creating-messages/create-video-message-by-url": { "body": "将远端视频及缩略图信息填入 `VideoElem` 后创建消息。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createVideoMessageByURL(videoElem);\n```", "description": "使用 VideoElem 创建已上传资源的视频消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-url", - "title": "从 URL 创建视频消息" + "title": "使用 URL 创建视频消息" + }, + "/sdk/android/message/creating-messages/create-file-message": { + "body": "```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createFileMessage(filePath, fileName);\n```\n\n文件应位于 SDK 初始化时配置的数据目录内,`filePath` 传入相对于该目录的路径,`fileName` 用于接收端展示。本方法只创建待发送对象。", + "description": "使用相对于 SDK 初始化数据目录的路径创建文件消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-file-message", + "title": "创建文件消息" }, "/sdk/android/message/creating-messages/create-file-message-by-file": { - "body": "文件名与路径分别传入;相对路径相对于 SDK 初始化时配置的缓存目录。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createFileMessageFromFullPath(filePath, fileName);\n```", - "description": "使用相对路径或绝对路径创建文件消息。", + "body": "```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createFileMessageFromFullPath(absolutePath, fileName);\n```\n\n绝对路径必须可读,文件名与路径分别传入。本方法只创建待发送对象。", + "description": "使用绝对路径创建文件消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-file", - "title": "从文件创建文件消息" + "title": "使用本地路径创建文件消息" }, "/sdk/android/message/creating-messages/create-file-message-by-url": { "body": "`FileElem` 应包含远端 URL、文件名和文件大小。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createFileMessageByURL(fileElem);\n```", "description": "使用 FileElem 创建已上传资源的文件消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-url", - "title": "从 URL 创建文件消息" + "title": "使用 URL 创建文件消息" }, "/sdk/android/message/creating-messages/create-card-message": { "body": "`CardElem` 保存名片用户的展示资料。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createCardMessage(cardElem);\n```", @@ -1400,7 +1483,21 @@ "description": "使用 createQuoteMessage 创建引用已有消息的回复。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-quote-message", - "title": "创建引用消息" + "title": "创建回复消息" + }, + "/sdk/android/message/creating-messages/create-advanced-text-message": { + "body": "`RichMessage` 使用 `offset` 和 `length` 标记正文范围,并通过 `type`、`url` 和 `info` 携带业务定义的实体信息。\n\n```java\nRichMessage link = new RichMessage();\nlink.setType(\"link\");\nlink.setOffset(0);\nlink.setLength(6);\nlink.setUrl(\"https://docs.openim.io\");\nlink.setInfo(\"{\\\"title\\\":\\\"OpenIM documentation\\\"}\");\n\nMessage message = OpenIMClient.getInstance().messageManager.createAdvancedTextMessage(\n \"OpenIM docs\",\n Collections.singletonList(link)\n);\n```\n\n每个实体的范围必须对应最终正文中的实际位置。发送前应校验范围、URL 和 `info` 内容,并确保接收端使用相同的 `type` 与 `info` 协议。本方法只创建 `Message`,不会发送消息;创建完成后使用[发送消息](/sdk/android/message/sending-messages/send-message)。", + "description": "使用 createAdvancedTextMessage 创建包含结构化实体范围的富文本消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-advanced-text-message", + "title": "创建富文本消息" + }, + "/sdk/android/message/creating-messages/create-advanced-quote-message": { + "body": "富文本回复同时保存回复正文、被引用的原消息和正文中的 `RichMessage` 实体范围。\n\n```java\nRichMessage mention = new RichMessage();\nmention.setType(\"mention\");\nmention.setOffset(0);\nmention.setLength(6);\nmention.setInfo(\"{\\\"userID\\\":\\\"user_a\\\"}\");\n\nMessage message = OpenIMClient.getInstance().messageManager.createAdvancedQuoteMessage(\n \"OpenIM agreed\",\n originalMessage,\n Collections.singletonList(mention)\n);\n```\n\n被引用的 `originalMessage` 应包含稳定的 `clientMsgID`,实体范围必须对应最终回复正文。`type`、`url` 和 `info` 的业务协议与[创建富文本消息](/sdk/android/message/creating-messages/create-advanced-text-message)相同。本方法只创建待发送对象,不会自动发送。", + "description": "使用 createAdvancedQuoteMessage 创建带富文本实体的引用回复消息。", + "headings": [], + "sourcePath": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "title": "创建富文本回复" }, "/sdk/android/message/creating-messages/create-forward-message": { "body": "传入待转发的 `Message`,创建结果仍需通过发送方法投递到目标会话。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createForwardMessage(sourceMessage);\n```", @@ -1417,7 +1514,7 @@ "title": "创建合并消息" }, "/sdk/android/message/sending-messages/send-message": { - "body": "单聊填写 `recvUid`,群聊填写 `recvGid`,另一个目标参数传 `null`。`OnMsgSendCallback` 同时承载成功、失败和媒体进度。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onSuccess(String id) { mergeSentMessage(message); }\n @Override public void onError(int code, String error) { showSendError(error); }\n}, message, peerUserID, null, offlinePushInfo);\n```", + "body": "单聊填写 `recvUid`,群聊填写 `recvGid`,另一个目标参数传 `null`。`OnMsgSendCallback` 同时承载成功、失败和媒体进度。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onSuccess(Message sentMessage) { mergeSentMessage(sentMessage); }\n @Override public void onError(int code, String error) { showSendError(error); }\n}, message, peerUserID, null, offlinePushInfo);\n```", "description": "使用 sendMessage 将 Message 发送到单聊或群聊。", "headings": [], "sourcePath": "/sdk/android/message/sending-messages/send-message", @@ -1428,14 +1525,14 @@ "description": "使用 sendMessageNotOss 发送已经由业务上传资源的媒体消息。", "headings": [], "sourcePath": "/sdk/android/message/sending-messages/send-message-not-oss", - "title": "发送非 OSS 消息" + "title": "发送不经 OSS 的消息" }, "/sdk/android/message/sending-messages/set-msg-send-progress-listener": { - "body": "Android 没有独立的全局发送进度 listener;进度随每次 `sendMessage()` 或 `sendMessageNotOss()` 传入的 `OnMsgSendCallback` 返回。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onProgress(long progress) { updateProgress(progress); }\n @Override public void onSuccess(String id) { finishProgress(); }\n @Override public void onError(int code, String error) { failProgress(error); }\n}, message, peerUserID, null, offlinePushInfo);\n```", + "body": "Android 没有独立的全局发送进度 listener;进度随每次 `sendMessage()` 或 `sendMessageNotOss()` 传入的 `OnMsgSendCallback` 返回。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onProgress(long progress) { updateProgress(progress); }\n @Override public void onSuccess(Message sentMessage) { finishProgress(); }\n @Override public void onError(int code, String error) { failProgress(error); }\n}, message, peerUserID, null, offlinePushInfo);\n```", "description": "通过 OnMsgSendCallback 的进度回调更新媒体发送进度。", "headings": [], "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", - "title": "跟踪消息发送进度" + "title": "监听消息发送进度" }, "/sdk/android/message/receiving-messages/receive-messages": { "body": "设置 `setAdvancedMsgListener()` 后,`onRecvNewMessage` 接收实时消息,`onRecvOfflineNewMessage` 接收离线批次,`onRecvOnlineOnlyMessage` 接收在线消息字符串。所有消息都按 `clientMsgID` 幂等合并。\n\n```java\nmessageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); }\n @Override public void onRecvOfflineNewMessage(List messages) { messageStore.mergeAll(messages); }\n});\n```", @@ -1452,25 +1549,38 @@ "title": "接收自定义业务消息" }, "/sdk/android/message/retrieving-messages/load-older-messages": { - "body": "首次查询传 `startMsg` 为 `null`,后续将上一页边界消息作为起点。按返回的 `clientMsgID` 去重。\n\n```java\nmessageManager.getAdvancedHistoryMessageList(callback, conversationID, startMessage, 20, ViewType.NORMAL);\n```", + "body": "首次查询传 `startMsg` 为 `null`,后续将上一页边界消息作为起点。普通历史消息使用 `ViewType.History`,按返回的 `clientMsgID` 去重。\n\n```java\nmessageManager.getAdvancedHistoryMessageList(callback, conversationID, startMessage, 20, ViewType.History);\n```", "description": "使用 getAdvancedHistoryMessageList 分页加载会话历史消息。", "headings": [], "sourcePath": "/sdk/android/message/retrieving-messages/load-older-messages", - "title": "加载更早消息" + "title": "加载历史消息" }, "/sdk/android/message/retrieving-messages/load-newer-messages": { - "body": "该方法用于从消息定位点向后读取,适合搜索定位或上下文分页。\n\n```java\nmessageManager.getAdvancedHistoryMessageListReverse(callback, conversationID, startMessage, 20, ViewType.NORMAL);\n```", + "body": "该方法用于从消息定位点向后读取下一页历史消息。此类方向历史分页使用 `ViewType.History`。\n\n```java\nmessageManager.getAdvancedHistoryMessageListReverse(callback, conversationID, startMessage, 20, ViewType.History);\n```", "description": "使用 getAdvancedHistoryMessageListReverse 加载起点之后的消息。", "headings": [], "sourcePath": "/sdk/android/message/retrieving-messages/load-newer-messages", - "title": "加载更新消息" + "title": "反向加载历史消息" }, "/sdk/android/message/retrieving-messages/find-messages-by-id": { "body": "构造 `SearchParams` 列表查询消息。返回结果应按消息 ID 合并,不要用列表位置作为稳定标识。\n\n```java\nmessageManager.findMessageList(new OnBase() {\n @Override public void onSuccess(SearchResult result) { showFoundMessages(result); }\n @Override public void onError(int code, String error) { showQueryError(error); }\n}, searchParams);\n```", "description": "使用 findMessageList 按 SearchParams 查询消息记录。", "headings": [], "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", - "title": "按 ID 查询消息" + "title": "按 ID 查找消息" + }, + "/sdk/android/message/retrieving-messages/load-message-context": { + "body": "从搜索结果或引用消息跳入聊天上下文时,把已经取得的 `Message` 作为锚点。\n\n## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `conversationID` | `String` | 是 | 锚点消息所在的会话 ID。 |\n| `startMsg` | `Message` | 是 | 已经取得的锚点消息。 |\n| `type` | `ViewType` | 是 | 上下文查看类型;引用消息使用 `ViewType.History`,搜索结果使用 `ViewType.Search`。 |\n| `before` | `int` | 是 | 锚点之前最多读取的消息数量。 |\n| `after` | `int` | 是 | 锚点之后最多读取的消息数量。 |\n\n```java\nmessageManager.fetchSurroundingMessages(\n new OnBase() {\n @Override\n public void onSuccess(Messages messages) {\n List surrounding = messages.getData();\n renderMessages(surrounding);\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n },\n conversationID,\n targetMessage,\n ViewType.Search,\n 20,\n 20\n);\n```\n\n成功回调中的 `messages.getData()` 是锚点前后取得的消息列表,消息字段见[消息概览](/sdk/android/message/overview-message)。\n\n`before` 和 `after` 分别限制锚点前后的数量。返回结果可能少于请求总数,例如锚点靠近历史边界或部分消息已经删除。按 `conversationID:clientMsgID` 合并,不要依赖固定数组位置。需要先定位消息时见[按 ID 查找消息](/sdk/android/message/retrieving-messages/find-messages-by-id)。", + "description": "使用 Android SDK 读取一条消息前后的上下文。", + "headings": [ + { + "depth": 2, + "title": "参数说明", + "url": "#参数说明" + } + ], + "sourcePath": "/sdk/android/message/retrieving-messages/load-message-context", + "title": "读取消息上下文" }, "/sdk/android/message/searching-messages/search-messages": { "body": "可按会话、关键词、发送者、消息类型、时间范围和分页参数搜索。`conversationID` 传 `null` 表示全局搜索。\n\n```java\nmessageManager.searchLocalMessages(callback, conversationID, keywords, 1,\n senderIDs, messageTypes, 0, 0, 0, 20);\n```", @@ -1480,11 +1590,18 @@ "title": "搜索消息" }, "/sdk/android/message/composing-messages/update-typing-status": { - "body": "输入框变化时传入对方用户 ID 和业务约定的提示字符串。调用侧应防抖,避免每次按键都发送请求。\n\n```java\nmessageManager.typingStatusUpdate(callback, peerUserID, \"typing\");\n```\n\n成功 callback 表示输入状态上报请求完成,不表示对端已经处理。对端通过应用级 `OnConversationListener.onConversationUserInputStatusChanged` 接收字符串载荷;Android wrapper 不会自动把它转换为模型,应在校验 JSON 后再解析:\n\n```java\n@Override\npublic void onConversationUserInputStatusChanged(String payload) {\n InputStatesChangedData state = JsonUtil.toObj(\n payload,\n InputStatesChangedData.class\n );\n if (state == null || state.getConversationID() == null) {\n return;\n }\n updateTypingState(\n state.getConversationID(),\n state.getUserID(),\n state.getPlatformIDs()\n );\n}\n```\n\n输入状态按 `conversationID:userID` 合并,并设置业务侧超时自动清除。`ConversationManager` 只保存一个会话 listener,本回调必须与会话列表、总未读数和同步事件组合后统一设置,不能在输入框页面单独覆盖。", - "description": "使用 typingStatusUpdate 提示单聊对方当前正在输入。", + "body": "进入输入状态时,将 `focus` 设为 `true`;输入结束、输入框失去焦点或退出会话时,将其设为 `false`。\n\n```java\nconversationManager.changeInputState(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 输入状态已上报\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n },\n conversationID,\n true\n);\n```\n\n输入结束时及时清除状态:\n\n```java\nconversationManager.changeInputState(callback, conversationID, false);\n```\n\n调用侧应合并连续的焦点变化,并在页面退出或连接中断前尝试上报 `false`。成功回调只表示上报请求完成,不表示其他客户端已经更新界面。\n\n其他客户端通过 `OnConversationListener.onConversationUserInputStatusChanged` 接收输入状态变化。Android SDK 以字符串形式返回事件载荷,应在校验 JSON 后再解析:\n\n```java\n@Override\npublic void onConversationUserInputStatusChanged(String payload) {\n InputStatesChangedData state = JsonUtil.toObj(\n payload,\n InputStatesChangedData.class\n );\n if (state == null || state.getConversationID() == null) {\n return;\n }\n updateTypingState(\n state.getConversationID(),\n state.getUserID(),\n state.getPlatformIDs()\n );\n}\n```\n\n输入状态按 `conversationID:userID` 合并,并设置业务侧超时自动清除。`ConversationManager` 只保存一个会话 listener,本回调应与会话列表、总未读数和同步事件组合后统一设置。\n\n进入会话或连接恢复时,可通过[查询输入状态](/sdk/android/message/composing-messages/get-typing-status)获取当前快照。", + "description": "使用 Android SDK 上报当前会话的输入状态。", "headings": [], "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", - "title": "更新输入状态" + "title": "上报输入状态" + }, + "/sdk/android/message/composing-messages/get-typing-status": { + "body": "进入会话、连接恢复或需要校准状态时,查询指定用户当前正在输入的平台 ID 列表。\n\n```java\nOpenIMClient.getInstance().conversationManager.getInputState(\n new OnBase>() {\n @Override\n public void onSuccess(List platformIDs) {\n boolean typing = platformIDs != null && !platformIDs.isEmpty();\n updateTypingState(conversationID, userID, typing);\n }\n\n @Override\n public void onError(int code, String error) {\n recordTypingStatusQueryFailure(code, error);\n }\n },\n conversationID,\n userID\n);\n```\n\n成功 callback 返回平台 ID 数组快照;空列表表示查询时没有平台处于输入状态。查询本身不会触发输入状态事件。群聊中不要频繁轮询全部成员,只在进入页面、连接恢复或补偿状态时查询重点成员;在线增量由[上报输入状态](/sdk/android/message/composing-messages/update-typing-status)归属的 listener 维护。", + "description": "使用 getInputState 查询指定用户在会话中的当前输入状态。", + "headings": [], + "sourcePath": "/sdk/android/message/composing-messages/get-typing-status", + "title": "查询输入状态" }, "/sdk/android/message/managing-messages/delete-local-message": { "body": "该操作不影响其他设备和其他用户的消息记录。\n\n```java\nmessageManager.deleteMessageFromLocalStorage(conversationID, clientMsgID, callback);\n```", @@ -1494,22 +1611,35 @@ "title": "删除本地消息" }, "/sdk/android/message/managing-messages/delete-saved-messages": { - "body": "删除结果通过消息事件同步,调用成功不代表所有端已经刷新。\n\n```java\nmessageManager.deleteMessageFromLocalAndSvr(conversationID, clientMsgID, callback);\n```", - "description": "使用 deleteMessageFromLocalAndSvr 删除本地和服务端的一条消息。", - "headings": [], + "body": "## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `conversationID` | `String` | 是 | 要删除消息所在的会话 ID。 |\n| `clientMsgIDs` | `String[]` | 是 | 要删除的消息 ID 列表;同一批 ID 必须属于同一会话。 |\n| `isSync` | `boolean` | 是 | 是否把删除动作同步到当前账号的其他客户端。 |\n\n```java\nDeleteMessagesReq request = new DeleteMessagesReq(\n true,\n conversationID,\n selectedClientMsgIDs.toArray(new String[0])\n);\n\nmessageManager.deleteMessages(request, new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 删除请求已完成\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n});\n```\n\n`isSync` 为 `false` 时,删除当前设备及当前账号服务端保存的记录;为 `true` 时,还会请求把删除动作同步到当前账号的其他客户端。该操作不会删除其他会话成员持有的副本,也不会产生撤回提示。\n\n成功回调表示删除请求已经完成;开启同步时,不代表其他客户端已经收到事件或完成界面更新。\n\n`OnAdvanceMsgListener.onMsgDeleted` 是本页归属事件。根据消息路由字段确定会话后,按 `clientMsgID` 幂等移除消息。\n\n```java\n@Override\npublic void onMsgDeleted(Message message) {\n removeMessage(resolveConversationID(message), message.getClientMsgID());\n}\n```\n\n需要校准当前消息快照时,重新查询对应会话的历史消息。", + "description": "使用 Android SDK 批量删除当前账号在同一会话中的消息。", + "headings": [ + { + "depth": 2, + "title": "参数说明", + "url": "#参数说明" + } + ], "sourcePath": "/sdk/android/message/managing-messages/delete-saved-messages", - "title": "删除已保存消息" + "title": "批量删除消息" + }, + "/sdk/android/message/managing-messages/delete-user-messages": { + "body": "```java\nmessageManager.deleteUserAllMessagesInConv(\n conversationID,\n targetUserID,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 删除请求已完成\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n }\n);\n```\n\n该 API 只用于群聊,可删除指定用户在目标群会话中的全部消息。这是高影响的群组管控操作,不应放入普通单条消息菜单;操作者权限由 OpenIMServer 校验。成功回调不代表事件已经到达。\n\n`OnAdvanceMsgListener.onDeleteUserAllMsgsInConv` 是本页归属事件。收到事件后,根据 `conversationID` 和 `userID` 移除缓存中该用户发送的消息,或重新读取会话历史进行校准。\n\n```java\n@Override\npublic void onDeleteUserAllMsgsInConv(DeleteUserAllMsgsListenerMsg event) {\n removeMessagesBySender(event.getConversationID(), event.getUserID());\n}\n```\n\n成功回调、事件到达和重新查询历史是三个独立阶段。", + "description": "使用 Android SDK 删除指定用户在群聊中的全部消息。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-messages/delete-user-messages", + "title": "删除群聊中指定用户的全部消息" }, "/sdk/android/message/managing-messages/revoke-a-message": { - "body": "Android 的撤回方法为 `revokeMessageV2()`,撤回详情通过 `onRecvMessageRevokedV2` 返回。\n\n```java\nmessageManager.revokeMessageV2(callback, conversationID, clientMsgID);\n```", - "description": "使用 revokeMessageV2 撤回已发送消息。", + "body": "撤回会使其他客户端把原消息显示为撤回状态。调用前应确认消息已经发送成功,并由业务界面限制可撤回时间;最终权限由服务端校验。\n\n```java\nmessageManager.revokeMessageV2(callback, conversationID, clientMsgID);\n```\n\n成功回调表示服务端完成撤回请求,不代表所有客户端都已经收到事件。接收端通过 `OnAdvanceMsgListener.onRecvMessageRevokedV2` 合并撤回变化。\n\n本页是 `onRecvMessageRevokedV2` 的完整事件归属页。`RevokedInfo` 包含 `clientMsgID`、撤回者和撤回时间,但不包含 `conversationID`,应先从当前账号的消息索引解析所属会话,再按 `conversationID:clientMsgID` 更新消息:\n\n```java\n@Override\npublic void onRecvMessageRevokedV2(RevokedInfo info) {\n String clientMsgID = info.getClientMsgID();\n String conversationID = findConversationIDByClientMsgID(clientMsgID);\n if (conversationID == null) {\n return;\n }\n markMessageRevoked(conversationID, clientMsgID, info);\n}\n```\n\n接收端应把对应消息更新为撤回状态,而不是直接从列表删除。该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。\n\n成功回调、撤回事件到达和重新查询历史是三个独立阶段。需要校准时重新读取对应会话的历史消息。", + "description": "撤回已发送消息,并处理其他客户端收到的撤回通知。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", "title": "撤回消息" }, "/sdk/android/message/managing-messages/modify-a-message": { - "body": "请求对象中填写会话 ID、客户端消息 ID 和新的消息内容,修改结果通过 `onMessageModified` 同步。\n\n```java\nmessageManager.modifyMessage(callback, modifyRequest);\n```", - "description": "使用 ModifyMessageReq 修改支持修改的消息内容。", + "body": "`modifyMessage` 用于修改会话中已经存在的消息。请求对象应保留原消息的会话 ID、`clientMsgID`、路由和发送者等字段,只更新允许修改的内容。\n\n```java\nmessageManager.modifyMessage(callback, modifyRequest);\n```\n\n成功回调表示修改请求已经完成,不代表所有客户端界面都已经更新。其他客户端通过 `OnAdvanceMsgListener.onMessageModified` 接收修改后的完整 `Message`。\n\n本页是 `onMessageModified` 的完整事件归属页。根据消息路由解析 `conversationID`,再按 `conversationID:clientMsgID` 替换原消息,不要按数组位置或显示文本匹配:\n\n```java\n@Override\npublic void onMessageModified(Message message) {\n String conversationID = resolveConversationID(message);\n if (conversationID == null) {\n return;\n }\n replaceMessage(conversationID, message.getClientMsgID(), message);\n}\n```\n\n该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。成功回调、修改事件到达和重新查询历史是三个独立阶段。", + "description": "修改支持编辑的消息内容,并处理其他客户端收到的消息修改事件。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", "title": "修改消息" @@ -1519,11 +1649,11 @@ "description": "使用 getConversationPinnedMsgs 查询会话中的置顶消息。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", - "title": "查看置顶消息" + "title": "查询会话置顶消息" }, "/sdk/android/message/managing-messages/set-message-pinned": { - "body": "最后一个参数为 `true` 置顶,`false` 取消置顶;变化通过 `onChangedPinnedMsg` 同步。\n\n```java\nmessageManager.setConversationPinnedMsg(callback, conversationID, clientMsgID, true);\n```", - "description": "使用 setConversationPinnedMsg 设置会话消息的置顶状态。", + "body": "最后一个参数为 `true` 时置顶消息,为 `false` 时取消置顶:\n\n```java\nmessageManager.setConversationPinnedMsg(\n callback,\n conversationID,\n clientMsgID,\n true\n);\n```\n\n成功回调表示设置请求完成,不代表置顶变化事件已经到达。\n\n`OnAdvanceMsgListener.onChangedPinnedMsg` 是本页归属事件。回调中的 `ChangedPinnedMsg` 包含 `conversationID` 和当前置顶消息集合;按会话替换集合,并按每条置顶消息的 `clientMsgID` 去重:\n\n```java\n@Override\npublic void onChangedPinnedMsg(ChangedPinnedMsg event) {\n replacePinnedMessages(event.getConversationID(), event.getMsgs());\n}\n```\n\n该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。成功回调、事件到达和[查询会话置顶消息](/sdk/android/message/managing-messages/get-pinned-messages)取得的快照是三个独立阶段。", + "description": "设置会话消息的置顶状态,并处理置顶消息变化事件。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", "title": "置顶或取消置顶消息" @@ -1547,28 +1677,48 @@ "description": "使用 deleteAllMsgFromLocal 清理当前设备的全部消息。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/clear-all-local-messages", - "title": "清空全部本地消息" + "title": "清理全部本地消息" }, "/sdk/android/message/managing-messages/clear-all-messages": { "body": "这是高影响操作,产品层应二次确认,并在完成后清理本地会话展示。\n\n```java\nmessageManager.deleteAllMsgFromLocalAndSvr(callback);\n```", "description": "使用 deleteAllMsgFromLocalAndSvr 清理本地和服务端消息。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/clear-all-messages", - "title": "清空全部已保存消息" + "title": "清理全部消息" }, "/sdk/android/message/managing-messages/set-message-local-ex": { "body": "`localEx` 适合保存下载路径、播放状态等本地信息,不会同步给其他用户。\n\n```java\nmessageManager.setMessageLocalEx(callback, conversationID, clientMsgID, localExJson);\n```", "description": "使用 setMessageLocalEx 保存仅当前设备使用的消息扩展数据。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/set-message-local-ex", - "title": "设置消息本地扩展字段" + "title": "设置消息本地扩展" + }, + "/sdk/android/message/managing-read-status/send-group-read-receipts": { + "body": "```java\nmessageManager.sendGroupMessageReadReceipt(\n conversationID,\n visibleClientMsgIDs,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 已读回执已上报\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n }\n);\n```\n\n同一批消息必须属于目标群会话。成功回调只表示服务端接受上报,不代表其他客户端界面已经更新。会话未读数仍由 `markConversationMessageAsRead` 独立维护。\n\n其他客户端通过 `OnAdvanceMsgListener.onRecvGroupMessageReadReceipt` 接收群聊成员级已读变化。本页是该事件的完整监听归属页;根据 `conversationID` 以及回执中的消息 ID 合并消息已读数、未读数和成员信息。\n\n```java\n@Override\npublic void onRecvGroupMessageReadReceipt(GroupMessageReceipt receipt) {\n mergeGroupReadReceipt(receipt);\n}\n```\n\n上报回调、群回执事件和[查询群消息已读成员](/sdk/android/message/managing-read-status/get-group-message-readers)取得的成员快照是三个独立阶段。", + "description": "使用 Android SDK 上报群消息已读回执。", + "headings": [], + "sourcePath": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "title": "上报群消息已读" + }, + "/sdk/android/message/managing-read-status/get-group-message-readers": { + "body": "## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `conversationID` | `String` | 是 | 群聊会话 ID。 |\n| `clientMsgID` | `String` | 是 | 要查询阅读成员的消息 ID。 |\n| `filter` | `int` | 是 | `0` 查询已读成员,`1` 查询未读成员。 |\n| `offset` | `int` | 是 | 分页偏移量,首页传 `0`。 |\n| `count` | `int` | 是 | 本次请求的成员数量。 |\n\n```java\nmessageManager.getGroupMessageReaderList(\n conversationID,\n clientMsgID,\n 0,\n 0,\n 50,\n new OnBase>() {\n @Override\n public void onSuccess(List members) {\n renderMembers(members);\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n }\n);\n```\n\n成功回调返回当前页 `GroupMembersInfo` 列表,字段含义见[分页查询群成员](/sdk/android/group/retrieving-group-members/get-group-member-list)。按 `groupID:userID` 去重;查询只建立当前快照,不触发回执事件。需要完整列表时继续分页。", + "description": "使用 Android SDK 分页查询群消息的已读或未读成员。", + "headings": [ + { + "depth": 2, + "title": "参数说明", + "url": "#参数说明" + } + ], + "sourcePath": "/sdk/android/message/managing-read-status/get-group-message-readers", + "title": "查询群消息已读成员" }, "/sdk/android/file-uploads/track-file-upload-progress": { "body": "Android SDK 不设置全局文件上传 listener。每次调用 `uploadFile()` 时传入一个 `OnPutFileListener`,由该 listener 接收当前上传任务的进度、分片状态和完成信息。\n\n```java\nOnPutFileListener uploadListener = new OnPutFileListener() {\n @Override\n public void open(long size) {\n initializeUploadProgress(uploadTaskID, size);\n }\n\n @Override\n public void uploadID(String id) {\n bindSdkUploadID(uploadTaskID, id);\n }\n\n @Override\n public void uploadComplete(long fileSize, long uploadedSize, long storageSize) {\n updateUploadProgress(uploadTaskID, uploadedSize, fileSize);\n }\n\n @Override\n public void uploadPartComplete(long partNumber, long partSize, String partHash) {\n markPartComplete(uploadTaskID, partNumber, partSize, partHash);\n }\n\n @Override\n public void complete(long size, String url, long type) {\n completeUpload(uploadTaskID, size, url, type);\n }\n};\n\nOpenIMClient.getInstance().uploadFile(resultCallback, uploadListener, putArgs);\n```\n\n`open()` 可用于初始化总大小,`uploadID()` 返回 SDK 上传任务标识,`uploadComplete()` 提供上传过程数据,`uploadPartComplete()` 表示一个分片已经完成,`complete()` 返回最终大小、远端 URL 和资源类型。只有业务需要展示分片细节时才处理分片回调;普通进度条通常只需要过程回调和最终完成回调。\n\n业务层仍应生成自己的稳定 `uploadTaskID`,并在 listener 闭包中关联界面状态。SDK 上传 ID、文件名和数组位置都不应代替业务任务主键。每个上传任务使用独立 listener;页面或账号状态销毁后应停止向旧状态分发回调。\n\n完整的参数构造和错误处理见[上传文件](/sdk/android/file-uploads/upload-file)。", "description": "使用 Android SDK 的 OnPutFileListener 跟踪单次文件上传任务。", "headings": [], "sourcePath": "/sdk/android/file-uploads/track-file-upload-progress", - "title": "跟踪文件上传进度" + "title": "监听文件上传进度" }, "/sdk/android/file-uploads/upload-file": { "body": "`uploadFile()` 是独立文件上传能力,可用于头像、群头像、资料附件或其他业务文件。上传过程不从属于消息,也不会自动创建消息或更新用户资料。\n\n## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `base` | `OnBase` | 是 | 接收上传请求的最终成功或失败结果。 |\n| `listener` | `OnPutFileListener` | 是 | 接收当前任务的上传进度、分片状态和完成信息。 |\n| `putArgs.filepath` | `String` | 是 | Android 应用可读取的本地文件路径。 |\n| `putArgs.name` | `String` | 是 | 上传使用的文件名;`PutArgs` 默认使用传入路径,可按业务需要改为原始文件名。 |\n| `putArgs.cuase` | `String` | 否 | 业务约定的上传原因。字段名以 Android SDK 的 `PutArgs` 声明为准。 |\n\n```java\nFile file = new File(localPath);\nPutArgs args = new PutArgs(file.getAbsolutePath());\nargs.name = file.getName();\nargs.cuase = \"user-avatar\";\n\nOpenIMClient.getInstance().uploadFile(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n finishUploadRequest(result);\n }\n\n @Override\n public void onError(int code, String error) {\n showUploadError(code, error);\n }\n },\n new OnPutFileListener() {\n @Override\n public void uploadComplete(long fileSize, long uploadedSize, long storageSize) {\n updateUploadProgress(uploadTaskID, uploadedSize, fileSize);\n }\n\n @Override\n public void complete(long size, String url, long type) {\n completeUpload(uploadTaskID, size, url, type);\n }\n },\n args\n);\n```\n\n每次调用都传入独立的 `OnPutFileListener`,因此无需设置全局上传 listener。并行上传时应由业务层为任务生成稳定 ID,并在回调闭包中关联对应任务,不要使用文件名或列表位置作为唯一标识。各回调的职责见[跟踪文件上传进度](/sdk/android/file-uploads/track-file-upload-progress)。\n\n`complete()` 返回的 URL 可用于后续更新头像、保存附件地址或创建 URL 类型的媒体消息。上传成功只表示文件资源已经写入远端;资料更新、消息创建和消息发送仍需分别调用对应 API。", @@ -1706,7 +1856,7 @@ "title": "发送自定义信令" }, "/sdk/android/events/overview-events": { - "body": "OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。\n\n连接 listener 是例外:`OnConnListener` 在 `initSDK()` 时传入,其完整处理见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。\n\n## 集中设置 listener\n\n下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。\n\n```java\npublic final class OpenIMEventCenter {\n private final OpenIMClient client = OpenIMClient.getInstance();\n\n private final OnUserListener userListener = buildUserListener();\n private final OnFriendshipListener friendshipListener = buildFriendshipListener();\n private final OnConversationListener conversationListener = buildConversationListener();\n private final OnGroupListener groupListener = buildGroupListener();\n private final OnAdvanceMsgListener messageListener = buildMessageListener();\n private final OnCustomBusinessListener businessListener = buildBusinessListener();\n private final OnSignalingListener signalingListener = buildSignalingListener();\n\n public void registerBeforeLogin() {\n client.userInfoManager.setOnUserListener(userListener);\n client.friendshipManager.setOnFriendshipListener(friendshipListener);\n client.conversationManager.setOnConversationListener(conversationListener);\n client.groupManager.setOnGroupListener(groupListener);\n client.messageManager.setAdvancedMsgListener(messageListener);\n client.messageManager.setCustomBusinessListener(businessListener);\n client.signalingManager.setSignalingListener(signalingListener);\n }\n}\n```\n\nAndroid SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。\n\n## 事件归属\n\n| 事件范围 | 合并标识 | 完整处理页面 |\n| --- | --- | --- |\n| 连接、Token 和强制下线 | 当前 SDK 实例与登录用户 | [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) |\n| 当前用户资料 | `userID` | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) |\n| 在线状态 | `userID` | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) |\n| 好友关系与资料 | `userID` | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) |\n| 好友申请 | `fromUserID:toUserID` | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) |\n| 黑名单 | `userID` | [拉黑用户](/sdk/android/user/blacklist/add-blacklist)、[移出黑名单](/sdk/android/user/blacklist/remove-blacklist) |\n| 会话列表 | `conversationID` | [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) |\n| 总未读数 | 当前登录用户 | [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) |\n| 输入状态 | `conversationID:userID` | [更新输入状态](/sdk/android/message/composing-messages/update-typing-status) |\n| 群资料、成员和群申请 | `groupID` 或 `groupID:userID` | [群组概览](/sdk/android/group/overview-group) |\n| 新消息、离线消息和在线消息 | `clientMsgID`,必要时结合 `conversationID` | [接收消息](/sdk/android/message/receiving-messages/receive-messages) |\n| 消息撤回、删除、修改和置顶 | `clientMsgID`,必要时结合 `conversationID` | [消息概览](/sdk/android/message/overview-message) |\n| 单聊已读回执 | `conversationID:clientMsgID` | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) |\n| 自定义业务消息 | 业务协议中的幂等 ID | [接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) |\n| 通话 | `roomID`,参与者结合用户 ID | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events) |\n| 通话自定义信令 | `roomID:eventID` | [发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) |\n| SDK 数据同步 | 当前 SDK 实例与登录用户 | 本页“监听初始化同步” |\n\n查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。\n\n## 监听初始化同步\n\n同步生命周期属于应用级 `OnConversationListener`。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑:\n\n```java\nprivate OnConversationListener buildConversationListener() {\n return new OnConversationListener() {\n @Override\n public void onNewConversation(List conversations) {\n mergeNewConversations(conversations);\n }\n\n @Override\n public void onConversationChanged(List conversations) {\n mergeChangedConversations(conversations);\n }\n\n @Override\n public void onTotalUnreadMessageCountChanged(int total) {\n updateTotalUnreadCount(total);\n }\n\n @Override\n public void onConversationUserInputStatusChanged(String payload) {\n handleInputStatus(payload);\n }\n\n @Override\n public void onSyncServerStart(boolean reinstall) {\n setSyncState(\"syncing\", 0, reinstall);\n }\n\n @Override\n public void onSyncServerProgress(long progress) {\n setSyncProgress(progress);\n }\n\n @Override\n public void onSyncServerFinish(boolean reinstall) {\n setSyncState(\"ready\", 100, reinstall);\n reloadVisibleSnapshots();\n }\n\n @Override\n public void onSyncServerFailed(boolean reinstall) {\n setSyncState(\"failed\", 0, reinstall);\n }\n };\n}\n```\n\n`reinstall` 为 `true` 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。`onSyncServerProgress` 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。\n\n本页是 `onSyncServerStart`、`onSyncServerProgress`、`onSyncServerFinish` 和 `onSyncServerFailed` 的完整处理归属页。同步状态没有业务实体合并键,应按当前 `OpenIMClient` 单例和登录用户隔离。", + "body": "OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。\n\n连接 listener 是例外:`OnConnListener` 在 `initSDK()` 时传入,其完整处理见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。\n\n## 集中设置 listener\n\n下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。\n\n```java\npublic final class OpenIMEventCenter {\n private final OpenIMClient client = OpenIMClient.getInstance();\n\n private final OnUserListener userListener = buildUserListener();\n private final OnFriendshipListener friendshipListener = buildFriendshipListener();\n private final OnConversationListener conversationListener = buildConversationListener();\n private final OnGroupListener groupListener = buildGroupListener();\n private final OnAdvanceMsgListener messageListener = buildMessageListener();\n private final OnCustomBusinessListener businessListener = buildBusinessListener();\n private final OnSignalingListener signalingListener = buildSignalingListener();\n\n public void registerBeforeLogin() {\n client.userInfoManager.setOnUserListener(userListener);\n client.friendshipManager.setOnFriendshipListener(friendshipListener);\n client.conversationManager.setOnConversationListener(conversationListener);\n client.groupManager.setOnGroupListener(groupListener);\n client.messageManager.setAdvancedMsgListener(messageListener);\n client.messageManager.setCustomBusinessListener(businessListener);\n client.signalingManager.setSignalingListener(signalingListener);\n }\n}\n```\n\nAndroid SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。\n\n## 事件归属\n\n| 事件范围 | Listener | 对应页面 |\n| --- | --- | --- |\n| 连接、Token 和强制下线 | `OnConnListener` | [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) |\n| 当前用户资料 | `OnUserListener` | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) |\n| 在线状态 | `OnUserListener` | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) |\n| 好友关系与资料 | `OnFriendshipListener` | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) |\n| 好友申请 | `OnFriendshipListener` | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) |\n| 黑名单 | `OnFriendshipListener` | [拉黑用户](/sdk/android/user/blacklist/add-blacklist)、[移出黑名单](/sdk/android/user/blacklist/remove-blacklist) |\n| 会话列表 | `OnConversationListener` | [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) |\n| 总未读数 | `OnConversationListener` | [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) |\n| 输入状态 | `OnConversationListener` | [上报输入状态](/sdk/android/message/composing-messages/update-typing-status) |\n| 群资料、成员和群申请 | `OnGroupListener` | [群组概览](/sdk/android/group/overview-group) |\n| 新消息、离线消息和在线消息 | `OnAdvanceMsgListener` | [接收消息](/sdk/android/message/receiving-messages/receive-messages) |\n| 消息撤回 | `OnAdvanceMsgListener` | [撤回消息](/sdk/android/message/managing-messages/revoke-a-message) |\n| 消息删除 | `OnAdvanceMsgListener` | [批量删除消息](/sdk/android/message/managing-messages/delete-saved-messages) |\n| 消息修改 | `OnAdvanceMsgListener` | [修改消息](/sdk/android/message/managing-messages/modify-a-message) |\n| 置顶消息 | `OnAdvanceMsgListener` | [置顶或取消置顶消息](/sdk/android/message/managing-messages/set-message-pinned) |\n| 单聊已读回执 | `OnAdvanceMsgListener` | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) |\n| 自定义业务消息 | `OnCustomBusinessListener` | [接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) |\n| 通话 | `OnSignalingListener` | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events) |\n| 通话自定义信令 | `OnSignalingListener` | [发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) |\n| SDK 数据同步 | `OnConversationListener` | [监听初始化同步](#监听初始化同步) |\n\n查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。\n\n## 监听初始化同步\n\n同步生命周期属于应用级 `OnConversationListener`。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑:\n\n```java\nprivate OnConversationListener buildConversationListener() {\n return new OnConversationListener() {\n @Override\n public void onNewConversation(List conversations) {\n mergeNewConversations(conversations);\n }\n\n @Override\n public void onConversationChanged(List conversations) {\n mergeChangedConversations(conversations);\n }\n\n @Override\n public void onTotalUnreadMessageCountChanged(int total) {\n updateTotalUnreadCount(total);\n }\n\n @Override\n public void onConversationUserInputStatusChanged(String payload) {\n handleInputStatus(payload);\n }\n\n @Override\n public void onSyncServerStart(boolean reinstall) {\n setSyncState(\"syncing\", 0, reinstall);\n }\n\n @Override\n public void onSyncServerProgress(long progress) {\n setSyncProgress(progress);\n }\n\n @Override\n public void onSyncServerFinish(boolean reinstall) {\n setSyncState(\"ready\", 100, reinstall);\n reloadVisibleSnapshots();\n }\n\n @Override\n public void onSyncServerFailed(boolean reinstall) {\n setSyncState(\"failed\", 0, reinstall);\n }\n };\n}\n```\n\n`reinstall` 为 `true` 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。`onSyncServerProgress` 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。\n\n本页是 `onSyncServerStart`、`onSyncServerProgress`、`onSyncServerFinish` 和 `onSyncServerFailed` 的完整处理归属页。同步状态没有业务实体合并键,应按当前 `OpenIMClient` 单例和登录用户隔离。", "description": "集中设置 Android SDK listener,并按业务领域分发连接、同步和数据事件。", "headings": [ { diff --git a/src/generated/navigation.json b/src/generated/navigation.json index 89d21f5af0..f3de5e84cd 100644 --- a/src/generated/navigation.json +++ b/src/generated/navigation.json @@ -4402,7 +4402,7 @@ { "id": "user/user-profile/set-self-info", "segment": "set-self-info", - "title": "Update the current user profile", + "title": "Update your profile", "href": "/sdk/android/user/user-profile/set-self-info", "type": "page", "children": [], @@ -4447,6 +4447,16 @@ "children": [], "minIndex": 140, "navigationTitle": "Refresh subscribed user status" + }, + { + "id": "user/online-status/unsubscribe-users-online-status", + "segment": "unsubscribe-users-online-status", + "title": "Unsubscribe from user status", + "href": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "type": "page", + "children": [], + "minIndex": 141, + "navigationTitle": "Unsubscribe from user status" } ], "minIndex": 139 @@ -4475,7 +4485,7 @@ "href": "/sdk/android/user/friends/get-friend-list-page", "type": "page", "children": [], - "minIndex": 141, + "minIndex": 142, "navigationTitle": "Get the friend list" }, { @@ -4485,7 +4495,7 @@ "href": "/sdk/android/user/friends/search-friends", "type": "page", "children": [], - "minIndex": 142, + "minIndex": 143, "navigationTitle": "Search friends" }, { @@ -4495,7 +4505,7 @@ "href": "/sdk/android/user/friends/get-friends-info", "type": "page", "children": [], - "minIndex": 143, + "minIndex": 144, "navigationTitle": "Get friend profiles" }, { @@ -4505,7 +4515,7 @@ "href": "/sdk/android/user/friends/check-friend", "type": "page", "children": [], - "minIndex": 144, + "minIndex": 145, "navigationTitle": "Check friendship status" }, { @@ -4515,7 +4525,7 @@ "href": "/sdk/android/user/friends/update-friends", "type": "page", "children": [], - "minIndex": 145, + "minIndex": 146, "navigationTitle": "Update friend information" }, { @@ -4525,7 +4535,7 @@ "href": "/sdk/android/user/friends/delete-friend", "type": "page", "children": [], - "minIndex": 146, + "minIndex": 147, "navigationTitle": "Delete a friend" }, { @@ -4542,7 +4552,7 @@ "href": "/sdk/android/user/friend-applications/add-friend", "type": "page", "children": [], - "minIndex": 147, + "minIndex": 148, "navigationTitle": "Send a friend application" }, { @@ -4552,7 +4562,7 @@ "href": "/sdk/android/user/friend-applications/get-recv-friend-application-list", "type": "page", "children": [], - "minIndex": 148, + "minIndex": 149, "navigationTitle": "Get received friend applications" }, { @@ -4562,7 +4572,7 @@ "href": "/sdk/android/user/friend-applications/get-send-friend-application-list", "type": "page", "children": [], - "minIndex": 149, + "minIndex": 150, "navigationTitle": "Get sent friend applications" }, { @@ -4572,7 +4582,7 @@ "href": "/sdk/android/user/friend-applications/accept-friend-application", "type": "page", "children": [], - "minIndex": 150, + "minIndex": 151, "navigationTitle": "Accept a friend application" }, { @@ -4582,14 +4592,14 @@ "href": "/sdk/android/user/friend-applications/refuse-friend-application", "type": "page", "children": [], - "minIndex": 151, + "minIndex": 152, "navigationTitle": "Reject a friend application" } ], - "minIndex": 147 + "minIndex": 148 } ], - "minIndex": 141 + "minIndex": 142 }, { "id": "user/blacklist", @@ -4605,7 +4615,7 @@ "href": "/sdk/android/user/blacklist/get-blacklist", "type": "page", "children": [], - "minIndex": 152 + "minIndex": 153 }, { "id": "user/blacklist/add-blacklist", @@ -4614,7 +4624,7 @@ "href": "/sdk/android/user/blacklist/add-blacklist", "type": "page", "children": [], - "minIndex": 153, + "minIndex": 154, "navigationTitle": "Block a user" }, { @@ -4624,14 +4634,14 @@ "href": "/sdk/android/user/blacklist/remove-blacklist", "type": "page", "children": [], - "minIndex": 154, + "minIndex": 155, "navigationTitle": "Unblock a user" } ], - "minIndex": 152 + "minIndex": 153 } ], - "minIndex": 141 + "minIndex": 142 }, { "id": "conversation", @@ -4647,7 +4657,7 @@ "href": "/sdk/android/conversation/overview-conversation", "type": "page", "children": [], - "minIndex": 155 + "minIndex": 156 }, { "id": "conversation/retrieving-conversations", @@ -4663,7 +4673,7 @@ "href": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", "type": "page", "children": [], - "minIndex": 156, + "minIndex": 157, "navigationTitle": "Open a conversation" }, { @@ -4673,7 +4683,7 @@ "href": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", "type": "page", "children": [], - "minIndex": 157, + "minIndex": 158, "navigationTitle": "Resolve a conversation ID" }, { @@ -4683,7 +4693,7 @@ "href": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", "type": "page", "children": [], - "minIndex": 158, + "minIndex": 159, "navigationTitle": "Get conversations by ID" }, { @@ -4693,10 +4703,10 @@ "href": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", "type": "page", "children": [], - "minIndex": 159 + "minIndex": 160 } ], - "minIndex": 156 + "minIndex": 157 }, { "id": "conversation/conversation-list-and-drafts", @@ -4712,7 +4722,7 @@ "href": "/sdk/android/conversation/managing-conversations/pin-conversation", "type": "page", "children": [], - "minIndex": 160, + "minIndex": 161, "navigationTitle": "Pin or unpin a conversation" }, { @@ -4722,7 +4732,7 @@ "href": "/sdk/android/conversation/managing-conversations/set-conversation-extension", "type": "page", "children": [], - "minIndex": 161, + "minIndex": 162, "navigationTitle": "Set conversation extra data" }, { @@ -4732,10 +4742,10 @@ "href": "/sdk/android/conversation/managing-conversations/set-conversation-draft", "type": "page", "children": [], - "minIndex": 162 + "minIndex": 163 } ], - "minIndex": 160 + "minIndex": 161 }, { "id": "conversation/message-reception-and-reminders", @@ -4751,7 +4761,7 @@ "href": "/sdk/android/conversation/managing-conversations/set-message-receive-option", "type": "page", "children": [], - "minIndex": 163, + "minIndex": 164, "navigationTitle": "Set conversation message reception" }, { @@ -4761,7 +4771,7 @@ "href": "/sdk/android/conversation/managing-conversations/clear-group-mentions", "type": "page", "children": [], - "minIndex": 164, + "minIndex": 165, "navigationTitle": "Reset group mention status" }, { @@ -4771,7 +4781,7 @@ "href": "/sdk/android/conversation/managing-conversations/mark-conversation-read", "type": "page", "children": [], - "minIndex": 165, + "minIndex": 166, "navigationTitle": "Mark a conversation as read" }, { @@ -4781,11 +4791,11 @@ "href": "/sdk/android/conversation/managing-conversations/get-total-unread-count", "type": "page", "children": [], - "minIndex": 166, + "minIndex": 167, "navigationTitle": "Track the total unread count" } ], - "minIndex": 163 + "minIndex": 164 }, { "id": "conversation/message-retention-and-privacy", @@ -4801,7 +4811,7 @@ "href": "/sdk/android/conversation/managing-conversations/set-private-chat", "type": "page", "children": [], - "minIndex": 167, + "minIndex": 168, "navigationTitle": "Enable or disable burn after reading" }, { @@ -4811,7 +4821,7 @@ "href": "/sdk/android/conversation/managing-conversations/set-burn-duration", "type": "page", "children": [], - "minIndex": 168, + "minIndex": 169, "navigationTitle": "Set the burn duration" }, { @@ -4821,11 +4831,11 @@ "href": "/sdk/android/conversation/managing-conversations/set-message-destruct", "type": "page", "children": [], - "minIndex": 169, + "minIndex": 170, "navigationTitle": "Schedule server message deletion" } ], - "minIndex": 167 + "minIndex": 168 }, { "id": "conversation/hiding-and-deleting-conversations", @@ -4841,7 +4851,7 @@ "href": "/sdk/android/conversation/managing-conversations/hide-a-conversation", "type": "page", "children": [], - "minIndex": 170 + "minIndex": 171 }, { "id": "conversation/managing-conversations/delete-conversation-with-messages", @@ -4850,7 +4860,7 @@ "href": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", "type": "page", "children": [], - "minIndex": 171, + "minIndex": 172, "navigationTitle": "Delete a conversation and its messages" }, { @@ -4860,14 +4870,14 @@ "href": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", "type": "page", "children": [], - "minIndex": 172, + "minIndex": 173, "navigationTitle": "Clear messages in a conversation" } ], - "minIndex": 170 + "minIndex": 171 } ], - "minIndex": 155 + "minIndex": 156 }, { "id": "group", @@ -4883,7 +4893,7 @@ "href": "/sdk/android/group/overview-group", "type": "page", "children": [], - "minIndex": 173, + "minIndex": 174, "navigationTitle": "Group overview" }, { @@ -4900,7 +4910,7 @@ "href": "/sdk/android/group/create-group", "type": "page", "children": [], - "minIndex": 174, + "minIndex": 175, "navigationTitle": "Create a group" }, { @@ -4910,7 +4920,7 @@ "href": "/sdk/android/group/update-group-profile", "type": "page", "children": [], - "minIndex": 175, + "minIndex": 176, "navigationTitle": "Update group profile" }, { @@ -4920,7 +4930,7 @@ "href": "/sdk/android/group/set-group-announcement", "type": "page", "children": [], - "minIndex": 176, + "minIndex": 177, "navigationTitle": "Publish a group announcement" }, { @@ -4930,11 +4940,11 @@ "href": "/sdk/android/group/set-group-extension", "type": "page", "children": [], - "minIndex": 177, + "minIndex": 178, "navigationTitle": "Set group extra data" } ], - "minIndex": 174 + "minIndex": 175 }, { "id": "group/permissions", @@ -4950,7 +4960,7 @@ "href": "/sdk/android/group/set-group-join-verification", "type": "page", "children": [], - "minIndex": 178, + "minIndex": 179, "navigationTitle": "Set group join verification" }, { @@ -4960,7 +4970,7 @@ "href": "/sdk/android/group/set-group-member-profile-access", "type": "page", "children": [], - "minIndex": 179, + "minIndex": 180, "navigationTitle": "Set member profile access" }, { @@ -4970,7 +4980,7 @@ "href": "/sdk/android/group/set-group-member-friend-permission", "type": "page", "children": [], - "minIndex": 180, + "minIndex": 181, "navigationTitle": "Set member friend request permission" }, { @@ -4980,11 +4990,11 @@ "href": "/sdk/android/group/change-group-mute", "type": "page", "children": [], - "minIndex": 181, + "minIndex": 182, "navigationTitle": "Change group mute status" } ], - "minIndex": 178 + "minIndex": 179 }, { "id": "group/joining-and-leaving", @@ -5000,7 +5010,7 @@ "href": "/sdk/android/group/join-group", "type": "page", "children": [], - "minIndex": 182, + "minIndex": 183, "navigationTitle": "Apply to join a group" }, { @@ -5010,7 +5020,7 @@ "href": "/sdk/android/group/quit-group", "type": "page", "children": [], - "minIndex": 183, + "minIndex": 184, "navigationTitle": "Leave a group" }, { @@ -5020,11 +5030,11 @@ "href": "/sdk/android/group/dismiss-group", "type": "page", "children": [], - "minIndex": 184, + "minIndex": 185, "navigationTitle": "Dismiss a group" } ], - "minIndex": 182 + "minIndex": 183 }, { "id": "group/retrieving-groups", @@ -5040,7 +5050,7 @@ "href": "/sdk/android/group/retrieving-groups/get-specified-groups-info", "type": "page", "children": [], - "minIndex": 185, + "minIndex": 186, "navigationTitle": "Get group information" }, { @@ -5050,7 +5060,7 @@ "href": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", "type": "page", "children": [], - "minIndex": 186, + "minIndex": 187, "navigationTitle": "Get joined groups by page" }, { @@ -5060,7 +5070,7 @@ "href": "/sdk/android/group/retrieving-groups/is-join-group", "type": "page", "children": [], - "minIndex": 187, + "minIndex": 188, "navigationTitle": "Check group membership" }, { @@ -5070,11 +5080,11 @@ "href": "/sdk/android/group/retrieving-groups/search-groups", "type": "page", "children": [], - "minIndex": 188, + "minIndex": 189, "navigationTitle": "Search groups" } ], - "minIndex": 185 + "minIndex": 186 }, { "id": "group/group-applications", @@ -5090,7 +5100,7 @@ "href": "/sdk/android/group/group-applications/overview-group-applications", "type": "page", "children": [], - "minIndex": 189, + "minIndex": 190, "navigationTitle": "Group applications overview" }, { @@ -5100,7 +5110,7 @@ "href": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", "type": "page", "children": [], - "minIndex": 190, + "minIndex": 191, "navigationTitle": "Get received group applications" }, { @@ -5110,7 +5120,7 @@ "href": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", "type": "page", "children": [], - "minIndex": 191, + "minIndex": 192, "navigationTitle": "Get sent group applications" }, { @@ -5120,7 +5130,7 @@ "href": "/sdk/android/group/group-applications/accept-group-application", "type": "page", "children": [], - "minIndex": 192, + "minIndex": 193, "navigationTitle": "Accept a group application" }, { @@ -5130,11 +5140,11 @@ "href": "/sdk/android/group/group-applications/refuse-group-application", "type": "page", "children": [], - "minIndex": 193, + "minIndex": 194, "navigationTitle": "Reject a group application" } ], - "minIndex": 189 + "minIndex": 190 }, { "id": "group/retrieving-group-members", @@ -5150,47 +5160,47 @@ "href": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", "type": "page", "children": [], - "minIndex": 194, + "minIndex": 195, "navigationTitle": "Group member queries overview" }, { "id": "group/retrieving-group-members/get-group-member-list", "segment": "get-group-member-list", - "title": "List group members", + "title": "Get group members", "href": "/sdk/android/group/retrieving-group-members/get-group-member-list", "type": "page", "children": [], - "minIndex": 195, + "minIndex": 196, "navigationTitle": "Get group members" }, { "id": "group/retrieving-group-members/get-specified-group-members-info", "segment": "get-specified-group-members-info", - "title": "Get specified group member profiles", + "title": "Get group member profiles", "href": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", "type": "page", "children": [], - "minIndex": 196, + "minIndex": 197, "navigationTitle": "Get group member profiles" }, { "id": "group/retrieving-group-members/get-users-in-group", "segment": "get-users-in-group", - "title": "Check group membership", + "title": "Check users in a group", "href": "/sdk/android/group/retrieving-group-members/get-users-in-group", "type": "page", "children": [], - "minIndex": 197, + "minIndex": 198, "navigationTitle": "Check users in a group" }, { "id": "group/retrieving-group-members/get-group-member-owner-and-admin", "segment": "get-group-member-owner-and-admin", - "title": "Get the group owner and administrators", + "title": "Get group owners and admins", "href": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", "type": "page", "children": [], - "minIndex": 198, + "minIndex": 199, "navigationTitle": "Get group owners and admins" }, { @@ -5200,11 +5210,11 @@ "href": "/sdk/android/group/retrieving-group-members/search-group-members", "type": "page", "children": [], - "minIndex": 199, + "minIndex": 200, "navigationTitle": "Search group members" } ], - "minIndex": 194 + "minIndex": 195 }, { "id": "group/managing-group-members", @@ -5220,7 +5230,7 @@ "href": "/sdk/android/group/managing-group-members/invite-user-to-group", "type": "page", "children": [], - "minIndex": 200, + "minIndex": 201, "navigationTitle": "Invite users to a group" }, { @@ -5230,17 +5240,17 @@ "href": "/sdk/android/group/managing-group-members/kick-group-member", "type": "page", "children": [], - "minIndex": 201, + "minIndex": 202, "navigationTitle": "Remove group members" }, { "id": "group/managing-group-members/set-group-member-nickname", "segment": "set-group-member-nickname", - "title": "Update a member’s group nickname", + "title": "Update a group nickname", "href": "/sdk/android/group/managing-group-members/set-group-member-nickname", "type": "page", "children": [], - "minIndex": 202, + "minIndex": 203, "navigationTitle": "Update a group nickname" }, { @@ -5250,27 +5260,27 @@ "href": "/sdk/android/group/managing-group-members/set-group-member-role-level", "type": "page", "children": [], - "minIndex": 203, + "minIndex": 204, "navigationTitle": "Manage group administrators" }, { "id": "group/managing-group-members/set-group-member-avatar", "segment": "set-group-member-avatar", - "title": "Update a group member’s avatar", + "title": "Update a group member avatar", "href": "/sdk/android/group/managing-group-members/set-group-member-avatar", "type": "page", "children": [], - "minIndex": 204, + "minIndex": 205, "navigationTitle": "Update a group member avatar" }, { "id": "group/managing-group-members/set-group-member-extension", "segment": "set-group-member-extension", - "title": "Set a group member extension", + "title": "Set group member extra data", "href": "/sdk/android/group/managing-group-members/set-group-member-extension", "type": "page", "children": [], - "minIndex": 205, + "minIndex": 206, "navigationTitle": "Set group member extra data" }, { @@ -5280,7 +5290,7 @@ "href": "/sdk/android/group/managing-group-members/transfer-group-owner", "type": "page", "children": [], - "minIndex": 206, + "minIndex": 207, "navigationTitle": "Transfer group ownership" }, { @@ -5290,14 +5300,14 @@ "href": "/sdk/android/group/managing-group-members/change-group-member-mute", "type": "page", "children": [], - "minIndex": 207, + "minIndex": 208, "navigationTitle": "Mute or unmute a group member" } ], - "minIndex": 200 + "minIndex": 201 } ], - "minIndex": 173 + "minIndex": 174 }, { "id": "message", @@ -5309,11 +5319,11 @@ { "id": "message/overview-message", "segment": "overview-message", - "title": "Overview", + "title": "Message overview", "href": "/sdk/android/message/overview-message", "type": "page", "children": [], - "minIndex": 208 + "minIndex": 209 }, { "id": "message/creating-messages", @@ -5329,16 +5339,16 @@ "href": "/sdk/android/message/creating-messages/create-text-message", "type": "page", "children": [], - "minIndex": 209 + "minIndex": 210 }, { "id": "message/creating-messages/create-text-at-message", "segment": "create-text-at-message", - "title": "Create an @ message", + "title": "Create a mention message", "href": "/sdk/android/message/creating-messages/create-text-at-message", "type": "page", "children": [], - "minIndex": 210 + "minIndex": 211 }, { "id": "message/creating-messages/create-custom-message", @@ -5347,34 +5357,56 @@ "href": "/sdk/android/message/creating-messages/create-custom-message", "type": "page", "children": [], - "minIndex": 211 + "minIndex": 212 + }, + { + "id": "message/creating-messages/create-image-message", + "segment": "create-image-message", + "title": "Create an image message", + "href": "/sdk/android/message/creating-messages/create-image-message", + "type": "page", + "children": [], + "minIndex": 213, + "navigationTitle": "Create an image message" }, { "id": "message/creating-messages/create-image-message-by-file", "segment": "create-image-message-by-file", - "title": "Create an image message from a file", + "title": "Create an image message from a local path", "href": "/sdk/android/message/creating-messages/create-image-message-by-file", "type": "page", "children": [], - "minIndex": 212 + "minIndex": 214, + "navigationTitle": "Create an image message from a path" }, { "id": "message/creating-messages/create-image-message-by-url", "segment": "create-image-message-by-url", - "title": "Create an image message from a URL", + "title": "Create an image message from URLs", "href": "/sdk/android/message/creating-messages/create-image-message-by-url", "type": "page", "children": [], - "minIndex": 213 + "minIndex": 215 + }, + { + "id": "message/creating-messages/create-sound-message", + "segment": "create-sound-message", + "title": "Create an audio message", + "href": "/sdk/android/message/creating-messages/create-sound-message", + "type": "page", + "children": [], + "minIndex": 216, + "navigationTitle": "Create an audio message" }, { "id": "message/creating-messages/create-sound-message-by-file", "segment": "create-sound-message-by-file", - "title": "Create an audio message from a file", + "title": "Create an audio message from a local path", "href": "/sdk/android/message/creating-messages/create-sound-message-by-file", "type": "page", "children": [], - "minIndex": 214 + "minIndex": 217, + "navigationTitle": "Create an audio message from a path" }, { "id": "message/creating-messages/create-sound-message-by-url", @@ -5383,16 +5415,27 @@ "href": "/sdk/android/message/creating-messages/create-sound-message-by-url", "type": "page", "children": [], - "minIndex": 215 + "minIndex": 218 + }, + { + "id": "message/creating-messages/create-video-message", + "segment": "create-video-message", + "title": "Create a video message", + "href": "/sdk/android/message/creating-messages/create-video-message", + "type": "page", + "children": [], + "minIndex": 219, + "navigationTitle": "Create a video message" }, { "id": "message/creating-messages/create-video-message-by-file", "segment": "create-video-message-by-file", - "title": "Create a video message from files", + "title": "Create a video message from local paths", "href": "/sdk/android/message/creating-messages/create-video-message-by-file", "type": "page", "children": [], - "minIndex": 216 + "minIndex": 220, + "navigationTitle": "Create a video message from a path" }, { "id": "message/creating-messages/create-video-message-by-url", @@ -5401,16 +5444,27 @@ "href": "/sdk/android/message/creating-messages/create-video-message-by-url", "type": "page", "children": [], - "minIndex": 217 + "minIndex": 221 + }, + { + "id": "message/creating-messages/create-file-message", + "segment": "create-file-message", + "title": "Create a file message", + "href": "/sdk/android/message/creating-messages/create-file-message", + "type": "page", + "children": [], + "minIndex": 222, + "navigationTitle": "Create a file message" }, { "id": "message/creating-messages/create-file-message-by-file", "segment": "create-file-message-by-file", - "title": "Create a file message from a file", + "title": "Create a file message from a local path", "href": "/sdk/android/message/creating-messages/create-file-message-by-file", "type": "page", "children": [], - "minIndex": 218 + "minIndex": 223, + "navigationTitle": "Create a file message from a path" }, { "id": "message/creating-messages/create-file-message-by-url", @@ -5419,7 +5473,7 @@ "href": "/sdk/android/message/creating-messages/create-file-message-by-url", "type": "page", "children": [], - "minIndex": 219 + "minIndex": 224 }, { "id": "message/creating-messages/create-card-message", @@ -5428,7 +5482,7 @@ "href": "/sdk/android/message/creating-messages/create-card-message", "type": "page", "children": [], - "minIndex": 220 + "minIndex": 225 }, { "id": "message/creating-messages/create-location-message", @@ -5437,7 +5491,7 @@ "href": "/sdk/android/message/creating-messages/create-location-message", "type": "page", "children": [], - "minIndex": 221 + "minIndex": 226 }, { "id": "message/creating-messages/create-face-message", @@ -5446,7 +5500,7 @@ "href": "/sdk/android/message/creating-messages/create-face-message", "type": "page", "children": [], - "minIndex": 222 + "minIndex": 227 }, { "id": "message/creating-messages/create-quote-message", @@ -5455,7 +5509,27 @@ "href": "/sdk/android/message/creating-messages/create-quote-message", "type": "page", "children": [], - "minIndex": 223 + "minIndex": 228 + }, + { + "id": "message/creating-messages/create-advanced-text-message", + "segment": "create-advanced-text-message", + "title": "Create a rich-text message", + "href": "/sdk/android/message/creating-messages/create-advanced-text-message", + "type": "page", + "children": [], + "minIndex": 229, + "navigationTitle": "Create rich text" + }, + { + "id": "message/creating-messages/create-advanced-quote-message", + "segment": "create-advanced-quote-message", + "title": "Create a rich-text reply", + "href": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "type": "page", + "children": [], + "minIndex": 230, + "navigationTitle": "Create a rich reply" }, { "id": "message/creating-messages/create-forward-message", @@ -5464,19 +5538,19 @@ "href": "/sdk/android/message/creating-messages/create-forward-message", "type": "page", "children": [], - "minIndex": 224 + "minIndex": 231 }, { "id": "message/creating-messages/create-merger-message", "segment": "create-merger-message", - "title": "Create a merged forward message", + "title": "Create a merged message", "href": "/sdk/android/message/creating-messages/create-merger-message", "type": "page", "children": [], - "minIndex": 225 + "minIndex": 232 } ], - "minIndex": 209 + "minIndex": 210 }, { "id": "message/sending-messages", @@ -5492,16 +5566,16 @@ "href": "/sdk/android/message/sending-messages/send-message", "type": "page", "children": [], - "minIndex": 226 + "minIndex": 233 }, { "id": "message/sending-messages/send-message-not-oss", "segment": "send-message-not-oss", - "title": "Send an uploaded media message", + "title": "Send a message without OSS", "href": "/sdk/android/message/sending-messages/send-message-not-oss", "type": "page", "children": [], - "minIndex": 227 + "minIndex": 234 }, { "id": "message/sending-messages/set-msg-send-progress-listener", @@ -5510,11 +5584,11 @@ "href": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", "type": "page", "children": [], - "minIndex": 228, + "minIndex": 235, "navigationTitle": "Track message sending progress" } ], - "minIndex": 226 + "minIndex": 233 }, { "id": "message/receiving-messages/receive-messages", @@ -5523,7 +5597,7 @@ "href": "/sdk/android/message/receiving-messages/receive-messages", "type": "page", "children": [], - "minIndex": 229 + "minIndex": 236 }, { "id": "message/receiving-messages/receive-custom-business-messages", @@ -5532,7 +5606,7 @@ "href": "/sdk/android/message/receiving-messages/receive-custom-business-messages", "type": "page", "children": [], - "minIndex": 230 + "minIndex": 237 }, { "id": "message/retrieving-messages", @@ -5544,20 +5618,20 @@ { "id": "message/retrieving-messages/load-older-messages", "segment": "load-older-messages", - "title": "Load message history", + "title": "Load older messages", "href": "/sdk/android/message/retrieving-messages/load-older-messages", "type": "page", "children": [], - "minIndex": 231 + "minIndex": 238 }, { "id": "message/retrieving-messages/load-newer-messages", "segment": "load-newer-messages", - "title": "Load message history in reverse", + "title": "Load newer messages", "href": "/sdk/android/message/retrieving-messages/load-newer-messages", "type": "page", "children": [], - "minIndex": 232 + "minIndex": 239 }, { "id": "message/retrieving-messages/find-messages-by-id", @@ -5566,7 +5640,17 @@ "href": "/sdk/android/message/retrieving-messages/find-messages-by-id", "type": "page", "children": [], - "minIndex": 233 + "minIndex": 240 + }, + { + "id": "message/retrieving-messages/load-message-context", + "segment": "load-message-context", + "title": "Load message context", + "href": "/sdk/android/message/retrieving-messages/load-message-context", + "type": "page", + "children": [], + "minIndex": 241, + "navigationTitle": "Load message context" }, { "id": "message/searching-messages/search-messages", @@ -5575,19 +5659,40 @@ "href": "/sdk/android/message/searching-messages/search-messages", "type": "page", "children": [], - "minIndex": 234 + "minIndex": 242 } ], - "minIndex": 231 + "minIndex": 238 }, { - "id": "message/composing-messages/update-typing-status", - "segment": "update-typing-status", - "title": "Report typing status", - "href": "/sdk/android/message/composing-messages/update-typing-status", - "type": "page", - "children": [], - "minIndex": 235 + "id": "message/composing-messages", + "segment": "composing-messages", + "title": "Composing messages", + "href": null, + "type": "folder", + "children": [ + { + "id": "message/composing-messages/update-typing-status", + "segment": "update-typing-status", + "title": "Update typing status", + "href": "/sdk/android/message/composing-messages/update-typing-status", + "type": "page", + "children": [], + "minIndex": 243, + "navigationTitle": "Update typing status" + }, + { + "id": "message/composing-messages/get-typing-status", + "segment": "get-typing-status", + "title": "Retrieve typing status", + "href": "/sdk/android/message/composing-messages/get-typing-status", + "type": "page", + "children": [], + "minIndex": 244, + "navigationTitle": "Get typing status" + } + ], + "minIndex": 243 }, { "id": "message/managing-messages", @@ -5603,7 +5708,7 @@ "href": "/sdk/android/message/managing-messages/delete-local-message", "type": "page", "children": [], - "minIndex": 236 + "minIndex": 245 }, { "id": "message/managing-messages/delete-saved-messages", @@ -5612,7 +5717,18 @@ "href": "/sdk/android/message/managing-messages/delete-saved-messages", "type": "page", "children": [], - "minIndex": 237 + "minIndex": 246, + "navigationTitle": "Delete saved messages" + }, + { + "id": "message/managing-messages/delete-user-messages", + "segment": "delete-user-messages", + "title": "Delete all messages from a user in a group chat", + "href": "/sdk/android/message/managing-messages/delete-user-messages", + "type": "page", + "children": [], + "minIndex": 247, + "navigationTitle": "Delete messages from a user" }, { "id": "message/managing-messages/revoke-a-message", @@ -5621,7 +5737,7 @@ "href": "/sdk/android/message/managing-messages/revoke-a-message", "type": "page", "children": [], - "minIndex": 238 + "minIndex": 248 }, { "id": "message/managing-messages/modify-a-message", @@ -5630,16 +5746,16 @@ "href": "/sdk/android/message/managing-messages/modify-a-message", "type": "page", "children": [], - "minIndex": 239 + "minIndex": 249 }, { "id": "message/managing-messages/get-pinned-messages", "segment": "get-pinned-messages", - "title": "Get pinned messages in a conversation", + "title": "View pinned messages", "href": "/sdk/android/message/managing-messages/get-pinned-messages", "type": "page", "children": [], - "minIndex": 240 + "minIndex": 250 }, { "id": "message/managing-messages/set-message-pinned", @@ -5648,16 +5764,16 @@ "href": "/sdk/android/message/managing-messages/set-message-pinned", "type": "page", "children": [], - "minIndex": 241 + "minIndex": 251 }, { "id": "message/managing-messages/insert-local-single-message", "segment": "insert-local-single-message", - "title": "Insert a local one-to-one message", + "title": "Insert a local direct message", "href": "/sdk/android/message/managing-messages/insert-local-single-message", "type": "page", "children": [], - "minIndex": 242 + "minIndex": 252 }, { "id": "message/managing-messages/insert-local-group-message", @@ -5666,7 +5782,7 @@ "href": "/sdk/android/message/managing-messages/insert-local-group-message", "type": "page", "children": [], - "minIndex": 243 + "minIndex": 253 }, { "id": "message/managing-messages/clear-all-local-messages", @@ -5675,31 +5791,61 @@ "href": "/sdk/android/message/managing-messages/clear-all-local-messages", "type": "page", "children": [], - "minIndex": 244 + "minIndex": 254 }, { "id": "message/managing-messages/clear-all-messages", "segment": "clear-all-messages", - "title": "Clear local and server messages", + "title": "Clear all saved messages", "href": "/sdk/android/message/managing-messages/clear-all-messages", "type": "page", "children": [], - "minIndex": 245 + "minIndex": 255 }, { "id": "message/managing-messages/set-message-local-ex", "segment": "set-message-local-ex", - "title": "Set a local message extension", + "title": "Set local message extensions", "href": "/sdk/android/message/managing-messages/set-message-local-ex", "type": "page", "children": [], - "minIndex": 246 + "minIndex": 256 } ], - "minIndex": 236 + "minIndex": 245 + }, + { + "id": "message/group-message-read-status", + "segment": "group-message-read-status", + "title": "Group message read status", + "href": null, + "type": "folder", + "children": [ + { + "id": "message/managing-read-status/send-group-read-receipts", + "segment": "send-group-read-receipts", + "title": "Report group messages as read", + "href": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "type": "page", + "children": [], + "minIndex": 257, + "navigationTitle": "Send group read receipts" + }, + { + "id": "message/managing-read-status/get-group-message-readers", + "segment": "get-group-message-readers", + "title": "Get members who read a group message", + "href": "/sdk/android/message/managing-read-status/get-group-message-readers", + "type": "page", + "children": [], + "minIndex": 258, + "navigationTitle": "View group message readers" + } + ], + "minIndex": 257 } ], - "minIndex": 208 + "minIndex": 209 }, { "id": "file-uploads", @@ -5715,7 +5861,7 @@ "href": "/sdk/android/file-uploads/track-file-upload-progress", "type": "page", "children": [], - "minIndex": 247, + "minIndex": 259, "navigationTitle": "Track file upload progress" }, { @@ -5725,11 +5871,11 @@ "href": "/sdk/android/file-uploads/upload-file", "type": "page", "children": [], - "minIndex": 248, + "minIndex": 260, "navigationTitle": "Upload a file" } ], - "minIndex": 247 + "minIndex": 259 }, { "id": "calling", @@ -5745,7 +5891,7 @@ "href": "/sdk/android/calling/overview-calling", "type": "page", "children": [], - "minIndex": 249 + "minIndex": 261 }, { "id": "calling/managing-calls", @@ -5761,7 +5907,7 @@ "href": "/sdk/android/calling/managing-calls/start-single-call", "type": "page", "children": [], - "minIndex": 250, + "minIndex": 262, "navigationTitle": "Start a one-to-one call" }, { @@ -5771,7 +5917,7 @@ "href": "/sdk/android/calling/managing-calls/start-group-call", "type": "page", "children": [], - "minIndex": 251, + "minIndex": 263, "navigationTitle": "Start a group call" }, { @@ -5781,7 +5927,7 @@ "href": "/sdk/android/calling/managing-calls/accept-call", "type": "page", "children": [], - "minIndex": 252, + "minIndex": 264, "navigationTitle": "Accept a call" }, { @@ -5791,7 +5937,7 @@ "href": "/sdk/android/calling/managing-calls/reject-call", "type": "page", "children": [], - "minIndex": 253, + "minIndex": 265, "navigationTitle": "Reject a call" }, { @@ -5801,17 +5947,17 @@ "href": "/sdk/android/calling/managing-calls/cancel-call", "type": "page", "children": [], - "minIndex": 254, + "minIndex": 266, "navigationTitle": "Cancel a call invitation" }, { "id": "calling/managing-calls/hang-up-call", "segment": "hang-up-call", - "title": "End a call", + "title": "Hang up a call", "href": "/sdk/android/calling/managing-calls/hang-up-call", "type": "page", "children": [], - "minIndex": 255, + "minIndex": 267, "navigationTitle": "Hang up a call" }, { @@ -5821,11 +5967,11 @@ "href": "/sdk/android/calling/managing-calls/handle-call-events", "type": "page", "children": [], - "minIndex": 256, + "minIndex": 268, "navigationTitle": "Handle call events" } ], - "minIndex": 250 + "minIndex": 262 }, { "id": "calling/retrieving-call-information", @@ -5837,11 +5983,11 @@ { "id": "calling/retrieving-call-information/restore-pending-invitation", "segment": "restore-pending-invitation", - "title": "Restore a pending call invitation", + "title": "Restore a pending invitation", "href": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", "type": "page", "children": [], - "minIndex": 257, + "minIndex": 269, "navigationTitle": "Restore a pending invitation" }, { @@ -5851,21 +5997,21 @@ "href": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", "type": "page", "children": [], - "minIndex": 258, + "minIndex": 270, "navigationTitle": "Get a group call room" }, { "id": "calling/retrieving-call-information/get-token-by-room-id", "segment": "get-token-by-room-id", - "title": "Get a call room token", + "title": "Get room credentials", "href": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", "type": "page", "children": [], - "minIndex": 259, + "minIndex": 271, "navigationTitle": "Get room credentials" } ], - "minIndex": 257 + "minIndex": 269 }, { "id": "calling/sending-custom-signals/send-a-custom-signal", @@ -5874,10 +6020,10 @@ "href": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", "type": "page", "children": [], - "minIndex": 260 + "minIndex": 272 } ], - "minIndex": 249 + "minIndex": 261 }, { "id": "events/overview-events", @@ -5886,20 +6032,20 @@ "href": "/sdk/android/events/overview-events", "type": "page", "children": [], - "minIndex": 261, + "minIndex": 273, "navigationTitle": "Events" }, { "id": "logger", "segment": "logger", - "title": "Logger", + "title": "Logging", "href": "/sdk/android/logger", "type": "page", "children": [], - "minIndex": 262 + "minIndex": 274 } ], - "pageCount": 134, + "pageCount": 146, "sidebarExpansion": "active-path" }, { diff --git a/src/generated/routes.json b/src/generated/routes.json index 63039829aa..2998f2f101 100644 --- a/src/generated/routes.json +++ b/src/generated/routes.json @@ -4307,7 +4307,7 @@ "relativePath": "sdk/android/getting-started/environment-specific-implementation", "sourcePath": "/sdk/android/getting-started/environment-specific-implementation", "title": "Integrate for Android", - "description": "Integrate, configure, and initialize OpenIM Android SDK while handling permissions, data storage, and application lifecycle boundaries.", + "description": "Add OpenIM Android SDK dependencies and network permissions to an Android project.", "product": "sdk", "version": "v4", "platform": "android", @@ -4343,7 +4343,7 @@ "relativePath": "sdk/android/getting-started/send-first-message", "sourcePath": "/sdk/android/getting-started/send-first-message", "title": "Send your first message", - "description": "Verify the first one-to-one or group text-message send and receive flow in an Android application.", + "description": "Send and verify the first one-to-one text message in an Android application.", "product": "sdk", "version": "v4", "platform": "android", @@ -4414,7 +4414,7 @@ "path": "/sdk/android/user/user-profile/set-self-info", "relativePath": "sdk/android/user/user-profile/set-self-info", "sourcePath": "/sdk/android/user/user-profile/set-self-info", - "title": "Update the current user profile", + "title": "Update your profile", "description": "Use setSelfInfo() to update the nickname, avatar, or extension data of the current user.", "product": "sdk", "version": "v4", @@ -4483,6 +4483,24 @@ }, { "id": 1364, + "path": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "relativePath": "sdk/android/user/online-status/unsubscribe-users-online-status", + "sourcePath": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "title": "Unsubscribe from user status", + "description": "Use unsubscribeOnlineUsersStatus to cancel online-status subscriptions for specified users.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2734, + "contentFile": "content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx", + "navOrder": 141 + }, + { + "id": 1365, "path": "/sdk/android/user/friends/get-friend-list-page", "relativePath": "sdk/android/user/friends/get-friend-list-page", "sourcePath": "/sdk/android/user/friends/get-friend-list-page", @@ -4495,12 +4513,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2734, + "sourceIndex": 2735, "contentFile": "content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx", - "navOrder": 141 + "navOrder": 142 }, { - "id": 1365, + "id": 1366, "path": "/sdk/android/user/friends/search-friends", "relativePath": "sdk/android/user/friends/search-friends", "sourcePath": "/sdk/android/user/friends/search-friends", @@ -4513,12 +4531,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2735, + "sourceIndex": 2736, "contentFile": "content/docs/chat/sdk/android/user/friends/search-friends.mdx", - "navOrder": 142 + "navOrder": 143 }, { - "id": 1366, + "id": 1367, "path": "/sdk/android/user/friends/get-friends-info", "relativePath": "sdk/android/user/friends/get-friends-info", "sourcePath": "/sdk/android/user/friends/get-friends-info", @@ -4531,12 +4549,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2736, + "sourceIndex": 2737, "contentFile": "content/docs/chat/sdk/android/user/friends/get-friends-info.mdx", - "navOrder": 143 + "navOrder": 144 }, { - "id": 1367, + "id": 1368, "path": "/sdk/android/user/friends/check-friend", "relativePath": "sdk/android/user/friends/check-friend", "sourcePath": "/sdk/android/user/friends/check-friend", @@ -4549,12 +4567,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2737, + "sourceIndex": 2738, "contentFile": "content/docs/chat/sdk/android/user/friends/check-friend.mdx", - "navOrder": 144 + "navOrder": 145 }, { - "id": 1368, + "id": 1369, "path": "/sdk/android/user/friends/update-friends", "relativePath": "sdk/android/user/friends/update-friends", "sourcePath": "/sdk/android/user/friends/update-friends", @@ -4567,12 +4585,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2738, + "sourceIndex": 2739, "contentFile": "content/docs/chat/sdk/android/user/friends/update-friends.mdx", - "navOrder": 145 + "navOrder": 146 }, { - "id": 1369, + "id": 1370, "path": "/sdk/android/user/friends/delete-friend", "relativePath": "sdk/android/user/friends/delete-friend", "sourcePath": "/sdk/android/user/friends/delete-friend", @@ -4585,12 +4603,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2739, + "sourceIndex": 2740, "contentFile": "content/docs/chat/sdk/android/user/friends/delete-friend.mdx", - "navOrder": 146 + "navOrder": 147 }, { - "id": 1370, + "id": 1371, "path": "/sdk/android/user/friend-applications/add-friend", "relativePath": "sdk/android/user/friend-applications/add-friend", "sourcePath": "/sdk/android/user/friend-applications/add-friend", @@ -4603,12 +4621,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2740, + "sourceIndex": 2741, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx", - "navOrder": 147 + "navOrder": 148 }, { - "id": 1371, + "id": 1372, "path": "/sdk/android/user/friend-applications/get-recv-friend-application-list", "relativePath": "sdk/android/user/friend-applications/get-recv-friend-application-list", "sourcePath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", @@ -4621,12 +4639,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2741, + "sourceIndex": 2742, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx", - "navOrder": 148 + "navOrder": 149 }, { - "id": 1372, + "id": 1373, "path": "/sdk/android/user/friend-applications/get-send-friend-application-list", "relativePath": "sdk/android/user/friend-applications/get-send-friend-application-list", "sourcePath": "/sdk/android/user/friend-applications/get-send-friend-application-list", @@ -4639,12 +4657,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2742, + "sourceIndex": 2743, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx", - "navOrder": 149 + "navOrder": 150 }, { - "id": 1373, + "id": 1374, "path": "/sdk/android/user/friend-applications/accept-friend-application", "relativePath": "sdk/android/user/friend-applications/accept-friend-application", "sourcePath": "/sdk/android/user/friend-applications/accept-friend-application", @@ -4657,12 +4675,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2743, + "sourceIndex": 2744, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx", - "navOrder": 150 + "navOrder": 151 }, { - "id": 1374, + "id": 1375, "path": "/sdk/android/user/friend-applications/refuse-friend-application", "relativePath": "sdk/android/user/friend-applications/refuse-friend-application", "sourcePath": "/sdk/android/user/friend-applications/refuse-friend-application", @@ -4675,12 +4693,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2744, + "sourceIndex": 2745, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx", - "navOrder": 151 + "navOrder": 152 }, { - "id": 1375, + "id": 1376, "path": "/sdk/android/user/blacklist/get-blacklist", "relativePath": "sdk/android/user/blacklist/get-blacklist", "sourcePath": "/sdk/android/user/blacklist/get-blacklist", @@ -4693,12 +4711,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2745, + "sourceIndex": 2746, "contentFile": "content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx", - "navOrder": 152 + "navOrder": 153 }, { - "id": 1376, + "id": 1377, "path": "/sdk/android/user/blacklist/add-blacklist", "relativePath": "sdk/android/user/blacklist/add-blacklist", "sourcePath": "/sdk/android/user/blacklist/add-blacklist", @@ -4711,12 +4729,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2746, + "sourceIndex": 2747, "contentFile": "content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx", - "navOrder": 153 + "navOrder": 154 }, { - "id": 1377, + "id": 1378, "path": "/sdk/android/user/blacklist/remove-blacklist", "relativePath": "sdk/android/user/blacklist/remove-blacklist", "sourcePath": "/sdk/android/user/blacklist/remove-blacklist", @@ -4729,12 +4747,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2747, + "sourceIndex": 2748, "contentFile": "content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx", - "navOrder": 154 + "navOrder": 155 }, { - "id": 1378, + "id": 1379, "path": "/sdk/android/conversation/overview-conversation", "relativePath": "sdk/android/conversation/overview-conversation", "sourcePath": "/sdk/android/conversation/overview-conversation", @@ -4747,12 +4765,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2748, + "sourceIndex": 2749, "contentFile": "content/docs/chat/sdk/android/conversation/overview-conversation.mdx", - "navOrder": 155 + "navOrder": 156 }, { - "id": 1379, + "id": 1380, "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", "relativePath": "sdk/android/conversation/retrieving-conversations/get-conversation-by-target", "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", @@ -4765,12 +4783,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2749, + "sourceIndex": 2750, "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx", - "navOrder": 156 + "navOrder": 157 }, { - "id": 1380, + "id": 1381, "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", "relativePath": "sdk/android/conversation/retrieving-conversations/get-conversation-id", "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", @@ -4783,12 +4801,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2750, + "sourceIndex": 2751, "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx", - "navOrder": 157 + "navOrder": 158 }, { - "id": 1381, + "id": 1382, "path": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", "relativePath": "sdk/android/conversation/retrieving-conversations/get-conversations-by-id", "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", @@ -4801,12 +4819,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2751, + "sourceIndex": 2752, "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx", - "navOrder": 158 + "navOrder": 159 }, { - "id": 1382, + "id": 1383, "path": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", "relativePath": "sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", "sourcePath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", @@ -4819,12 +4837,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2752, + "sourceIndex": 2753, "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx", - "navOrder": 159 + "navOrder": 160 }, { - "id": 1383, + "id": 1384, "path": "/sdk/android/conversation/managing-conversations/pin-conversation", "relativePath": "sdk/android/conversation/managing-conversations/pin-conversation", "sourcePath": "/sdk/android/conversation/managing-conversations/pin-conversation", @@ -4837,12 +4855,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2753, + "sourceIndex": 2754, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx", - "navOrder": 160 + "navOrder": 161 }, { - "id": 1384, + "id": 1385, "path": "/sdk/android/conversation/managing-conversations/set-conversation-extension", "relativePath": "sdk/android/conversation/managing-conversations/set-conversation-extension", "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", @@ -4855,12 +4873,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2754, + "sourceIndex": 2755, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx", - "navOrder": 161 + "navOrder": 162 }, { - "id": 1385, + "id": 1386, "path": "/sdk/android/conversation/managing-conversations/set-conversation-draft", "relativePath": "sdk/android/conversation/managing-conversations/set-conversation-draft", "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", @@ -4873,12 +4891,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2755, + "sourceIndex": 2756, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx", - "navOrder": 162 + "navOrder": 163 }, { - "id": 1386, + "id": 1387, "path": "/sdk/android/conversation/managing-conversations/set-message-receive-option", "relativePath": "sdk/android/conversation/managing-conversations/set-message-receive-option", "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", @@ -4891,12 +4909,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2756, + "sourceIndex": 2757, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx", - "navOrder": 163 + "navOrder": 164 }, { - "id": 1387, + "id": 1388, "path": "/sdk/android/conversation/managing-conversations/clear-group-mentions", "relativePath": "sdk/android/conversation/managing-conversations/clear-group-mentions", "sourcePath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", @@ -4909,12 +4927,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2757, + "sourceIndex": 2758, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx", - "navOrder": 164 + "navOrder": 165 }, { - "id": 1388, + "id": 1389, "path": "/sdk/android/conversation/managing-conversations/mark-conversation-read", "relativePath": "sdk/android/conversation/managing-conversations/mark-conversation-read", "sourcePath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", @@ -4927,12 +4945,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2758, + "sourceIndex": 2759, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx", - "navOrder": 165 + "navOrder": 166 }, { - "id": 1389, + "id": 1390, "path": "/sdk/android/conversation/managing-conversations/get-total-unread-count", "relativePath": "sdk/android/conversation/managing-conversations/get-total-unread-count", "sourcePath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", @@ -4945,12 +4963,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2759, + "sourceIndex": 2760, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx", - "navOrder": 166 + "navOrder": 167 }, { - "id": 1390, + "id": 1391, "path": "/sdk/android/conversation/managing-conversations/set-private-chat", "relativePath": "sdk/android/conversation/managing-conversations/set-private-chat", "sourcePath": "/sdk/android/conversation/managing-conversations/set-private-chat", @@ -4963,12 +4981,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2760, + "sourceIndex": 2761, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx", - "navOrder": 167 + "navOrder": 168 }, { - "id": 1391, + "id": 1392, "path": "/sdk/android/conversation/managing-conversations/set-burn-duration", "relativePath": "sdk/android/conversation/managing-conversations/set-burn-duration", "sourcePath": "/sdk/android/conversation/managing-conversations/set-burn-duration", @@ -4981,12 +4999,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2761, + "sourceIndex": 2762, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx", - "navOrder": 168 + "navOrder": 169 }, { - "id": 1392, + "id": 1393, "path": "/sdk/android/conversation/managing-conversations/set-message-destruct", "relativePath": "sdk/android/conversation/managing-conversations/set-message-destruct", "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-destruct", @@ -4999,12 +5017,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2762, + "sourceIndex": 2763, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx", - "navOrder": 169 + "navOrder": 170 }, { - "id": 1393, + "id": 1394, "path": "/sdk/android/conversation/managing-conversations/hide-a-conversation", "relativePath": "sdk/android/conversation/managing-conversations/hide-a-conversation", "sourcePath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", @@ -5017,12 +5035,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2763, + "sourceIndex": 2764, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx", - "navOrder": 170 + "navOrder": 171 }, { - "id": 1394, + "id": 1395, "path": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", "relativePath": "sdk/android/conversation/managing-conversations/delete-conversation-with-messages", "sourcePath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", @@ -5035,12 +5053,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2764, + "sourceIndex": 2765, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx", - "navOrder": 171 + "navOrder": 172 }, { - "id": 1395, + "id": 1396, "path": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", "relativePath": "sdk/android/conversation/managing-conversations/clear-conversation-messages", "sourcePath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", @@ -5053,1629 +5071,1827 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2765, + "sourceIndex": 2766, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx", - "navOrder": 172 + "navOrder": 173 }, { - "id": 1396, + "id": 1397, "path": "/sdk/android/group/overview-group", "relativePath": "sdk/android/group/overview-group", "sourcePath": "/sdk/android/group/overview-group", "title": "Group overview", - "description": "OpenIM Android SDK guide for Group overview.", + "description": "Learn how group profiles, members, applications, and group events are organized in the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2766, + "status": "published", + "sourceIndex": 2767, "contentFile": "content/docs/chat/sdk/android/group/overview-group.mdx", - "navOrder": 173 + "navOrder": 174 }, { - "id": 1397, + "id": 1398, "path": "/sdk/android/group/create-group", "relativePath": "sdk/android/group/create-group", "sourcePath": "/sdk/android/group/create-group", "title": "Create a group", - "description": "OpenIM Android SDK guide for Create a group.", + "description": "Use createGroup to create a group profile and specify its initial members, administrators, and owner.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2767, + "status": "published", + "sourceIndex": 2768, "contentFile": "content/docs/chat/sdk/android/group/create-group.mdx", - "navOrder": 174 + "navOrder": 175 }, { - "id": 1398, + "id": 1399, "path": "/sdk/android/group/update-group-profile", "relativePath": "sdk/android/group/update-group-profile", "sourcePath": "/sdk/android/group/update-group-profile", "title": "Update group profile", - "description": "OpenIM Android SDK guide for Update group profile.", + "description": "Use setGroupInfo to update a group name, avatar, introduction, and other profile fields.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2768, + "status": "published", + "sourceIndex": 2769, "contentFile": "content/docs/chat/sdk/android/group/update-group-profile.mdx", - "navOrder": 175 + "navOrder": 176 }, { - "id": 1399, + "id": 1400, "path": "/sdk/android/group/set-group-announcement", "relativePath": "sdk/android/group/set-group-announcement", "sourcePath": "/sdk/android/group/set-group-announcement", "title": "Publish a group announcement", - "description": "OpenIM Android SDK guide for Publish a group announcement.", + "description": "Publish or update a group announcement through GroupInfo.notification.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2769, + "status": "published", + "sourceIndex": 2770, "contentFile": "content/docs/chat/sdk/android/group/set-group-announcement.mdx", - "navOrder": 176 + "navOrder": 177 }, { - "id": 1400, + "id": 1401, "path": "/sdk/android/group/set-group-extension", "relativePath": "sdk/android/group/set-group-extension", "sourcePath": "/sdk/android/group/set-group-extension", "title": "Set group extra data", - "description": "OpenIM Android SDK guide for Set group extra data.", + "description": "Store application-defined group data in GroupInfo.ex.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2770, + "status": "published", + "sourceIndex": 2771, "contentFile": "content/docs/chat/sdk/android/group/set-group-extension.mdx", - "navOrder": 177 + "navOrder": 178 }, { - "id": 1401, + "id": 1402, "path": "/sdk/android/group/set-group-join-verification", "relativePath": "sdk/android/group/set-group-join-verification", "sourcePath": "/sdk/android/group/set-group-join-verification", "title": "Set group join verification", - "description": "OpenIM Android SDK guide for Set group join verification.", + "description": "Configure verification rules for group applications and invitations through GroupInfo.needVerification.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2771, + "status": "published", + "sourceIndex": 2772, "contentFile": "content/docs/chat/sdk/android/group/set-group-join-verification.mdx", - "navOrder": 178 + "navOrder": 179 }, { - "id": 1402, + "id": 1403, "path": "/sdk/android/group/set-group-member-profile-access", "relativePath": "sdk/android/group/set-group-member-profile-access", "sourcePath": "/sdk/android/group/set-group-member-profile-access", "title": "Set member profile access", - "description": "OpenIM Android SDK guide for Set member profile access.", + "description": "Use GroupInfo.lookMemberInfo to control whether users can view member profiles through the group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2772, + "status": "published", + "sourceIndex": 2773, "contentFile": "content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx", - "navOrder": 179 + "navOrder": 180 }, { - "id": 1403, + "id": 1404, "path": "/sdk/android/group/set-group-member-friend-permission", "relativePath": "sdk/android/group/set-group-member-friend-permission", "sourcePath": "/sdk/android/group/set-group-member-friend-permission", "title": "Set member friend request permission", - "description": "OpenIM Android SDK guide for Set member friend request permission.", + "description": "Use GroupInfo.applyMemberFriend to control whether users can send friend requests from the group member list.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2773, + "status": "published", + "sourceIndex": 2774, "contentFile": "content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx", - "navOrder": 180 + "navOrder": 181 }, { - "id": 1404, + "id": 1405, "path": "/sdk/android/group/change-group-mute", "relativePath": "sdk/android/group/change-group-mute", "sourcePath": "/sdk/android/group/change-group-mute", "title": "Change group mute status", - "description": "OpenIM Android SDK guide for Change group mute status.", + "description": "Use changeGroupMute to enable or disable mute-all mode for a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2774, + "status": "published", + "sourceIndex": 2775, "contentFile": "content/docs/chat/sdk/android/group/change-group-mute.mdx", - "navOrder": 181 + "navOrder": 182 }, { - "id": 1405, + "id": 1406, "path": "/sdk/android/group/join-group", "relativePath": "sdk/android/group/join-group", "sourcePath": "/sdk/android/group/join-group", "title": "Apply to join a group", - "description": "OpenIM Android SDK guide for Apply to join a group.", + "description": "Use joinGroup to submit a group application or join request.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2775, + "status": "published", + "sourceIndex": 2776, "contentFile": "content/docs/chat/sdk/android/group/join-group.mdx", - "navOrder": 182 + "navOrder": 183 }, { - "id": 1406, + "id": 1407, "path": "/sdk/android/group/quit-group", "relativePath": "sdk/android/group/quit-group", "sourcePath": "/sdk/android/group/quit-group", "title": "Leave a group", - "description": "OpenIM Android SDK guide for Leave a group.", + "description": "Use quitGroup to remove the current signed-in user from a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2776, + "status": "published", + "sourceIndex": 2777, "contentFile": "content/docs/chat/sdk/android/group/quit-group.mdx", - "navOrder": 183 + "navOrder": 184 }, { - "id": 1407, + "id": 1408, "path": "/sdk/android/group/dismiss-group", "relativePath": "sdk/android/group/dismiss-group", "sourcePath": "/sdk/android/group/dismiss-group", "title": "Dismiss a group", - "description": "OpenIM Android SDK guide for Dismiss a group.", + "description": "Use dismissGroup to dismiss a group that the current user is allowed to manage.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2777, + "status": "published", + "sourceIndex": 2778, "contentFile": "content/docs/chat/sdk/android/group/dismiss-group.mdx", - "navOrder": 184 + "navOrder": 185 }, { - "id": 1408, + "id": 1409, "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", "relativePath": "sdk/android/group/retrieving-groups/get-specified-groups-info", "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", "title": "Get group information", - "description": "OpenIM Android SDK guide for Get group information.", + "description": "Use getGroupsInfo to retrieve the latest profiles for specified groups.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2778, + "status": "published", + "sourceIndex": 2779, "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx", - "navOrder": 185 + "navOrder": 186 }, { - "id": 1409, + "id": 1410, "path": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", "relativePath": "sdk/android/group/retrieving-groups/get-joined-group-list-page", "sourcePath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", "title": "Get joined groups by page", - "description": "OpenIM Android SDK guide for Get joined groups by page.", + "description": "Use getJoinedGroupListPage to retrieve the current account’s joined groups by page.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2779, + "status": "published", + "sourceIndex": 2780, "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx", - "navOrder": 186 + "navOrder": 187 }, { - "id": 1410, + "id": 1411, "path": "/sdk/android/group/retrieving-groups/is-join-group", "relativePath": "sdk/android/group/retrieving-groups/is-join-group", "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", "title": "Check group membership", - "description": "OpenIM Android SDK guide for Check group membership.", + "description": "Use isJoinGroup to determine whether the current signed-in user has joined a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2780, + "status": "published", + "sourceIndex": 2781, "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx", - "navOrder": 187 + "navOrder": 188 }, { - "id": 1411, + "id": 1412, "path": "/sdk/android/group/retrieving-groups/search-groups", "relativePath": "sdk/android/group/retrieving-groups/search-groups", "sourcePath": "/sdk/android/group/retrieving-groups/search-groups", "title": "Search groups", - "description": "OpenIM Android SDK guide for Search groups.", + "description": "Use searchGroups to search locally available groups by group ID or name.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2781, + "status": "published", + "sourceIndex": 2782, "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx", - "navOrder": 188 + "navOrder": 189 }, { - "id": 1412, + "id": 1413, "path": "/sdk/android/group/group-applications/overview-group-applications", "relativePath": "sdk/android/group/group-applications/overview-group-applications", "sourcePath": "/sdk/android/group/group-applications/overview-group-applications", "title": "Group applications overview", - "description": "OpenIM Android SDK guide for Group applications overview.", + "description": "Understand received and sent group applications, handling results, and state events in the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2782, + "status": "published", + "sourceIndex": 2783, "contentFile": "content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx", - "navOrder": 189 + "navOrder": 190 }, { - "id": 1413, + "id": 1414, "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", "relativePath": "sdk/android/group/group-applications/get-group-application-list-as-recipient", "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", "title": "Get received group applications", - "description": "OpenIM Android SDK guide for Get received group applications.", + "description": "Use getRecvGroupApplicationList to retrieve group applications that the current user can handle.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2783, + "status": "published", + "sourceIndex": 2784, "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx", - "navOrder": 190 + "navOrder": 191 }, { - "id": 1414, + "id": 1415, "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", "relativePath": "sdk/android/group/group-applications/get-group-application-list-as-applicant", "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", "title": "Get sent group applications", - "description": "OpenIM Android SDK guide for Get sent group applications.", + "description": "Use getSendGroupApplicationList to retrieve group applications sent by the current user.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2784, + "status": "published", + "sourceIndex": 2785, "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx", - "navOrder": 191 + "navOrder": 192 }, { - "id": 1415, + "id": 1416, "path": "/sdk/android/group/group-applications/accept-group-application", "relativePath": "sdk/android/group/group-applications/accept-group-application", "sourcePath": "/sdk/android/group/group-applications/accept-group-application", "title": "Accept a group application", - "description": "OpenIM Android SDK guide for Accept a group application.", + "description": "Use acceptGroupApplication to accept a user’s application to join a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2785, + "status": "published", + "sourceIndex": 2786, "contentFile": "content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx", - "navOrder": 192 + "navOrder": 193 }, { - "id": 1416, + "id": 1417, "path": "/sdk/android/group/group-applications/refuse-group-application", "relativePath": "sdk/android/group/group-applications/refuse-group-application", "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", "title": "Reject a group application", - "description": "OpenIM Android SDK guide for Reject a group application.", + "description": "Use refuseGroupApplication to reject a user’s application to join a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2786, + "status": "published", + "sourceIndex": 2787, "contentFile": "content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx", - "navOrder": 193 + "navOrder": 194 }, { - "id": 1417, + "id": 1418, "path": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", "relativePath": "sdk/android/group/retrieving-group-members/overview-retrieving-group-members", "sourcePath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", "title": "Group member queries overview", - "description": "OpenIM Android SDK guide for Group member queries overview.", + "description": "Understand group member lists, specified member profiles, and membership queries in the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2787, + "status": "published", + "sourceIndex": 2788, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx", - "navOrder": 194 + "navOrder": 195 }, { - "id": 1418, + "id": 1419, "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", "relativePath": "sdk/android/group/retrieving-group-members/get-group-member-list", "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", - "title": "List group members", - "description": "OpenIM Android SDK guide for List group members.", + "title": "Get group members", + "description": "Use getGroupMemberList to retrieve group members by role and page.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2788, + "status": "published", + "sourceIndex": 2789, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx", - "navOrder": 195 + "navOrder": 196 }, { - "id": 1419, + "id": 1420, "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", "relativePath": "sdk/android/group/retrieving-group-members/get-specified-group-members-info", "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", - "title": "Get specified group member profiles", - "description": "OpenIM Android SDK guide for Get specified group member profiles.", + "title": "Get group member profiles", + "description": "Use getGroupMembersInfo to retrieve specified users’ profiles within a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2789, + "status": "published", + "sourceIndex": 2790, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx", - "navOrder": 196 + "navOrder": 197 }, { - "id": 1420, + "id": 1421, "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", "relativePath": "sdk/android/group/retrieving-group-members/get-users-in-group", "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", - "title": "Check group membership", - "description": "OpenIM Android SDK guide for Check group membership.", + "title": "Check users in a group", + "description": "Use getUsersInGroup to select the users who are currently members of a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2790, + "status": "published", + "sourceIndex": 2791, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx", - "navOrder": 197 + "navOrder": 198 }, { - "id": 1421, + "id": 1422, "path": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", "relativePath": "sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", - "title": "Get the group owner and administrators", - "description": "OpenIM Android SDK guide for Get the group owner and administrators.", + "title": "Get group owners and admins", + "description": "Use getGroupMemberOwnerAndAdmin to retrieve the group owner and administrator profiles.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2791, + "status": "published", + "sourceIndex": 2792, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx", - "navOrder": 198 + "navOrder": 199 }, { - "id": 1422, + "id": 1423, "path": "/sdk/android/group/retrieving-group-members/search-group-members", "relativePath": "sdk/android/group/retrieving-group-members/search-group-members", "sourcePath": "/sdk/android/group/retrieving-group-members/search-group-members", "title": "Search group members", - "description": "OpenIM Android SDK guide for Search group members.", + "description": "Use searchGroupMembers to search group members by user ID or group nickname.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2792, + "status": "published", + "sourceIndex": 2793, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx", - "navOrder": 199 + "navOrder": 200 }, { - "id": 1423, + "id": 1424, "path": "/sdk/android/group/managing-group-members/invite-user-to-group", "relativePath": "sdk/android/group/managing-group-members/invite-user-to-group", "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", "title": "Invite users to a group", - "description": "OpenIM Android SDK guide for Invite users to a group.", + "description": "Use inviteUserToGroup to invite a list of users to a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2793, + "status": "published", + "sourceIndex": 2794, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx", - "navOrder": 200 + "navOrder": 201 }, { - "id": 1424, + "id": 1425, "path": "/sdk/android/group/managing-group-members/kick-group-member", "relativePath": "sdk/android/group/managing-group-members/kick-group-member", "sourcePath": "/sdk/android/group/managing-group-members/kick-group-member", "title": "Remove group members", - "description": "OpenIM Android SDK guide for Remove group members.", + "description": "Use kickGroupMember to remove specified members from a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2794, + "status": "published", + "sourceIndex": 2795, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx", - "navOrder": 201 + "navOrder": 202 }, { - "id": 1425, + "id": 1426, "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", "relativePath": "sdk/android/group/managing-group-members/set-group-member-nickname", "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", - "title": "Update a member’s group nickname", - "description": "OpenIM Android SDK guide for Update a member’s group nickname.", + "title": "Update a group nickname", + "description": "Use SetGroupMemberInfo.nickname to update a member’s display name in a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2795, + "status": "published", + "sourceIndex": 2796, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx", - "navOrder": 202 + "navOrder": 203 }, { - "id": 1426, + "id": 1427, "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", "relativePath": "sdk/android/group/managing-group-members/set-group-member-role-level", "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", "title": "Manage group administrators", - "description": "OpenIM Android SDK guide for Manage group administrators.", + "description": "Use SetGroupMemberInfo.roleLevel to change a member’s role in a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2796, + "status": "published", + "sourceIndex": 2797, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx", - "navOrder": 203 + "navOrder": 204 }, { - "id": 1427, + "id": 1428, "path": "/sdk/android/group/managing-group-members/set-group-member-avatar", "relativePath": "sdk/android/group/managing-group-members/set-group-member-avatar", "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-avatar", - "title": "Update a group member’s avatar", - "description": "OpenIM Android SDK guide for Update a group member’s avatar.", + "title": "Update a group member avatar", + "description": "Use SetGroupMemberInfo.faceURL to update the avatar displayed for a member in a group.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2797, + "status": "published", + "sourceIndex": 2798, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx", - "navOrder": 204 + "navOrder": 205 }, { - "id": 1428, + "id": 1429, "path": "/sdk/android/group/managing-group-members/set-group-member-extension", "relativePath": "sdk/android/group/managing-group-members/set-group-member-extension", "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-extension", - "title": "Set a group member extension", - "description": "OpenIM Android SDK guide for Set a group member extension.", + "title": "Set group member extra data", + "description": "Store application-defined group member data in SetGroupMemberInfo.ex.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2798, + "status": "published", + "sourceIndex": 2799, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx", - "navOrder": 205 + "navOrder": 206 }, { - "id": 1429, + "id": 1430, "path": "/sdk/android/group/managing-group-members/transfer-group-owner", "relativePath": "sdk/android/group/managing-group-members/transfer-group-owner", "sourcePath": "/sdk/android/group/managing-group-members/transfer-group-owner", "title": "Transfer group ownership", - "description": "OpenIM Android SDK guide for Transfer group ownership.", + "description": "Use transferGroupOwner to transfer group ownership to a specified member.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2799, + "status": "published", + "sourceIndex": 2800, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx", - "navOrder": 206 + "navOrder": 207 }, { - "id": 1430, + "id": 1431, "path": "/sdk/android/group/managing-group-members/change-group-member-mute", "relativePath": "sdk/android/group/managing-group-members/change-group-member-mute", "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", "title": "Mute or unmute a group member", - "description": "OpenIM Android SDK guide for Mute or unmute a group member.", + "description": "Use changeGroupMemberMute to set the mute duration for a specified group member.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2800, + "status": "published", + "sourceIndex": 2801, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx", - "navOrder": 207 + "navOrder": 208 }, { - "id": 1431, + "id": 1432, "path": "/sdk/android/message/overview-message", "relativePath": "sdk/android/message/overview-message", "sourcePath": "/sdk/android/message/overview-message", - "title": "Overview", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "title": "Message overview", + "description": "Learn about the Android SDK Message model, message lifecycle, and message listener.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 2801, + "status": "published", + "sourceIndex": 2802, "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx", - "navOrder": 208 + "navOrder": 209 }, { - "id": 1432, + "id": 1433, "path": "/sdk/android/message/creating-messages/create-text-message", "relativePath": "sdk/android/message/creating-messages/create-text-message", "sourcePath": "/sdk/android/message/creating-messages/create-text-message", "title": "Create a text message", - "description": "OpenIM Android SDK guide for Create a text message.", + "description": "Use createTextMessage to create a text Message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2802, + "status": "published", + "sourceIndex": 2803, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx", - "navOrder": 209 + "navOrder": 210 }, { - "id": 1433, + "id": 1434, "path": "/sdk/android/message/creating-messages/create-text-at-message", "relativePath": "sdk/android/message/creating-messages/create-text-at-message", "sourcePath": "/sdk/android/message/creating-messages/create-text-at-message", - "title": "Create an @ message", - "description": "OpenIM Android SDK guide for Create an @ message.", + "title": "Create a mention message", + "description": "Use createTextAtMessage to create a text message that mentions group members.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2803, + "status": "published", + "sourceIndex": 2804, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx", - "navOrder": 210 + "navOrder": 211 }, { - "id": 1434, + "id": 1435, "path": "/sdk/android/message/creating-messages/create-custom-message", "relativePath": "sdk/android/message/creating-messages/create-custom-message", "sourcePath": "/sdk/android/message/creating-messages/create-custom-message", "title": "Create a custom message", - "description": "OpenIM Android SDK guide for Create a custom message.", + "description": "Use createCustomMessage to carry application-defined JSON content.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2804, + "status": "published", + "sourceIndex": 2805, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx", - "navOrder": 211 + "navOrder": 212 }, { - "id": 1435, + "id": 1436, + "path": "/sdk/android/message/creating-messages/create-image-message", + "relativePath": "sdk/android/message/creating-messages/create-image-message", + "sourcePath": "/sdk/android/message/creating-messages/create-image-message", + "title": "Create an image message", + "description": "Create an image message from a path relative to the SDK data directory.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2806, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx", + "navOrder": 213 + }, + { + "id": 1437, "path": "/sdk/android/message/creating-messages/create-image-message-by-file", "relativePath": "sdk/android/message/creating-messages/create-image-message-by-file", "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-file", - "title": "Create an image message from a file", - "description": "OpenIM Android SDK guide for Create an image message from a file.", + "title": "Create an image message from a local path", + "description": "Create an image message from an absolute path.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2805, + "status": "published", + "sourceIndex": 2807, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx", - "navOrder": 212 + "navOrder": 214 }, { - "id": 1436, + "id": 1438, "path": "/sdk/android/message/creating-messages/create-image-message-by-url", "relativePath": "sdk/android/message/creating-messages/create-image-message-by-url", "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-url", - "title": "Create an image message from a URL", - "description": "OpenIM Android SDK guide for Create an image message from a URL.", + "title": "Create an image message from URLs", + "description": "Use createImageMessageByURL to create an image message for an uploaded resource.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2806, + "status": "published", + "sourceIndex": 2808, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx", - "navOrder": 213 + "navOrder": 215 }, { - "id": 1437, + "id": 1439, + "path": "/sdk/android/message/creating-messages/create-sound-message", + "relativePath": "sdk/android/message/creating-messages/create-sound-message", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message", + "title": "Create an audio message", + "description": "Create an audio message from a path relative to the SDK data directory.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2809, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx", + "navOrder": 216 + }, + { + "id": 1440, "path": "/sdk/android/message/creating-messages/create-sound-message-by-file", "relativePath": "sdk/android/message/creating-messages/create-sound-message-by-file", "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-file", - "title": "Create an audio message from a file", - "description": "OpenIM Android SDK guide for Create an audio message from a file.", + "title": "Create an audio message from a local path", + "description": "Create an audio message from an absolute path.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2807, + "status": "published", + "sourceIndex": 2810, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx", - "navOrder": 214 + "navOrder": 217 }, { - "id": 1438, + "id": 1441, "path": "/sdk/android/message/creating-messages/create-sound-message-by-url", "relativePath": "sdk/android/message/creating-messages/create-sound-message-by-url", "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-url", "title": "Create an audio message from a URL", - "description": "OpenIM Android SDK guide for Create an audio message from a URL.", + "description": "Use SoundElem to create an audio message for an uploaded resource.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2808, + "status": "published", + "sourceIndex": 2811, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx", - "navOrder": 215 + "navOrder": 218 }, { - "id": 1439, + "id": 1442, + "path": "/sdk/android/message/creating-messages/create-video-message", + "relativePath": "sdk/android/message/creating-messages/create-video-message", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message", + "title": "Create a video message", + "description": "Create a video message from paths relative to the SDK data directory.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2812, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx", + "navOrder": 219 + }, + { + "id": 1443, "path": "/sdk/android/message/creating-messages/create-video-message-by-file", "relativePath": "sdk/android/message/creating-messages/create-video-message-by-file", "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-file", - "title": "Create a video message from files", - "description": "OpenIM Android SDK guide for Create a video message from files.", + "title": "Create a video message from local paths", + "description": "Create a video message from absolute video and thumbnail paths.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2809, + "status": "published", + "sourceIndex": 2813, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx", - "navOrder": 216 + "navOrder": 220 }, { - "id": 1440, + "id": 1444, "path": "/sdk/android/message/creating-messages/create-video-message-by-url", "relativePath": "sdk/android/message/creating-messages/create-video-message-by-url", "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-url", "title": "Create a video message from URLs", - "description": "OpenIM Android SDK guide for Create a video message from URLs.", + "description": "Use VideoElem to create a video message for an uploaded resource.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2810, + "status": "published", + "sourceIndex": 2814, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx", - "navOrder": 217 + "navOrder": 221 }, { - "id": 1441, + "id": 1445, + "path": "/sdk/android/message/creating-messages/create-file-message", + "relativePath": "sdk/android/message/creating-messages/create-file-message", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message", + "title": "Create a file message", + "description": "Create a file message from a path relative to the SDK data directory.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2815, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx", + "navOrder": 222 + }, + { + "id": 1446, "path": "/sdk/android/message/creating-messages/create-file-message-by-file", "relativePath": "sdk/android/message/creating-messages/create-file-message-by-file", "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-file", - "title": "Create a file message from a file", - "description": "OpenIM Android SDK guide for Create a file message from a file.", + "title": "Create a file message from a local path", + "description": "Create a file message from an absolute path.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2811, + "status": "published", + "sourceIndex": 2816, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx", - "navOrder": 218 + "navOrder": 223 }, { - "id": 1442, + "id": 1447, "path": "/sdk/android/message/creating-messages/create-file-message-by-url", "relativePath": "sdk/android/message/creating-messages/create-file-message-by-url", "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-url", "title": "Create a file message from a URL", - "description": "OpenIM Android SDK guide for Create a file message from a URL.", + "description": "Use FileElem to create a file message for an uploaded resource.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2812, + "status": "published", + "sourceIndex": 2817, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx", - "navOrder": 219 + "navOrder": 224 }, { - "id": 1443, + "id": 1448, "path": "/sdk/android/message/creating-messages/create-card-message", "relativePath": "sdk/android/message/creating-messages/create-card-message", "sourcePath": "/sdk/android/message/creating-messages/create-card-message", "title": "Create a contact card message", - "description": "OpenIM Android SDK guide for Create a contact card message.", + "description": "Use createCardMessage to create a contact card message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2813, + "status": "published", + "sourceIndex": 2818, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx", - "navOrder": 220 + "navOrder": 225 }, { - "id": 1444, + "id": 1449, "path": "/sdk/android/message/creating-messages/create-location-message", "relativePath": "sdk/android/message/creating-messages/create-location-message", "sourcePath": "/sdk/android/message/creating-messages/create-location-message", "title": "Create a location message", - "description": "OpenIM Android SDK guide for Create a location message.", + "description": "Use createLocationMessage to create a message with coordinates and a location description.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2814, + "status": "published", + "sourceIndex": 2819, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx", - "navOrder": 221 + "navOrder": 226 }, { - "id": 1445, + "id": 1450, "path": "/sdk/android/message/creating-messages/create-face-message", "relativePath": "sdk/android/message/creating-messages/create-face-message", "sourcePath": "/sdk/android/message/creating-messages/create-face-message", "title": "Create an emoji message", - "description": "OpenIM Android SDK guide for Create an emoji message.", + "description": "Use createFaceMessage to create a custom emoji message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2815, + "status": "published", + "sourceIndex": 2820, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx", - "navOrder": 222 + "navOrder": 227 }, { - "id": 1446, + "id": 1451, "path": "/sdk/android/message/creating-messages/create-quote-message", "relativePath": "sdk/android/message/creating-messages/create-quote-message", "sourcePath": "/sdk/android/message/creating-messages/create-quote-message", "title": "Create a reply message", - "description": "OpenIM Android SDK guide for Create a reply message.", + "description": "Use createQuoteMessage to reply while quoting an existing message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2816, + "status": "published", + "sourceIndex": 2821, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx", - "navOrder": 223 + "navOrder": 228 }, { - "id": 1447, + "id": 1452, + "path": "/sdk/android/message/creating-messages/create-advanced-text-message", + "relativePath": "sdk/android/message/creating-messages/create-advanced-text-message", + "sourcePath": "/sdk/android/message/creating-messages/create-advanced-text-message", + "title": "Create a rich-text message", + "description": "Use createAdvancedTextMessage to create a rich-text message with structured entity ranges.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2822, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx", + "navOrder": 229 + }, + { + "id": 1453, + "path": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "relativePath": "sdk/android/message/creating-messages/create-advanced-quote-message", + "sourcePath": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "title": "Create a rich-text reply", + "description": "Use createAdvancedQuoteMessage to create a quoted reply with rich-text entities.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2823, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx", + "navOrder": 230 + }, + { + "id": 1454, "path": "/sdk/android/message/creating-messages/create-forward-message", "relativePath": "sdk/android/message/creating-messages/create-forward-message", "sourcePath": "/sdk/android/message/creating-messages/create-forward-message", "title": "Create a forwarded message", - "description": "OpenIM Android SDK guide for Create a forwarded message.", + "description": "Use createForwardMessage to create a forwarded copy of a message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2817, + "status": "published", + "sourceIndex": 2824, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx", - "navOrder": 224 + "navOrder": 231 }, { - "id": 1448, + "id": 1455, "path": "/sdk/android/message/creating-messages/create-merger-message", "relativePath": "sdk/android/message/creating-messages/create-merger-message", "sourcePath": "/sdk/android/message/creating-messages/create-merger-message", - "title": "Create a merged forward message", - "description": "OpenIM Android SDK guide for Create a merged forward message.", + "title": "Create a merged message", + "description": "Use createMergerMessage to combine multiple messages into one summary message.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2818, + "status": "published", + "sourceIndex": 2825, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx", - "navOrder": 225 + "navOrder": 232 }, { - "id": 1449, + "id": 1456, "path": "/sdk/android/message/sending-messages/send-message", "relativePath": "sdk/android/message/sending-messages/send-message", "sourcePath": "/sdk/android/message/sending-messages/send-message", "title": "Send a message", - "description": "OpenIM Android SDK guide for Send a message.", + "description": "Use sendMessage to send a Message to a one-to-one or group conversation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2819, + "status": "published", + "sourceIndex": 2826, "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message.mdx", - "navOrder": 226 + "navOrder": 233 }, { - "id": 1450, + "id": 1457, "path": "/sdk/android/message/sending-messages/send-message-not-oss", "relativePath": "sdk/android/message/sending-messages/send-message-not-oss", "sourcePath": "/sdk/android/message/sending-messages/send-message-not-oss", - "title": "Send an uploaded media message", - "description": "OpenIM Android SDK guide for Send an uploaded media message.", + "title": "Send a message without OSS", + "description": "Use sendMessageNotOss to send a media message whose resources were uploaded by your application.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2820, + "status": "published", + "sourceIndex": 2827, "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx", - "navOrder": 227 + "navOrder": 234 }, { - "id": 1451, + "id": 1458, "path": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", "relativePath": "sdk/android/message/sending-messages/set-msg-send-progress-listener", "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", "title": "Track message sending progress", - "description": "OpenIM Android SDK guide for Track message sending progress.", + "description": "Use the progress callback on OnMsgSendCallback to update media sending progress.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2821, + "status": "published", + "sourceIndex": 2828, "contentFile": "content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx", - "navOrder": 228 + "navOrder": 235 }, { - "id": 1452, + "id": 1459, "path": "/sdk/android/message/receiving-messages/receive-messages", "relativePath": "sdk/android/message/receiving-messages/receive-messages", "sourcePath": "/sdk/android/message/receiving-messages/receive-messages", "title": "Receive messages", - "description": "OpenIM Android SDK guide for Receive messages.", + "description": "Use OnAdvanceMsgListener to receive new, offline, and online-only messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2822, + "status": "published", + "sourceIndex": 2829, "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx", - "navOrder": 229 + "navOrder": 236 }, { - "id": 1453, + "id": 1460, "path": "/sdk/android/message/receiving-messages/receive-custom-business-messages", "relativePath": "sdk/android/message/receiving-messages/receive-custom-business-messages", "sourcePath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", "title": "Receive custom business messages", - "description": "OpenIM Android SDK guide for Receive custom business messages.", + "description": "Use setCustomBusinessListener to receive business callbacks that are separate from regular chat messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2823, + "status": "published", + "sourceIndex": 2830, "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx", - "navOrder": 230 + "navOrder": 237 }, { - "id": 1454, + "id": 1461, "path": "/sdk/android/message/retrieving-messages/load-older-messages", "relativePath": "sdk/android/message/retrieving-messages/load-older-messages", "sourcePath": "/sdk/android/message/retrieving-messages/load-older-messages", - "title": "Load message history", - "description": "OpenIM Android SDK guide for Load message history.", + "title": "Load older messages", + "description": "Use getAdvancedHistoryMessageList to load conversation history by page.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2824, + "status": "published", + "sourceIndex": 2831, "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx", - "navOrder": 231 + "navOrder": 238 }, { - "id": 1455, + "id": 1462, "path": "/sdk/android/message/retrieving-messages/load-newer-messages", "relativePath": "sdk/android/message/retrieving-messages/load-newer-messages", "sourcePath": "/sdk/android/message/retrieving-messages/load-newer-messages", - "title": "Load message history in reverse", - "description": "OpenIM Android SDK guide for Load message history in reverse.", + "title": "Load newer messages", + "description": "Use getAdvancedHistoryMessageListReverse to load messages after a starting point.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2825, + "status": "published", + "sourceIndex": 2832, "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx", - "navOrder": 232 + "navOrder": 239 }, { - "id": 1456, + "id": 1463, "path": "/sdk/android/message/retrieving-messages/find-messages-by-id", "relativePath": "sdk/android/message/retrieving-messages/find-messages-by-id", "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", "title": "Find messages by ID", - "description": "OpenIM Android SDK guide for Find messages by ID.", + "description": "Use findMessageList to retrieve message records with SearchParams.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2826, + "status": "published", + "sourceIndex": 2833, "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx", - "navOrder": 233 + "navOrder": 240 }, { - "id": 1457, + "id": 1464, + "path": "/sdk/android/message/retrieving-messages/load-message-context", + "relativePath": "sdk/android/message/retrieving-messages/load-message-context", + "sourcePath": "/sdk/android/message/retrieving-messages/load-message-context", + "title": "Load message context", + "description": "Retrieve messages before and after a specified message with the Android SDK.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2834, + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx", + "navOrder": 241 + }, + { + "id": 1465, "path": "/sdk/android/message/searching-messages/search-messages", "relativePath": "sdk/android/message/searching-messages/search-messages", "sourcePath": "/sdk/android/message/searching-messages/search-messages", "title": "Search messages", - "description": "OpenIM Android SDK guide for Search messages.", + "description": "Use searchLocalMessages to search messages synchronized to the current account’s local storage.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2827, + "status": "published", + "sourceIndex": 2835, "contentFile": "content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx", - "navOrder": 234 + "navOrder": 242 + }, + { + "id": 1466, + "path": "/sdk/android/message/composing-messages/update-typing-status", + "relativePath": "sdk/android/message/composing-messages/update-typing-status", + "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", + "title": "Update typing status", + "description": "Report the current conversation typing state with the Android SDK.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2836, + "contentFile": "content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx", + "navOrder": 243 }, { - "id": 1458, - "path": "/sdk/android/message/composing-messages/update-typing-status", - "relativePath": "sdk/android/message/composing-messages/update-typing-status", - "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", - "title": "Report typing status", - "description": "OpenIM Android SDK guide for Report typing status.", + "id": 1467, + "path": "/sdk/android/message/composing-messages/get-typing-status", + "relativePath": "sdk/android/message/composing-messages/get-typing-status", + "sourcePath": "/sdk/android/message/composing-messages/get-typing-status", + "title": "Retrieve typing status", + "description": "Use getInputState to retrieve a specified user’s current typing status in a conversation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2828, - "contentFile": "content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx", - "navOrder": 235 + "status": "published", + "sourceIndex": 2837, + "contentFile": "content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx", + "navOrder": 244 }, { - "id": 1459, + "id": 1468, "path": "/sdk/android/message/managing-messages/delete-local-message", "relativePath": "sdk/android/message/managing-messages/delete-local-message", "sourcePath": "/sdk/android/message/managing-messages/delete-local-message", "title": "Delete a local message", - "description": "OpenIM Android SDK guide for Delete a local message.", + "description": "Use deleteMessageFromLocalStorage to delete only the message copy on the current device.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2829, + "status": "published", + "sourceIndex": 2838, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx", - "navOrder": 236 + "navOrder": 245 }, { - "id": 1460, + "id": 1469, "path": "/sdk/android/message/managing-messages/delete-saved-messages", "relativePath": "sdk/android/message/managing-messages/delete-saved-messages", "sourcePath": "/sdk/android/message/managing-messages/delete-saved-messages", "title": "Delete messages in a batch", - "description": "OpenIM Android SDK guide for Delete messages in a batch.", + "description": "Delete multiple messages from one conversation for the current account with the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2830, + "status": "published", + "sourceIndex": 2839, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx", - "navOrder": 237 + "navOrder": 246 }, { - "id": 1461, + "id": 1470, + "path": "/sdk/android/message/managing-messages/delete-user-messages", + "relativePath": "sdk/android/message/managing-messages/delete-user-messages", + "sourcePath": "/sdk/android/message/managing-messages/delete-user-messages", + "title": "Delete all messages from a user in a group chat", + "description": "Delete every message sent by a specified user in a group chat with the Android SDK.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2840, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx", + "navOrder": 247 + }, + { + "id": 1471, "path": "/sdk/android/message/managing-messages/revoke-a-message", "relativePath": "sdk/android/message/managing-messages/revoke-a-message", "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", "title": "Revoke a message", - "description": "OpenIM Android SDK guide for Revoke a message.", + "description": "Revoke a sent message and handle revocation notifications received by other clients.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2831, + "status": "published", + "sourceIndex": 2841, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx", - "navOrder": 238 + "navOrder": 248 }, { - "id": 1462, + "id": 1472, "path": "/sdk/android/message/managing-messages/modify-a-message", "relativePath": "sdk/android/message/managing-messages/modify-a-message", "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", "title": "Modify a message", - "description": "OpenIM Android SDK guide for Modify a message.", + "description": "Modify supported message content and handle modification events received by other clients.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2832, + "status": "published", + "sourceIndex": 2842, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx", - "navOrder": 239 + "navOrder": 249 }, { - "id": 1463, + "id": 1473, "path": "/sdk/android/message/managing-messages/get-pinned-messages", "relativePath": "sdk/android/message/managing-messages/get-pinned-messages", "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", - "title": "Get pinned messages in a conversation", - "description": "OpenIM Android SDK guide for Get pinned messages in a conversation.", + "title": "View pinned messages", + "description": "Use getConversationPinnedMsgs to retrieve pinned messages in a conversation.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2833, + "status": "published", + "sourceIndex": 2843, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx", - "navOrder": 240 + "navOrder": 250 }, { - "id": 1464, + "id": 1474, "path": "/sdk/android/message/managing-messages/set-message-pinned", "relativePath": "sdk/android/message/managing-messages/set-message-pinned", "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", "title": "Pin or unpin a message", - "description": "OpenIM Android SDK guide for Pin or unpin a message.", + "description": "Change a conversation message’s pinned state and handle pinned-message change events.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2834, + "status": "published", + "sourceIndex": 2844, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx", - "navOrder": 241 + "navOrder": 251 }, { - "id": 1465, + "id": 1475, "path": "/sdk/android/message/managing-messages/insert-local-single-message", "relativePath": "sdk/android/message/managing-messages/insert-local-single-message", "sourcePath": "/sdk/android/message/managing-messages/insert-local-single-message", - "title": "Insert a local one-to-one message", - "description": "OpenIM Android SDK guide for Insert a local one-to-one message.", + "title": "Insert a local direct message", + "description": "Use insertSingleMessageToLocalStorage to insert a one-to-one message visible only on the current device.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2835, + "status": "published", + "sourceIndex": 2845, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx", - "navOrder": 242 + "navOrder": 252 }, { - "id": 1466, + "id": 1476, "path": "/sdk/android/message/managing-messages/insert-local-group-message", "relativePath": "sdk/android/message/managing-messages/insert-local-group-message", "sourcePath": "/sdk/android/message/managing-messages/insert-local-group-message", "title": "Insert a local group message", - "description": "OpenIM Android SDK guide for Insert a local group message.", + "description": "Use insertGroupMessageToLocalStorage to insert a group message visible only on the current device.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2836, + "status": "published", + "sourceIndex": 2846, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx", - "navOrder": 243 + "navOrder": 253 }, { - "id": 1467, + "id": 1477, "path": "/sdk/android/message/managing-messages/clear-all-local-messages", "relativePath": "sdk/android/message/managing-messages/clear-all-local-messages", "sourcePath": "/sdk/android/message/managing-messages/clear-all-local-messages", "title": "Clear all local messages", - "description": "OpenIM Android SDK guide for Clear all local messages.", + "description": "Use deleteAllMsgFromLocal to clear all messages stored on the current device.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2837, + "status": "published", + "sourceIndex": 2847, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx", - "navOrder": 244 + "navOrder": 254 }, { - "id": 1468, + "id": 1478, "path": "/sdk/android/message/managing-messages/clear-all-messages", "relativePath": "sdk/android/message/managing-messages/clear-all-messages", "sourcePath": "/sdk/android/message/managing-messages/clear-all-messages", - "title": "Clear local and server messages", - "description": "OpenIM Android SDK guide for Clear local and server messages.", + "title": "Clear all saved messages", + "description": "Use deleteAllMsgFromLocalAndSvr to clear local and server-side messages.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2838, + "status": "published", + "sourceIndex": 2848, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx", - "navOrder": 245 + "navOrder": 255 }, { - "id": 1469, + "id": 1479, "path": "/sdk/android/message/managing-messages/set-message-local-ex", "relativePath": "sdk/android/message/managing-messages/set-message-local-ex", "sourcePath": "/sdk/android/message/managing-messages/set-message-local-ex", - "title": "Set a local message extension", - "description": "OpenIM Android SDK guide for Set a local message extension.", + "title": "Set local message extensions", + "description": "Use setMessageLocalEx to store message data used only on the current device.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2839, + "status": "published", + "sourceIndex": 2849, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx", - "navOrder": 246 + "navOrder": 256 }, { - "id": 1470, + "id": 1480, + "path": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "relativePath": "sdk/android/message/managing-read-status/send-group-read-receipts", + "sourcePath": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "title": "Report group messages as read", + "description": "Report group-message read receipts with the Android SDK.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2850, + "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx", + "navOrder": 257 + }, + { + "id": 1481, + "path": "/sdk/android/message/managing-read-status/get-group-message-readers", + "relativePath": "sdk/android/message/managing-read-status/get-group-message-readers", + "sourcePath": "/sdk/android/message/managing-read-status/get-group-message-readers", + "title": "Get members who read a group message", + "description": "Retrieve members who have or have not read a group message using pagination.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 2851, + "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx", + "navOrder": 258 + }, + { + "id": 1482, "path": "/sdk/android/file-uploads/track-file-upload-progress", "relativePath": "sdk/android/file-uploads/track-file-upload-progress", "sourcePath": "/sdk/android/file-uploads/track-file-upload-progress", "title": "Track file upload progress", - "description": "OpenIM Android SDK guide for Track file upload progress.", + "description": "Use OnPutFileListener to track an individual Android SDK file upload.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2840, + "status": "published", + "sourceIndex": 2852, "contentFile": "content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx", - "navOrder": 247 + "navOrder": 259 }, { - "id": 1471, + "id": 1483, "path": "/sdk/android/file-uploads/upload-file", "relativePath": "sdk/android/file-uploads/upload-file", "sourcePath": "/sdk/android/file-uploads/upload-file", "title": "Upload a file", - "description": "OpenIM Android SDK guide for Upload a file.", + "description": "Upload a standalone file with the Android SDK and retrieve its remote resource URL.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2841, + "status": "published", + "sourceIndex": 2853, "contentFile": "content/docs/chat/sdk/android/file-uploads/upload-file.mdx", - "navOrder": 248 + "navOrder": 260 }, { - "id": 1472, + "id": 1484, "path": "/sdk/android/calling/overview-calling", "relativePath": "sdk/android/calling/overview-calling", "sourcePath": "/sdk/android/calling/overview-calling", "title": "Audio and video calling overview", - "description": "OpenIM Android SDK guide for Audio and video calling overview.", + "description": "Learn about Android SDK call signaling, room information, and event boundaries.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2842, + "status": "published", + "sourceIndex": 2854, "contentFile": "content/docs/chat/sdk/android/calling/overview-calling.mdx", - "navOrder": 249 + "navOrder": 261 }, { - "id": 1473, + "id": 1485, "path": "/sdk/android/calling/managing-calls/start-single-call", "relativePath": "sdk/android/calling/managing-calls/start-single-call", "sourcePath": "/sdk/android/calling/managing-calls/start-single-call", "title": "Start a one-to-one call", - "description": "OpenIM Android SDK guide for Start a one-to-one call.", + "description": "Start a one-to-one audio or video call with the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2843, + "status": "published", + "sourceIndex": 2855, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx", - "navOrder": 250 + "navOrder": 262 }, { - "id": 1474, + "id": 1486, "path": "/sdk/android/calling/managing-calls/start-group-call", "relativePath": "sdk/android/calling/managing-calls/start-group-call", "sourcePath": "/sdk/android/calling/managing-calls/start-group-call", "title": "Start a group call", - "description": "OpenIM Android SDK guide for Start a group call.", + "description": "Start a group audio or video call with the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2844, + "status": "published", + "sourceIndex": 2856, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx", - "navOrder": 251 + "navOrder": 263 }, { - "id": 1475, + "id": 1487, "path": "/sdk/android/calling/managing-calls/accept-call", "relativePath": "sdk/android/calling/managing-calls/accept-call", "sourcePath": "/sdk/android/calling/managing-calls/accept-call", "title": "Accept a call", - "description": "OpenIM Android SDK guide for Accept a call.", + "description": "Accept a call invitation with the Android SDK and retrieve room credentials.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2845, + "status": "published", + "sourceIndex": 2857, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx", - "navOrder": 252 + "navOrder": 264 }, { - "id": 1476, + "id": 1488, "path": "/sdk/android/calling/managing-calls/reject-call", "relativePath": "sdk/android/calling/managing-calls/reject-call", "sourcePath": "/sdk/android/calling/managing-calls/reject-call", "title": "Reject a call", - "description": "OpenIM Android SDK guide for Reject a call.", + "description": "Reject a call invitation with the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2846, + "status": "published", + "sourceIndex": 2858, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx", - "navOrder": 253 + "navOrder": 265 }, { - "id": 1477, + "id": 1489, "path": "/sdk/android/calling/managing-calls/cancel-call", "relativePath": "sdk/android/calling/managing-calls/cancel-call", "sourcePath": "/sdk/android/calling/managing-calls/cancel-call", "title": "Cancel a call invitation", - "description": "OpenIM Android SDK guide for Cancel a call invitation.", + "description": "Cancel a call invitation before it is accepted with the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2847, + "status": "published", + "sourceIndex": 2859, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx", - "navOrder": 254 + "navOrder": 266 }, { - "id": 1478, + "id": 1490, "path": "/sdk/android/calling/managing-calls/hang-up-call", "relativePath": "sdk/android/calling/managing-calls/hang-up-call", "sourcePath": "/sdk/android/calling/managing-calls/hang-up-call", - "title": "End a call", - "description": "OpenIM Android SDK guide for End a call.", + "title": "Hang up a call", + "description": "Hang up an established call with the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2848, + "status": "published", + "sourceIndex": 2860, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx", - "navOrder": 255 + "navOrder": 267 }, { - "id": 1479, + "id": 1491, "path": "/sdk/android/calling/managing-calls/handle-call-events", "relativePath": "sdk/android/calling/managing-calls/handle-call-events", "sourcePath": "/sdk/android/calling/managing-calls/handle-call-events", "title": "Handle call events", - "description": "OpenIM Android SDK guide for Handle call events.", + "description": "Register Android SDK invitation, participant, and media-stream callbacks in one call listener.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2849, + "status": "published", + "sourceIndex": 2861, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx", - "navOrder": 256 + "navOrder": 268 }, { - "id": 1480, + "id": 1492, "path": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", "relativePath": "sdk/android/calling/retrieving-call-information/restore-pending-invitation", "sourcePath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", - "title": "Restore a pending call invitation", - "description": "OpenIM Android SDK guide for Restore a pending call invitation.", + "title": "Restore a pending invitation", + "description": "Restore a call invitation that was received before the Android application started or resumed.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2850, + "status": "published", + "sourceIndex": 2862, "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx", - "navOrder": 257 + "navOrder": 269 }, { - "id": 1481, + "id": 1493, "path": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", "relativePath": "sdk/android/calling/retrieving-call-information/get-room-by-group-id", "sourcePath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", "title": "Get a group call room", - "description": "OpenIM Android SDK guide for Get a group call room.", + "description": "Use the Android SDK to retrieve an active call room by group ID.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2851, + "status": "published", + "sourceIndex": 2863, "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx", - "navOrder": 258 + "navOrder": 270 }, { - "id": 1482, + "id": 1494, "path": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", "relativePath": "sdk/android/calling/retrieving-call-information/get-token-by-room-id", "sourcePath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", - "title": "Get a call room token", - "description": "OpenIM Android SDK guide for Get a call room token.", + "title": "Get room credentials", + "description": "Use the Android SDK to retrieve fresh join credentials for a known room ID.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2852, + "status": "published", + "sourceIndex": 2864, "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx", - "navOrder": 259 + "navOrder": 271 }, { - "id": 1483, + "id": 1495, "path": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", "relativePath": "sdk/android/calling/sending-custom-signals/send-a-custom-signal", "sourcePath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", "title": "Send a custom signal", - "description": "OpenIM Android SDK guide for Send a custom signal.", + "description": "Send and receive custom signaling data in an Android SDK call room.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2853, + "status": "published", + "sourceIndex": 2865, "contentFile": "content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx", - "navOrder": 260 + "navOrder": 272 }, { - "id": 1484, + "id": 1496, "path": "/sdk/android/events/overview-events", "relativePath": "sdk/android/events/overview-events", "sourcePath": "/sdk/android/events/overview-events", "title": "Events overview", - "description": "OpenIM Android SDK guide for Events overview.", + "description": "Register Android SDK listeners centrally and route connection, synchronization, and data events by domain.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "draft", - "sourceIndex": 2854, + "status": "published", + "sourceIndex": 2866, "contentFile": "content/docs/chat/sdk/android/events/overview-events.mdx", - "navOrder": 261 + "navOrder": 273 }, { - "id": 1485, + "id": 1497, "path": "/sdk/android/logger", "relativePath": "sdk/android/logger", "sourcePath": "/sdk/android/logger", - "title": "Logger", - "description": "OpenIM · SDK · Android · v4 documentation scaffold for Logger. Replace this placeholder with OpenIM-specific guidance, examples, and assets.", + "title": "Logging", + "description": "Configure Android SDK logging, write application diagnostics, and upload logs.", "product": "sdk", "version": "v4", "platform": "android", "contextKey": "chat/sdk/android", "contextTitle": "SDKs · Android · v4", "template": "guide", - "status": "scaffold", - "sourceIndex": 2855, + "status": "published", + "sourceIndex": 2867, "contentFile": "content/docs/chat/sdk/android/logger.mdx", - "navOrder": 262 + "navOrder": 274 }, { "id": 864, diff --git a/src/generated/search-index-zh.json b/src/generated/search-index-zh.json index dec2b5e736..5c0901b3ab 100644 --- a/src/generated/search-index-zh.json +++ b/src/generated/search-index-zh.json @@ -1941,7 +1941,7 @@ "description": "了解 Android SDK 中的用户资料、好友关系、好友申请、黑名单和在线状态 API。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user overview-user", - "content": "OpenIM Android SDK 使用 userID 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。 群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。 用户类型 Android SDK 会根据使用场景返回不同的用户对象: | 类型 | 适用场景 | 主要 API | | | | | | LocalUser | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | getSelfLocalUserInfo 、 setSelfInfo | | PublicUserInfo | 查询应用用户、查找好友候选人和展示陌生人资料卡 | getUsersInfo | | UserInfo | Android wrapper 返回的组合对象,可承载公开资料、好友资料或黑名单资料 | getFriendListPage 、 getFriendsInfo 、 getBlacklist | | FriendInfo | 当前用户的好友列表、好友备注和关系扩展字段 | searchFriends 、 getFriendListPage | | FriendApplicationInfo | 好友申请双方、处理状态和附言 | 好友申请查询与 listener | | BlacklistInfo | 当前用户拉黑的用户及黑名单关系字段 | getBlacklist 、 addBlacklist 、 removeBlacklist | | UsersOnlineStatus | 用户在线状态和在线平台列表 | subscribeUsersOnlineStatus 、 getSubscribeOnlineUsersStatus | 同一个 userID 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 UserInfo.getFriendInfo ;只需要账号公开资料时使用 PublicUserInfo ;黑名单页面使用 UserInfo.getBlackInfo 。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。 所有列表和事件都应使用 userID 作为稳定标识。好友申请同时包含申请方和接收方,应使用 fromUserID:toUserID 标识一条申请。 功能入口 下表列出了用户相关的常见需求和对应页面: | 需求 | 推荐页面 | | | | | 按 userID 查询公开资料,用于查找好友候选人或展示资料卡 | 获取指定用户资料 /sdk/android/user/user profile/get users info | | 分页、搜索或按 ID 查询好友关系 | 分页获取好友列表 /sdk/android/user/friends/get friend list page | | 发送、查询、接受或拒绝好友申请 | 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list | | 修改好友资料 | 更新好友资料 /sdk/android/user/friends/update friends | | 删除好友关系 | 删除好友 /sdk/android/user/friends/delete friend | | 查看和维护当前用户黑名单 | 获取黑名单列表 /sdk/android/user/blacklist/get blacklist | | 读取或更新当前用户的昵称、头像和扩展资料 | 更新当前用户资料 /sdk/android/user/user profile/set self info | | 设置账号级消息接收和通知策略 | 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception | | 订阅和读取在线状态 | 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status | 状态更新 用户相关事件由对应能力页负责监听和合并: 当前用户资料变化:见 更新当前用户资料 /sdk/android/user/user profile/set self info 。 好友申请变化:见 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 。 好友关系和好友资料变化:见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。 黑名单变化:见 拉黑用户 /sdk/android/user/blacklist/add blacklist 。 在线状态变化:见 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 。 Android SDK 的 UserInfoManager 和 FriendshipManager 各保存一个 listener, setOnUserListener 和 setOnFriendshipListener 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。" + "content": "OpenIM Android SDK 使用 userID 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。 群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。 用户类型 Android SDK 会根据使用场景返回不同的用户对象: | 类型 | 适用场景 | 主要 API | | | | | | LocalUser | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | getSelfLocalUserInfo 、 setSelfInfo | | PublicUserInfo | 查询应用用户、查找好友候选人和展示陌生人资料卡 | getUsersInfo | | UserInfo | Android wrapper 返回的组合对象,可承载公开资料、好友资料或黑名单资料 | getFriendListPage 、 getFriendsInfo 、 getBlacklist | | FriendInfo | 当前用户的好友列表、好友备注和关系扩展字段 | searchFriends 、 getFriendListPage | | FriendApplicationInfo | 好友申请双方、处理状态和附言 | 好友申请查询与 listener | | BlacklistInfo | 当前用户拉黑的用户及黑名单关系字段 | getBlacklist 、 addBlacklist 、 removeBlacklist | | UsersOnlineStatus | 用户在线状态和在线平台列表 | subscribeUsersOnlineStatus 、 getSubscribeOnlineUsersStatus 、 unsubscribeOnlineUsersStatus | 同一个 userID 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 UserInfo.getFriendInfo ;只需要账号公开资料时使用 PublicUserInfo ;黑名单页面使用 UserInfo.getBlackInfo 。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。 所有列表和事件都应使用 userID 作为稳定标识。好友申请同时包含申请方和接收方,应使用 fromUserID:toUserID 标识一条申请。 功能入口 下表列出了用户相关的常见需求和对应页面: | 需求 | 推荐页面 | | | | | 按 userID 查询公开资料,用于查找好友候选人或展示资料卡 | 获取指定用户资料 /sdk/android/user/user profile/get users info | | 分页、搜索或按 ID 查询好友关系 | 分页获取好友列表 /sdk/android/user/friends/get friend list page | | 发送、查询、接受或拒绝好友申请 | 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list | | 修改好友资料 | 更新好友资料 /sdk/android/user/friends/update friends | | 删除好友关系 | 删除好友 /sdk/android/user/friends/delete friend | | 查看和维护当前用户黑名单 | 获取黑名单列表 /sdk/android/user/blacklist/get blacklist | | 读取或更新当前用户的昵称、头像和扩展资料 | 更新当前用户资料 /sdk/android/user/user profile/set self info | | 设置账号级消息接收和通知策略 | 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception | | 订阅、读取和取消在线状态 | 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 、 取消用户状态订阅 /sdk/android/user/online status/unsubscribe users online status | 状态更新 用户相关事件由对应能力页负责监听和合并: 当前用户资料变化:见 更新当前用户资料 /sdk/android/user/user profile/set self info 。 好友申请变化:见 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 。 好友关系和好友资料变化:见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。 黑名单变化:见 拉黑用户 /sdk/android/user/blacklist/add blacklist 。 在线状态变化:见 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 。 Android SDK 的 UserInfoManager 和 FriendshipManager 各保存一个 listener, setOnUserListener 和 setOnFriendshipListener 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。" }, { "path": "/sdk/android/user/user-profile/get-users-info", @@ -1981,7 +1981,7 @@ "description": "使用 subscribeUsersOnlineStatus() 订阅指定用户的在线状态。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user online-status subscribe-users-online-status", - "content": "List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.subscribeUsersOnlineStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusSubscriptionFailure code, error ; , userIDs ; 调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 List 快照,每项包含 userID 、 status 和 platformIDs 。重复订阅同一个用户时,应由应用层去重并保留一份状态。 状态字段 | 字段 | 说明 | | | | | userID | 目标用户 ID。 | | status | 在线状态值,具体枚举含义以服务端契约为准。 | | platformIDs | 当前在线的平台 ID 列表。 | onUserStatusChanged 由本页归属,应组合进应用唯一的 OnUserListener ,并按 userID 合并: @Override public void onUserStatusChanged UsersOnlineStatus status onlineStatusStore.put status.getUserID , status ; 订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合;Android API 未提供可验证的取消订阅入口,因此不在文档中记录取消订阅调用。" + "content": "List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.subscribeUsersOnlineStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusSubscriptionFailure code, error ; , userIDs ; 调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 List 快照,每项包含 userID 、 status 和 platformIDs 。重复订阅同一个用户时,应由应用层去重并保留一份状态。 状态字段 | 字段 | 说明 | | | | | userID | 目标用户 ID。 | | status | 在线状态值,具体枚举含义以服务端契约为准。 | | platformIDs | 当前在线的平台 ID 列表。 | onUserStatusChanged 由本页归属,应组合进应用唯一的 OnUserListener ,并按 userID 合并: @Override public void onUserStatusChanged UsersOnlineStatus status onlineStatusStore.put status.getUserID , status ; 订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合,并通过 取消用户状态订阅 /sdk/android/user/online status/unsubscribe users online status 移除不再需要的用户。" }, { "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", @@ -1991,6 +1991,14 @@ "keywords": "sdk android v4 sdk android user online-status get-subscribe-online-users-status", "content": "OpenIMClient.getInstance .userInfoManager.getSubscribeOnlineUsersStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusQueryFailure code, error ; ; 该方法不接收用户 ID,也不改变订阅集合。成功 callback 返回当前已订阅用户的 List 状态快照,适合在重连或重新进入页面时按 userID 校准状态。 查询本身不会触发 onUserStatusChanged 。状态快照只应覆盖在线状态存储,不要覆盖用户昵称、头像等资料字段;需要资料时分别调用用户资料 API。" }, + { + "path": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "title": "取消用户状态订阅", + "description": "使用 unsubscribeOnlineUsersStatus 取消指定用户的在线状态订阅。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android user online-status unsubscribe-users-online-status", + "content": "用户离开可见范围、页面结束或切换账号时,取消不再需要的在线状态订阅。调用前应去除空值和重复 ID。 List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.unsubscribeOnlineUsersStatus new OnBase @Override public void onSuccess String data for String userID : userIDs presenceByUserID.remove userID ; @Override public void onError int code, String error recordStatusUnsubscribeFailure code, error ; , userIDs ; 成功 callback 表示取消订阅请求已完成。此后再从应用维护的订阅集合和在线状态缓存中移除这些 userID ;失败时保留原状态,以便重试。该操作不会修改用户资料或好友关系。 需要再次跟踪用户状态时,重新调用 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 。" + }, { "path": "/sdk/android/user/friends/get-friend-list-page", "title": "分页获取好友列表", @@ -2265,7 +2273,7 @@ }, { "path": "/sdk/android/group/update-group-profile", - "title": "更新群资料", + "title": "更新群名称、简介和头像", "description": "使用 setGroupInfo 更新群名称、头像、简介和其他群资料字段。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group update-group-profile", @@ -2273,7 +2281,7 @@ }, { "path": "/sdk/android/group/set-group-announcement", - "title": "发布群公告", + "title": "发布或更新群公告", "description": "通过 GroupInfo.notification 发布或更新群公告。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-announcement", @@ -2281,7 +2289,7 @@ }, { "path": "/sdk/android/group/set-group-extension", - "title": "设置群扩展字段", + "title": "设置群组扩展字段", "description": "通过 GroupInfo.ex 保存应用定义的群组扩展数据。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-extension", @@ -2305,7 +2313,7 @@ }, { "path": "/sdk/android/group/set-group-member-friend-permission", - "title": "设置成员好友申请权限", + "title": "设置群内添加好友权限", "description": "通过 GroupInfo.applyMemberFriend 设置是否允许从群成员发起好友申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-member-friend-permission", @@ -2313,7 +2321,7 @@ }, { "path": "/sdk/android/group/change-group-mute", - "title": "设置全员禁言", + "title": "设置群组全员禁言", "description": "使用 changeGroupMute 开启或关闭群组全员禁言。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group change-group-mute", @@ -2345,7 +2353,7 @@ }, { "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", - "title": "获取群资料", + "title": "查询指定群组资料", "description": "使用 getGroupsInfo 批量查询指定群组的最新资料。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups get-specified-groups-info", @@ -2361,7 +2369,7 @@ }, { "path": "/sdk/android/group/retrieving-groups/is-join-group", - "title": "检查是否加入群组", + "title": "检查是否已加入群组", "description": "使用 isJoinGroup 查询当前登录用户是否已经加入指定群组。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups is-join-group", @@ -2377,7 +2385,7 @@ }, { "path": "/sdk/android/group/group-applications/overview-group-applications", - "title": "群申请概览", + "title": "入群申请概览", "description": "说明 Android SDK 中收到和发出的群申请、处理结果及状态事件。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications overview-group-applications", @@ -2385,7 +2393,7 @@ }, { "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", - "title": "获取收到的群申请", + "title": "获取收到的入群申请", "description": "使用 getRecvGroupApplicationList 分页读取当前用户可处理的入群申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-recipient", @@ -2393,7 +2401,7 @@ }, { "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", - "title": "获取发出的群申请", + "title": "获取发出的入群申请", "description": "使用 getSendGroupApplicationList 分页读取当前用户发出的入群申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-applicant", @@ -2401,7 +2409,7 @@ }, { "path": "/sdk/android/group/group-applications/accept-group-application", - "title": "同意群申请", + "title": "接受入群申请", "description": "使用 acceptGroupApplication 同意指定用户的入群申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications accept-group-application", @@ -2409,7 +2417,7 @@ }, { "path": "/sdk/android/group/group-applications/refuse-group-application", - "title": "拒绝群申请", + "title": "拒绝入群申请", "description": "使用 refuseGroupApplication 拒绝指定用户的入群申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications refuse-group-application", @@ -2425,7 +2433,7 @@ }, { "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", - "title": "获取群成员列表", + "title": "分页查询群成员", "description": "使用 getGroupMemberList 按角色和分页条件读取群成员。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-group-member-list", @@ -2433,7 +2441,7 @@ }, { "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", - "title": "获取群成员资料", + "title": "查询指定群成员资料", "description": "使用 getGroupMembersInfo 批量读取指定成员在群内的资料。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-specified-group-members-info", @@ -2441,7 +2449,7 @@ }, { "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", - "title": "检查用户是否在群内", + "title": "查询用户入群状态", "description": "使用 getUsersInGroup 从候选用户中筛出当前在群内的用户 ID。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-users-in-group", @@ -2465,7 +2473,7 @@ }, { "path": "/sdk/android/group/managing-group-members/invite-user-to-group", - "title": "邀请用户入群", + "title": "邀请用户加入群组", "description": "使用 inviteUserToGroup 邀请一组用户加入指定群组。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members invite-user-to-group", @@ -2481,7 +2489,7 @@ }, { "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", - "title": "更新群昵称", + "title": "修改群内昵称", "description": "使用 SetGroupMemberInfo.nickname 更新成员在指定群中的显示昵称。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-nickname", @@ -2489,7 +2497,7 @@ }, { "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", - "title": "管理群管理员", + "title": "设置管理员", "description": "使用 SetGroupMemberInfo.roleLevel 设置成员的群内角色。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-role-level", @@ -2521,7 +2529,7 @@ }, { "path": "/sdk/android/group/managing-group-members/change-group-member-mute", - "title": "禁言或解除禁言群成员", + "title": "设置群成员禁言", "description": "使用 changeGroupMemberMute 设置指定成员的禁言时长。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members change-group-member-mute", @@ -2559,65 +2567,97 @@ "keywords": "sdk android v4 sdk android message creating-messages create-custom-message", "content": "data 、 extension 和 description 由业务定义,接收端应按自己的协议解析。 Message message = OpenIMClient.getInstance .messageManager.createCustomMessage dataJson, extensionJson, description ;" }, + { + "path": "/sdk/android/message/creating-messages/create-image-message", + "title": "创建图片消息", + "description": "使用相对于 SDK 初始化数据目录的路径创建图片消息。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-image-message", + "content": "Message message = OpenIMClient.getInstance .messageManager .createImageMessage imagePath ; 图片文件应位于 SDK 初始化时配置的数据目录内, imagePath 传入相对于该目录的路径。本方法只创建待发送对象,普通发送流程负责上传图片。" + }, { "path": "/sdk/android/message/creating-messages/create-image-message-by-file", - "title": "从文件创建图片消息", - "description": "使用相对路径或绝对路径创建图片消息。", + "title": "使用本地路径创建图片消息", + "description": "使用绝对路径创建图片消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-image-message-by-file", - "content": "缓存目录内使用 createImageMessage ,绝对路径使用 createImageMessageFromFullPath 。 Message message = OpenIMClient.getInstance .messageManager.createImageMessageFromFullPath filePath ;" + "content": "Message message = OpenIMClient.getInstance .messageManager .createImageMessageFromFullPath absolutePath ; 绝对路径必须可读。本方法只创建待发送对象,普通发送流程负责上传图片。" }, { "path": "/sdk/android/message/creating-messages/create-image-message-by-url", - "title": "从 URL 创建图片消息", + "title": "使用 URL 创建图片消息", "description": "使用 createImageMessageByURL 创建已上传资源的图片消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-image-message-by-url", "content": "准备 PictureInfo 的原图、大图和缩略图信息后创建消息。 Message message = OpenIMClient.getInstance .messageManager.createImageMessageByURL sourceURL, sourcePicture, bigPicture, snapshotPicture ;" }, + { + "path": "/sdk/android/message/creating-messages/create-sound-message", + "title": "创建音频消息", + "description": "使用相对于 SDK 初始化数据目录的路径创建音频消息。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-sound-message", + "content": "Message message = OpenIMClient.getInstance .messageManager .createSoundMessage soundPath, durationSeconds ; 音频文件应位于 SDK 初始化时配置的数据目录内, soundPath 传入相对于该目录的路径,时长单位为秒。本方法只创建待发送对象。" + }, { "path": "/sdk/android/message/creating-messages/create-sound-message-by-file", - "title": "从文件创建音频消息", - "description": "使用相对路径或绝对路径创建音频消息。", + "title": "使用本地路径创建音频消息", + "description": "使用绝对路径创建音频消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-sound-message-by-file", - "content": "音频时长单位为秒;根据文件位置选择相对路径或绝对路径方法。 Message message = OpenIMClient.getInstance .messageManager .createSoundMessageFromFullPath soundPath, durationSeconds ;" + "content": "Message message = OpenIMClient.getInstance .messageManager .createSoundMessageFromFullPath absolutePath, durationSeconds ; 绝对路径必须可读,音频时长单位为秒。本方法只创建待发送对象。" }, { "path": "/sdk/android/message/creating-messages/create-sound-message-by-url", - "title": "从 URL 创建音频消息", + "title": "使用 URL 创建音频消息", "description": "使用 SoundElem 创建已上传资源的音频消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-sound-message-by-url", "content": "createSoundMessageByURL 接收已经包含 URL、时长和大小的 SoundElem 。 Message message = OpenIMClient.getInstance .messageManager.createSoundMessageByURL soundElem ;" }, + { + "path": "/sdk/android/message/creating-messages/create-video-message", + "title": "创建视频消息", + "description": "使用相对于 SDK 初始化数据目录的路径创建视频消息。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-video-message", + "content": "Message message = OpenIMClient.getInstance .messageManager.createVideoMessage videoPath, mimeType, durationSeconds, snapshotPath ; 视频和快照文件应位于 SDK 初始化时配置的数据目录内,两个路径均相对于该目录。视频时长单位为秒。本方法只创建待发送对象。" + }, { "path": "/sdk/android/message/creating-messages/create-video-message-by-file", - "title": "从文件创建视频消息", - "description": "使用相对路径或绝对路径创建视频消息及缩略图。", + "title": "使用本地路径创建视频消息", + "description": "使用视频和缩略图的绝对路径创建视频消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-video-message-by-file", - "content": "视频方法需要 MIME 类型、时长和缩略图路径。 Message message = OpenIMClient.getInstance .messageManager.createVideoMessageFromFullPath videoPath, mimeType, durationSeconds, snapshotPath ;" + "content": "Message message = OpenIMClient.getInstance .messageManager.createVideoMessageFromFullPath absoluteVideoPath, mimeType, durationSeconds, absoluteSnapshotPath ; 视频和缩略图的绝对路径必须可读,视频时长单位为秒。本方法只创建待发送对象。" }, { "path": "/sdk/android/message/creating-messages/create-video-message-by-url", - "title": "从 URL 创建视频消息", + "title": "使用 URL 创建视频消息", "description": "使用 VideoElem 创建已上传资源的视频消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-video-message-by-url", "content": "将远端视频及缩略图信息填入 VideoElem 后创建消息。 Message message = OpenIMClient.getInstance .messageManager.createVideoMessageByURL videoElem ;" }, + { + "path": "/sdk/android/message/creating-messages/create-file-message", + "title": "创建文件消息", + "description": "使用相对于 SDK 初始化数据目录的路径创建文件消息。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-file-message", + "content": "Message message = OpenIMClient.getInstance .messageManager .createFileMessage filePath, fileName ; 文件应位于 SDK 初始化时配置的数据目录内, filePath 传入相对于该目录的路径, fileName 用于接收端展示。本方法只创建待发送对象。" + }, { "path": "/sdk/android/message/creating-messages/create-file-message-by-file", - "title": "从文件创建文件消息", - "description": "使用相对路径或绝对路径创建文件消息。", + "title": "使用本地路径创建文件消息", + "description": "使用绝对路径创建文件消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-file-message-by-file", - "content": "文件名与路径分别传入;相对路径相对于 SDK 初始化时配置的缓存目录。 Message message = OpenIMClient.getInstance .messageManager .createFileMessageFromFullPath filePath, fileName ;" + "content": "Message message = OpenIMClient.getInstance .messageManager .createFileMessageFromFullPath absolutePath, fileName ; 绝对路径必须可读,文件名与路径分别传入。本方法只创建待发送对象。" }, { "path": "/sdk/android/message/creating-messages/create-file-message-by-url", - "title": "从 URL 创建文件消息", + "title": "使用 URL 创建文件消息", "description": "使用 FileElem 创建已上传资源的文件消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-file-message-by-url", @@ -2649,12 +2689,28 @@ }, { "path": "/sdk/android/message/creating-messages/create-quote-message", - "title": "创建引用消息", + "title": "创建回复消息", "description": "使用 createQuoteMessage 创建引用已有消息的回复。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-quote-message", "content": "引用消息保存被引用的完整 Message ,发送前应确保引用对象包含稳定的 clientMsgID 。 Message message = OpenIMClient.getInstance .messageManager .createQuoteMessage replyText, quotedMessage ;" }, + { + "path": "/sdk/android/message/creating-messages/create-advanced-text-message", + "title": "创建富文本消息", + "description": "使用 createAdvancedTextMessage 创建包含结构化实体范围的富文本消息。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-advanced-text-message", + "content": "RichMessage 使用 offset 和 length 标记正文范围,并通过 type 、 url 和 info 携带业务定义的实体信息。 RichMessage link = new RichMessage ; link.setType \"link\" ; link.setOffset 0 ; link.setLength 6 ; link.setUrl \"https://docs.openim.io\" ; link.setInfo \" \\\"title\\\":\\\"OpenIM documentation\\\" \" ; Message message = OpenIMClient.getInstance .messageManager.createAdvancedTextMessage \"OpenIM docs\", Collections.singletonList link ; 每个实体的范围必须对应最终正文中的实际位置。发送前应校验范围、URL 和 info 内容,并确保接收端使用相同的 type 与 info 协议。本方法只创建 Message ,不会发送消息;创建完成后使用 发送消息 /sdk/android/message/sending messages/send message 。" + }, + { + "path": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "title": "创建富文本回复", + "description": "使用 createAdvancedQuoteMessage 创建带富文本实体的引用回复消息。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-advanced-quote-message", + "content": "富文本回复同时保存回复正文、被引用的原消息和正文中的 RichMessage 实体范围。 RichMessage mention = new RichMessage ; mention.setType \"mention\" ; mention.setOffset 0 ; mention.setLength 6 ; mention.setInfo \" \\\"userID\\\":\\\"user a\\\" \" ; Message message = OpenIMClient.getInstance .messageManager.createAdvancedQuoteMessage \"OpenIM agreed\", originalMessage, Collections.singletonList mention ; 被引用的 originalMessage 应包含稳定的 clientMsgID ,实体范围必须对应最终回复正文。 type 、 url 和 info 的业务协议与 创建富文本消息 /sdk/android/message/creating messages/create advanced text message 相同。本方法只创建待发送对象,不会自动发送。" + }, { "path": "/sdk/android/message/creating-messages/create-forward-message", "title": "创建转发消息", @@ -2681,7 +2737,7 @@ }, { "path": "/sdk/android/message/sending-messages/send-message-not-oss", - "title": "发送非 OSS 消息", + "title": "发送不经 OSS 的消息", "description": "使用 sendMessageNotOss 发送已经由业务上传资源的媒体消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message sending-messages send-message-not-oss", @@ -2689,7 +2745,7 @@ }, { "path": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", - "title": "跟踪消息发送进度", + "title": "监听消息发送进度", "description": "通过 OnMsgSendCallback 的进度回调更新媒体发送进度。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message sending-messages set-msg-send-progress-listener", @@ -2713,7 +2769,7 @@ }, { "path": "/sdk/android/message/retrieving-messages/load-older-messages", - "title": "加载更早消息", + "title": "加载历史消息", "description": "使用 getAdvancedHistoryMessageList 分页加载会话历史消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message retrieving-messages load-older-messages", @@ -2721,7 +2777,7 @@ }, { "path": "/sdk/android/message/retrieving-messages/load-newer-messages", - "title": "加载更新消息", + "title": "反向加载历史消息", "description": "使用 getAdvancedHistoryMessageListReverse 加载起点之后的消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message retrieving-messages load-newer-messages", @@ -2729,12 +2785,20 @@ }, { "path": "/sdk/android/message/retrieving-messages/find-messages-by-id", - "title": "按 ID 查询消息", + "title": "按 ID 查找消息", "description": "使用 findMessageList 按 SearchParams 查询消息记录。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message retrieving-messages find-messages-by-id", "content": "构造 SearchParams 列表查询消息。返回结果应按消息 ID 合并,不要用列表位置作为稳定标识。 messageManager.findMessageList new OnBase @Override public void onSuccess SearchResult result showFoundMessages result ; @Override public void onError int code, String error showQueryError error ; , searchParams ;" }, + { + "path": "/sdk/android/message/retrieving-messages/load-message-context", + "title": "读取消息上下文", + "description": "使用 Android SDK 读取一条消息前后的上下文。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message retrieving-messages load-message-context", + "content": "从搜索结果或引用消息跳入聊天上下文时,把已经取得的 Message 作为锚点。 参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | conversationID | String | 是 | 锚点消息所在的会话 ID。 | | startMsg | Message | 是 | 已经取得的锚点消息。 | | type | ViewType | 是 | 上下文查看类型;引用消息使用 ViewType.History ,搜索结果使用 ViewType.Search 。 | | before | int | 是 | 锚点之前最多读取的消息数量。 | | after | int | 是 | 锚点之后最多读取的消息数量。 | messageManager.fetchSurroundingMessages new OnBase @Override public void onSuccess Messages messages List surrounding = messages.getData ; renderMessages surrounding ; @Override public void onError int code, String error // 处理失败 , conversationID, targetMessage, ViewType.Search, 20, 20 ; 成功回调中的 messages.getData 是锚点前后取得的消息列表,消息字段见 消息概览 /sdk/android/message/overview message 。 before 和 after 分别限制锚点前后的数量。返回结果可能少于请求总数,例如锚点靠近历史边界或部分消息已经删除。按 conversationID:clientMsgID 合并,不要依赖固定数组位置。需要先定位消息时见 按 ID 查找消息 /sdk/android/message/retrieving messages/find messages by id 。" + }, { "path": "/sdk/android/message/searching-messages/search-messages", "title": "搜索消息", @@ -2745,11 +2809,19 @@ }, { "path": "/sdk/android/message/composing-messages/update-typing-status", - "title": "更新输入状态", - "description": "使用 typingStatusUpdate 提示单聊对方当前正在输入。", + "title": "上报输入状态", + "description": "使用 Android SDK 上报当前会话的输入状态。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message composing-messages update-typing-status", - "content": "输入框变化时传入对方用户 ID 和业务约定的提示字符串。调用侧应防抖,避免每次按键都发送请求。 messageManager.typingStatusUpdate callback, peerUserID, \"typing\" ; 成功 callback 表示输入状态上报请求完成,不表示对端已经处理。对端通过应用级 OnConversationListener.onConversationUserInputStatusChanged 接收字符串载荷;Android wrapper 不会自动把它转换为模型,应在校验 JSON 后再解析: @Override public void onConversationUserInputStatusChanged String payload InputStatesChangedData state = JsonUtil.toObj payload, InputStatesChangedData.class ; if state == null || state.getConversationID == null return; updateTypingState state.getConversationID , state.getUserID , state.getPlatformIDs ; 输入状态按 conversationID:userID 合并,并设置业务侧超时自动清除。 ConversationManager 只保存一个会话 listener,本回调必须与会话列表、总未读数和同步事件组合后统一设置,不能在输入框页面单独覆盖。" + "content": "进入输入状态时,将 focus 设为 true ;输入结束、输入框失去焦点或退出会话时,将其设为 false 。 conversationManager.changeInputState new OnBase @Override public void onSuccess String data // 输入状态已上报 @Override public void onError int code, String error // 处理失败 , conversationID, true ; 输入结束时及时清除状态: conversationManager.changeInputState callback, conversationID, false ; 调用侧应合并连续的焦点变化,并在页面退出或连接中断前尝试上报 false 。成功回调只表示上报请求完成,不表示其他客户端已经更新界面。 其他客户端通过 OnConversationListener.onConversationUserInputStatusChanged 接收输入状态变化。Android SDK 以字符串形式返回事件载荷,应在校验 JSON 后再解析: @Override public void onConversationUserInputStatusChanged String payload InputStatesChangedData state = JsonUtil.toObj payload, InputStatesChangedData.class ; if state == null || state.getConversationID == null return; updateTypingState state.getConversationID , state.getUserID , state.getPlatformIDs ; 输入状态按 conversationID:userID 合并,并设置业务侧超时自动清除。 ConversationManager 只保存一个会话 listener,本回调应与会话列表、总未读数和同步事件组合后统一设置。 进入会话或连接恢复时,可通过 查询输入状态 /sdk/android/message/composing messages/get typing status 获取当前快照。" + }, + { + "path": "/sdk/android/message/composing-messages/get-typing-status", + "title": "查询输入状态", + "description": "使用 getInputState 查询指定用户在会话中的当前输入状态。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message composing-messages get-typing-status", + "content": "进入会话、连接恢复或需要校准状态时,查询指定用户当前正在输入的平台 ID 列表。 OpenIMClient.getInstance .conversationManager.getInputState new OnBase @Override public void onSuccess List platformIDs boolean typing = platformIDs = null && platformIDs.isEmpty ; updateTypingState conversationID, userID, typing ; @Override public void onError int code, String error recordTypingStatusQueryFailure code, error ; , conversationID, userID ; 成功 callback 返回平台 ID 数组快照;空列表表示查询时没有平台处于输入状态。查询本身不会触发输入状态事件。群聊中不要频繁轮询全部成员,只在进入页面、连接恢复或补偿状态时查询重点成员;在线增量由 上报输入状态 /sdk/android/message/composing messages/update typing status 归属的 listener 维护。" }, { "path": "/sdk/android/message/managing-messages/delete-local-message", @@ -2761,31 +2833,39 @@ }, { "path": "/sdk/android/message/managing-messages/delete-saved-messages", - "title": "删除已保存消息", - "description": "使用 deleteMessageFromLocalAndSvr 删除本地和服务端的一条消息。", + "title": "批量删除消息", + "description": "使用 Android SDK 批量删除当前账号在同一会话中的消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages delete-saved-messages", - "content": "删除结果通过消息事件同步,调用成功不代表所有端已经刷新。 messageManager.deleteMessageFromLocalAndSvr conversationID, clientMsgID, callback ;" + "content": "参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | conversationID | String | 是 | 要删除消息所在的会话 ID。 | | clientMsgIDs | String | 是 | 要删除的消息 ID 列表;同一批 ID 必须属于同一会话。 | | isSync | boolean | 是 | 是否把删除动作同步到当前账号的其他客户端。 | DeleteMessagesReq request = new DeleteMessagesReq true, conversationID, selectedClientMsgIDs.toArray new String 0 ; messageManager.deleteMessages request, new OnBase @Override public void onSuccess String data // 删除请求已完成 @Override public void onError int code, String error // 处理失败 ; isSync 为 false 时,删除当前设备及当前账号服务端保存的记录;为 true 时,还会请求把删除动作同步到当前账号的其他客户端。该操作不会删除其他会话成员持有的副本,也不会产生撤回提示。 成功回调表示删除请求已经完成;开启同步时,不代表其他客户端已经收到事件或完成界面更新。 OnAdvanceMsgListener.onMsgDeleted 是本页归属事件。根据消息路由字段确定会话后,按 clientMsgID 幂等移除消息。 @Override public void onMsgDeleted Message message removeMessage resolveConversationID message , message.getClientMsgID ; 需要校准当前消息快照时,重新查询对应会话的历史消息。" + }, + { + "path": "/sdk/android/message/managing-messages/delete-user-messages", + "title": "删除群聊中指定用户的全部消息", + "description": "使用 Android SDK 删除指定用户在群聊中的全部消息。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages delete-user-messages", + "content": "messageManager.deleteUserAllMessagesInConv conversationID, targetUserID, new OnBase @Override public void onSuccess String data // 删除请求已完成 @Override public void onError int code, String error // 处理失败 ; 该 API 只用于群聊,可删除指定用户在目标群会话中的全部消息。这是高影响的群组管控操作,不应放入普通单条消息菜单;操作者权限由 OpenIMServer 校验。成功回调不代表事件已经到达。 OnAdvanceMsgListener.onDeleteUserAllMsgsInConv 是本页归属事件。收到事件后,根据 conversationID 和 userID 移除缓存中该用户发送的消息,或重新读取会话历史进行校准。 @Override public void onDeleteUserAllMsgsInConv DeleteUserAllMsgsListenerMsg event removeMessagesBySender event.getConversationID , event.getUserID ; 成功回调、事件到达和重新查询历史是三个独立阶段。" }, { "path": "/sdk/android/message/managing-messages/revoke-a-message", "title": "撤回消息", - "description": "使用 revokeMessageV2 撤回已发送消息。", + "description": "撤回已发送消息,并处理其他客户端收到的撤回通知。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages revoke-a-message", - "content": "Android 的撤回方法为 revokeMessageV2 ,撤回详情通过 onRecvMessageRevokedV2 返回。 messageManager.revokeMessageV2 callback, conversationID, clientMsgID ;" + "content": "撤回会使其他客户端把原消息显示为撤回状态。调用前应确认消息已经发送成功,并由业务界面限制可撤回时间;最终权限由服务端校验。 messageManager.revokeMessageV2 callback, conversationID, clientMsgID ; 成功回调表示服务端完成撤回请求,不代表所有客户端都已经收到事件。接收端通过 OnAdvanceMsgListener.onRecvMessageRevokedV2 合并撤回变化。 本页是 onRecvMessageRevokedV2 的完整事件归属页。 RevokedInfo 包含 clientMsgID 、撤回者和撤回时间,但不包含 conversationID ,应先从当前账号的消息索引解析所属会话,再按 conversationID:clientMsgID 更新消息: @Override public void onRecvMessageRevokedV2 RevokedInfo info String clientMsgID = info.getClientMsgID ; String conversationID = findConversationIDByClientMsgID clientMsgID ; if conversationID == null return; markMessageRevoked conversationID, clientMsgID, info ; 接收端应把对应消息更新为撤回状态,而不是直接从列表删除。该回调应纳入应用唯一的 OnAdvanceMsgListener ,集中设置入口见 事件概览 /sdk/android/events/overview events 。 成功回调、撤回事件到达和重新查询历史是三个独立阶段。需要校准时重新读取对应会话的历史消息。" }, { "path": "/sdk/android/message/managing-messages/modify-a-message", "title": "修改消息", - "description": "使用 ModifyMessageReq 修改支持修改的消息内容。", + "description": "修改支持编辑的消息内容,并处理其他客户端收到的消息修改事件。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages modify-a-message", - "content": "请求对象中填写会话 ID、客户端消息 ID 和新的消息内容,修改结果通过 onMessageModified 同步。 messageManager.modifyMessage callback, modifyRequest ;" + "content": "modifyMessage 用于修改会话中已经存在的消息。请求对象应保留原消息的会话 ID、 clientMsgID 、路由和发送者等字段,只更新允许修改的内容。 messageManager.modifyMessage callback, modifyRequest ; 成功回调表示修改请求已经完成,不代表所有客户端界面都已经更新。其他客户端通过 OnAdvanceMsgListener.onMessageModified 接收修改后的完整 Message 。 本页是 onMessageModified 的完整事件归属页。根据消息路由解析 conversationID ,再按 conversationID:clientMsgID 替换原消息,不要按数组位置或显示文本匹配: @Override public void onMessageModified Message message String conversationID = resolveConversationID message ; if conversationID == null return; replaceMessage conversationID, message.getClientMsgID , message ; 该回调应纳入应用唯一的 OnAdvanceMsgListener ,集中设置入口见 事件概览 /sdk/android/events/overview events 。成功回调、修改事件到达和重新查询历史是三个独立阶段。" }, { "path": "/sdk/android/message/managing-messages/get-pinned-messages", - "title": "查看置顶消息", + "title": "查询会话置顶消息", "description": "使用 getConversationPinnedMsgs 查询会话中的置顶消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages get-pinned-messages", @@ -2794,10 +2874,10 @@ { "path": "/sdk/android/message/managing-messages/set-message-pinned", "title": "置顶或取消置顶消息", - "description": "使用 setConversationPinnedMsg 设置会话消息的置顶状态。", + "description": "设置会话消息的置顶状态,并处理置顶消息变化事件。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages set-message-pinned", - "content": "最后一个参数为 true 置顶, false 取消置顶;变化通过 onChangedPinnedMsg 同步。 messageManager.setConversationPinnedMsg callback, conversationID, clientMsgID, true ;" + "content": "最后一个参数为 true 时置顶消息,为 false 时取消置顶: messageManager.setConversationPinnedMsg callback, conversationID, clientMsgID, true ; 成功回调表示设置请求完成,不代表置顶变化事件已经到达。 OnAdvanceMsgListener.onChangedPinnedMsg 是本页归属事件。回调中的 ChangedPinnedMsg 包含 conversationID 和当前置顶消息集合;按会话替换集合,并按每条置顶消息的 clientMsgID 去重: @Override public void onChangedPinnedMsg ChangedPinnedMsg event replacePinnedMessages event.getConversationID , event.getMsgs ; 该回调应纳入应用唯一的 OnAdvanceMsgListener ,集中设置入口见 事件概览 /sdk/android/events/overview events 。成功回调、事件到达和 查询会话置顶消息 /sdk/android/message/managing messages/get pinned messages 取得的快照是三个独立阶段。" }, { "path": "/sdk/android/message/managing-messages/insert-local-single-message", @@ -2817,7 +2897,7 @@ }, { "path": "/sdk/android/message/managing-messages/clear-all-local-messages", - "title": "清空全部本地消息", + "title": "清理全部本地消息", "description": "使用 deleteAllMsgFromLocal 清理当前设备的全部消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages clear-all-local-messages", @@ -2825,7 +2905,7 @@ }, { "path": "/sdk/android/message/managing-messages/clear-all-messages", - "title": "清空全部已保存消息", + "title": "清理全部消息", "description": "使用 deleteAllMsgFromLocalAndSvr 清理本地和服务端消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages clear-all-messages", @@ -2833,15 +2913,31 @@ }, { "path": "/sdk/android/message/managing-messages/set-message-local-ex", - "title": "设置消息本地扩展字段", + "title": "设置消息本地扩展", "description": "使用 setMessageLocalEx 保存仅当前设备使用的消息扩展数据。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages set-message-local-ex", "content": "localEx 适合保存下载路径、播放状态等本地信息,不会同步给其他用户。 messageManager.setMessageLocalEx callback, conversationID, clientMsgID, localExJson ;" }, + { + "path": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "title": "上报群消息已读", + "description": "使用 Android SDK 上报群消息已读回执。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-read-status send-group-read-receipts", + "content": "messageManager.sendGroupMessageReadReceipt conversationID, visibleClientMsgIDs, new OnBase @Override public void onSuccess String data // 已读回执已上报 @Override public void onError int code, String error // 处理失败 ; 同一批消息必须属于目标群会话。成功回调只表示服务端接受上报,不代表其他客户端界面已经更新。会话未读数仍由 markConversationMessageAsRead 独立维护。 其他客户端通过 OnAdvanceMsgListener.onRecvGroupMessageReadReceipt 接收群聊成员级已读变化。本页是该事件的完整监听归属页;根据 conversationID 以及回执中的消息 ID 合并消息已读数、未读数和成员信息。 @Override public void onRecvGroupMessageReadReceipt GroupMessageReceipt receipt mergeGroupReadReceipt receipt ; 上报回调、群回执事件和 查询群消息已读成员 /sdk/android/message/managing read status/get group message readers 取得的成员快照是三个独立阶段。" + }, + { + "path": "/sdk/android/message/managing-read-status/get-group-message-readers", + "title": "查询群消息已读成员", + "description": "使用 Android SDK 分页查询群消息的已读或未读成员。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-read-status get-group-message-readers", + "content": "参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | conversationID | String | 是 | 群聊会话 ID。 | | clientMsgID | String | 是 | 要查询阅读成员的消息 ID。 | | filter | int | 是 | 0 查询已读成员, 1 查询未读成员。 | | offset | int | 是 | 分页偏移量,首页传 0 。 | | count | int | 是 | 本次请求的成员数量。 | messageManager.getGroupMessageReaderList conversationID, clientMsgID, 0, 0, 50, new OnBase @Override public void onSuccess List members renderMembers members ; @Override public void onError int code, String error // 处理失败 ; 成功回调返回当前页 GroupMembersInfo 列表,字段含义见 分页查询群成员 /sdk/android/group/retrieving group members/get group member list 。按 groupID:userID 去重;查询只建立当前快照,不触发回执事件。需要完整列表时继续分页。" + }, { "path": "/sdk/android/file-uploads/track-file-upload-progress", - "title": "跟踪文件上传进度", + "title": "监听文件上传进度", "description": "使用 Android SDK 的 OnPutFileListener 跟踪单次文件上传任务。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android file-uploads track-file-upload-progress", @@ -2957,7 +3053,7 @@ "description": "集中设置 Android SDK listener,并按业务领域分发连接、同步和数据事件。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android events overview-events", - "content": "OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。 连接 listener 是例外: OnConnListener 在 initSDK 时传入,其完整处理见 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。 集中设置 listener 下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。 public final class OpenIMEventCenter private final OpenIMClient client = OpenIMClient.getInstance ; private final OnUserListener userListener = buildUserListener ; private final OnFriendshipListener friendshipListener = buildFriendshipListener ; private final OnConversationListener conversationListener = buildConversationListener ; private final OnGroupListener groupListener = buildGroupListener ; private final OnAdvanceMsgListener messageListener = buildMessageListener ; private final OnCustomBusinessListener businessListener = buildBusinessListener ; private final OnSignalingListener signalingListener = buildSignalingListener ; public void registerBeforeLogin client.userInfoManager.setOnUserListener userListener ; client.friendshipManager.setOnFriendshipListener friendshipListener ; client.conversationManager.setOnConversationListener conversationListener ; client.groupManager.setOnGroupListener groupListener ; client.messageManager.setAdvancedMsgListener messageListener ; client.messageManager.setCustomBusinessListener businessListener ; client.signalingManager.setSignalingListener signalingListener ; Android SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。 事件归属 | 事件范围 | 合并标识 | 完整处理页面 | | | | | | 连接、Token 和强制下线 | 当前 SDK 实例与登录用户 | 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session | | 当前用户资料 | userID | 更新当前用户资料 /sdk/android/user/user profile/set self info | | 在线状态 | userID | 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status | | 好友关系与资料 | userID | 分页获取好友列表 /sdk/android/user/friends/get friend list page | | 好友申请 | fromUserID:toUserID | 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list | | 黑名单 | userID | 拉黑用户 /sdk/android/user/blacklist/add blacklist 、 移出黑名单 /sdk/android/user/blacklist/remove blacklist | | 会话列表 | conversationID | 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list | | 总未读数 | 当前登录用户 | 获取消息总未读数 /sdk/android/conversation/managing conversations/get total unread count | | 输入状态 | conversationID:userID | 更新输入状态 /sdk/android/message/composing messages/update typing status | | 群资料、成员和群申请 | groupID 或 groupID:userID | 群组概览 /sdk/android/group/overview group | | 新消息、离线消息和在线消息 | clientMsgID ,必要时结合 conversationID | 接收消息 /sdk/android/message/receiving messages/receive messages | | 消息撤回、删除、修改和置顶 | clientMsgID ,必要时结合 conversationID | 消息概览 /sdk/android/message/overview message | | 单聊已读回执 | conversationID:clientMsgID | 标记会话已读 /sdk/android/conversation/managing conversations/mark conversation read | | 自定义业务消息 | 业务协议中的幂等 ID | 接收自定义业务消息 /sdk/android/message/receiving messages/receive custom business messages | | 通话 | roomID ,参与者结合用户 ID | 处理通话事件 /sdk/android/calling/managing calls/handle call events | | 通话自定义信令 | roomID:eventID | 发送自定义信令 /sdk/android/calling/sending custom signals/send a custom signal | | SDK 数据同步 | 当前 SDK 实例与登录用户 | 本页“监听初始化同步” | 查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。 监听初始化同步 同步生命周期属于应用级 OnConversationListener 。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑: private OnConversationListener buildConversationListener return new OnConversationListener @Override public void onNewConversation List conversations mergeNewConversations conversations ; @Override public void onConversationChanged List conversations mergeChangedConversations conversations ; @Override public void onTotalUnreadMessageCountChanged int total updateTotalUnreadCount total ; @Override public void onConversationUserInputStatusChanged String payload handleInputStatus payload ; @Override public void onSyncServerStart boolean reinstall setSyncState \"syncing\", 0, reinstall ; @Override public void onSyncServerProgress long progress setSyncProgress progress ; @Override public void onSyncServerFinish boolean reinstall setSyncState \"ready\", 100, reinstall ; reloadVisibleSnapshots ; @Override public void onSyncServerFailed boolean reinstall setSyncState \"failed\", 0, reinstall ; ; reinstall 为 true 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。 onSyncServerProgress 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。 本页是 onSyncServerStart 、 onSyncServerProgress 、 onSyncServerFinish 和 onSyncServerFailed 的完整处理归属页。同步状态没有业务实体合并键,应按当前 OpenIMClient 单例和登录用户隔离。" + "content": "OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。 连接 listener 是例外: OnConnListener 在 initSDK 时传入,其完整处理见 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。 集中设置 listener 下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。 public final class OpenIMEventCenter private final OpenIMClient client = OpenIMClient.getInstance ; private final OnUserListener userListener = buildUserListener ; private final OnFriendshipListener friendshipListener = buildFriendshipListener ; private final OnConversationListener conversationListener = buildConversationListener ; private final OnGroupListener groupListener = buildGroupListener ; private final OnAdvanceMsgListener messageListener = buildMessageListener ; private final OnCustomBusinessListener businessListener = buildBusinessListener ; private final OnSignalingListener signalingListener = buildSignalingListener ; public void registerBeforeLogin client.userInfoManager.setOnUserListener userListener ; client.friendshipManager.setOnFriendshipListener friendshipListener ; client.conversationManager.setOnConversationListener conversationListener ; client.groupManager.setOnGroupListener groupListener ; client.messageManager.setAdvancedMsgListener messageListener ; client.messageManager.setCustomBusinessListener businessListener ; client.signalingManager.setSignalingListener signalingListener ; Android SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。 事件归属 | 事件范围 | Listener | 对应页面 | | | | | | 连接、Token 和强制下线 | OnConnListener | 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session | | 当前用户资料 | OnUserListener | 更新当前用户资料 /sdk/android/user/user profile/set self info | | 在线状态 | OnUserListener | 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status | | 好友关系与资料 | OnFriendshipListener | 分页获取好友列表 /sdk/android/user/friends/get friend list page | | 好友申请 | OnFriendshipListener | 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list | | 黑名单 | OnFriendshipListener | 拉黑用户 /sdk/android/user/blacklist/add blacklist 、 移出黑名单 /sdk/android/user/blacklist/remove blacklist | | 会话列表 | OnConversationListener | 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list | | 总未读数 | OnConversationListener | 获取消息总未读数 /sdk/android/conversation/managing conversations/get total unread count | | 输入状态 | OnConversationListener | 上报输入状态 /sdk/android/message/composing messages/update typing status | | 群资料、成员和群申请 | OnGroupListener | 群组概览 /sdk/android/group/overview group | | 新消息、离线消息和在线消息 | OnAdvanceMsgListener | 接收消息 /sdk/android/message/receiving messages/receive messages | | 消息撤回 | OnAdvanceMsgListener | 撤回消息 /sdk/android/message/managing messages/revoke a message | | 消息删除 | OnAdvanceMsgListener | 批量删除消息 /sdk/android/message/managing messages/delete saved messages | | 消息修改 | OnAdvanceMsgListener | 修改消息 /sdk/android/message/managing messages/modify a message | | 置顶消息 | OnAdvanceMsgListener | 置顶或取消置顶消息 /sdk/android/message/managing messages/set message pinned | | 单聊已读回执 | OnAdvanceMsgListener | 标记会话已读 /sdk/android/conversation/managing conversations/mark conversation read | | 自定义业务消息 | OnCustomBusinessListener | 接收自定义业务消息 /sdk/android/message/receiving messages/receive custom business messages | | 通话 | OnSignalingListener | 处理通话事件 /sdk/android/calling/managing calls/handle call events | | 通话自定义信令 | OnSignalingListener | 发送自定义信令 /sdk/android/calling/sending custom signals/send a custom signal | | SDK 数据同步 | OnConversationListener | 监听初始化同步 监听初始化同步 | 查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。 监听初始化同步 同步生命周期属于应用级 OnConversationListener 。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑: private OnConversationListener buildConversationListener return new OnConversationListener @Override public void onNewConversation List conversations mergeNewConversations conversations ; @Override public void onConversationChanged List conversations mergeChangedConversations conversations ; @Override public void onTotalUnreadMessageCountChanged int total updateTotalUnreadCount total ; @Override public void onConversationUserInputStatusChanged String payload handleInputStatus payload ; @Override public void onSyncServerStart boolean reinstall setSyncState \"syncing\", 0, reinstall ; @Override public void onSyncServerProgress long progress setSyncProgress progress ; @Override public void onSyncServerFinish boolean reinstall setSyncState \"ready\", 100, reinstall ; reloadVisibleSnapshots ; @Override public void onSyncServerFailed boolean reinstall setSyncState \"failed\", 0, reinstall ; ; reinstall 为 true 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。 onSyncServerProgress 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。 本页是 onSyncServerStart 、 onSyncServerProgress 、 onSyncServerFinish 和 onSyncServerFailed 的完整处理归属页。同步状态没有业务实体合并键,应按当前 OpenIMClient 单例和登录用户隔离。" }, { "path": "/sdk/android/logger", diff --git a/src/generated/search-index.json b/src/generated/search-index.json index e42b8f2c52..f72a177757 100644 --- a/src/generated/search-index.json +++ b/src/generated/search-index.json @@ -1941,7 +1941,7 @@ "description": "Learn about user profiles, friendships, friend requests, blacklists, and online status in the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user overview-user", - "content": "OpenIM Android SDK identifies each user by userID . When implementing profile cards, friend requests, contacts, or a blocklist, distinguish an application's public user profile from the current user's friend relationship and blocklist state. Group member lists, in group nicknames, group roles, and member administration belong to the Groups domain. User APIs cover profiles, friendships, friend requests, blacklists, and online status. User objects Android SDK returns different user objects for different scenarios: | Type | Use case | Main APIs | | | | | | LocalUser | The current user's local profile, settings page, avatar, nickname, and account level receive setting | getSelfLocalUserInfo , setSelfInfo | | PublicUserInfo | Application user lookup, friend candidates, and profiles for users who are not friends | getUsersInfo | | UserInfo | Combined Android wrapper object that can carry public, friend, or blacklist information | getFriendListPage , getFriendsInfo , getBlacklist | | FriendInfo | The current user's friend list, friend remarks, and relationship extension data | searchFriends , getFriendListPage | | FriendApplicationInfo | The parties, handling state, and message for a friend request | Friend request queries and callbacks | | BlacklistInfo | Users blocked by the current user and their blocklist relationship fields | getBlacklist , addBlacklist , removeBlacklist | | UsersOnlineStatus | User online status and connected platforms | subscribeUsersOnlineStatus , getSubscribeOnlineUsersStatus | The same userID can appear in public profile, friend, blocklist, and group member data. Prefer UserInfo.getFriendInfo when displaying a contact, PublicUserInfo when only a public account profile is needed, and UserInfo.getBlackInfo on a blocklist screen. Conversation list and chat page titles belong to conversation data and should use the conversation display name. Use userID as the stable key for user lists and events. A friend request contains both parties, so use fromUserID:toUserID to identify one request. Feature entry points | Requirement | Recommended page | | | | | Retrieve public profiles by userID for friend candidates or profile cards | Get specified user profiles /sdk/android/user/user profile/get users info | | Page through, search, or retrieve friend relationships by ID | Get the friend list by page /sdk/android/user/friends/get friend list page | | Send, retrieve, accept, or reject friend requests | Get received friend requests /sdk/android/user/friend applications/get recv friend application list | | Update friend data | Update friend profiles /sdk/android/user/friends/update friends | | Delete a friend relationship | Delete a friend /sdk/android/user/friends/delete friend | | View and maintain the current user's blocklist | Get the blacklist /sdk/android/user/blacklist/get blacklist | | Read or update the current user's nickname, avatar, and extension data | Update the current user profile /sdk/android/user/user profile/set self info | | Configure account level message reception and notification behavior | Set global message reception /sdk/android/user/user profile/set global message reception | | Subscribe to and retrieve online status | Subscribe to user online status /sdk/android/user/online status/subscribe users online status | State updates Each user related capability page owns the listener and merge behavior for its events: Current user profile changes: Update the current user profile /sdk/android/user/user profile/set self info . Friend request changes: Get received friend requests /sdk/android/user/friend applications/get recv friend application list . Friend relationship and profile changes: Get the friend list by page /sdk/android/user/friends/get friend list page . Blocklist changes: Block a user /sdk/android/user/blacklist/add blacklist . Online status changes: Subscribe to user online status /sdk/android/user/online status/subscribe users online status . UserInfoManager and FriendshipManager each retain one listener. setOnUserListener and setOnFriendshipListener replace the current listener. Combine the required callbacks in a shared state layer and set each listener once; multiple pages must not overwrite one another's listeners." + "content": "OpenIM Android SDK identifies each user by userID . When implementing profile cards, friend requests, contacts, or a blocklist, distinguish an application's public user profile from the current user's friend relationship and blocklist state. Group member lists, in group nicknames, group roles, and member administration belong to the Groups domain. User APIs cover profiles, friendships, friend requests, blacklists, and online status. User objects Android SDK returns different user objects for different scenarios: | Type | Use case | Main APIs | | | | | | LocalUser | The current user's local profile, settings page, avatar, nickname, and account level receive setting | getSelfLocalUserInfo , setSelfInfo | | PublicUserInfo | Application user lookup, friend candidates, and profiles for users who are not friends | getUsersInfo | | UserInfo | Combined Android wrapper object that can carry public, friend, or blacklist information | getFriendListPage , getFriendsInfo , getBlacklist | | FriendInfo | The current user's friend list, friend remarks, and relationship extension data | searchFriends , getFriendListPage | | FriendApplicationInfo | The parties, handling state, and message for a friend request | Friend request queries and callbacks | | BlacklistInfo | Users blocked by the current user and their blocklist relationship fields | getBlacklist , addBlacklist , removeBlacklist | | UsersOnlineStatus | User online status and connected platforms | subscribeUsersOnlineStatus , getSubscribeOnlineUsersStatus , unsubscribeOnlineUsersStatus | The same userID can appear in public profile, friend, blocklist, and group member data. Prefer UserInfo.getFriendInfo when displaying a contact, PublicUserInfo when only a public account profile is needed, and UserInfo.getBlackInfo on a blocklist screen. Conversation list and chat page titles belong to conversation data and should use the conversation display name. Use userID as the stable key for user lists and events. A friend request contains both parties, so use fromUserID:toUserID to identify one request. Feature entry points | Requirement | Recommended page | | | | | Retrieve public profiles by userID for friend candidates or profile cards | Get specified user profiles /sdk/android/user/user profile/get users info | | Page through, search, or retrieve friend relationships by ID | Get the friend list by page /sdk/android/user/friends/get friend list page | | Send, retrieve, accept, or reject friend requests | Get received friend requests /sdk/android/user/friend applications/get recv friend application list | | Update friend data | Update friend profiles /sdk/android/user/friends/update friends | | Delete a friend relationship | Delete a friend /sdk/android/user/friends/delete friend | | View and maintain the current user's blocklist | Get the blacklist /sdk/android/user/blacklist/get blacklist | | Read or update the current user's nickname, avatar, and extension data | Update the current user profile /sdk/android/user/user profile/set self info | | Configure account level message reception and notification behavior | Set global message reception /sdk/android/user/user profile/set global message reception | | Subscribe to, retrieve, and unsubscribe from online status | Subscribe to user online status /sdk/android/user/online status/subscribe users online status , Unsubscribe from user status /sdk/android/user/online status/unsubscribe users online status | State updates Each user related capability page owns the listener and merge behavior for its events: Current user profile changes: Update the current user profile /sdk/android/user/user profile/set self info . Friend request changes: Get received friend requests /sdk/android/user/friend applications/get recv friend application list . Friend relationship and profile changes: Get the friend list by page /sdk/android/user/friends/get friend list page . Blocklist changes: Block a user /sdk/android/user/blacklist/add blacklist . Online status changes: Subscribe to user online status /sdk/android/user/online status/subscribe users online status . UserInfoManager and FriendshipManager each retain one listener. setOnUserListener and setOnFriendshipListener replace the current listener. Combine the required callbacks in a shared state layer and set each listener once; multiple pages must not overwrite one another's listeners." }, { "path": "/sdk/android/user/user-profile/get-users-info", @@ -1961,7 +1961,7 @@ }, { "path": "/sdk/android/user/user-profile/set-self-info", - "title": "Update the current user profile", + "title": "Update your profile", "description": "Use setSelfInfo() to update the nickname, avatar, or extension data of the current user.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user user-profile set-self-info", @@ -1981,7 +1981,7 @@ "description": "Use subscribeUsersOnlineStatus() to subscribe to online status for specified users.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user online-status subscribe-users-online-status", - "content": "List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.subscribeUsersOnlineStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusSubscriptionFailure code, error ; , userIDs ; Remove empty and duplicate IDs, and subscribe only to users whose status is needed. The callback returns the initial List snapshot. Each item contains userID , status , and platformIDs . Deduplicate repeated subscriptions in the application state layer. Status fields | Field | Description | | | | | userID | Target user ID. | | status | Online status value defined by the server contract. | | platformIDs | Platforms on which the user is online. | This page owns onUserStatusChanged . Combine it into the application's single OnUserListener and merge by userID : @Override public void onUserStatusChanged UsersOnlineStatus status onlineStatusStore.put status.getUserID , status ; Subscription only creates or updates the subscription set; do not treat its callback as friend profile data. Manage the subscription set centrally when users leave the visible range or the account changes. Android does not expose a verifiable unsubscribe entry point, so this documentation does not record one." + "content": "List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.subscribeUsersOnlineStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusSubscriptionFailure code, error ; , userIDs ; Remove empty and duplicate IDs, and subscribe only to users whose status is needed. The callback returns the initial List snapshot. Each item contains userID , status , and platformIDs . Deduplicate repeated subscriptions in the application state layer. Status fields | Field | Description | | | | | userID | Target user ID. | | status | Online status value defined by the server contract. | | platformIDs | Platforms on which the user is online. | This page owns onUserStatusChanged . Combine it into the application's single OnUserListener and merge by userID : @Override public void onUserStatusChanged UsersOnlineStatus status onlineStatusStore.put status.getUserID , status ; Subscription only creates or updates the subscription set; do not treat its callback as friend profile data. Manage the subscription set centrally when users leave the visible range or the account changes, and remove users that are no longer needed through Unsubscribe from user status /sdk/android/user/online status/unsubscribe users online status ." }, { "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", @@ -1991,6 +1991,14 @@ "keywords": "sdk android v4 sdk android user online-status get-subscribe-online-users-status", "content": "OpenIMClient.getInstance .userInfoManager.getSubscribeOnlineUsersStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusQueryFailure code, error ; ; This method does not accept user IDs or modify the subscription set. The callback returns the current subscribed user List snapshot, which can reconcile status by userID after reconnecting or reopening a screen. The query does not trigger onUserStatusChanged . Apply the snapshot only to presence state; retrieve names and avatars through the user profile APIs." }, + { + "path": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "title": "Unsubscribe from user status", + "description": "Use unsubscribeOnlineUsersStatus to cancel online-status subscriptions for specified users.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android user online-status unsubscribe-users-online-status", + "content": "Cancel online status subscriptions when users leave the visible range, the screen closes, or the account changes. Remove empty and duplicate IDs before making the call. List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.unsubscribeOnlineUsersStatus new OnBase @Override public void onSuccess String data for String userID : userIDs presenceByUserID.remove userID ; @Override public void onError int code, String error recordStatusUnsubscribeFailure code, error ; , userIDs ; A successful callback means that the unsubscribe request completed. Only then remove the IDs from the application's subscription set and presence cache. Retain the previous state after an error so the operation can be retried. This operation does not change user profiles or friend relationships. Call Subscribe to user online status /sdk/android/user/online status/subscribe users online status when those users need to be tracked again." + }, { "path": "/sdk/android/user/friends/get-friend-list-page", "title": "Get the friend list by page", @@ -2247,6 +2255,814 @@ "keywords": "sdk android v4 sdk android conversation managing-conversations clear-conversation-messages", "content": "Use messageManager.clearConversationAndDeleteAllMsg for a product action such as “clear chat history”. OpenIMClient.getInstance .messageManager.clearConversationAndDeleteAllMsg conversationID, new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; @Override public void onError int code, String error recordConversationClearFailure code, error ; ; The conversation entry remains while the current account's messages and summary state are cleared. Clear the visible message list immediately, then reconcile the latest message, summary, and unread state from onConversationChanged or a fresh query." }, + { + "path": "/sdk/android/group/overview-group", + "title": "Group overview", + "description": "Learn how group profiles, members, applications, and group events are organized in the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group overview-group", + "content": "A group is represented by GroupInfo . Its groupID is the unique target identifier for profile, member, application, and permission operations. GroupMembersInfo represents a member's group specific nickname, role, mute expiration time, and extra data. One to one relationships and conversation unread counts do not belong to the group APIs. GroupManager delivers group profile changes, member changes, application handling, and joined group changes through one OnGroupListener . Set the listener once in a shared state layer and merge events by groupID or userID . OpenIMClient.getInstance .groupManager.setOnGroupListener new OnGroupListener @Override public void onGroupInfoChanged GroupInfo group groupStore.put group.getGroupID , group ; @Override public void onGroupMemberInfoChanged GroupMembersInfo member memberStore.put member.getGroupID + member.getUserID , member ; ; A successful callback from a group profile or member operation only means that the request completed. Use the corresponding group event or a fresh query as the source of truth. Main capabilities Group profile and settings /sdk/android/group/create group Group permissions /sdk/android/group/set group join verification Joining and leaving groups /sdk/android/group/join group Retrieving groups /sdk/android/group/retrieving groups/get specified groups info Group applications /sdk/android/group/group applications/overview group applications Retrieving group members /sdk/android/group/retrieving group members/overview retrieving group members Managing group members /sdk/android/group/managing group members/invite user to group" + }, + { + "path": "/sdk/android/group/create-group", + "title": "Create a group", + "description": "Use createGroup to create a group profile and specify its initial members, administrators, and owner.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group create-group", + "content": "Use createGroup to create a group. Set the group profile in GroupInfo , and pass the initial regular members, administrators, and owner as separate parameters. The success callback returns the complete GroupInfo created by the server. Store the server assigned groupID . GroupInfo info = new GroupInfo ; info.setGroupName \"Project discussion\" ; info.setIntroduction \"For project members only\" ; OpenIMClient.getInstance .groupManager.createGroup memberUserIDs, adminUserIDs, info, ownerUserID, new OnBase @Override public void onSuccess GroupInfo group openGroup group.getGroupID ; @Override public void onError int code, String error showCreateError error ; ; Select the owner and administrators according to your application's permission rules. Do not infer the owner from a local user list." + }, + { + "path": "/sdk/android/group/update-group-profile", + "title": "Update group profile", + "description": "Use setGroupInfo to update a group name, avatar, introduction, and other profile fields.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group update-group-profile", + "content": "Use setGroupInfo to update a group profile. The request object should contain at least the groupID and the fields being changed. Do not use an incomplete local cache to overwrite fields that are not part of the current edit. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setGroupName \"Mobile project team\" ; update.setIntroduction \"Android and iOS collaboration group\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markGroupUpdateSubmitted groupID ; @Override public void onError int code, String error showGroupUpdateError error ; ; Merge the latest profile from onGroupInfoChanged . Group announcements and extra data use the same API and are covered on their respective pages." + }, + { + "path": "/sdk/android/group/set-group-announcement", + "title": "Publish a group announcement", + "description": "Publish or update a group announcement through GroupInfo.notification.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group set-group-announcement", + "content": "The Android SDK does not provide a separate announcement method. Create a GroupInfo containing the groupID and notification , then call setGroupInfo . GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNotification \"Release review starts at 20:00 tonight.\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data refreshAnnouncement groupID ; @Override public void onError int code, String error showAnnouncementError error ; ; The returned GroupInfo exposes the update time and author through notificationUpdateTime and notificationUserID . The server validates whether the current user has permission to publish the announcement." + }, + { + "path": "/sdk/android/group/set-group-extension", + "title": "Set group extra data", + "description": "Store application-defined group data in GroupInfo.ex.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group set-group-extension", + "content": "GroupInfo.ex is a complete string; the SDK does not merge JSON values. If several application modules share the field, read the existing value and preserve the other namespaces when merging your changes. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setEx \" \\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false \" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markExtensionSubmitted groupID ; @Override public void onError int code, String error showExtensionError error ; ; Do not store access tokens, secrets, or device only UI state in group extra data." + }, + { + "path": "/sdk/android/group/set-group-join-verification", + "title": "Set group join verification", + "description": "Configure verification rules for group applications and invitations through GroupInfo.needVerification.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group set-group-join-verification", + "content": "Set the verification mode in GroupInfo.needVerification , then call setGroupInfo . Use one of the GroupVerification constants: APPLY NEED VERIFICATION INVITE DIRECTLY , ALL NEED VERIFICATION , or DIRECTLY . GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNeedVerification GroupVerification.ALL NEED VERIFICATION ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markVerificationSubmitted groupID ; @Override public void onError int code, String error showVerificationError error ; ; This setting applies to subsequent join requests. It does not accept or reject existing applications." + }, + { + "path": "/sdk/android/group/set-group-member-profile-access", + "title": "Set member profile access", + "description": "Use GroupInfo.lookMemberInfo to control whether users can view member profiles through the group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group set-group-member-profile-access", + "content": "lookMemberInfo is an integer switch: 0 disables access and 1 enables it. Submit only the groupID and this permission field when changing the setting. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setLookMemberInfo 1 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markMemberInfoAccessSubmitted groupID ; @Override public void onError int code, String error showPermissionError error ; ; This switch controls profile access through the group. It does not change user profile data that a member already possesses." + }, + { + "path": "/sdk/android/group/set-group-member-friend-permission", + "title": "Set member friend request permission", + "description": "Use GroupInfo.applyMemberFriend to control whether users can send friend requests from the group member list.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group set-group-member-friend-permission", + "content": "applyMemberFriend is an integer switch: 0 disables friend requests and 1 enables them. This rule only affects requests initiated through the member relationship in this group. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setApplyMemberFriend 0 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markFriendPermissionSubmitted groupID ; @Override public void onError int code, String error showPermissionError error ; ; After the update, use onGroupInfoChanged or a newly retrieved GroupInfo as the source of truth." + }, + { + "path": "/sdk/android/group/change-group-mute", + "title": "Change group mute status", + "description": "Use changeGroupMute to enable or disable mute-all mode for a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group change-group-mute", + "content": "Use changeGroupMute to toggle mute all mode. Pass true to enable it or false to disable it. To mute one member, see Mute or unmute a group member /sdk/android/group/managing group members/change group member mute . OpenIMClient.getInstance .groupManager.changeGroupMute new OnBase @Override public void onSuccess String data markGroupMuteSubmitted groupID, true ; @Override public void onError int code, String error showGroupMuteError error ; , groupID, true ; The effective speaking permissions for the owner and administrators, as well as server side permission checks, depend on the deployment policy." + }, + { + "path": "/sdk/android/group/join-group", + "title": "Apply to join a group", + "description": "Use joinGroup to submit a group application or join request.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group join-group", + "content": "Use joinGroup to submit a request to join a group. Set joinSource to the source of the request, such as an invitation, search result, or QR code. Use the five parameter overload when attaching extra data. OpenIMClient.getInstance .groupManager.joinGroup new OnBase @Override public void onSuccess String data markJoinSubmitted groupID ; @Override public void onError int code, String error showJoinError error ; , groupID, \"I would like to join the project discussion\", 3, \" \\\"from\\\":\\\"search\\\" \" ; The verification mode determines whether the user joins immediately. Update local state later through onJoinedGroupAdded or the relevant group application event." + }, + { + "path": "/sdk/android/group/quit-group", + "title": "Leave a group", + "description": "Use quitGroup to remove the current signed-in user from a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group quit-group", + "content": "quitGroup only removes the current signed in user. It does not dismiss the group or remove other members. OpenIMClient.getInstance .groupManager.quitGroup new OnBase @Override public void onSuccess String data removeJoinedGroup groupID ; @Override public void onError int code, String error showQuitError error ; , groupID ; Even after the request succeeds, handle onJoinedGroupDeleted and clear application caches for the group's member list, conversation entry, and related data." + }, + { + "path": "/sdk/android/group/dismiss-group", + "title": "Dismiss a group", + "description": "Use dismissGroup to dismiss a group that the current user is allowed to manage.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group dismiss-group", + "content": "dismissGroup dismisses the specified group and is normally available only to its owner. Ask for explicit confirmation before calling it so that leaving a group is not accidentally implemented as dismissing it. OpenIMClient.getInstance .groupManager.dismissGroup new OnBase @Override public void onSuccess String data markDismissSubmitted groupID ; @Override public void onError int code, String error showDismissError error ; , groupID ; Merge the final state from onGroupDismissed . After receiving the event, remove cached group profile, member, and conversation related data." + }, + { + "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "title": "Get group information", + "description": "Use getGroupsInfo to retrieve the latest profiles for specified groups.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-groups get-specified-groups-info", + "content": "When you already have a set of groupID values, use getGroupsInfo to retrieve their profiles. The result is a list of GroupInfo objects. Do not assume that its order exactly matches the request list. OpenIMClient.getInstance .groupManager.getGroupsInfo new OnBase @Override public void onSuccess List groups mergeGroups groups ; @Override public void onError int code, String error showGroupQueryError error ; , groupIDs ; Remove empty and duplicate IDs before making the request. Treat groups that do not exist or cannot be accessed as missing results." + }, + { + "path": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "title": "Get joined groups by page", + "description": "Use getJoinedGroupListPage to retrieve the current account’s joined groups by page.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-groups get-joined-group-list-page", + "content": "The Android SDK provides the paginated API. Start offset at 0 , then advance it by the number of items successfully merged from each page. Stop loading when the returned list is empty. OpenIMClient.getInstance .groupManager.getJoinedGroupListPage new OnBase @Override public void onSuccess List groups appendJoinedGroups groups ; @Override public void onError int code, String error showPageError error ; , offset, 20 ; Merge incremental changes from onJoinedGroupAdded and onJoinedGroupDeleted . Do not treat the pages loaded so far as the complete joined group list." + }, + { + "path": "/sdk/android/group/retrieving-groups/is-join-group", + "title": "Check group membership", + "description": "Use isJoinGroup to determine whether the current signed-in user has joined a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-groups is-join-group", + "content": "isJoinGroup only checks the membership relationship between the current signed in user and the specified groupID . OpenIMClient.getInstance .groupManager.isJoinGroup groupID, new OnBase @Override public void onSuccess Boolean joined updateJoinAction Boolean.TRUE.equals joined ; @Override public void onError int code, String error showMembershipError error ; ; This result does not replace a group profile query and cannot determine whether another user is in the group." + }, + { + "path": "/sdk/android/group/retrieving-groups/search-groups", + "title": "Search groups", + "description": "Use searchGroups to search locally available groups by group ID or name.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-groups search-groups", + "content": "searchGroups accepts a keyword list and separate switches for searching group IDs and group names. If both switches are disabled, there is no valid search scope. OpenIMClient.getInstance .groupManager.searchGroups new OnBase @Override public void onSuccess List groups showSearchResults groups ; @Override public void onError int code, String error showSearchError error ; , Collections.singletonList keyword , true, true ; A search result does not prove membership. Before opening the group, call Check group membership /sdk/android/group/retrieving groups/is join group when the current state matters." + }, + { + "path": "/sdk/android/group/group-applications/overview-group-applications", + "title": "Group applications overview", + "description": "Understand received and sent group applications, handling results, and state events in the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group group-applications overview-group-applications", + "content": "Group applications are represented by GroupApplicationInfo . Received applications are intended for group administrators, while sent applications belong to the current user. Use handleResult , reqMsg , handledMsg , and the handling time to display application state. The Android SDK provides paginated queries for received and sent applications, as well as accept and reject operations. It does not provide the pending application count API found in the Flutter menu. Merge application added, accepted, rejected, and deleted events through the shared listener described in Group overview /sdk/android/group/overview group ." + }, + { + "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "title": "Get received group applications", + "description": "Use getRecvGroupApplicationList to retrieve group applications that the current user can handle.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-recipient", + "content": "Use the non deprecated overload with GetGroupApplicationListAsRecipientReq . The request can filter by offset , count , groupIDs , and handleResults . GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .groupManager.getRecvGroupApplicationList new OnBase @Override public void onSuccess List items mergeReceivedApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ; Merge application events by their groupID and userID . Do not use a list index as an application identifier." + }, + { + "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "title": "Get sent group applications", + "description": "Use getSendGroupApplicationList to retrieve group applications sent by the current user.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-applicant", + "content": "Configure pagination and filters in GetGroupApplicationListAsApplicantReq , then call getSendGroupApplicationList . GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .groupManager.getSendGroupApplicationList new OnBase @Override public void onSuccess List items mergeSentApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ; After an application is accepted, use onJoinedGroupAdded as the source of truth for the joined group list." + }, + { + "path": "/sdk/android/group/group-applications/accept-group-application", + "title": "Accept a group application", + "description": "Use acceptGroupApplication to accept a user’s application to join a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group group-applications accept-group-application", + "content": "Pass the application's groupID , the applicant's userID , and a handling message. The server checks whether the current user has permission to approve the application. OpenIMClient.getInstance .groupManager.acceptGroupApplication new OnBase @Override public void onSuccess String data markApplicationHandled groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"Welcome to the group\" ; After acceptance, update the application and member lists through the group application event and onGroupMemberAdded ." + }, + { + "path": "/sdk/android/group/group-applications/refuse-group-application", + "title": "Reject a group application", + "description": "Use refuseGroupApplication to reject a user’s application to join a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group group-applications refuse-group-application", + "content": "The reject operation also takes the application's groupID , the applicant's userID , and a handling message. OpenIMClient.getInstance .groupManager.refuseGroupApplication new OnBase @Override public void onSuccess String data markApplicationRejected groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"The group is currently full\" ; Do not delete the local record immediately after the success callback. Update it from onGroupApplicationRejected or a fresh query." + }, + { + "path": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "title": "Group member queries overview", + "description": "Understand group member lists, specified member profiles, and membership queries in the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-group-members overview-retrieving-group-members", + "content": "Group member queries are scoped by groupID and return either GroupMembersInfo objects or user ID lists. The member list supports role filtering and offset pagination. Separate APIs retrieve specified member profiles, check membership, retrieve owners and administrators, and search by keyword. Merge member additions, removals, and profile changes through the OnGroupListener owned by Group overview /sdk/android/group/overview group . A query provides a snapshot and does not replace event handling." + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "title": "Get group members", + "description": "Use getGroupMemberList to retrieve group members by role and page.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-group-members get-group-member-list", + "content": "Set filter to 0 for all members, 1 for regular members, 2 for the owner, or 3 for administrators. Use offset and count for pagination. OpenIMClient.getInstance .groupManager.getGroupMemberList new OnBase @Override public void onSuccess List members appendMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, 0, offset, 50 ; Continue accepting member events while paging. Use the combination of groupID and userID as the merge key." + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "title": "Get group member profiles", + "description": "Use getGroupMembersInfo to retrieve specified users’ profiles within a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-group-members get-specified-group-members-info", + "content": "getGroupMembersInfo accepts one groupID and a list of target user IDs. It returns the users' GroupMembersInfo profiles within that group. OpenIMClient.getInstance .groupManager.getGroupMembersInfo new OnBase @Override public void onSuccess List members mergeMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, userIDs ; An empty list can mean that the targets are not in the group or that the current user cannot read their profiles. Handle the result according to your product requirements." + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "title": "Check users in a group", + "description": "Use getUsersInGroup to select the users who are currently members of a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-group-members get-users-in-group", + "content": "getUsersInGroup returns the IDs among the supplied candidates that currently belong to the specified group. It does not return member profiles. OpenIMClient.getInstance .groupManager.getUsersInGroup new OnBase @Override public void onSuccess List joinedUserIDs updateMembership joinedUserIDs ; @Override public void onError int code, String error showMembershipError error ; , groupID, candidateUserIDs ; To retrieve nicknames, roles, or mute state, call Get group member profiles /sdk/android/group/retrieving group members/get specified group members info afterward." + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "Get group owners and admins", + "description": "Use getGroupMemberOwnerAndAdmin to retrieve the group owner and administrator profiles.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-group-members get-group-member-owner-and-admin", + "content": "Use getGroupMemberOwnerAndAdmin when you need to display or check members with management roles. OpenIMClient.getInstance .groupManager.getGroupMemberOwnerAndAdmin new OnBase @Override public void onSuccess List members showModerators members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID ; The owner, administrator, and regular member roleLevel constants are defined in GroupRole . The server still determines whether a particular operation is permitted." + }, + { + "path": "/sdk/android/group/retrieving-group-members/search-group-members", + "title": "Search group members", + "description": "Use searchGroupMembers to search group members by user ID or group nickname.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group retrieving-group-members search-group-members", + "content": "Provide a keyword list, switches for user ID and group nickname matching, and pagination parameters. OpenIMClient.getInstance .groupManager.searchGroupMembers new OnBase @Override public void onSuccess List members showMemberSearch members ; @Override public void onError int code, String error showSearchError error ; , groupID, Collections.singletonList keyword , true, true, 0, 20 ; The search is limited to the target group. Do not make the request with an empty keyword or with both search switches disabled." + }, + { + "path": "/sdk/android/group/managing-group-members/invite-user-to-group", + "title": "Invite users to a group", + "description": "Use inviteUserToGroup to invite a list of users to a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group managing-group-members invite-user-to-group", + "content": "Pass the group ID, the list of invited user IDs, and an invitation message. The server determines whether the users join immediately according to the group settings and the current user's permissions. OpenIMClient.getInstance .groupManager.inviteUserToGroup new OnBase @Override public void onSuccess String data markInviteSubmitted groupID ; @Override public void onError int code, String error showInviteError error ; , groupID, inviteeUserIDs, \"Join the project discussion\" ; Merge users into the member list only after onGroupMemberAdded confirms that they joined. A successful submission alone does not mean that they are already members." + }, + { + "path": "/sdk/android/group/managing-group-members/kick-group-member", + "title": "Remove group members", + "description": "Use kickGroupMember to remove specified members from a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group managing-group-members kick-group-member", + "content": "kickGroupMember accepts a list of member IDs and a removal message. Prevent the current user from accidentally selecting themselves and respect the permission boundaries between owners and administrators. OpenIMClient.getInstance .groupManager.kickGroupMember new OnBase @Override public void onSuccess String data markRemovalSubmitted groupID ; @Override public void onError int code, String error showRemovalError error ; , groupID, memberUserIDs, \"No longer participating in this project\" ; Remove targets from the member cache after receiving onGroupMemberDeleted ." + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "title": "Update a group nickname", + "description": "Use SetGroupMemberInfo.nickname to update a member’s display name in a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-nickname", + "content": "All group member profile changes use setGroupMemberInfo . Set the groupID , userID , and nickname in the request. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setNickname \"Lin\" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markNicknameSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; Update the displayed name from GroupMembersInfo.nickname received by onGroupMemberInfoChanged ." + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "title": "Manage group administrators", + "description": "Use SetGroupMemberInfo.roleLevel to change a member’s role in a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-role-level", + "content": "Set roleLevel with a GroupRole constant: OWNER , ADMIN , or MEMBER . Use the separate ownership transfer API when changing the group owner; do not infer an ownership transfer flow from this API. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setRoleLevel GroupRole.ADMIN ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markRoleSubmitted groupID, userID ; @Override public void onError int code, String error showRoleError error ; ; The server validates the role change and its permissions. Use the member profile change event as the source of truth." + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "title": "Update a group member avatar", + "description": "Use SetGroupMemberInfo.faceURL to update the avatar displayed for a member in a group.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-avatar", + "content": "A group member avatar is a group specific profile field and does not change the user's global avatar. Pass an avatar URL that group members can access. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setFaceURL avatarURL ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markAvatarSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; Keep the previous avatar or an optimistic local state until the event arrives, then reconcile it with the latest member profile." + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-extension", + "title": "Set group member extra data", + "description": "Store application-defined group member data in SetGroupMemberInfo.ex.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-extension", + "content": "SetGroupMemberInfo.ex is a complete string; the SDK does not merge JSON values. If several application modules share the field, read and merge the existing value while preserving the other namespaces. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setEx \" \\\"duty\\\":\\\"reviewer\\\" \" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markMemberExtensionSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; Do not store credentials, tokens, or device only display state in this field." + }, + { + "path": "/sdk/android/group/managing-group-members/transfer-group-owner", + "title": "Transfer group ownership", + "description": "Use transferGroupOwner to transfer group ownership to a specified member.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group managing-group-members transfer-group-owner", + "content": "The target user must already be a group member. Require explicit confirmation before transferring ownership, then retrieve the owner and administrator profiles again after completion. OpenIMClient.getInstance .groupManager.transferGroupOwner new OnBase @Override public void onSuccess String data markOwnershipTransferSubmitted groupID ; @Override public void onError int code, String error showTransferError error ; , groupID, newOwnerUserID ; onGroupMemberInfoChanged and group profile changes can arrive asynchronously. Do not assume that local roles have already been updated inside the success callback." + }, + { + "path": "/sdk/android/group/managing-group-members/change-group-member-mute", + "title": "Mute or unmute a group member", + "description": "Use changeGroupMemberMute to set the mute duration for a specified group member.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android group managing-group-members change-group-member-mute", + "content": "seconds is the mute duration in seconds. Pass 0 to unmute the member. Member level mute state is independent from the group's mute all setting. OpenIMClient.getInstance .groupManager.changeGroupMemberMute new OnBase @Override public void onSuccess String data markMemberMuteSubmitted groupID, userID ; @Override public void onError int code, String error showMemberMuteError error ; , groupID, userID, 3600L ; Read muteEndTime from onGroupMemberInfoChanged to update the member state. Do not keep deriving the final mute state from local time and the submitted duration." + }, + { + "path": "/sdk/android/message/overview-message", + "title": "Message overview", + "description": "Learn about the Android SDK Message model, message lifecycle, and message listener.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message overview-message", + "content": "Android messages are represented by Message . Use clientMsgID for deduplication, and use sessionType , recvID , and groupID to distinguish one to one chats from group chats. Message content is stored in the corresponding element field. Sending, receiving, revoking, and deleting are separate state changes. OpenIMClient.getInstance .messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; ; Queries establish a snapshot, while OnAdvanceMsgListener merges incremental changes. Setting a listener on MessageManager replaces the current listener, so register it once in a shared state layer." + }, + { + "path": "/sdk/android/message/creating-messages/create-text-message", + "title": "Create a text message", + "description": "Use createTextMessage to create a text Message.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-text-message", + "content": "createTextMessage only creates a local message object. It does not send the message. Message message = OpenIMClient.getInstance .messageManager.createTextMessage text ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-text-at-message", + "title": "Create a mention message", + "description": "Use createTextAtMessage to create a text message that mentions group members.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-text-at-message", + "content": "Pass the text, mentioned user IDs, the AtUserInfo list, and an optional quoted message. Message message = OpenIMClient.getInstance .messageManager.createTextAtMessage text, userIDs, atUserInfos, quoteMessage ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-custom-message", + "title": "Create a custom message", + "description": "Use createCustomMessage to carry application-defined JSON content.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-custom-message", + "content": "Your application defines data , extension , and description . Receiving clients must parse them according to the same application protocol. Message message = OpenIMClient.getInstance .messageManager.createCustomMessage dataJson, extensionJson, description ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-image-message", + "title": "Create an image message", + "description": "Create an image message from a path relative to the SDK data directory.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-image-message", + "content": "Message message = OpenIMClient.getInstance .messageManager .createImageMessage imagePath ; The image file must be stored under the data directory configured during SDK initialization. Pass its path relative to that directory. This method only creates an object waiting to be sent; the regular send flow uploads the image." + }, + { + "path": "/sdk/android/message/creating-messages/create-image-message-by-file", + "title": "Create an image message from a local path", + "description": "Create an image message from an absolute path.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-image-message-by-file", + "content": "Message message = OpenIMClient.getInstance .messageManager .createImageMessageFromFullPath absolutePath ; The absolute path must be readable. This method only creates an object waiting to be sent; the regular send flow uploads the image." + }, + { + "path": "/sdk/android/message/creating-messages/create-image-message-by-url", + "title": "Create an image message from URLs", + "description": "Use createImageMessageByURL to create an image message for an uploaded resource.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-image-message-by-url", + "content": "Prepare the original, large, and thumbnail PictureInfo values before creating the message. Message message = OpenIMClient.getInstance .messageManager.createImageMessageByURL sourceURL, sourcePicture, bigPicture, snapshotPicture ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-sound-message", + "title": "Create an audio message", + "description": "Create an audio message from a path relative to the SDK data directory.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-sound-message", + "content": "Message message = OpenIMClient.getInstance .messageManager .createSoundMessage soundPath, durationSeconds ; The audio file must be stored under the data directory configured during SDK initialization. Pass its path relative to that directory, and specify the duration in seconds. This method only creates an object waiting to be sent." + }, + { + "path": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "title": "Create an audio message from a local path", + "description": "Create an audio message from an absolute path.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-sound-message-by-file", + "content": "Message message = OpenIMClient.getInstance .messageManager .createSoundMessageFromFullPath absolutePath, durationSeconds ; The absolute path must be readable, and the audio duration is measured in seconds. This method only creates an object waiting to be sent." + }, + { + "path": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "title": "Create an audio message from a URL", + "description": "Use SoundElem to create an audio message for an uploaded resource.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-sound-message-by-url", + "content": "createSoundMessageByURL accepts a SoundElem that already contains the remote URL, duration, and file size. Message message = OpenIMClient.getInstance .messageManager.createSoundMessageByURL soundElem ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-video-message", + "title": "Create a video message", + "description": "Create a video message from paths relative to the SDK data directory.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-video-message", + "content": "Message message = OpenIMClient.getInstance .messageManager.createVideoMessage videoPath, mimeType, durationSeconds, snapshotPath ; The video and snapshot files must be stored under the data directory configured during SDK initialization. Pass both paths relative to that directory, and specify the duration in seconds. This method only creates an object waiting to be sent." + }, + { + "path": "/sdk/android/message/creating-messages/create-video-message-by-file", + "title": "Create a video message from local paths", + "description": "Create a video message from absolute video and thumbnail paths.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-video-message-by-file", + "content": "Message message = OpenIMClient.getInstance .messageManager.createVideoMessageFromFullPath absoluteVideoPath, mimeType, durationSeconds, absoluteSnapshotPath ; The absolute video and thumbnail paths must be readable, and the duration is measured in seconds. This method only creates an object waiting to be sent." + }, + { + "path": "/sdk/android/message/creating-messages/create-video-message-by-url", + "title": "Create a video message from URLs", + "description": "Use VideoElem to create a video message for an uploaded resource.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-video-message-by-url", + "content": "Populate VideoElem with the remote video and thumbnail information, then create the message. Message message = OpenIMClient.getInstance .messageManager.createVideoMessageByURL videoElem ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-file-message", + "title": "Create a file message", + "description": "Create a file message from a path relative to the SDK data directory.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-file-message", + "content": "Message message = OpenIMClient.getInstance .messageManager .createFileMessage filePath, fileName ; The file must be stored under the data directory configured during SDK initialization. Pass its path relative to that directory; fileName is displayed to recipients. This method only creates an object waiting to be sent." + }, + { + "path": "/sdk/android/message/creating-messages/create-file-message-by-file", + "title": "Create a file message from a local path", + "description": "Create a file message from an absolute path.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-file-message-by-file", + "content": "Message message = OpenIMClient.getInstance .messageManager .createFileMessageFromFullPath absolutePath, fileName ; The absolute path must be readable. Pass the file name and path separately. This method only creates an object waiting to be sent." + }, + { + "path": "/sdk/android/message/creating-messages/create-file-message-by-url", + "title": "Create a file message from a URL", + "description": "Use FileElem to create a file message for an uploaded resource.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-file-message-by-url", + "content": "FileElem should contain the remote URL, file name, and file size. Message message = OpenIMClient.getInstance .messageManager.createFileMessageByURL fileElem ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-card-message", + "title": "Create a contact card message", + "description": "Use createCardMessage to create a contact card message.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-card-message", + "content": "CardElem stores the display profile for the user represented by the card. Message message = OpenIMClient.getInstance .messageManager.createCardMessage cardElem ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-location-message", + "title": "Create a location message", + "description": "Use createLocationMessage to create a message with coordinates and a location description.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-location-message", + "content": "Use decimal degrees for latitude and longitude. The description is displayed in a map view or message list. Message message = OpenIMClient.getInstance .messageManager .createLocationMessage latitude, longitude, description ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-face-message", + "title": "Create an emoji message", + "description": "Use createFaceMessage to create a custom emoji message.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-face-message", + "content": "index identifies the emoji position, while data stores JSON such as an emoji URL. Message message = OpenIMClient.getInstance .messageManager.createFaceMessage index, dataJson ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-quote-message", + "title": "Create a reply message", + "description": "Use createQuoteMessage to reply while quoting an existing message.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-quote-message", + "content": "A quote message stores the complete quoted Message . Before sending, make sure the quoted object has a stable clientMsgID . Message message = OpenIMClient.getInstance .messageManager .createQuoteMessage replyText, quotedMessage ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-advanced-text-message", + "title": "Create a rich-text message", + "description": "Use createAdvancedTextMessage to create a rich-text message with structured entity ranges.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-advanced-text-message", + "content": "RichMessage marks a range in the text with offset and length , while type , url , and info carry application defined entity data. RichMessage link = new RichMessage ; link.setType \"link\" ; link.setOffset 0 ; link.setLength 6 ; link.setUrl \"https://docs.openim.io\" ; link.setInfo \" \\\"title\\\":\\\"OpenIM documentation\\\" \" ; Message message = OpenIMClient.getInstance .messageManager.createAdvancedTextMessage \"OpenIM docs\", Collections.singletonList link ; Every entity range must match an actual range in the final text. Validate the ranges, URLs, and info values before sending, and make sure receiving clients use the same type and info protocol. This method only creates a Message ; send it through Send a message /sdk/android/message/sending messages/send message ." + }, + { + "path": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "title": "Create a rich-text reply", + "description": "Use createAdvancedQuoteMessage to create a quoted reply with rich-text entities.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-advanced-quote-message", + "content": "A rich text reply stores the reply text, the quoted message, and the RichMessage entity ranges in the reply text. RichMessage mention = new RichMessage ; mention.setType \"mention\" ; mention.setOffset 0 ; mention.setLength 6 ; mention.setInfo \" \\\"userID\\\":\\\"user a\\\" \" ; Message message = OpenIMClient.getInstance .messageManager.createAdvancedQuoteMessage \"OpenIM agreed\", originalMessage, Collections.singletonList mention ; The quoted originalMessage should contain a stable clientMsgID , and every entity range must match the final reply text. Use the same application protocol for type , url , and info as described in Create a rich text message /sdk/android/message/creating messages/create advanced text message . This method only creates an object waiting to be sent." + }, + { + "path": "/sdk/android/message/creating-messages/create-forward-message", + "title": "Create a forwarded message", + "description": "Use createForwardMessage to create a forwarded copy of a message.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-forward-message", + "content": "Pass the source Message . The returned message must still be delivered to the target conversation through a send API. Message message = OpenIMClient.getInstance .messageManager.createForwardMessage sourceMessage ;" + }, + { + "path": "/sdk/android/message/creating-messages/create-merger-message", + "title": "Create a merged message", + "description": "Use createMergerMessage to combine multiple messages into one summary message.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message creating-messages create-merger-message", + "content": "Pass the message list, title, and summary list. Keep summary ordering consistent with the display protocol used by your clients. Message message = OpenIMClient.getInstance .messageManager.createMergerMessage messages, title, summaries ;" + }, + { + "path": "/sdk/android/message/sending-messages/send-message", + "title": "Send a message", + "description": "Use sendMessage to send a Message to a one-to-one or group conversation.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message sending-messages send-message", + "content": "For a one to one message, set recvUid and pass null for the group target. For a group message, set recvGid and pass null for the user target. OnMsgSendCallback reports success, failure, and media upload progress. messageManager.sendMessage new OnMsgSendCallback @Override public void onSuccess String id mergeSentMessage message ; @Override public void onError int code, String error showSendError error ; , message, peerUserID, null, offlinePushInfo ;" + }, + { + "path": "/sdk/android/message/sending-messages/send-message-not-oss", + "title": "Send a message without OSS", + "description": "Use sendMessageNotOss to send a media message whose resources were uploaded by your application.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message sending-messages send-message-not-oss", + "content": "Use this method when the media URLs in the message are already available. It prevents the SDK from entering its built in upload flow again. messageManager.sendMessageNotOss callback, message, peerUserID, null, offlinePushInfo ;" + }, + { + "path": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "title": "Track message sending progress", + "description": "Use the progress callback on OnMsgSendCallback to update media sending progress.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message sending-messages set-msg-send-progress-listener", + "content": "Android does not provide a separate global send progress listener. Each call to sendMessage or sendMessageNotOss reports progress through its own OnMsgSendCallback . messageManager.sendMessage new OnMsgSendCallback @Override public void onProgress long progress updateProgress progress ; @Override public void onSuccess String id finishProgress ; @Override public void onError int code, String error failProgress error ; , message, peerUserID, null, offlinePushInfo ;" + }, + { + "path": "/sdk/android/message/receiving-messages/receive-messages", + "title": "Receive messages", + "description": "Use OnAdvanceMsgListener to receive new, offline, and online-only messages.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message receiving-messages receive-messages", + "content": "After calling setAdvancedMsgListener , onRecvNewMessage receives real time messages, onRecvOfflineNewMessage receives offline batches, and onRecvOnlineOnlyMessage receives online only message strings. Merge all messages idempotently by clientMsgID . messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; @Override public void onRecvOfflineNewMessage List messages messageStore.mergeAll messages ; ;" + }, + { + "path": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "title": "Receive custom business messages", + "description": "Use setCustomBusinessListener to receive business callbacks that are separate from regular chat messages.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message receiving-messages receive-custom-business-messages", + "content": "The custom business callback carries a string payload. Validate its source and JSON structure according to your application protocol instead of rendering it directly as a Message . messageManager.setCustomBusinessListener new OnCustomBusinessListener @Override public void onRecvCustomBusinessMessage String payload handleBusiness payload ; ; This page owns the complete handling contract for onRecvCustomBusinessMessage . Include a protocol version and stable idempotency ID in the payload, and deduplicate by that ID. Do not depend on callback order or use a custom business message to grant client side permissions. MessageManager retains only one custom business listener; setting another replaces the previous one. Register it once in an application level event center, and stop dispatching into the previous account's state when signing out or switching accounts." + }, + { + "path": "/sdk/android/message/retrieving-messages/load-older-messages", + "title": "Load older messages", + "description": "Use getAdvancedHistoryMessageList to load conversation history by page.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message retrieving-messages load-older-messages", + "content": "Pass null for startMsg on the first query. For each subsequent page, use the boundary message from the previous page as the starting point. Deduplicate returned messages by clientMsgID . messageManager.getAdvancedHistoryMessageList callback, conversationID, startMessage, 20, ViewType.NORMAL ;" + }, + { + "path": "/sdk/android/message/retrieving-messages/load-newer-messages", + "title": "Load newer messages", + "description": "Use getAdvancedHistoryMessageListReverse to load messages after a starting point.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message retrieving-messages load-newer-messages", + "content": "Use this method to read forward from a located message, such as when opening a search result or loading the following page of context. messageManager.getAdvancedHistoryMessageListReverse callback, conversationID, startMessage, 20, ViewType.NORMAL ;" + }, + { + "path": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "title": "Find messages by ID", + "description": "Use findMessageList to retrieve message records with SearchParams.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message retrieving-messages find-messages-by-id", + "content": "Create a list of SearchParams for the messages you need. Merge returned records by message ID rather than treating their list positions as stable identifiers. messageManager.findMessageList new OnBase @Override public void onSuccess SearchResult result showFoundMessages result ; @Override public void onError int code, String error showQueryError error ; , searchParams ;" + }, + { + "path": "/sdk/android/message/retrieving-messages/load-message-context", + "title": "Load message context", + "description": "Retrieve messages before and after a specified message with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message retrieving-messages load-message-context", + "content": "When navigating from a search result or referenced message into its chat context, use the Message already retrieved as the anchor. Parameters | Parameter | Type | Required | Description | | | | | | | conversationID | String | Yes | ID of the conversation containing the anchor message. | | startMsg | Message | Yes | Previously retrieved anchor message. | | type | ViewType | Yes | Context type. Use ViewType.History for a referenced message and ViewType.Search for a search result. | | before | int | Yes | Maximum number of messages to retrieve before the anchor. | | after | int | Yes | Maximum number of messages to retrieve after the anchor. | messageManager.fetchSurroundingMessages new OnBase @Override public void onSuccess Messages messages List surrounding = messages.getData ; renderMessages surrounding ; @Override public void onError int code, String error // Handle the failure , conversationID, targetMessage, ViewType.Search, 20, 20 ; In the success callback, messages.getData is the list retrieved before and after the anchor. For message fields, see Message overview /sdk/android/message/overview message . before and after independently limit the number of messages on either side. The result can contain fewer messages than requested when the anchor is near a history boundary or some messages have been deleted. Merge by conversationID:clientMsgID ; do not rely on fixed array positions. If the message must first be located, see Find messages by ID /sdk/android/message/retrieving messages/find messages by id ." + }, + { + "path": "/sdk/android/message/searching-messages/search-messages", + "title": "Search messages", + "description": "Use searchLocalMessages to search messages synchronized to the current account’s local storage.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message searching-messages search-messages", + "content": "Search by conversation, keywords, senders, message types, time range, and pagination parameters. Pass null for conversationID to search across all local conversations. messageManager.searchLocalMessages callback, conversationID, keywords, 1, senderIDs, messageTypes, 0, 0, 0, 20 ;" + }, + { + "path": "/sdk/android/message/composing-messages/update-typing-status", + "title": "Update typing status", + "description": "Report the current conversation typing state with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message composing-messages update-typing-status", + "content": "Set focus to true when typing starts. Set it to false when typing ends, the input field loses focus, or the conversation screen closes. conversationManager.changeInputState new OnBase @Override public void onSuccess String data // The typing state has been reported @Override public void onError int code, String error // Handle the failure , conversationID, true ; Clear the state promptly when typing ends: conversationManager.changeInputState callback, conversationID, false ; Coalesce consecutive focus changes and attempt to report false before the screen closes or the connection is interrupted. A successful callback means only that the report request completed; it does not mean that other clients have updated their interfaces. Other clients receive typing state changes through OnConversationListener.onConversationUserInputStatusChanged . The Android SDK returns the event payload as a string, so validate the JSON before parsing it: @Override public void onConversationUserInputStatusChanged String payload InputStatesChangedData state = JsonUtil.toObj payload, InputStatesChangedData.class ; if state == null || state.getConversationID == null return; updateTypingState state.getConversationID , state.getUserID , state.getPlatformIDs ; Merge typing states by conversationID:userID and clear them after an application defined timeout. ConversationManager retains only one conversation listener, so combine this callback with conversation list, total unread, and synchronization events in one listener. When opening a conversation or restoring a connection, use Get typing status /sdk/android/message/composing messages/get typing status to retrieve the current snapshot." + }, + { + "path": "/sdk/android/message/composing-messages/get-typing-status", + "title": "Retrieve typing status", + "description": "Use getInputState to retrieve a specified user’s current typing status in a conversation.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message composing-messages get-typing-status", + "content": "When opening a conversation, restoring a connection, or reconciling state, query the platform IDs on which a specified user is currently typing. OpenIMClient.getInstance .conversationManager.getInputState new OnBase @Override public void onSuccess List platformIDs boolean typing = platformIDs = null && platformIDs.isEmpty ; updateTypingState conversationID, userID, typing ; @Override public void onError int code, String error recordTypingStatusQueryFailure code, error ; , conversationID, userID ; The callback returns a snapshot array of platform IDs. An empty array means that no platform was typing at query time. The query itself does not trigger a typing status event. In a group chat, do not poll every member frequently. Query relevant members only when opening the screen, restoring a connection, or reconciling state, and maintain incremental updates through the listener owned by Report typing status /sdk/android/message/composing messages/update typing status ." + }, + { + "path": "/sdk/android/message/managing-messages/delete-local-message", + "title": "Delete a local message", + "description": "Use deleteMessageFromLocalStorage to delete only the message copy on the current device.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages delete-local-message", + "content": "This operation does not affect message records on other devices or for other users. messageManager.deleteMessageFromLocalStorage conversationID, clientMsgID, callback ;" + }, + { + "path": "/sdk/android/message/managing-messages/delete-saved-messages", + "title": "Delete messages in a batch", + "description": "Delete multiple messages from one conversation for the current account with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages delete-saved-messages", + "content": "Parameters | Parameter | Type | Required | Description | | | | | | | conversationID | String | Yes | ID of the conversation containing the messages to delete. | | clientMsgIDs | String | Yes | IDs of the messages to delete. Every ID in one batch must belong to the same conversation. | | isSync | boolean | Yes | Whether to synchronize the deletion to the current account's other clients. | DeleteMessagesReq request = new DeleteMessagesReq true, conversationID, selectedClientMsgIDs.toArray new String 0 ; messageManager.deleteMessages request, new OnBase @Override public void onSuccess String data // The deletion request has completed @Override public void onError int code, String error // Handle the failure ; With isSync set to false , the operation deletes the current device's copy and the current account's server side record. With true , it also requests deletion synchronization to the account's other clients. It does not delete copies held by other conversation members or display a revocation notice. The success callback means that the deletion request has completed. When synchronization is enabled, it does not mean that other clients have already received the event or updated their interfaces. This page owns OnAdvanceMsgListener.onMsgDeleted . Determine the conversation from the message routing fields, then remove the message idempotently by clientMsgID . @Override public void onMsgDeleted Message message removeMessage resolveConversationID message , message.getClientMsgID ; To reconcile the current message snapshot, query the corresponding conversation history again." + }, + { + "path": "/sdk/android/message/managing-messages/delete-user-messages", + "title": "Delete all messages from a user in a group chat", + "description": "Delete every message sent by a specified user in a group chat with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages delete-user-messages", + "content": "messageManager.deleteUserAllMessagesInConv conversationID, targetUserID, new OnBase @Override public void onSuccess String data // The deletion request has completed @Override public void onError int code, String error // Handle the failure ; This API is available only for group chats and deletes every message sent by the specified user in the target group conversation. It is a high impact group moderation action and should not appear in an ordinary single message menu. OpenIMServer validates the operator's permission. A successful callback does not mean that the event has already arrived. This page owns OnAdvanceMsgListener.onDeleteUserAllMsgsInConv . When the event arrives, use its conversationID and userID to remove messages from that sender in the cached conversation, or reload conversation history to reconcile the state. @Override public void onDeleteUserAllMsgsInConv DeleteUserAllMsgsListenerMsg event removeMessagesBySender event.getConversationID , event.getUserID ; Callback completion, event arrival, and a new history query are three independent stages." + }, + { + "path": "/sdk/android/message/managing-messages/revoke-a-message", + "title": "Revoke a message", + "description": "Revoke a sent message and handle revocation notifications received by other clients.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages revoke-a-message", + "content": "Revoking a message causes other clients to display the original message in a revoked state. Before calling the API, confirm that the message was sent successfully and enforce the revocation time window in the application interface. The server makes the final authorization decision. messageManager.revokeMessageV2 callback, conversationID, clientMsgID ; The success callback means that the server completed the revocation request; it does not mean that every client has received the event. Receiving clients merge the change through OnAdvanceMsgListener.onRecvMessageRevokedV2 . This page is the complete owner of onRecvMessageRevokedV2 . RevokedInfo contains the clientMsgID , revoker, and revocation time, but not the conversationID . Resolve the owning conversation from the current account's message index, then update by conversationID:clientMsgID : @Override public void onRecvMessageRevokedV2 RevokedInfo info String clientMsgID = info.getClientMsgID ; String conversationID = findConversationIDByClientMsgID clientMsgID ; if conversationID == null return; markMessageRevoked conversationID, clientMsgID, info ; Update the matching message to a revoked state instead of deleting it from the list. Add this callback to the application's single OnAdvanceMsgListener ; see Events /sdk/android/events/overview events for centralized setup. Callback completion, event delivery, and a new history query are three independent stages. Re query the corresponding conversation history when reconciliation is required." + }, + { + "path": "/sdk/android/message/managing-messages/modify-a-message", + "title": "Modify a message", + "description": "Modify supported message content and handle modification events received by other clients.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages modify-a-message", + "content": "Use modifyMessage to change an existing message in a conversation. Preserve the original conversation ID, clientMsgID , routing fields, sender, and other message data in the request, and update only the supported content. messageManager.modifyMessage callback, modifyRequest ; The success callback means that the modification request completed; it does not mean that every client interface has updated. Other clients receive the complete modified Message through OnAdvanceMsgListener.onMessageModified . This page is the complete owner of onMessageModified . Resolve the conversationID from the message routing fields, then replace the original message by conversationID:clientMsgID . Do not match by array position or displayed text: @Override public void onMessageModified Message message String conversationID = resolveConversationID message ; if conversationID == null return; replaceMessage conversationID, message.getClientMsgID , message ; Add this callback to the application's single OnAdvanceMsgListener ; see Events /sdk/android/events/overview events for centralized setup. Callback completion, event delivery, and a new history query are three independent stages." + }, + { + "path": "/sdk/android/message/managing-messages/get-pinned-messages", + "title": "View pinned messages", + "description": "Use getConversationPinnedMsgs to retrieve pinned messages in a conversation.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages get-pinned-messages", + "content": "The result is a snapshot of the messages currently pinned in the specified conversation. messageManager.getConversationPinnedMsgs new OnBase @Override public void onSuccess List messages showPinned messages ; @Override public void onError int code, String error showPinnedError error ; , conversationID ;" + }, + { + "path": "/sdk/android/message/managing-messages/set-message-pinned", + "title": "Pin or unpin a message", + "description": "Change a conversation message’s pinned state and handle pinned-message change events.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages set-message-pinned", + "content": "Pass true as the final argument to pin the message or false to unpin it: messageManager.setConversationPinnedMsg callback, conversationID, clientMsgID, true ; The success callback means that the request completed; it does not mean that the pinned message event has arrived. This page owns OnAdvanceMsgListener.onChangedPinnedMsg . ChangedPinnedMsg contains the conversationID and current pinned message collection. Replace the collection for that conversation, then deduplicate its messages by clientMsgID : @Override public void onChangedPinnedMsg ChangedPinnedMsg event replacePinnedMessages event.getConversationID , event.getMsgs ; Add this callback to the application's single OnAdvanceMsgListener ; see Events /sdk/android/events/overview events for centralized setup. Callback completion, event delivery, and the snapshot from View pinned messages /sdk/android/message/managing messages/get pinned messages are three independent stages." + }, + { + "path": "/sdk/android/message/managing-messages/insert-local-single-message", + "title": "Insert a local direct message", + "description": "Use insertSingleMessageToLocalStorage to insert a one-to-one message visible only on the current device.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages insert-local-single-message", + "content": "This method does not send the message to the server. receiver and sender determine how the local message is associated with the conversation. messageManager.insertSingleMessageToLocalStorage callback, message, receiverUserID, senderUserID ;" + }, + { + "path": "/sdk/android/message/managing-messages/insert-local-group-message", + "title": "Insert a local group message", + "description": "Use insertGroupMessageToLocalStorage to insert a group message visible only on the current device.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages insert-local-group-message", + "content": "Pass the group ID and sender ID. The message is not synchronized to other devices. messageManager.insertGroupMessageToLocalStorage callback, message, groupID, senderUserID ;" + }, + { + "path": "/sdk/android/message/managing-messages/clear-all-local-messages", + "title": "Clear all local messages", + "description": "Use deleteAllMsgFromLocal to clear all messages stored on the current device.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages clear-all-local-messages", + "content": "This operation only clears the current device's local cache. It does not delete server records. messageManager.deleteAllMsgFromLocal callback ;" + }, + { + "path": "/sdk/android/message/managing-messages/clear-all-messages", + "title": "Clear all saved messages", + "description": "Use deleteAllMsgFromLocalAndSvr to clear local and server-side messages.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages clear-all-messages", + "content": "This is a high impact operation. Ask for confirmation before calling it, then clear the local conversation display after it completes. messageManager.deleteAllMsgFromLocalAndSvr callback ;" + }, + { + "path": "/sdk/android/message/managing-messages/set-message-local-ex", + "title": "Set local message extensions", + "description": "Use setMessageLocalEx to store message data used only on the current device.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-messages set-message-local-ex", + "content": "localEx is suitable for local information such as a download path or playback state. It is not synchronized to other users. messageManager.setMessageLocalEx callback, conversationID, clientMsgID, localExJson ;" + }, + { + "path": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "title": "Report group messages as read", + "description": "Report group-message read receipts with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-read-status send-group-read-receipts", + "content": "messageManager.sendGroupMessageReadReceipt conversationID, visibleClientMsgIDs, new OnBase @Override public void onSuccess String data // The read receipts have been reported @Override public void onError int code, String error // Handle the failure ; Every message in one batch must belong to the target group conversation. A successful callback means only that the server accepted the report; it does not mean that other client interfaces have already updated. The conversation unread count is maintained separately through markConversationMessageAsRead . Other clients receive member level group read changes through OnAdvanceMsgListener.onRecvGroupMessageReadReceipt . This page is the canonical reference for that event. Merge read counts, unread counts, and member information using the receipt's conversationID and message IDs. @Override public void onRecvGroupMessageReadReceipt GroupMessageReceipt receipt mergeGroupReadReceipt receipt ; The report callback, the group receipt event, and the member snapshot from Get members who read a group message /sdk/android/message/managing read status/get group message readers are three independent stages." + }, + { + "path": "/sdk/android/message/managing-read-status/get-group-message-readers", + "title": "Get members who read a group message", + "description": "Retrieve members who have or have not read a group message using pagination.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android message managing-read-status get-group-message-readers", + "content": "Parameters | Parameter | Type | Required | Description | | | | | | | conversationID | String | Yes | ID of the group conversation. | | clientMsgID | String | Yes | ID of the message whose reader list to query. | | filter | int | Yes | Pass 0 for members who have read the message or 1 for members who have not read it. | | offset | int | Yes | Pagination offset. Pass 0 for the first page. | | count | int | Yes | Maximum number of members to retrieve. | messageManager.getGroupMessageReaderList conversationID, clientMsgID, 0, 0, 50, new OnBase @Override public void onSuccess List members renderMembers members ; @Override public void onError int code, String error // Handle the failure ; The success callback returns the current page of GroupMembersInfo objects. For field descriptions, see List group members /sdk/android/group/retrieving group members/get group member list . Deduplicate by groupID:userID . The query establishes a snapshot and does not trigger a receipt event. Continue paging when the complete list is required." + }, + { + "path": "/sdk/android/file-uploads/track-file-upload-progress", + "title": "Track file upload progress", + "description": "Use OnPutFileListener to track an individual Android SDK file upload.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android file-uploads track-file-upload-progress", + "content": "The Android SDK does not use a global file upload listener. Pass an OnPutFileListener to each uploadFile call. That listener receives progress, part completion, and final result callbacks for the current task. OnPutFileListener uploadListener = new OnPutFileListener @Override public void open long size initializeUploadProgress uploadTaskID, size ; @Override public void uploadID String id bindSdkUploadID uploadTaskID, id ; @Override public void uploadComplete long fileSize, long uploadedSize, long storageSize updateUploadProgress uploadTaskID, uploadedSize, fileSize ; @Override public void uploadPartComplete long partNumber, long partSize, String partHash markPartComplete uploadTaskID, partNumber, partSize, partHash ; @Override public void complete long size, String url, long type completeUpload uploadTaskID, size, url, type ; ; OpenIMClient.getInstance .uploadFile resultCallback, uploadListener, putArgs ; Use open to initialize the total size, uploadID to receive the SDK upload identifier, uploadComplete for in progress byte counts, uploadPartComplete when one part finishes, and complete for the final size, remote URL, and resource type. Most progress bars only need the progress and completion callbacks; process part details only when the product exposes them. Generate a stable application level uploadTaskID and capture it in the listener. Do not use the SDK upload ID, file name, or array position as the task's primary key. Give each task its own listener, and stop dispatching callbacks into destroyed page or account state. For complete argument construction and error handling, see Upload a file /sdk/android/file uploads/upload file ." + }, + { + "path": "/sdk/android/file-uploads/upload-file", + "title": "Upload a file", + "description": "Upload a standalone file with the Android SDK and retrieve its remote resource URL.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android file-uploads upload-file", + "content": "uploadFile uploads a standalone file for uses such as a user avatar, group avatar, profile attachment, or other application resource. The upload does not belong to a message and does not automatically create a message or update a profile. Parameters | Parameter | Type | Required | Description | | | | | | | base | OnBase | Yes | Receives the final success or failure result for the upload request. | | listener | OnPutFileListener | Yes | Receives progress, part completion, and final file information for this task. | | putArgs.filepath | String | Yes | A local file path readable by the Android application. | | putArgs.name | String | Yes | The upload file name. PutArgs initially uses the supplied path; replace it with the original file name when appropriate. | | putArgs.cuase | String | No | An application defined upload reason. The spelling follows the Android SDK PutArgs declaration. | File file = new File localPath ; PutArgs args = new PutArgs file.getAbsolutePath ; args.name = file.getName ; args.cuase = \"user avatar\"; OpenIMClient.getInstance .uploadFile new OnBase @Override public void onSuccess String result finishUploadRequest result ; @Override public void onError int code, String error showUploadError code, error ; , new OnPutFileListener @Override public void uploadComplete long fileSize, long uploadedSize, long storageSize updateUploadProgress uploadTaskID, uploadedSize, fileSize ; @Override public void complete long size, String url, long type completeUpload uploadTaskID, size, url, type ; , args ; Each call receives its own OnPutFileListener , so no global upload listener is required. For parallel uploads, generate a stable task ID and capture it in the callbacks. Do not use a file name or list position as the unique identifier. See Track file upload progress /sdk/android/file uploads/track file upload progress for callback responsibilities. The URL returned by complete can be used later to update an avatar, store an attachment address, or create a URL based media message. Upload success only means that the resource was written remotely; profile updates, message creation, and message sending remain separate API calls." + }, + { + "path": "/sdk/android/calling/overview-calling", + "title": "Audio and video calling overview", + "description": "Learn about Android SDK call signaling, room information, and event boundaries.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling overview-calling", + "content": "The Android SDK SignalingManager provides the signaling APIs needed to invite, accept, reject, cancel, hang up, query rooms, and synchronize call state. It coordinates participants, room information, and the call lifecycle. It does not capture camera video, play remote media, or render a call interface. Pass the returned roomID , token , and liveURL to your chosen real time audio/video engine. Your application remains responsible for Android permissions, devices, media tracks, poor network behavior, and UI state. The signaling APIs are not a complete real time media SDK. Call flow 1. Call signalingInvite for a one to one call or signalingInviteInGroup for a group call. 2. The invitee receives SignalingInfo through onReceiveNewInvitation and chooses to accept or reject. 3. The invitee calls signalingAccept , and both parties connect their media engine with the returned room credentials. 4. During the call, update local state from participant, media stream, and custom signaling callbacks. 5. The inviter can cancel a pending invitation; any participant can hang up an established call. Core data | Data | Description | | | | | SignalingInvitationInfo | Inviter, invitees, group, room, media type, timeout, session type, and application extra data. | | SignalingInfo | Current operation user, original invitation, participant profiles, and optional offline push information. | | SignalingCertificate | The roomID , token , liveURL , and busy user list returned by OpenIMServer. | | RoomCallingInfo | A snapshot of a group's room, invitation, participants, group, and join credentials. | Use customData and custom signaling only for application negotiation data. Do not place long lived credentials, administrator secrets, or other sensitive data in these fields. State updates and event ownership For invite, accept, reject, cancel, and hang up operations, handle both the API callback and the call listener. The API success callback means that the current signaling request completed. The listener represents incremental state observed by inviters, invitees, other devices, or room participants. They are not the same completion signal. The complete invitation lifecycle, participant, hang up, and stream listener belongs to Handle call events /sdk/android/calling/managing calls/handle call events . Custom signaling belongs to Send a custom signal /sdk/android/calling/sending custom signals/send a custom signal . Room, credential, and pending invitation queries only return snapshots. This overview does not register a listener. Use roomID as the call state key and combine it with user ID for participant state. Query again when the current room needs to be restored or reconciled. Find a page by task | Task | Page | | | | | Start a one to one or group call | Start a one to one call /sdk/android/calling/managing calls/start single call , Start a group call /sdk/android/calling/managing calls/start group call | | Accept or reject an invitation | Accept a call /sdk/android/calling/managing calls/accept call , Reject a call /sdk/android/calling/managing calls/reject call | | Cancel an invitation or hang up | Cancel a call invitation /sdk/android/calling/managing calls/cancel call , Hang up a call /sdk/android/calling/managing calls/hang up call | | Restore a room or pending invitation | Get a group call room /sdk/android/calling/retrieving call information/get room by group id , Get room credentials /sdk/android/calling/retrieving call information/get token by room id , Restore a pending invitation /sdk/android/calling/retrieving call information/restore pending invitation | | Handle call events and negotiation | Handle call events /sdk/android/calling/managing calls/handle call events , Send a custom signal /sdk/android/calling/sending custom signals/send a custom signal |" + }, + { + "path": "/sdk/android/calling/managing-calls/start-single-call", + "title": "Start a one-to-one call", + "description": "Start a one-to-one audio or video call with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling managing-calls start-single-call", + "content": "signalingInvite starts a one to one call. The Android SDK handles call signaling; your application must connect a real time audio/video engine with the returned room credentials. Parameters | Field | Type | Required | Description | | | | | | | userID | String | Yes | The current signed in user performing the invite operation. | | inviterUserID | String | Yes | The inviter, normally the current signed in user. | | inviteeUserIDList | List | Yes | The invitees; for a one to one call, include only the other user. | | groupID | String | Yes | Use an empty string for a one to one call. | | roomID | String | Yes | The call's unique room identifier and the primary key for subsequent state. | | timeout | long | Yes | Invitation timeout in seconds. | | mediaType | String | Yes | The application defined media type, typically audio or video . | | sessionType | int | Yes | Use ConversationType.SINGLE CHAT . | | platformID | int | Yes | Use Platform.ANDROID for an Android phone client. | | customData | String | No | Application extra data carried with the invitation. | | offlinePushInfo | OfflinePushInfo | No | Push content used when the invitee is offline. | SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList Collections.singletonList peerUserID ; invitation.setGroupID \"\" ; invitation.setRoomID roomID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.SINGLE CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"contact card\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setUserID currentUserID ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInvite new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCallError code, error ; , info ; The success callback returns SignalingCertificate . roomID identifies the media room, token is a short lived join credential, liveURL is the media service address, and busyLineUserIDList contains busy users. Connect the media engine only after receiving a valid token and roomID . API success does not mean the invitee accepted; merge subsequent state through Handle call events /sdk/android/calling/managing calls/handle call events ." + }, + { + "path": "/sdk/android/calling/managing-calls/start-group-call", + "title": "Start a group call", + "description": "Start a group audio or video call with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling managing-calls start-group-call", + "content": "signalingInviteInGroup starts a group call. It invites only the members explicitly listed in inviteeUserIDList ; setting groupID does not automatically invite every group member. SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList selectedGroupMemberIDs ; invitation.setGroupID groupID ; invitation.setRoomID groupID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.GROUP CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"group call\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setUserID currentUserID ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInviteInGroup new OnBase @Override public void onSuccess SignalingCertificate credentials startGroupCall credentials ; @Override public void onError int code, String error showCallError code, error ; , info ; groupID must not be empty. Remove the current user, empty IDs, and duplicates from inviteeUserIDList . The example reuses the group ID as the room ID. If your application generates another roomID , every participant must use the same value. The success callback returns SignalingCertificate ; see Start a one to one call /sdk/android/calling/managing calls/start single call for its fields. busyLineUserIDList only identifies some unavailable members and should not stop invitations to the others. Success does not mean that any member has accepted." + }, + { + "path": "/sdk/android/calling/managing-calls/accept-call", + "title": "Accept a call", + "description": "Accept a call invitation with the Android SDK and retrieve room credentials.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling managing-calls accept-call", + "content": "After receiving the original SignalingInfo from onReceiveNewInvitation , pass it to signalingAccept : OpenIMClient.getInstance .signalingManager.signalingAccept new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showAcceptError code, error ; , receivedInfo ; Preserve the original roomID , inviter, invitees, and session type in receivedInfo . Do not rebuild it as an object that contains only roomID . The success callback returns SignalingCertificate . Connect the media room only after receiving a valid token and roomID , then keep merging remote state through Handle call events /sdk/android/calling/managing calls/handle call events ." + }, + { + "path": "/sdk/android/calling/managing-calls/reject-call", + "title": "Reject a call", + "description": "Reject a call invitation with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling managing-calls reject-call", + "content": "When the user declines an incoming call, pass the original SignalingInfo to signalingReject : OpenIMClient.getInstance .signalingManager.signalingReject new OnBase @Override public void onSuccess String result closeIncomingCallUI ; @Override public void onError int code, String error showRejectError code, error ; , receivedInfo ; The success callback only means that the reject signaling request completed. The inviter later updates its interface through onInviteeRejected ; see Handle call events /sdk/android/calling/managing calls/handle call events ." + }, + { + "path": "/sdk/android/calling/managing-calls/cancel-call", + "title": "Cancel a call invitation", + "description": "Cancel a call invitation before it is accepted with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling managing-calls cancel-call", + "content": "Before an invitation is accepted, the inviter can call signalingCancel : OpenIMClient.getInstance .signalingManager.signalingCancel new OnBase @Override public void onSuccess String result stopWaitingForAnswer activeInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showCancelError code, error ; , activeInfo ; Pass the complete SignalingInfo saved when the call was started, not a new object containing only roomID . A successful callback means that the cancel request completed. End the local waiting state and release unused media resources; remote clients update through onInvitationCancelled ." + }, + { + "path": "/sdk/android/calling/managing-calls/hang-up-call", + "title": "Hang up a call", + "description": "Hang up an established call with the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling managing-calls hang-up-call", + "content": "After a call is established, a participant can call signalingHungUp . The supplied SignalingInfo should preserve the complete invitation, and its roomID must match the active media room. OpenIMClient.getInstance .signalingManager.signalingHungUp new OnBase @Override public void onSuccess String result releaseCallResources activeInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showHangUpError code, error ; , activeInfo ; The success callback only means that the hang up request completed. Stop local capture, disconnect the media room, and release the camera and microphone. Cancellation, rejection, timeout, and hang up should all enter one idempotent cleanup flow keyed by roomID ." + }, + { + "path": "/sdk/android/calling/managing-calls/handle-call-events", + "title": "Handle call events", + "description": "Register Android SDK invitation, participant, and media-stream callbacks in one call listener.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling managing-calls handle-call-events", + "content": "Register OnSignalingListener once in the call state layer. Merge invitation lifecycle, participant connection, and media stream changes by roomID . OpenIMClient.getInstance .signalingManager.setSignalingListener new OnSignalingListener @Override public void onReceiveNewInvitation SignalingInfo info upsertCall info, \"ringing\" ; @Override public void onInviteeAccepted SignalingInfo info mergeCallEvent \"accepted\", info ; @Override public void onInviteeRejected SignalingInfo info mergeCallEvent \"rejected\", info ; @Override public void onInvitationCancelled SignalingInfo info mergeCallEvent \"cancelled\", info ; @Override public void onInvitationTimeout SignalingInfo info mergeCallEvent \"timeout\", info ; @Override public void onInviteeAcceptedByOtherDevice SignalingInfo info mergeCallEvent \"accepted by other device\", info ; @Override public void onInviteeRejectedByOtherDevice SignalingInfo info mergeCallEvent \"rejected by other device\", info ; @Override public void onHangup SignalingInfo info finishCall info.getInvitation .getRoomID ; @Override public void onRoomParticipantConnected RoomCallingInfo room mergeConnectedParticipants room.getRoomID , room.getParticipant ; @Override public void onRoomParticipantDisconnected RoomCallingInfo room mergeDisconnectedParticipants room.getRoomID , room.getParticipant ; @Override public void onStreamChange String streamInfo mergeStreamChange streamInfo ; ; This page owns the complete handling contract for the 11 call callbacks exposed by the Android adapter other than onReceiveCustomSignal . Custom signaling belongs to Send a custom signal /sdk/android/calling/sending custom signals/send a custom signal . Merge invitation events with SignalingInfo.invitation.roomID . Merge participant state with RoomCallingInfo.roomID plus the participant user ID. Do not merge by event order, display name, or array position. onStreamChange currently carries a string payload; parse and validate it according to the actual server protocol used by your deployment. SignalingManager retains one listener. Setting another replaces the previous instance, and there is no public remove method. Combine custom signaling with these callbacks in the same application level listener. When signing out or switching accounts, stop writing into old account state and replace the listener with the complete listener for the new account." + }, + { + "path": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "title": "Restore a pending invitation", + "description": "Restore a call invitation that was received before the Android application started or resumed.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling retrieving-call-information restore-pending-invitation", + "content": "getSignalingInvitationInfoStartApp takes no application parameters. It returns the invitation snapshot that should be handled when the application starts or resumes. OpenIMClient.getInstance .signalingManager.getSignalingInvitationInfoStartApp new OnBase @Override public void onSuccess SignalingInfo info if info = null && info.getInvitation = null && info.getInvitation .getRoomID = null && info.getInvitation .getRoomID .isEmpty restoreIncomingCall info ; @Override public void onError int code, String error clearExpiredIncomingCall ; ; Success only means that the current snapshot was retrieved; it does not replace the call listener. Restore the incoming call interface only when both invitation and roomID are valid. Continue handling cancellation, timeout, acceptance, and hang up through Handle call events /sdk/android/calling/managing calls/handle call events ." + }, + { + "path": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "title": "Get a group call room", + "description": "Use the Android SDK to retrieve an active call room by group ID.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling retrieving-call-information get-room-by-group-id", + "content": "signalingGetRoomByGroupID takes a group ID, not a custom roomID . OpenIMClient.getInstance .signalingManager.signalingGetRoomByGroupID new OnBase @Override public void onSuccess RoomCallingInfo room if room.getRoomID = null && room.getRoomID .isEmpty renderParticipants room.getParticipant ; @Override public void onError int code, String error showNoActiveGroupCall ; , groupID ; The success callback returns a RoomCallingInfo snapshot containing the room ID, original invitation, participants, group ID, token, and connection address. Account profiles, group member profiles, and group profiles inside participant data come from different sources and must not overwrite one another. If no group call is active, treat an error or empty room as “no call to restore” and discard old credentials. Even when your group call uses a custom room ID, this method still receives groupID ." + }, + { + "path": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "title": "Get room credentials", + "description": "Use the Android SDK to retrieve fresh join credentials for a known room ID.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling retrieving-call-information get-token-by-room-id", + "content": "When you know the roomID but need new join credentials, call signalingGetTokenByRoomID . OpenIMClient.getInstance .signalingManager.signalingGetTokenByRoomID new OnBase @Override public void onSuccess SignalingCertificate credentials if credentials.getToken = null && credentials.getRoomID = null joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCredentialError code, error ; , roomID ; The success callback returns SignalingCertificate ; see Start a one to one call /sdk/android/calling/managing calls/start single call for its fields. Connect the media engine only after receiving a valid token and roomID . A room token is a short lived sensitive credential. Keep it in memory and do not write it to logs, URLs, analytics events, or persistent storage." + }, + { + "path": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "title": "Send a custom signal", + "description": "Send and receive custom signaling data in an Android SDK call room.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android calling sending-custom-signals send-a-custom-signal", + "content": "signalingSendCustomSignal sends lightweight application negotiation data to a call room, such as a raised hand action, layout hint, or application state update. It is not a chat message API and does not replace the media engine's data channel. Send a signal Both roomID and customInfo are required strings. Define a stable schema and serialize structured data as JSON. JSONObject signal = new JSONObject ; signal.put \"version\", 1 ; signal.put \"eventID\", eventID ; signal.put \"type\", \"hand raised\" ; signal.put \"userID\", currentUserID ; signal.put \"sentAt\", System.currentTimeMillis ; OpenIMClient.getInstance .signalingManager.signalingSendCustomSignal new OnBase @Override public void onSuccess String result markSignalSent eventID ; @Override public void onError int code, String error showSignalError code, error ; , roomID, signal.toString ; The success callback means that the send request completed, not that other participants processed it. Keep custom signals small and include a protocol version and application idempotency ID. Do not place large files, chat history, long lived state, or sensitive credentials in customInfo . Receive a signal OnSignalingListener.onReceiveCustomSignal returns CustomSignalingInfo . Validate the room and your application protocol before updating the interface. @Override public void onReceiveCustomSignal CustomSignalingInfo info if info == null || activeRoomID.equals info.getRoomID return; CallSignal signal = parseAndValidateCallSignal info.getCustomInfo ; String mergeID = info.getRoomID + \":\" + signal.getEventID ; if hasAppliedSignal mergeID return; applyCallSignal signal ; This page owns the complete handling contract for onReceiveCustomSignal . parseAndValidateCallSignal should check the JSON structure, protocol version, eventID , type , and application fields. Process signals idempotently by roomID:eventID and do not depend on event order. SignalingManager retains only one listener. Add the custom signal callback to the application level listener shown in Handle call events /sdk/android/calling/managing calls/handle call events . Registering another listener from this feature would replace all other call callbacks. Custom client signaling must not grant host, payment, or privacy permissions. Store and validate authoritative state on a trusted backend. After reconnecting, reconcile long lived state through a room query or the application backend." + }, + { + "path": "/sdk/android/events/overview-events", + "title": "Events overview", + "description": "Register Android SDK listeners centrally and route connection, synchronization, and data events by domain.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android events overview-events", + "content": "OpenIM Android SDK uses listeners to report connection, synchronization, user, friendship, conversation, group, message, and calling changes. Listener setters on each manager use replacement semantics: a later call replaces the previous instance. Combine all callbacks in an application level event center and register them once before login. Do not register them repeatedly from an Activity, Fragment, Compose screen, or feature component. The connection listener is the exception. OnConnListener is passed to initSDK ; its complete handling contract is described in Authenticate and manage a session /sdk/android/getting started/authenticate and manage session . Register listeners centrally The following entry point uses stable application level listeners. Each listener should include all callbacks for its domain; detailed merge behavior remains on the page that owns each event. public final class OpenIMEventCenter private final OpenIMClient client = OpenIMClient.getInstance ; private final OnUserListener userListener = buildUserListener ; private final OnFriendshipListener friendshipListener = buildFriendshipListener ; private final OnConversationListener conversationListener = buildConversationListener ; private final OnGroupListener groupListener = buildGroupListener ; private final OnAdvanceMsgListener messageListener = buildMessageListener ; private final OnCustomBusinessListener businessListener = buildBusinessListener ; private final OnSignalingListener signalingListener = buildSignalingListener ; public void registerBeforeLogin client.userInfoManager.setOnUserListener userListener ; client.friendshipManager.setOnFriendshipListener friendshipListener ; client.conversationManager.setOnConversationListener conversationListener ; client.groupManager.setOnGroupListener groupListener ; client.messageManager.setAdvancedMsgListener messageListener ; client.messageManager.setCustomBusinessListener businessListener ; client.signalingManager.setSignalingListener signalingListener ; The Android SDK does not expose remove or unset methods for these listeners. When signing out, switching accounts, or destroying the application state layer, stop dispatching into old account state and destroyed screens. Before the next login, replace each listener with the complete listener set for the new account. Event ownership | Event scope | Listener | Corresponding page | | | | | | Connection, token, and forced logout | OnConnListener | Authenticate and manage a session /sdk/android/getting started/authenticate and manage session | | Current user profile | OnUserListener | Update the current user profile /sdk/android/user/user profile/set self info | | Online status | OnUserListener | Subscribe to user online status /sdk/android/user/online status/subscribe users online status | | Friend relationships and profiles | OnFriendshipListener | Get the friend list by page /sdk/android/user/friends/get friend list page | | Friend applications | OnFriendshipListener | Get received friend requests /sdk/android/user/friend applications/get recv friend application list | | Blacklist | OnFriendshipListener | Block a user /sdk/android/user/blacklist/add blacklist , Remove a user from the blacklist /sdk/android/user/blacklist/remove blacklist | | Conversation list | OnConversationListener | Retrieve the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list | | Total unread count | OnConversationListener | Get the total unread count /sdk/android/conversation/managing conversations/get total unread count | | Typing state | OnConversationListener | Update typing status /sdk/android/message/composing messages/update typing status | | Group profiles, members, and applications | OnGroupListener | Group overview /sdk/android/group/overview group | | New, offline, and online only messages | OnAdvanceMsgListener | Receive messages /sdk/android/message/receiving messages/receive messages | | Message revocation | OnAdvanceMsgListener | Revoke a message /sdk/android/message/managing messages/revoke a message | | Message deletion | OnAdvanceMsgListener | Delete messages in a batch /sdk/android/message/managing messages/delete saved messages | | Message modification | OnAdvanceMsgListener | Modify a message /sdk/android/message/managing messages/modify a message | | Pinned messages | OnAdvanceMsgListener | Pin or unpin a message /sdk/android/message/managing messages/set message pinned | | One to one read receipts | OnAdvanceMsgListener | Mark a conversation as read /sdk/android/conversation/managing conversations/mark conversation read | | Custom business messages | OnCustomBusinessListener | Receive custom business messages /sdk/android/message/receiving messages/receive custom business messages | | Calls | OnSignalingListener | Handle call events /sdk/android/calling/managing calls/handle call events | | Custom call signaling | OnSignalingListener | Send a custom signal /sdk/android/calling/sending custom signals/send a custom signal | | SDK data synchronization | OnConversationListener | Handle initial synchronization handle initial synchronization | Query APIs establish snapshots, and listeners merge subsequent changes. Query results, successful API callbacks, and event delivery are three independent stages and cannot replace one another. Handle initial synchronization The synchronization lifecycle belongs to the application level OnConversationListener . That listener must also include conversation list, unread count, and typing status callbacks. The following example only highlights synchronization logic owned by this page. private OnConversationListener buildConversationListener return new OnConversationListener @Override public void onNewConversation List conversations mergeNewConversations conversations ; @Override public void onConversationChanged List conversations mergeChangedConversations conversations ; @Override public void onTotalUnreadMessageCountChanged int total updateTotalUnreadCount total ; @Override public void onConversationUserInputStatusChanged String payload handleInputStatus payload ; @Override public void onSyncServerStart boolean reinstall setSyncState \"syncing\", 0, reinstall ; @Override public void onSyncServerProgress long progress setSyncProgress progress ; @Override public void onSyncServerFinish boolean reinstall setSyncState \"ready\", 100, reinstall ; reloadVisibleSnapshots ; @Override public void onSyncServerFailed boolean reinstall setSyncState \"failed\", 0, reinstall ; ; When reinstall is true , treat local data as being rebuilt. Show a more complete synchronization state and avoid relying on old cache data until synchronization completes. onSyncServerProgress reports current progress. After completion, query the snapshots needed by visible screens again. On failure, record the error and wait for retry or connection recovery. This page owns the complete handling contract for onSyncServerStart , onSyncServerProgress , onSyncServerFinish , and onSyncServerFailed . Synchronization state has no business entity key; isolate it by the current OpenIMClient singleton and signed in user." + }, + { + "path": "/sdk/android/logger", + "title": "Logging", + "description": "Configure Android SDK logging, write application diagnostics, and upload logs.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android logger", + "content": "OpenIM Android SDK logs help diagnose initialization, connection, and business API problems. Development and staging builds can use more detailed output. Production builds should reduce log volume and must avoid recording tokens, complete message bodies, raw file URLs, call room credentials, and private user fields. Configure logging during initialization Logging options belong to InitConfig and must be set before initSDK . File dataDirectory = new File application.getFilesDir , \"openim\" ; File logDirectory = new File application.getFilesDir , \"openim logs\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn; config.isLogStandardOutput = BuildConfig.DEBUG; config.logFilePath = logDirectory.getAbsolutePath ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; | Field | Description | | | | | logLevel | Controls verbosity with a LogLevel constant. Available values include DebugWithSQL , Debug , Info , Warn , Error , Panic , and Fatal . | | isLogStandardOutput | Writes SDK logs to Android standard output when enabled; use it for development diagnostics. | | logFilePath | Optional log directory. Keep it within application writable storage and manage its size and retention. | Use Debug for ordinary development diagnostics. Enable DebugWithSQL temporarily and only when diagnosing database problems. Production builds normally use Warn or Error and disable unnecessary standard output. Write application diagnostic logs Use the non deprecated logs overload to add application context to SDK logs. OpenIMClient.getInstance .logs LogLevel.Error, ChatRepository.class.getSimpleName , 184, \"send message failed\", errorMessage, \"conversationID\", conversationID, \"clientMsgID\", clientMsgID ; currentClassName and currentLineNum identify the call site. msgStr is a short action description, and errStr is the error information. Warn , Error , Panic , and Fatal require a non empty error string. Pass trailing extra values as key value pairs and include only non sensitive identifiers needed for diagnosis. The older logs overload with OnBase and Map parameters is deprecated and should not be used in new code. Upload diagnostic logs Call uploadLogs only after the user explicitly agrees to submit diagnostic information. The Android API retains the params argument; pass an empty list when no additional parameters are needed. line configures how many log lines are read for the upload. String uploadID = UUID.randomUUID .toString ; OpenIMClient.getInstance .uploadLogs new OnBase @Override public void onSuccess String data showLogUploadCompleted ; @Override public void onError int code, String error showLogUploadError code, error ; , Collections.emptyList , 2000, uploadID, \"support ticket 42\", new UploadLogProgress @Override public void onProgress long current, long total updateLogUploadProgress current, total ; ; | Parameter | Description | | | | | line | Number of log lines configured for this upload. | | cancelID | Stable identifier for this upload, such as an application generated UUID. | | ex | Diagnostic context attached to the task, such as a support ticket ID. It must not contain credentials or private data. | | UploadLogProgress | Reports current progress and total work for the upload interface. | The success callback means that the log upload request completed. It does not change user, conversation, or message state and does not trigger a business domain event. On failure, record the error code, current user, and application diagnostic ID without printing the complete logs again. operationID and application tracing Public methods in the Android Java wrapper do not accept operationID . The wrapper generates one with ParamsUtil.buildOperationID for each call and passes it to Core, so applications normally do not create or supply this value. Maintain a separate application trace ID in your own logs. Record the business action, error code, and only the required conversationID , clientMsgID , groupID , or roomID . The application trace ID links a multi step business flow, while the SDK operationID links one SDK call. Neither is an identity credential or a business idempotency key. Related pages Implement for the Android environment /sdk/android/getting started/environment specific implementation Authenticate and manage a session /sdk/android/getting started/authenticate and manage session Send a message /sdk/android/message/sending messages/send message" + }, { "path": "/sdk/flutter/overview", "title": "OpenIM Flutter SDK overview", diff --git a/src/lib/client-sdk-commercial.ts b/src/lib/client-sdk-commercial.ts index 678b1c9b70..c62ff76fc2 100644 --- a/src/lib/client-sdk-commercial.ts +++ b/src/lib/client-sdk-commercial.ts @@ -44,6 +44,7 @@ const nativeAudits: Record = { const platformSymbolAliases: Record> = { android: { + getConversationPinnedMsgs: 'getConversationPinnedMsg', onHangup: 'OnHangUp', onRecvGroupMessageReadReceipt: 'OnRecvGroupReadReceipt', }, @@ -89,6 +90,11 @@ const partialCommercialConceptSources: Record = { '/sdk/ios/calling/managing-calls/handle-call-events', '/sdk/ios/calling/retrieving-call-information/restore-pending-invitation', ], + '/sdk/android/calling/overview-calling': [ + '/sdk/android/calling/managing-calls/start-single-call', + '/sdk/android/calling/managing-calls/handle-call-events', + '/sdk/android/calling/retrieving-call-information/restore-pending-invitation', + ], }; // These capabilities share general-purpose setters with open-source fields. Classify the From 6e8a50af47948ae59b5e3117c72d21c7cd0e42bf Mon Sep 17 00:00:00 2001 From: chan <1499188352@qq.com> Date: Fri, 14 Aug 2026 19:23:46 +0800 Subject: [PATCH 03/12] docs(android): publish Android SDK calling/events/logger documentation --- .../calling/managing-calls/accept-call.mdx | 2 +- .../calling/managing-calls/cancel-call.mdx | 2 +- .../managing-calls/handle-call-events.mdx | 39 +++--- .../calling/managing-calls/hang-up-call.mdx | 8 +- .../calling/managing-calls/reject-call.mdx | 2 +- .../managing-calls/start-group-call.mdx | 9 +- .../managing-calls/start-single-call.mdx | 41 ++++--- .../get-room-by-group-id.mdx | 6 +- .../get-token-by-room-id.mdx | 2 +- .../restore-pending-invitation.mdx | 4 +- .../send-a-custom-signal.mdx | 12 +- .../sdk/android/events/overview-events.mdx | 111 ++++++++---------- content/docs/chat/sdk/android/logger.mdx | 31 ++--- .../calling/managing-calls/accept-call.mdx | 2 +- .../calling/managing-calls/cancel-call.mdx | 2 +- .../managing-calls/handle-call-events.mdx | 39 +++--- .../calling/managing-calls/hang-up-call.mdx | 8 +- .../calling/managing-calls/reject-call.mdx | 2 +- .../managing-calls/start-group-call.mdx | 9 +- .../managing-calls/start-single-call.mdx | 39 ++++-- .../get-room-by-group-id.mdx | 6 +- .../get-token-by-room-id.mdx | 2 +- .../restore-pending-invitation.mdx | 4 +- .../send-a-custom-signal.mdx | 12 +- .../sdk/android/events/overview-events.mdx | 111 ++++++++---------- content/zh/docs/chat/sdk/android/logger.mdx | 31 ++--- src/generated/android-sdk-zh-content.json | 38 +++--- src/generated/search-index-zh.json | 34 +++--- src/generated/search-index.json | 36 +++--- 29 files changed, 331 insertions(+), 313 deletions(-) diff --git a/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx index 3c0b57557a..75b82cc295 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx @@ -36,4 +36,4 @@ OpenIMClient.getInstance().signalingManager.signalingAccept( Preserve the original `roomID`, inviter, invitees, and session type in `receivedInfo`. Do not rebuild it as an object that contains only `roomID`. -The success callback returns `SignalingCertificate`. Connect the media room only after receiving a valid `token` and `roomID`, then keep merging remote state through [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). +The success callback returns `SignalingCertificate`. Connect to the media room only after obtaining a valid `token` and `roomID`. A successful API call only confirms that the accept request was submitted to the server; it does not mean the call is established. Continue listening for [call events](/sdk/android/calling/managing-calls/handle-call-events) and update the call UI and state based on events from the inviter, other devices, or room participants. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx index c7bdb66974..c2690f2437 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx @@ -30,4 +30,4 @@ OpenIMClient.getInstance().signalingManager.signalingCancel( ); ``` -Pass the complete `SignalingInfo` saved when the call was started, not a new object containing only `roomID`. A successful callback means that the cancel request completed. End the local waiting state and release unused media resources; remote clients update through `onInvitationCancelled`. +Pass the complete `SignalingInfo` saved when the call was started, not a new object containing only `roomID`. A successful callback means that the cancel signaling request completed; the application should also end the local pending-answer state and release unused media resources. Remote clients update through `onInvitationCancelled`. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx b/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx index 51eff77695..ee733eecd2 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx @@ -11,71 +11,76 @@ platform: 'android' sourcePath: '/sdk/android/calling/managing-calls/handle-call-events' --- -Register `OnSignalingListener` once in the call state layer. Merge invitation lifecycle, participant connection, and media stream changes by `roomID`. +Register `OnSignalingListener` once in your application's call state manager. The SDK uses these callbacks to notify your app about incoming invitations, acceptances, rejections, cancellations, timeouts, hang-ups, and participants joining or leaving a room. Use them to update the call UI and local call state. + +`SignalingManager` retains only one listener: calling `setSignalingListener()` again replaces the previous listener. When signing out or switching accounts, first stop updating the old account's call state, then set the listener for the new account. ```java OpenIMClient.getInstance().signalingManager.setSignalingListener( new OnSignalingListener() { @Override public void onReceiveNewInvitation(SignalingInfo info) { - upsertCall(info, "ringing"); + showIncomingCall(info); } @Override public void onInviteeAccepted(SignalingInfo info) { - mergeCallEvent("accepted", info); + updateCallStatus(info, "accepted"); } @Override public void onInviteeRejected(SignalingInfo info) { - mergeCallEvent("rejected", info); + updateCallStatus(info, "rejected"); } @Override public void onInvitationCancelled(SignalingInfo info) { - mergeCallEvent("cancelled", info); + endCall(info); } @Override public void onInvitationTimeout(SignalingInfo info) { - mergeCallEvent("timeout", info); + endCall(info); } @Override public void onInviteeAcceptedByOtherDevice(SignalingInfo info) { - mergeCallEvent("accepted-by-other-device", info); + endCall(info); } @Override public void onInviteeRejectedByOtherDevice(SignalingInfo info) { - mergeCallEvent("rejected-by-other-device", info); + endCall(info); } @Override public void onHangup(SignalingInfo info) { - finishCall(info.getInvitation().getRoomID()); + endCall(info); } @Override public void onRoomParticipantConnected(RoomCallingInfo room) { - mergeConnectedParticipants(room.getRoomID(), room.getParticipant()); + updateParticipantStatus(room, true); } @Override public void onRoomParticipantDisconnected(RoomCallingInfo room) { - mergeDisconnectedParticipants(room.getRoomID(), room.getParticipant()); + updateParticipantStatus(room, false); } @Override public void onStreamChange(String streamInfo) { - mergeStreamChange(streamInfo); + handleStreamChange(streamInfo); } } ); ``` -This page owns the complete handling contract for the 11 call callbacks exposed by the Android adapter other than `onReceiveCustomSignal`. Custom signaling belongs to [Send a custom signal](/sdk/android/calling/sending-custom-signals/send-a-custom-signal). - -Merge invitation events with `SignalingInfo.invitation.roomID`. Merge participant state with `RoomCallingInfo.roomID` plus the participant user ID. Do not merge by event order, display name, or array position. `onStreamChange` currently carries a string payload; parse and validate it according to the actual server protocol used by your deployment. - -`SignalingManager` retains one listener. Setting another replaces the previous instance, and there is no public remove method. Combine custom signaling with these callbacks in the same application-level listener. When signing out or switching accounts, stop writing into old account state and replace the listener with the complete listener for the new account. +| Callback | When it is called | What your app should do | +| --- | --- | --- | +| `onReceiveNewInvitation` | A new call invitation arrives. | Save the `SignalingInfo`, show the incoming-call UI, and let the user accept or reject it. | +| `onInviteeAccepted`, `onInviteeRejected` | An invitee accepts or rejects. | Update that member's call status. In a group call, do not affect the other members. | +| `onInvitationCancelled`, `onInvitationTimeout`, `onHangup` | An invitation is cancelled or times out, or either party hangs up. | Close the matching call UI, disconnect from the media room, and release local resources. | +| `onInviteeAcceptedByOtherDevice`, `onInviteeRejectedByOtherDevice` | Another device signed in to the same account accepts or rejects. | End the incoming-call UI on this device so that two devices do not handle the same invitation. | +| `onRoomParticipantConnected`, `onRoomParticipantDisconnected` | A member joins or leaves the media room. | Update the member's status in a group call. | +| `onStreamChange` | The server sends media-stream change information. | Parse the string according to your server integration, then update the media stream. | diff --git a/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx index 85e4b0d993..cd884a07bc 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx @@ -11,14 +11,14 @@ platform: 'android' sourcePath: '/sdk/android/calling/managing-calls/hang-up-call' --- -After a call is established, a participant can call `signalingHungUp()`. The supplied `SignalingInfo` should preserve the complete invitation, and its `roomID` must match the active media room. +After a call is established, any participant can call `signalingHungUp()` to hang up. Pass the complete `SignalingInfo` saved for the active call; its `roomID` must match the active media room. ```java OpenIMClient.getInstance().signalingManager.signalingHungUp( new OnBase() { @Override public void onSuccess(String result) { - releaseCallResources(activeInfo.getInvitation().getRoomID()); + releaseCallResources(signalingInfo.getInvitation().getRoomID()); } @Override @@ -26,8 +26,8 @@ OpenIMClient.getInstance().signalingManager.signalingHungUp( showHangUpError(code, error); } }, - activeInfo + signalingInfo ); ``` -The success callback only means that the hang-up request completed. Stop local capture, disconnect the media room, and release the camera and microphone. Cancellation, rejection, timeout, and hang-up should all enter one idempotent cleanup flow keyed by `roomID`. +The success callback only confirms that the hang-up signaling request completed; it does not release local resources automatically. Close the call UI, stop local capture, disconnect from the media room, and release the camera and microphone. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx index 974b545897..633c2925b3 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx @@ -26,7 +26,7 @@ OpenIMClient.getInstance().signalingManager.signalingReject( showRejectError(code, error); } }, - receivedInfo + signalingInfo ); ``` diff --git a/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx index 44e5b0163d..d8ead8f727 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx @@ -11,7 +11,9 @@ platform: 'android' sourcePath: '/sdk/android/calling/managing-calls/start-group-call' --- -`signalingInviteInGroup()` starts a group call. It invites only the members explicitly listed in `inviteeUserIDList`; setting `groupID` does not automatically invite every group member. +`signalingInviteInGroup()` starts a group call and uses the same parameter types as [Start a one-to-one call](/sdk/android/calling/managing-calls/start-single-call). For group calls, `invitation.groupID` must contain the group ID and `invitation.sessionType` is always `ConversationType.GROUP_CHAT`. + +Only members in `inviteeUserIDList` are invited; setting `groupID` does not invite every group member automatically. Exclude the current user, empty IDs, and duplicates from the list. This example uses the group ID as the room ID; if you generate a separate `roomID`, every participant must use the same value. ```java SignalingInvitationInfo invitation = new SignalingInvitationInfo(); @@ -26,7 +28,6 @@ invitation.setPlatformID(Platform.ANDROID); invitation.setCustomData("{\"source\":\"group-call\"}"); SignalingInfo info = new SignalingInfo(); -info.setUserID(currentUserID); info.setInvitation(invitation); info.setOfflinePushInfo(offlinePushInfo); @@ -46,6 +47,6 @@ OpenIMClient.getInstance().signalingManager.signalingInviteInGroup( ); ``` -`groupID` must not be empty. Remove the current user, empty IDs, and duplicates from `inviteeUserIDList`. The example reuses the group ID as the room ID. If your application generates another `roomID`, every participant must use the same value. +The success callback returns `SignalingCertificate`. `roomID` is the media room ID, `token` is the short-lived credential for joining it, `liveURL` is the media service address, and `busyLineUserIDList` lists busy users. Busy users do not prevent invitations to the remaining members, and a successful callback does not mean that any member has accepted. -The success callback returns `SignalingCertificate`; see [Start a one-to-one call](/sdk/android/calling/managing-calls/start-single-call) for its fields. `busyLineUserIDList` only identifies some unavailable members and should not stop invitations to the others. Success does not mean that any member has accepted. +Connect to the media room only after obtaining a valid `token` and `roomID`. A successful API call does not mean the invitees have accepted; merge subsequent state through [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). diff --git a/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx index 1c89908027..72b272fe5c 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx @@ -15,19 +15,33 @@ sourcePath: '/sdk/android/calling/managing-calls/start-single-call' ## Parameters -| Field | Type | Required | Description | -| ------------------- | ----------------- | -------- | --------------------------------------------------------------------------- | -| `userID` | `String` | Yes | The current signed-in user performing the invite operation. | -| `inviterUserID` | `String` | Yes | The inviter, normally the current signed-in user. | -| `inviteeUserIDList` | `List` | Yes | The invitees; for a one-to-one call, include only the other user. | -| `groupID` | `String` | Yes | Use an empty string for a one-to-one call. | -| `roomID` | `String` | Yes | The call's unique room identifier and the primary key for subsequent state. | -| `timeout` | `long` | Yes | Invitation timeout in seconds. | -| `mediaType` | `String` | Yes | The application-defined media type, typically `audio` or `video`. | -| `sessionType` | `int` | Yes | Use `ConversationType.SINGLE_CHAT`. | -| `platformID` | `int` | Yes | Use `Platform.ANDROID` for an Android phone client. | -| `customData` | `String` | No | Application extra data carried with the invitation. | -| `offlinePushInfo` | `OfflinePushInfo` | No | Push content used when the invitee is offline. | +Call signature: + +```java +signalingInvite(OnBase callback, SignalingInfo info) +``` + +All fields below belong to `info`; dot notation represents nested objects. Only parameters shared by the Android and WASM SDKs are listed. + +| Parameter | Type | Required | Description | +| --- | --- | --- | --- | +| `invitation` | `SignalingInvitationInfo` | Yes | The call invitation. | +| `invitation.inviterUserID` | `String` | Yes | The inviter; pass the current signed-in user ID. | +| `invitation.inviteeUserIDList` | `List` | Yes | The invitees; for a one-to-one call, include only the other user. | +| `invitation.groupID` | `String` | Yes | Group ID. Pass an empty string for a one-to-one call. | +| `invitation.roomID` | `String` | Yes | The call's unique room identifier and the primary key for subsequent state. | +| `invitation.timeout` | `long` | Yes | Invitation timeout in seconds. | +| `invitation.mediaType` | `String` | Yes | The application-defined media type, typically `audio` or `video`. | +| `invitation.sessionType` | `int` | Yes | Use `ConversationType.SINGLE_CHAT` for one-to-one calls and `ConversationType.SUPER_GROUP_CHAT` for group calls. | +| `invitation.platformID` | `int` | Yes | The current client platform; pass `Platform.ANDROID`. | +| `invitation.customData` | `String` | No | Application extra data carried with the invitation. | +| `invitation.initiateTime` | `long` | No | The invitation start time. It is normally maintained by the signaling flow and does not need to be set manually. | +| `offlinePushInfo` | `OfflinePushInfo` | No | Push content used when the invitee is offline. | +| `offlinePushInfo.title` | `String` | Conditionally required | Push title; required when `offlinePushInfo` is provided. | +| `offlinePushInfo.desc` | `String` | Conditionally required | Push body; required when `offlinePushInfo` is provided. | +| `offlinePushInfo.ex` | `String` | Conditionally required | Push extension string; pass an empty string when there is no content. | +| `offlinePushInfo.iOSPushSound` | `String` | Conditionally required | iOS push sound; required when `offlinePushInfo` is provided. | +| `offlinePushInfo.iOSBadgeCount` | `boolean` | Conditionally required | Whether to update the iOS badge; required when `offlinePushInfo` is provided. | ```java SignalingInvitationInfo invitation = new SignalingInvitationInfo(); @@ -42,7 +56,6 @@ invitation.setPlatformID(Platform.ANDROID); invitation.setCustomData("{\"source\":\"contact-card\"}"); SignalingInfo info = new SignalingInfo(); -info.setUserID(currentUserID); info.setInvitation(invitation); info.setOfflinePushInfo(offlinePushInfo); diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx index 5beee147ca..ee49466e79 100644 --- a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/calling/retrieving-call-information/get-room-by-group-id' --- -`signalingGetRoomByGroupID()` takes a group ID, not a custom `roomID`. +`signalingGetRoomByGroupID()` takes a group ID, not `roomID`, even when the call uses a custom `roomID`. ```java OpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID( @@ -32,6 +32,6 @@ OpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID( ); ``` -The success callback returns a `RoomCallingInfo` snapshot containing the room ID, original invitation, participants, group ID, token, and connection address. Account profiles, group member profiles, and group profiles inside participant data come from different sources and must not overwrite one another. +The success callback returns a `RoomCallingInfo` snapshot containing the room ID, original invitation, participants, group ID, token, and connection address. -If no group call is active, treat an error or empty room as “no call to restore” and discard old credentials. Even when your group call uses a custom room ID, this method still receives `groupID`. +If there is no active call in the group, the API can return an error or an empty room. Clear locally saved call state and room credentials, and do not attempt to join the old room. diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx index 655d317e4a..5f1f52ac10 100644 --- a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx @@ -37,6 +37,6 @@ OpenIMClient.getInstance().signalingManager.signalingGetTokenByRoomID( ); ``` -The success callback returns `SignalingCertificate`; see [Start a one-to-one call](/sdk/android/calling/managing-calls/start-single-call) for its fields. Connect the media engine only after receiving a valid `token` and `roomID`. +The success callback returns `SignalingCertificate`, which provides the `token` and `liveURL` required to join the audio/video room. A room token is a short-lived sensitive credential. Keep it in memory and do not write it to logs, URLs, analytics events, or persistent storage. diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx index f42fb5e22c..c78e432f11 100644 --- a/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/calling/retrieving-call-information/restore-pending-invitation' --- -`getSignalingInvitationInfoStartApp()` takes no application parameters. It returns the invitation snapshot that should be handled when the application starts or resumes. +Use `getSignalingInvitationInfoStartApp()` to retrieve an unhandled call invitation when the application starts or resumes. ```java OpenIMClient.getInstance().signalingManager.getSignalingInvitationInfoStartApp( @@ -34,4 +34,4 @@ OpenIMClient.getInstance().signalingManager.getSignalingInvitationInfoStartApp( ); ``` -Success only means that the current snapshot was retrieved; it does not replace the call listener. Restore the incoming-call interface only when both `invitation` and `roomID` are valid. Continue handling cancellation, timeout, acceptance, and hang-up through [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). +The success callback returns an invitation snapshot at the time of the call; it does not connect the call. Continue handling cancellation, timeout, and acceptance of the call invitation yourself. diff --git a/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx b/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx index 6ba5f79847..6a18bcd95f 100644 --- a/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx +++ b/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/calling/sending-custom-signals/send-a-custom-signal' --- -`signalingSendCustomSignal()` sends lightweight application negotiation data to a call room, such as a raised-hand action, layout hint, or application state update. It is not a chat message API and does not replace the media engine's data channel. +Use `signalingSendCustomSignal()` to send small pieces of call-related application information to a call room, such as a raised-hand action, layout hint, or temporary state update. It is not suitable for chat content, large data, or files. ## Send a signal @@ -42,11 +42,11 @@ OpenIMClient.getInstance().signalingManager.signalingSendCustomSignal( ); ``` -The success callback means that the send request completed, not that other participants processed it. Keep custom signals small and include a protocol version and application idempotency ID. Do not place large files, chat history, long-lived state, or sensitive credentials in `customInfo`. +The success callback only confirms that the send request completed; it does not mean that other participants received or processed the signal. Include a protocol version and a unique `eventID` in `customInfo` so receivers can identify duplicate messages. Do not include large files, chat history, long-lived state, or sensitive credentials. ## Receive a signal -`OnSignalingListener.onReceiveCustomSignal` returns `CustomSignalingInfo`. Validate the room and your application protocol before updating the interface. +When a custom signal arrives, `OnSignalingListener.onReceiveCustomSignal` receives `CustomSignalingInfo`. Confirm that it belongs to the active room and validate its format before updating the UI. ```java @Override @@ -64,8 +64,8 @@ public void onReceiveCustomSignal(CustomSignalingInfo info) { } ``` -This page owns the complete handling contract for `onReceiveCustomSignal`. `parseAndValidateCallSignal()` should check the JSON structure, protocol version, `eventID`, `type`, and application fields. Process signals idempotently by `roomID:eventID` and do not depend on event order. +If your application needs to avoid duplicate processing, include a unique event ID in the custom signal and record processed events on the receiving side. Messages may not arrive in send order, so do not rely on arrival order to determine application state. -`SignalingManager` retains only one listener. Add the custom signal callback to the application-level listener shown in [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). Registering another listener from this feature would replace all other call callbacks. +Register `onReceiveCustomSignal` together with the other call callbacks in the listener shown in [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). `SignalingManager` retains only one listener; registering another one replaces the existing call callbacks. -Custom client signaling must not grant host, payment, or privacy permissions. Store and validate authoritative state on a trusted backend. After reconnecting, reconcile long-lived state through a room query or the application backend. +Do not grant host, payment, or privacy permissions based only on custom client signals. Store and validate these trusted states on your backend; after reconnecting, restore long-lived state from a room query or your backend. diff --git a/content/docs/chat/sdk/android/events/overview-events.mdx b/content/docs/chat/sdk/android/events/overview-events.mdx index 897d4e2c50..74bdf7b2e5 100644 --- a/content/docs/chat/sdk/android/events/overview-events.mdx +++ b/content/docs/chat/sdk/android/events/overview-events.mdx @@ -11,25 +11,39 @@ platform: 'android' sourcePath: '/sdk/android/events/overview-events' --- -OpenIM Android SDK uses listeners to report connection, synchronization, user, friendship, conversation, group, message, and calling changes. Listener setters on each manager use replacement semantics: a later call replaces the previous instance. Combine all callbacks in an application-level event center and register them once before login. Do not register them repeatedly from an Activity, Fragment, Compose screen, or feature component. +OpenIM Android SDK uses listeners to report connection, synchronization, user, friendship, conversation, group, message, and calling changes. Each manager keeps only one listener; setting another one replaces the previous listener. Manage these listeners in one place in your application and set them once before login. Do not register them repeatedly from an Activity, Fragment, Compose screen, or feature component. -The connection listener is the exception. `OnConnListener` is passed to `initSDK()`; its complete handling contract is described in [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session). +`OnConnListener` monitors the connection status to IM Server. It is not set separately through a manager; pass it when calling `initSDK()`. For complete handling guidance, see [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session). ## Register listeners centrally -The following entry point uses stable application-level listeners. Each listener should include all callbacks for its domain; detailed merge behavior remains on the page that owns each event. +The following example registers each listener in one place in the application. Each listener handles events for its own domain, such as messages, conversations, friends, or calls. ```java public final class OpenIMEventCenter { private final OpenIMClient client = OpenIMClient.getInstance(); - private final OnUserListener userListener = buildUserListener(); - private final OnFriendshipListener friendshipListener = buildFriendshipListener(); - private final OnConversationListener conversationListener = buildConversationListener(); - private final OnGroupListener groupListener = buildGroupListener(); - private final OnAdvanceMsgListener messageListener = buildMessageListener(); - private final OnCustomBusinessListener businessListener = buildBusinessListener(); - private final OnSignalingListener signalingListener = buildSignalingListener(); + private final OnUserListener userListener = new OnUserListener() { + // Handles user profile and online-status changes. + }; + private final OnFriendshipListener friendshipListener = new OnFriendshipListener() { + // Handles friend relationships, friend applications, and blacklist changes. + }; + private final OnConversationListener conversationListener = new OnConversationListener() { + // Handles conversations, unread counts, input status, and initial synchronization. + }; + private final OnGroupListener groupListener = new OnGroupListener() { + // Handles groups, group members, and group application changes. + }; + private final OnAdvanceMsgListener messageListener = new OnAdvanceMsgListener() { + // Handles new messages, revocations, deletions, modifications, and read receipts. + }; + private final OnCustomBusinessListener businessListener = new OnCustomBusinessListener() { + // Handles custom business messages. + }; + private final OnSignalingListener signalingListener = new OnSignalingListener() { + // Handles call invitations, participant status, and custom call signals. + }; public void registerBeforeLogin() { client.userInfoManager.setOnUserListener(userListener); @@ -43,7 +57,7 @@ public final class OpenIMEventCenter { } ``` -The Android SDK does not expose remove or unset methods for these listeners. When signing out, switching accounts, or destroying the application state layer, stop dispatching into old account state and destroyed screens. Before the next login, replace each listener with the complete listener set for the new account. +The Android SDK does not provide a way to remove listeners. When signing out, switching accounts, or destroying a screen, stop callbacks from updating old account data or destroyed UI and clear references held by your application. Before the next login, set each listener again for the new account. ## Event ownership @@ -70,59 +84,34 @@ The Android SDK does not expose remove or unset methods for these listeners. Whe | Custom call signaling | `OnSignalingListener` | [Send a custom signal](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) | | SDK data synchronization | `OnConversationListener` | [Handle initial synchronization](#handle-initial-synchronization) | -Query APIs establish snapshots, and listeners merge subsequent changes. Query results, successful API callbacks, and event delivery are three independent stages and cannot replace one another. - ## Handle initial synchronization -The synchronization lifecycle belongs to the application-level `OnConversationListener`. That listener must also include conversation-list, unread-count, and typing-status callbacks. The following example only highlights synchronization logic owned by this page. +The synchronization lifecycle belongs to `OnConversationListener`, which also includes callbacks for the conversation list, unread count, and typing status. The following example shows only the callbacks related to initial synchronization: ```java -private OnConversationListener buildConversationListener() { - return new OnConversationListener() { - @Override - public void onNewConversation(List conversations) { - mergeNewConversations(conversations); - } - - @Override - public void onConversationChanged(List conversations) { - mergeChangedConversations(conversations); - } - - @Override - public void onTotalUnreadMessageCountChanged(int total) { - updateTotalUnreadCount(total); - } - - @Override - public void onConversationUserInputStatusChanged(String payload) { - handleInputStatus(payload); - } - - @Override - public void onSyncServerStart(boolean reinstall) { - setSyncState("syncing", 0, reinstall); - } - - @Override - public void onSyncServerProgress(long progress) { - setSyncProgress(progress); - } - - @Override - public void onSyncServerFinish(boolean reinstall) { - setSyncState("ready", 100, reinstall); - reloadVisibleSnapshots(); - } - - @Override - public void onSyncServerFailed(boolean reinstall) { - setSyncState("failed", 0, reinstall); - } - }; -} -``` +private final OnConversationListener conversationListener = new OnConversationListener() { + @Override + public void onSyncServerStart(boolean reinstall) { + // Synchronization started: update the sync state and show loading UI when needed. + } -When `reinstall` is `true`, treat local data as being rebuilt. Show a more complete synchronization state and avoid relying on old cache data until synchronization completes. `onSyncServerProgress` reports current progress. After completion, query the snapshots needed by visible screens again. On failure, record the error and wait for retry or connection recovery. + @Override + public void onSyncServerProgress(long progress) { + // Synchronization in progress: update the progress indicator. + } + + @Override + public void onSyncServerFinish(boolean reinstall) { + // Synchronization finished: refresh screens that require complete data. + } + + @Override + public void onSyncServerFailed(boolean reinstall) { + // Synchronization failed: update the failure state and wait for retry or connection recovery. + } + + // Other conversationListener callbacks... +}; +``` -This page owns the complete handling contract for `onSyncServerStart`, `onSyncServerProgress`, `onSyncServerFinish`, and `onSyncServerFailed`. Synchronization state has no business entity key; isolate it by the current `OpenIMClient` singleton and signed-in user. +`reinstall` indicates whether synchronization follows a local data rebuild: `true` means synchronization after the application is reinstalled, local data is cleared, or a similar scenario, when local cache is usually unavailable; `false` means ordinary synchronization after login. `onSyncServerProgress` reports the current synchronization progress. After synchronization completes, query the data required by the current screen again. On failure, update the synchronization failure state and wait for retry or connection recovery. diff --git a/content/docs/chat/sdk/android/logger.mdx b/content/docs/chat/sdk/android/logger.mdx index 467929c2d8..43a89db390 100644 --- a/content/docs/chat/sdk/android/logger.mdx +++ b/content/docs/chat/sdk/android/logger.mdx @@ -1,6 +1,6 @@ --- title: 'Logging' -description: 'Configure Android SDK logging, write application diagnostics, and upload logs.' +description: 'Configure Android SDK logging, write application logs, and upload logs.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' @@ -15,7 +15,7 @@ OpenIM Android SDK logs help diagnose initialization, connection, and business A ## Configure logging during initialization -Logging options belong to `InitConfig` and must be set before `initSDK()`. +Configure logging when calling `initSDK()`: ```java File dataDirectory = new File(application.getFilesDir(), "openim"); @@ -45,9 +45,9 @@ boolean initialized = OpenIMClient.getInstance().initSDK( Use `Debug` for ordinary development diagnostics. Enable `DebugWithSQL` temporarily and only when diagnosing database problems. Production builds normally use `Warn` or `Error` and disable unnecessary standard output. -## Write application diagnostic logs +## Write application logs -Use the non-deprecated `logs()` overload to add application context to SDK logs. +Use `logs()` to write application logs to the SDK log: ```java OpenIMClient.getInstance().logs( @@ -65,12 +65,12 @@ OpenIMClient.getInstance().logs( The older `logs()` overload with `OnBase` and `Map` parameters is deprecated and should not be used in new code. -## Upload diagnostic logs +## Upload logs -Call `uploadLogs()` only after the user explicitly agrees to submit diagnostic information. The Android API retains the `params` argument; pass an empty list when no additional parameters are needed. `line` configures how many log lines are read for the upload. +Use `uploadLogs()` to upload client logs to the server, primarily when a user actively submits diagnostic logs. ```java -String uploadID = UUID.randomUUID().toString(); +String cancelID = UUID.randomUUID().toString(); OpenIMClient.getInstance().uploadLogs( new OnBase() { @@ -84,10 +84,10 @@ OpenIMClient.getInstance().uploadLogs( showLogUploadError(code, error); } }, - Collections.emptyList(), - 2000, - uploadID, - "support-ticket-42", + new ArrayList<>(), + 2000, // line + cancelID, + "support-ticket-42", // ex new UploadLogProgress() { @Override public void onProgress(long current, long total) { @@ -99,18 +99,19 @@ OpenIMClient.getInstance().uploadLogs( | Parameter | Description | | ------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| `params` | Legacy parameter that the current SDK does not use. Pass an empty list, such as `new ArrayList<>()`. | | `line` | Number of log lines configured for this upload. | | `cancelID` | Stable identifier for this upload, such as an application-generated UUID. | | `ex` | Diagnostic context attached to the task, such as a support ticket ID. It must not contain credentials or private data. | | `UploadLogProgress` | Reports current progress and total work for the upload interface. | -The success callback means that the log upload request completed. It does not change user, conversation, or message state and does not trigger a business-domain event. On failure, record the error code, current user, and application diagnostic ID without printing the complete logs again. +The success callback means that the log upload request completed. -## operationID and application tracing +## Use operationID to locate an SDK call -Public methods in the Android Java wrapper do not accept `operationID`. The wrapper generates one with `ParamsUtil.buildOperationID()` for each call and passes it to Core, so applications normally do not create or supply this value. +Public methods in the OpenIM Android SDK do not accept `operationID`. Each SDK call generates an `operationID` automatically. `operationID` identifies only one SDK call; it is not a user identity, permission credential, business idempotency key, or business ID. -Maintain a separate application trace ID in your own logs. Record the business action, error code, and only the required `conversationID`, `clientMsgID`, `groupID`, or `roomID`. The application trace ID links a multi-step business flow, while the SDK `operationID` links one SDK call. Neither is an identity credential or a business idempotency key. +When investigating a problem, find the `operationID` near the failed or unexpected call in the client SDK logs. It identifies the related log records for that SDK call. When providing logs to support, also include the time of the issue, user ID, action name, and any relevant `conversationID`, `clientMsgID`, `groupID`, or `roomID` to help locate the records. ## Related pages diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx index 8e6ab3dc0c..fec5afe26e 100644 --- a/content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx @@ -29,4 +29,4 @@ OpenIMClient.getInstance().signalingManager.signalingAccept( `receivedInfo` 必须保留收到的原始 `roomID`、邀请人、被邀请人和会话类型,不能重新构造为只包含 `roomID` 的对象。 -成功回调返回 `SignalingCertificate`。取得有效的 `token` 和 `roomID` 后再连接媒体房间;远端状态由[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)继续合并。 +成功回调返回 `SignalingCertificate`。取得有效的 `token` 和 `roomID` 后再连接媒体房间;API 成功仅表示已向服务端提交接听请求,不代表通话已建立,请继续监听[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events),根据邀请方、其他设备或房间参与者返回的事件更新通话界面和状态。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx index 0c754c80b4..0f8a9af2e8 100644 --- a/content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx @@ -4,7 +4,7 @@ description: '使用 Android SDK 取消尚未接通的通话邀请。' sourcePath: '/sdk/android/calling/managing-calls/cancel-call' --- -邀请尚未接通时,发起方调用 `signalingCancel()`: +邀请尚未接通时,发起方可调用 `signalingCancel()` 取消通话邀请: ```java OpenIMClient.getInstance().signalingManager.signalingCancel( diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx index d3890e8447..fecdb61dc7 100644 --- a/content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx @@ -4,71 +4,76 @@ description: '集中设置 Android SDK 的通话邀请、参与者和媒体流 l sourcePath: '/sdk/android/calling/managing-calls/handle-call-events' --- -通话状态层应集中设置一次 `OnSignalingListener`,并按 `roomID` 合并邀请生命周期、参与者连接状态和媒体流变化。 +在应用的通话状态管理处注册一次 `OnSignalingListener`。SDK 通过这些回调通知来电、接听、拒绝、取消、超时、挂断以及成员进出房间;应用据此更新通话界面和本地通话状态。 + +`SignalingManager` 同时只保留一个 listener,重复调用 `setSignalingListener()` 会替换之前的 listener。退出登录或切换账号时,先停止更新旧账号的通话状态,再为新账号设置 listener。 ```java OpenIMClient.getInstance().signalingManager.setSignalingListener( new OnSignalingListener() { @Override public void onReceiveNewInvitation(SignalingInfo info) { - upsertCall(info, "ringing"); + showIncomingCall(info); } @Override public void onInviteeAccepted(SignalingInfo info) { - mergeCallEvent("accepted", info); + updateCallStatus(info, "accepted"); } @Override public void onInviteeRejected(SignalingInfo info) { - mergeCallEvent("rejected", info); + updateCallStatus(info, "rejected"); } @Override public void onInvitationCancelled(SignalingInfo info) { - mergeCallEvent("cancelled", info); + endCall(info); } @Override public void onInvitationTimeout(SignalingInfo info) { - mergeCallEvent("timeout", info); + endCall(info); } @Override public void onInviteeAcceptedByOtherDevice(SignalingInfo info) { - mergeCallEvent("accepted-by-other-device", info); + endCall(info); } @Override public void onInviteeRejectedByOtherDevice(SignalingInfo info) { - mergeCallEvent("rejected-by-other-device", info); + endCall(info); } @Override public void onHangup(SignalingInfo info) { - finishCall(info.getInvitation().getRoomID()); + endCall(info); } @Override public void onRoomParticipantConnected(RoomCallingInfo room) { - mergeConnectedParticipants(room.getRoomID(), room.getParticipant()); + updateParticipantStatus(room, true); } @Override public void onRoomParticipantDisconnected(RoomCallingInfo room) { - mergeDisconnectedParticipants(room.getRoomID(), room.getParticipant()); + updateParticipantStatus(room, false); } @Override public void onStreamChange(String streamInfo) { - mergeStreamChange(streamInfo); + handleStreamChange(streamInfo); } } ); ``` -本页是除 `onReceiveCustomSignal` 外 11 个已接入 Android 适配层的通话回调的完整归属页。自定义信令的处理边界见[发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal)。 - -邀请事件使用 `SignalingInfo.invitation.roomID` 合并。参与者状态使用 `RoomCallingInfo.roomID`,并结合参与者的用户 ID 更新;不要按事件顺序、展示名称或数组位置合并。`onStreamChange` 当前提供字符串载荷,应由接入层按服务端实际协议解析并校验。 - -`SignalingManager` 只设置一个 listener,后一次设置会替换先前实例,并且没有公开移除方法。自定义信令回调必须与本页的其他回调组合在同一个应用级 listener 中。退出登录或切换账号时,应停止向旧账号状态写入,并用新账号的完整 listener 覆盖。 +| 回调 | 何时触发 | 应用应做什么 | +| --- | --- | --- | +| `onReceiveNewInvitation` | 收到新的通话邀请。 | 保存 `SignalingInfo`,显示来电界面,并让用户选择接听或拒绝。 | +| `onInviteeAccepted`、`onInviteeRejected` | 某位被邀请者接听或拒绝。 | 更新该成员的通话状态;群聊中不应影响其他成员。 | +| `onInvitationCancelled`、`onInvitationTimeout`、`onHangup` | 邀请被取消、超时或任一方挂断。 | 关闭对应通话界面,断开媒体房间并释放本地资源。 | +| `onInviteeAcceptedByOtherDevice`、`onInviteeRejectedByOtherDevice` | 同一账号的另一台设备已接听或拒绝。 | 结束当前设备上的来电界面,避免两台设备同时处理同一邀请。 | +| `onRoomParticipantConnected`、`onRoomParticipantDisconnected` | 成员进入或离开媒体房间。 | 更新群聊中的成员状态。 | +| `onStreamChange` | 服务端发送媒体流变化信息。 | 按接入服务端实际约定解析字符串,再更新媒体流。 | diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx index 3301761f13..1021466879 100644 --- a/content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx @@ -4,14 +4,14 @@ description: '使用 Android SDK 挂断已经建立的通话。' sourcePath: '/sdk/android/calling/managing-calls/hang-up-call' --- -通话已经建立后,参与者调用 `signalingHungUp()`。传入的 `SignalingInfo` 应保留本次通话的完整邀请信息,其中 `roomID` 必须与当前媒体房间一致。 +通话建立后,任一参与者都可以调用 `signalingHungUp()` 挂断。传入当前通话保存的完整 `SignalingInfo`,其中的 `roomID` 必须与当前媒体房间一致。 ```java OpenIMClient.getInstance().signalingManager.signalingHungUp( new OnBase() { @Override public void onSuccess(String result) { - releaseCallResources(activeInfo.getInvitation().getRoomID()); + releaseCallResources(signalingInfo.getInvitation().getRoomID()); } @Override @@ -19,8 +19,8 @@ OpenIMClient.getInstance().signalingManager.signalingHungUp( showHangUpError(code, error); } }, - activeInfo + signalingInfo ); ``` -成功回调只表示挂断信令请求完成。应用还需要停止本地采集、断开媒体房间,并释放摄像头和麦克风。取消、拒绝、超时和挂断应进入同一套按 `roomID` 幂等执行的清理流程。 +成功回调只表示挂断信令请求已完成,不代表本地资源已自动释放。应用应关闭通话界面、停止本地采集、断开媒体房间,并释放摄像头和麦克风。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx index 3b0240957a..ce860f6ef2 100644 --- a/content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx @@ -19,7 +19,7 @@ OpenIMClient.getInstance().signalingManager.signalingReject( showRejectError(code, error); } }, - receivedInfo + signalingInfo ); ``` diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx index d88962deea..f6fb2ddec1 100644 --- a/content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx @@ -4,7 +4,9 @@ description: '使用 Android SDK 发起群聊音视频通话。' sourcePath: '/sdk/android/calling/managing-calls/start-group-call' --- -`signalingInviteInGroup()` 发起群聊通话,只邀请 `inviteeUserIDList` 明确列出的群成员,不会因为填写 `groupID` 自动邀请全群。 +`signalingInviteInGroup()` 发起群聊通话,参数类型与[发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)相同。群聊通话时,`invitation.groupID` 必须传入群组 ID,`invitation.sessionType` 固定为 `ConversationType.GROUP_CHAT`。 + +只会邀请 `inviteeUserIDList` 中列出的成员,填写 `groupID` 不会自动邀请全群。`inviteeUserIDList` 列表应排除当前用户、空值和重复成员。示例以群组 ID 作为房间 ID;若自行生成 `roomID`,所有参与者必须使用相同的值。 ```java SignalingInvitationInfo invitation = new SignalingInvitationInfo(); @@ -19,7 +21,6 @@ invitation.setPlatformID(Platform.ANDROID); invitation.setCustomData("{\"source\":\"group-call\"}"); SignalingInfo info = new SignalingInfo(); -info.setUserID(currentUserID); info.setInvitation(invitation); info.setOfflinePushInfo(offlinePushInfo); @@ -39,6 +40,6 @@ OpenIMClient.getInstance().signalingManager.signalingInviteInGroup( ); ``` -`groupID` 不能为空,`inviteeUserIDList` 应排除当前用户、空值和重复成员。示例沿用群组 ID 作为房间 ID;若业务自行生成 `roomID`,所有参与端必须使用同一个值。 +成功回调返回 `SignalingCertificate`,其中 `roomID` 是媒体房间 ID,`token` 是加入房间使用的短期凭据,`liveURL` 是媒体服务提供的连接地址,`busyLineUserIDList` 是忙线用户列表。忙线用户不影响其余成员的邀请;成功也不表示已有成员接听。 -成功回调返回 `SignalingCertificate`,字段含义见[发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)。`busyLineUserIDList` 只表示部分成员忙线,不应中止其他成员的邀请流程;成功也不表示其他成员已经接听。 +只有取得有效的 `token` 和 `roomID` 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx index d983335caf..20a1a84a5d 100644 --- a/content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx @@ -8,19 +8,33 @@ sourcePath: '/sdk/android/calling/managing-calls/start-single-call' ## 参数说明 -| 字段 | 类型 | 是否必填 | 说明 | +调用方法: + +```java +signalingInvite(OnBase callback, SignalingInfo info) +``` + +下表字段均为 `info` 的属性;使用点号表示嵌套对象。仅列出 Android SDK 与 WASM SDK 共有的参数。 + +| 参数 | 类型 | 是否必填 | 说明 | | --- | --- | --- | --- | -| `userID` | `String` | 是 | 执行邀请操作的当前登录用户 ID。 | -| `inviterUserID` | `String` | 是 | 邀请方用户 ID,通常与当前登录用户一致。 | -| `inviteeUserIDList` | `List` | 是 | 被邀请用户列表;单聊只填写对方一个用户。 | -| `groupID` | `String` | 是 | 单聊固定传空字符串。 | -| `roomID` | `String` | 是 | 本次通话的唯一房间标识,后续状态按它合并。 | -| `timeout` | `long` | 是 | 邀请等待时长,单位为秒。 | -| `mediaType` | `String` | 是 | 媒体类型,业务通常约定为 `audio` 或 `video`。 | -| `sessionType` | `int` | 是 | 单聊使用 `ConversationType.SINGLE_CHAT`。 | -| `platformID` | `int` | 是 | Android 手机端使用 `Platform.ANDROID`。 | -| `customData` | `String` | 否 | 随邀请携带的业务扩展字符串。 | +| `invitation` | `SignalingInvitationInfo` | 是 | 本次通话邀请。 | +| `invitation.inviterUserID` | `String` | 是 | 邀请者,传入当前登录用户 ID。 | +| `invitation.inviteeUserIDList` | `List` | 是 | 被邀请用户列表;单聊只填写对方一个用户。 | +| `invitation.groupID` | `String` | 是 | 群ID,单聊固定传空字符串。 | +| `invitation.roomID` | `String` | 是 | 本次通话的唯一房间标识,后续状态按它合并。 | +| `invitation.timeout` | `long` | 是 | 邀请等待时长,单位为秒。 | +| `invitation.mediaType` | `String` | 是 | 媒体类型,业务通常约定为 `audio` 或 `video`。 | +| `invitation.sessionType` | `int` | 是 | 单聊使用 `ConversationType.SINGLE_CHAT`,群聊使用 `ConversationType.SUPER_GROUP_CHAT`。 | +| `invitation.platformID` | `int` | 是 | 当前客户端平台,固定传入 `Platform.ANDROID`。 | +| `invitation.customData` | `String` | 否 | 随邀请携带的业务扩展字符串。 | +| `invitation.initiateTime` | `long` | 否 | 邀请发起时间。通常由信令链路维护,无需手动填写。 | | `offlinePushInfo` | `OfflinePushInfo` | 否 | 被邀请人离线时使用的推送内容。 | +| `offlinePushInfo.title` | `String` | 条件必填 | 推送标题,提供 `offlinePushInfo` 时必填 | +| `offlinePushInfo.desc` | `String` | 条件必填 | 推送正文,提供 `offlinePushInfo` 时必填 | +| `offlinePushInfo.ex` | `String` | 条件必填 | 推送扩展字符串,没有内容时传空字符串。 | +| `offlinePushInfo.iOSPushSound` | `String` | 条件必填 | iOS 推送声音,提供 `offlinePushInfo` 时必填 | +| `offlinePushInfo.iOSBadgeCount` | `boolean` | 条件必填 | 是否更新 iOS 角标,提供 `offlinePushInfo` 时必填 | ```java SignalingInvitationInfo invitation = new SignalingInvitationInfo(); @@ -35,7 +49,6 @@ invitation.setPlatformID(Platform.ANDROID); invitation.setCustomData("{\"source\":\"contact-card\"}"); SignalingInfo info = new SignalingInfo(); -info.setUserID(currentUserID); info.setInvitation(invitation); info.setOfflinePushInfo(offlinePushInfo); @@ -61,4 +74,4 @@ OpenIMClient.getInstance().signalingManager.signalingInvite( 成功回调返回 `SignalingCertificate`。其中 `roomID` 是媒体房间 ID,`token` 是加入房间使用的短期凭据,`liveURL` 是媒体服务提供的连接地址,`busyLineUserIDList` 是忙线用户列表。 -只有取得有效的 `token` 和 `roomID` 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态由[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)合并。 +只有取得有效的 `token` 和 `roomID` 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。 diff --git a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx index dcfadafd97..c0e18c3199 100644 --- a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx +++ b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx @@ -4,7 +4,7 @@ description: '使用 Android SDK 按群组 ID 查询进行中的通话房间。' sourcePath: '/sdk/android/calling/retrieving-call-information/get-room-by-group-id' --- -`signalingGetRoomByGroupID()` 的参数是群组 ID,不是自定义 `roomID`: +`signalingGetRoomByGroupID()` 的参数是群组 ID,不是 `roomID`,即使通话使用了自定义 `roomID`。 ```java OpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID( @@ -25,6 +25,6 @@ OpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID( ); ``` -成功回调返回 `RoomCallingInfo` 快照,其中包含房间 ID、原始邀请、参与者、群组 ID、Token 和连接地址。参与者资料中的账号资料、群内资料和群资料属于不同数据源,不应相互覆盖。 +成功回调返回 `RoomCallingInfo` 快照,其中包含房间 ID、原始邀请、参与者、群组 ID、Token 和连接地址。 -没有进行中的群通话时,应把错误或空房间视为“当前没有可恢复的通话”,不要继续使用旧凭据。即使业务为群通话使用自定义房间 ID,本方法仍然传入 `groupID`。 +如果当前群组没有进行中的通话,接口可能返回错误或空房间。此时应清除本地保存的通话状态和房间凭据,不要继续尝试加入旧房间。 diff --git a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx index f49f7a0827..3aa19bee41 100644 --- a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx +++ b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx @@ -30,6 +30,6 @@ OpenIMClient.getInstance().signalingManager.signalingGetTokenByRoomID( ); ``` -成功回调返回 `SignalingCertificate`,字段含义见[发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)。只有取得有效的 `token` 和 `roomID` 后才能连接媒体引擎。 +成功回调返回 `SignalingCertificate`,可获取接入音视频房间所需的 `token` 和 `liveURL`。 房间 Token 是短期敏感凭据,只在内存中使用,不要写入日志、URL、分析事件或持久化存储。 diff --git a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx index c466e6033a..3f2adc7781 100644 --- a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx +++ b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx @@ -4,7 +4,7 @@ description: '使用 Android SDK 恢复应用启动时尚未处理的通话邀 sourcePath: '/sdk/android/calling/retrieving-call-information/restore-pending-invitation' --- -`getSignalingInvitationInfoStartApp()` 不接收业务参数,返回应用启动或恢复时需要处理的邀请快照: +`getSignalingInvitationInfoStartApp()` 用于在应用启动或恢复时获取未处理的通话邀请。 ```java OpenIMClient.getInstance().signalingManager.getSignalingInvitationInfoStartApp( @@ -27,4 +27,4 @@ OpenIMClient.getInstance().signalingManager.getSignalingInvitationInfoStartApp( ); ``` -成功回调只表示取得当前快照,不会替代通话 listener。仅在 `invitation` 和 `roomID` 有效时恢复来电界面;随后仍需处理取消、超时、接受和挂断,完整处理见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。 +成功回调返回的是调用时的邀请快照,不会接通通话,仍需自行处理取消、超时、接受通话邀请。 diff --git a/content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx b/content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx index 27854c43a6..8eda5fecab 100644 --- a/content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx +++ b/content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx @@ -4,7 +4,7 @@ description: '使用 Android SDK 在通话房间中发送和接收自定义信 sourcePath: '/sdk/android/calling/sending-custom-signals/send-a-custom-signal' --- -`signalingSendCustomSignal()` 用于向指定通话房间发送轻量级业务协商数据,例如举手、切换布局提示或业务侧状态同步。它不是聊天消息接口,也不能替代媒体引擎的数据通道。 +`signalingSendCustomSignal()` 用于在指定通话房间内发送少量与通话相关的业务信息,例如举手、切换布局提示或临时状态同步。它不是聊天消息接口,也不适合发送大量数据或文件。 ## 发送信令 @@ -35,11 +35,11 @@ OpenIMClient.getInstance().signalingManager.signalingSendCustomSignal( ); ``` -成功回调表示本次自定义信令发送请求已经完成,不等于其他参与者已经处理。自定义信令应保持精简,并包含协议版本和业务幂等 ID。大文件、聊天记录、长期状态和敏感凭据不应放入 `customInfo`。 +成功回调只表示发送请求已完成,不表示其他参与者已收到或处理该信令。建议在 `customInfo` 中包含协议版本和唯一的 `eventID`,以便接收方识别重复消息。不要放入大文件、聊天记录、长期状态或敏感凭据。 ## 接收信令 -`OnSignalingListener.onReceiveCustomSignal` 返回 `CustomSignalingInfo`。应用应先校验房间和自有业务协议,再更新界面: +收到自定义信令时,`OnSignalingListener.onReceiveCustomSignal` 会返回 `CustomSignalingInfo`。先确认它属于当前房间并校验数据格式,再更新界面: ```java @Override @@ -57,8 +57,8 @@ public void onReceiveCustomSignal(CustomSignalingInfo info) { } ``` -本页是 `onReceiveCustomSignal` 的完整处理归属页。`parseAndValidateCallSignal()` 应检查 JSON 结构、协议版本、`eventID`、`type` 和业务字段。按 `roomID:eventID` 幂等处理,不要依赖事件顺序。 +如果业务需要避免重复处理,可以在自定义信令中携带唯一事件 ID,并在接收端记录已处理的事件。消息可能不会按发送顺序到达,因此不要依赖到达顺序决定业务状态。 -`SignalingManager` 只设置一个 listener。接收自定义信令的回调应合并到[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)所示的应用级 listener 中,不能为本页单独设置一个新 listener,否则会覆盖其他通话回调。 +将 `onReceiveCustomSignal` 与其他通话回调一起注册到[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)中的 listener。`SignalingManager` 只保留一个 listener;重新设置会覆盖已有的其他通话回调。 -客户端自定义信令不能用于授予主持人、付费或隐私权限。需要权威校验的状态应由可信后端保存和判断;连接恢复后,通过房间查询或业务后端校准长期状态。 +客户端自定义信令不能用于授予主持人、付费或隐私权限。这类需要可信校验的状态应由服务端保存和判断;在连接断连恢复时,应该从房间查询或业务后端恢复长期状态。 diff --git a/content/zh/docs/chat/sdk/android/events/overview-events.mdx b/content/zh/docs/chat/sdk/android/events/overview-events.mdx index 7ba0c0f9e2..0a6b57bccc 100644 --- a/content/zh/docs/chat/sdk/android/events/overview-events.mdx +++ b/content/zh/docs/chat/sdk/android/events/overview-events.mdx @@ -4,25 +4,39 @@ description: '集中设置 Android SDK listener,并按业务领域分发连接 sourcePath: '/sdk/android/events/overview-events' --- -OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。 +OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。每个 manager 同时只保留一个 listener;再次设置会覆盖之前设置的 listener。因此应在应用中统一管理这些 listener,并在登录前设置一次,不要在 Activity、Fragment、Compose 页面或各功能组件中重复设置。 -连接 listener 是例外:`OnConnListener` 在 `initSDK()` 时传入,其完整处理见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。 +IM Server 连接状态由 `OnConnListener` 监听。它不通过 manager 单独设置,而是在调用 `initSDK()` 时传入;完整处理方式见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。 ## 集中设置 listener -下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。 +以下示例在应用的统一位置注册各类 listener。每个 listener 只处理其所属业务的事件,例如消息、会话、好友和通话。 ```java public final class OpenIMEventCenter { private final OpenIMClient client = OpenIMClient.getInstance(); - private final OnUserListener userListener = buildUserListener(); - private final OnFriendshipListener friendshipListener = buildFriendshipListener(); - private final OnConversationListener conversationListener = buildConversationListener(); - private final OnGroupListener groupListener = buildGroupListener(); - private final OnAdvanceMsgListener messageListener = buildMessageListener(); - private final OnCustomBusinessListener businessListener = buildBusinessListener(); - private final OnSignalingListener signalingListener = buildSignalingListener(); + private final OnUserListener userListener = new OnUserListener() { + // 处理用户资料和在线状态变化 + }; + private final OnFriendshipListener friendshipListener = new OnFriendshipListener() { + // 处理好友关系、好友申请和黑名单变化 + }; + private final OnConversationListener conversationListener = new OnConversationListener() { + // 处理会话、未读数、输入状态和初始化同步 + }; + private final OnGroupListener groupListener = new OnGroupListener() { + // 处理群组、群成员和群申请变化 + }; + private final OnAdvanceMsgListener messageListener = new OnAdvanceMsgListener() { + // 处理新消息、撤回、删除、修改和已读回执 + }; + private final OnCustomBusinessListener businessListener = new OnCustomBusinessListener() { + // 处理自定义业务消息 + }; + private final OnSignalingListener signalingListener = new OnSignalingListener() { + // 处理通话邀请、成员状态和自定义通话信令 + }; public void registerBeforeLogin() { client.userInfoManager.setOnUserListener(userListener); @@ -36,7 +50,7 @@ public final class OpenIMEventCenter { } ``` -Android SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。 +Android SDK 不提供移除 listener 的方法。退出登录、切换账号或页面销毁时,应停止用回调更新旧账号数据和已销毁界面,并清理应用自身持有的引用。下次登录前,重新设置新账号使用的各类 listener。 ## 事件归属 @@ -63,59 +77,34 @@ Android SDK 没有公开的 remove 或 unset 方法。退出登录、切换账 | 通话自定义信令 | `OnSignalingListener` | [发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) | | SDK 数据同步 | `OnConversationListener` | [监听初始化同步](#监听初始化同步) | -查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。 - ## 监听初始化同步 -同步生命周期属于应用级 `OnConversationListener`。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑: +同步生命周期属于 `OnConversationListener`,该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示初始化同步相关的回调: ```java -private OnConversationListener buildConversationListener() { - return new OnConversationListener() { - @Override - public void onNewConversation(List conversations) { - mergeNewConversations(conversations); - } - - @Override - public void onConversationChanged(List conversations) { - mergeChangedConversations(conversations); - } - - @Override - public void onTotalUnreadMessageCountChanged(int total) { - updateTotalUnreadCount(total); - } - - @Override - public void onConversationUserInputStatusChanged(String payload) { - handleInputStatus(payload); - } - - @Override - public void onSyncServerStart(boolean reinstall) { - setSyncState("syncing", 0, reinstall); - } - - @Override - public void onSyncServerProgress(long progress) { - setSyncProgress(progress); - } - - @Override - public void onSyncServerFinish(boolean reinstall) { - setSyncState("ready", 100, reinstall); - reloadVisibleSnapshots(); - } - - @Override - public void onSyncServerFailed(boolean reinstall) { - setSyncState("failed", 0, reinstall); - } - }; -} -``` +private final OnConversationListener conversationListener = new OnConversationListener() { + @Override + public void onSyncServerStart(boolean reinstall) { + // 开始同步:更新同步状态并按需显示加载界面 + } -`reinstall` 为 `true` 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。`onSyncServerProgress` 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。 + @Override + public void onSyncServerProgress(long progress) { + // 同步中:更新同步进度 + } + + @Override + public void onSyncServerFinish(boolean reinstall) { + // 同步完成:刷新依赖完整数据的页面 + } + + @Override + public void onSyncServerFailed(boolean reinstall) { + // 同步失败:更新同步失败状态并等待重试或连接恢复 + } + + // conversationListener 的其他回调函数... +}; +``` -本页是 `onSyncServerStart`、`onSyncServerProgress`、`onSyncServerFinish` 和 `onSyncServerFailed` 的完整处理归属页。同步状态没有业务实体合并键,应按当前 `OpenIMClient` 单例和登录用户隔离。 +`reinstall` 表示本次是否为本地数据重建后的同步:`true` 表示应用重装、清除本地数据等场景后的同步,本地通常没有可用缓存;`false` 表示普通登录后的同步。`onSyncServerProgress` 提供当前同步进度;同步完成后重新查询当前界面需要的数据,失败时更新同步失败状态并等待重试或连接恢复。 diff --git a/content/zh/docs/chat/sdk/android/logger.mdx b/content/zh/docs/chat/sdk/android/logger.mdx index 7e40da542f..f1ff5e38e9 100644 --- a/content/zh/docs/chat/sdk/android/logger.mdx +++ b/content/zh/docs/chat/sdk/android/logger.mdx @@ -8,7 +8,7 @@ OpenIM Android SDK 日志用于定位初始化、连接和业务 API 调用问 ## 初始化日志配置 -日志选项属于 `InitConfig`,必须在 `initSDK()` 前设置: +在调用 `initSDK()` 时配置日志: ```java File dataDirectory = new File(application.getFilesDir(), "openim"); @@ -38,9 +38,9 @@ boolean initialized = OpenIMClient.getInstance().initSDK( 开发诊断可以使用 `Debug`;只有排查数据库问题时才临时启用 `DebugWithSQL`。生产环境通常使用 `Warn` 或 `Error`,并关闭不必要的标准输出。 -## 写入应用诊断日志 +## 写入应用日志 -需要把业务上下文写入 SDK 日志时,使用未废弃的 `logs()` 重载: +需要把业务日志写入 SDK 日志时,使用 `logs()`: ```java OpenIMClient.getInstance().logs( @@ -56,14 +56,14 @@ OpenIMClient.getInstance().logs( `currentClassName` 和 `currentLineNum` 用于定位调用位置,`msgStr` 是简短动作描述,`errStr` 是错误信息。`Warn`、`Error`、`Panic` 和 `Fatal` 级别必须提供非空错误信息。末尾的 `extra` 按“键、值”成对传入;只记录排查所需的非敏感标识。 -旧的带 `OnBase`、`Map` 参数的 `logs()` 重载已经废弃,不应在新代码中使用。 +旧版带 `OnBase`、`Map` 参数的 `logs()` 重载已经废弃,不应在新代码中使用。 -## 上传诊断日志 +## 上传日志 -只在用户明确同意提交诊断信息后调用 `uploadLogs()`。Android API 保留了 `params` 参数;没有额外参数时传空列表。`line` 表示本次上传读取的日志行数配置。 +`uploadLogs()` 可将客户端日志上传至服务器,主要使用场景是用户主动提交诊断日志。 ```java -String uploadID = UUID.randomUUID().toString(); +String cancelID = UUID.randomUUID().toString(); OpenIMClient.getInstance().uploadLogs( new OnBase() { @@ -77,10 +77,10 @@ OpenIMClient.getInstance().uploadLogs( showLogUploadError(code, error); } }, - Collections.emptyList(), - 2000, - uploadID, - "support-ticket-42", + new ArrayList<>(), + 2000, // line + cancelID, + "support-ticket-42", // ex new UploadLogProgress() { @Override public void onProgress(long current, long total) { @@ -92,18 +92,19 @@ OpenIMClient.getInstance().uploadLogs( | 参数 | 说明 | | --- | --- | +| `params` | 历史遗留参数,当前 SDK 不使用;传入空列表,例如 `new ArrayList<>()`。 | | `line` | 本次上传读取的日志行数配置。 | | `cancelID` | 本次上传的稳定标识,可使用业务生成的 UUID。 | | `ex` | 附加到上传任务的诊断说明,例如工单 ID;不能包含凭据或隐私数据。 | | `UploadLogProgress` | 提供当前进度和总量,用于更新上传界面。 | -成功 callback 表示本次日志上传请求完成,不会修改用户、会话或消息状态,也不会触发业务领域事件。上传失败时记录错误码、当前用户和业务诊断 ID,不要再次输出完整日志内容。 +成功 callback 表示本次日志上传请求完成。 -## operationID 与业务追踪 +## 使用 operationID 定位一次 SDK 调用 -Android Java wrapper 的公共业务方法不接收 `operationID`。每次调用时,wrapper 会通过 `ParamsUtil.buildOperationID()` 自动生成并传给 Core,因此应用通常不需要创建或传递该值。 +OpenIM Android SDK 的公共业务方法不接收 `operationID` 参数。每次调用 SDK 时,会自动生成 `operationID`。`operationID` 只对应一次 SDK 调用,不是用户身份、权限凭据、业务幂等键或业务 ID。 -应用日志应另外维护自己的 trace ID,并记录业务动作、错误码以及必要的 `conversationID`、`clientMsgID`、`groupID` 或 `roomID`。应用 trace ID 用于串联多步骤业务流程;SDK 的 `operationID` 用于单次 SDK 调用链路,两者都不是身份凭据或业务幂等键。 +排查问题时,在客户端 SDK 日志中找到报错或异常调用附近的 `operationID`,可用它定位这一次 SDK 调用的相关日志。向技术支持提供日志时,同时提供发生时间、用户 ID、操作名称,以及必要的 `conversationID`、`clientMsgID`、`groupID` 或 `roomID`,有助于更快找到对应记录。 ## 相关页面 diff --git a/src/generated/android-sdk-zh-content.json b/src/generated/android-sdk-zh-content.json index e5f04071b4..f080996bbc 100644 --- a/src/generated/android-sdk-zh-content.json +++ b/src/generated/android-sdk-zh-content.json @@ -1762,7 +1762,7 @@ "title": "音视频通话概览" }, "/sdk/android/calling/managing-calls/start-single-call": { - "body": "`signalingInvite()` 发起单聊通话。Android SDK 负责通话信令,应用仍需使用返回的房间凭据接入实时音视频媒体引擎。\n\n## 参数说明\n\n| 字段 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `userID` | `String` | 是 | 执行邀请操作的当前登录用户 ID。 |\n| `inviterUserID` | `String` | 是 | 邀请方用户 ID,通常与当前登录用户一致。 |\n| `inviteeUserIDList` | `List` | 是 | 被邀请用户列表;单聊只填写对方一个用户。 |\n| `groupID` | `String` | 是 | 单聊固定传空字符串。 |\n| `roomID` | `String` | 是 | 本次通话的唯一房间标识,后续状态按它合并。 |\n| `timeout` | `long` | 是 | 邀请等待时长,单位为秒。 |\n| `mediaType` | `String` | 是 | 媒体类型,业务通常约定为 `audio` 或 `video`。 |\n| `sessionType` | `int` | 是 | 单聊使用 `ConversationType.SINGLE_CHAT`。 |\n| `platformID` | `int` | 是 | Android 手机端使用 `Platform.ANDROID`。 |\n| `customData` | `String` | 否 | 随邀请携带的业务扩展字符串。 |\n| `offlinePushInfo` | `OfflinePushInfo` | 否 | 被邀请人离线时使用的推送内容。 |\n\n```java\nSignalingInvitationInfo invitation = new SignalingInvitationInfo();\ninvitation.setInviterUserID(currentUserID);\ninvitation.setInviteeUserIDList(Collections.singletonList(peerUserID));\ninvitation.setGroupID(\"\");\ninvitation.setRoomID(roomID);\ninvitation.setTimeout(30);\ninvitation.setMediaType(\"video\");\ninvitation.setSessionType(ConversationType.SINGLE_CHAT);\ninvitation.setPlatformID(Platform.ANDROID);\ninvitation.setCustomData(\"{\\\"source\\\":\\\"contact-card\\\"}\");\n\nSignalingInfo info = new SignalingInfo();\ninfo.setUserID(currentUserID);\ninfo.setInvitation(invitation);\ninfo.setOfflinePushInfo(offlinePushInfo);\n\nOpenIMClient.getInstance().signalingManager.signalingInvite(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n joinMediaRoom(\n credentials.getRoomID(),\n credentials.getToken(),\n credentials.getLiveURL()\n );\n }\n\n @Override\n public void onError(int code, String error) {\n showCallError(code, error);\n }\n },\n info\n);\n```\n\n成功回调返回 `SignalingCertificate`。其中 `roomID` 是媒体房间 ID,`token` 是加入房间使用的短期凭据,`liveURL` 是媒体服务提供的连接地址,`busyLineUserIDList` 是忙线用户列表。\n\n只有取得有效的 `token` 和 `roomID` 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态由[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)合并。", + "body": "`signalingInvite()` 发起单聊通话。Android SDK 负责通话信令,应用仍需使用返回的房间凭据接入实时音视频媒体引擎。\n\n## 参数说明\n\n调用方法:\n\n```java\nsignalingInvite(OnBase callback, SignalingInfo info)\n```\n\n下表字段均为 `info` 的属性;使用点号表示嵌套对象。仅列出 Android SDK 与 WASM SDK 共有的参数。\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `invitation` | `SignalingInvitationInfo` | 是 | 本次通话邀请。 |\n| `invitation.inviterUserID` | `String` | 是 | 邀请者,传入当前登录用户 ID。 |\n| `invitation.inviteeUserIDList` | `List` | 是 | 被邀请用户列表;单聊只填写对方一个用户。 |\n| `invitation.groupID` | `String` | 是 | 群ID,单聊固定传空字符串。 |\n| `invitation.roomID` | `String` | 是 | 本次通话的唯一房间标识,后续状态按它合并。 |\n| `invitation.timeout` | `long` | 是 | 邀请等待时长,单位为秒。 |\n| `invitation.mediaType` | `String` | 是 | 媒体类型,业务通常约定为 `audio` 或 `video`。 |\n| `invitation.sessionType` | `int` | 是 | 单聊使用 `ConversationType.SINGLE_CHAT`,群聊使用 `ConversationType.SUPER_GROUP_CHAT`。 |\n| `invitation.platformID` | `int` | 是 | 当前客户端平台,固定传入 `Platform.ANDROID`。 |\n| `invitation.customData` | `String` | 否 | 随邀请携带的业务扩展字符串。 |\n| `invitation.initiateTime` | `long` | 否 | 邀请发起时间。通常由信令链路维护,无需手动填写。 |\n| `offlinePushInfo` | `OfflinePushInfo` | 否 | 被邀请人离线时使用的推送内容。 |\n| `offlinePushInfo.title` | `String` | 条件必填 | 推送标题,提供 `offlinePushInfo` 时必填 |\n| `offlinePushInfo.desc` | `String` | 条件必填 | 推送正文,提供 `offlinePushInfo` 时必填 |\n| `offlinePushInfo.ex` | `String` | 条件必填 | 推送扩展字符串,没有内容时传空字符串。 |\n| `offlinePushInfo.iOSPushSound` | `String` | 条件必填 | iOS 推送声音,提供 `offlinePushInfo` 时必填 |\n| `offlinePushInfo.iOSBadgeCount` | `boolean` | 条件必填 | 是否更新 iOS 角标,提供 `offlinePushInfo` 时必填 |\n\n```java\nSignalingInvitationInfo invitation = new SignalingInvitationInfo();\ninvitation.setInviterUserID(currentUserID);\ninvitation.setInviteeUserIDList(Collections.singletonList(peerUserID));\ninvitation.setGroupID(\"\");\ninvitation.setRoomID(roomID);\ninvitation.setTimeout(30);\ninvitation.setMediaType(\"video\");\ninvitation.setSessionType(ConversationType.SINGLE_CHAT);\ninvitation.setPlatformID(Platform.ANDROID);\ninvitation.setCustomData(\"{\\\"source\\\":\\\"contact-card\\\"}\");\n\nSignalingInfo info = new SignalingInfo();\ninfo.setInvitation(invitation);\ninfo.setOfflinePushInfo(offlinePushInfo);\n\nOpenIMClient.getInstance().signalingManager.signalingInvite(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n joinMediaRoom(\n credentials.getRoomID(),\n credentials.getToken(),\n credentials.getLiveURL()\n );\n }\n\n @Override\n public void onError(int code, String error) {\n showCallError(code, error);\n }\n },\n info\n);\n```\n\n成功回调返回 `SignalingCertificate`。其中 `roomID` 是媒体房间 ID,`token` 是加入房间使用的短期凭据,`liveURL` 是媒体服务提供的连接地址,`busyLineUserIDList` 是忙线用户列表。\n\n只有取得有效的 `token` 和 `roomID` 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。", "description": "使用 Android SDK 发起单聊音视频通话。", "headings": [ { @@ -1775,70 +1775,70 @@ "title": "发起单聊通话" }, "/sdk/android/calling/managing-calls/start-group-call": { - "body": "`signalingInviteInGroup()` 发起群聊通话,只邀请 `inviteeUserIDList` 明确列出的群成员,不会因为填写 `groupID` 自动邀请全群。\n\n```java\nSignalingInvitationInfo invitation = new SignalingInvitationInfo();\ninvitation.setInviterUserID(currentUserID);\ninvitation.setInviteeUserIDList(selectedGroupMemberIDs);\ninvitation.setGroupID(groupID);\ninvitation.setRoomID(groupID);\ninvitation.setTimeout(30);\ninvitation.setMediaType(\"video\");\ninvitation.setSessionType(ConversationType.GROUP_CHAT);\ninvitation.setPlatformID(Platform.ANDROID);\ninvitation.setCustomData(\"{\\\"source\\\":\\\"group-call\\\"}\");\n\nSignalingInfo info = new SignalingInfo();\ninfo.setUserID(currentUserID);\ninfo.setInvitation(invitation);\ninfo.setOfflinePushInfo(offlinePushInfo);\n\nOpenIMClient.getInstance().signalingManager.signalingInviteInGroup(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n startGroupCall(credentials);\n }\n\n @Override\n public void onError(int code, String error) {\n showCallError(code, error);\n }\n },\n info\n);\n```\n\n`groupID` 不能为空,`inviteeUserIDList` 应排除当前用户、空值和重复成员。示例沿用群组 ID 作为房间 ID;若业务自行生成 `roomID`,所有参与端必须使用同一个值。\n\n成功回调返回 `SignalingCertificate`,字段含义见[发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)。`busyLineUserIDList` 只表示部分成员忙线,不应中止其他成员的邀请流程;成功也不表示其他成员已经接听。", + "body": "`signalingInviteInGroup()` 发起群聊通话,参数类型与[发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)相同。群聊通话时,`invitation.groupID` 必须传入群组 ID,`invitation.sessionType` 固定为 `ConversationType.GROUP_CHAT`。\n\n只会邀请 `inviteeUserIDList` 中列出的成员,填写 `groupID` 不会自动邀请全群。`inviteeUserIDList` 列表应排除当前用户、空值和重复成员。示例以群组 ID 作为房间 ID;若自行生成 `roomID`,所有参与者必须使用相同的值。\n\n```java\nSignalingInvitationInfo invitation = new SignalingInvitationInfo();\ninvitation.setInviterUserID(currentUserID);\ninvitation.setInviteeUserIDList(selectedGroupMemberIDs);\ninvitation.setGroupID(groupID);\ninvitation.setRoomID(groupID);\ninvitation.setTimeout(30);\ninvitation.setMediaType(\"video\");\ninvitation.setSessionType(ConversationType.GROUP_CHAT);\ninvitation.setPlatformID(Platform.ANDROID);\ninvitation.setCustomData(\"{\\\"source\\\":\\\"group-call\\\"}\");\n\nSignalingInfo info = new SignalingInfo();\ninfo.setInvitation(invitation);\ninfo.setOfflinePushInfo(offlinePushInfo);\n\nOpenIMClient.getInstance().signalingManager.signalingInviteInGroup(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n startGroupCall(credentials);\n }\n\n @Override\n public void onError(int code, String error) {\n showCallError(code, error);\n }\n },\n info\n);\n```\n\n成功回调返回 `SignalingCertificate`,其中 `roomID` 是媒体房间 ID,`token` 是加入房间使用的短期凭据,`liveURL` 是媒体服务提供的连接地址,`busyLineUserIDList` 是忙线用户列表。忙线用户不影响其余成员的邀请;成功也不表示已有成员接听。\n\n只有取得有效的 `token` 和 `roomID` 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。", "description": "使用 Android SDK 发起群聊音视频通话。", "headings": [], "sourcePath": "/sdk/android/calling/managing-calls/start-group-call", "title": "发起群聊通话" }, "/sdk/android/calling/managing-calls/accept-call": { - "body": "从 `onReceiveNewInvitation` 取得原始 `SignalingInfo` 后,使用 `signalingAccept()` 接受邀请:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingAccept(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n joinMediaRoom(\n credentials.getRoomID(),\n credentials.getToken(),\n credentials.getLiveURL()\n );\n }\n\n @Override\n public void onError(int code, String error) {\n showAcceptError(code, error);\n }\n },\n receivedInfo\n);\n```\n\n`receivedInfo` 必须保留收到的原始 `roomID`、邀请人、被邀请人和会话类型,不能重新构造为只包含 `roomID` 的对象。\n\n成功回调返回 `SignalingCertificate`。取得有效的 `token` 和 `roomID` 后再连接媒体房间;远端状态由[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)继续合并。", + "body": "从 `onReceiveNewInvitation` 取得原始 `SignalingInfo` 后,使用 `signalingAccept()` 接受邀请:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingAccept(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n joinMediaRoom(\n credentials.getRoomID(),\n credentials.getToken(),\n credentials.getLiveURL()\n );\n }\n\n @Override\n public void onError(int code, String error) {\n showAcceptError(code, error);\n }\n },\n receivedInfo\n);\n```\n\n`receivedInfo` 必须保留收到的原始 `roomID`、邀请人、被邀请人和会话类型,不能重新构造为只包含 `roomID` 的对象。\n\n成功回调返回 `SignalingCertificate`。取得有效的 `token` 和 `roomID` 后再连接媒体房间;API 成功仅表示已向服务端提交接听请求,不代表通话已建立,请继续监听[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events),根据邀请方、其他设备或房间参与者返回的事件更新通话界面和状态。", "description": "使用 Android SDK 接受通话邀请并获取房间凭据。", "headings": [], "sourcePath": "/sdk/android/calling/managing-calls/accept-call", "title": "接受通话" }, "/sdk/android/calling/managing-calls/reject-call": { - "body": "用户拒绝来电时,将收到的原始 `SignalingInfo` 交给 `signalingReject()`:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingReject(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n closeIncomingCallUI();\n }\n\n @Override\n public void onError(int code, String error) {\n showRejectError(code, error);\n }\n },\n receivedInfo\n);\n```\n\n成功回调只表示拒绝信令请求完成。发起端随后通过 `onInviteeRejected` 更新界面;完整处理见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。", + "body": "用户拒绝来电时,将收到的原始 `SignalingInfo` 交给 `signalingReject()`:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingReject(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n closeIncomingCallUI();\n }\n\n @Override\n public void onError(int code, String error) {\n showRejectError(code, error);\n }\n },\n signalingInfo\n);\n```\n\n成功回调只表示拒绝信令请求完成。发起端随后通过 `onInviteeRejected` 更新界面;完整处理见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。", "description": "使用 Android SDK 拒绝通话邀请。", "headings": [], "sourcePath": "/sdk/android/calling/managing-calls/reject-call", "title": "拒绝通话" }, "/sdk/android/calling/managing-calls/cancel-call": { - "body": "邀请尚未接通时,发起方调用 `signalingCancel()`:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingCancel(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n stopWaitingForAnswer(activeInfo.getInvitation().getRoomID());\n }\n\n @Override\n public void onError(int code, String error) {\n showCancelError(code, error);\n }\n },\n activeInfo\n);\n```\n\n必须传入发起时保存的完整 `SignalingInfo`,不能只构造一个 `roomID`。成功回调表示取消信令请求完成;应用还应结束本地等待接听状态,并释放尚未使用的媒体资源。远端通过 `onInvitationCancelled` 更新。", + "body": "邀请尚未接通时,发起方可调用 `signalingCancel()` 取消通话邀请:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingCancel(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n stopWaitingForAnswer(activeInfo.getInvitation().getRoomID());\n }\n\n @Override\n public void onError(int code, String error) {\n showCancelError(code, error);\n }\n },\n activeInfo\n);\n```\n\n必须传入发起时保存的完整 `SignalingInfo`,不能只构造一个 `roomID`。成功回调表示取消信令请求完成;应用还应结束本地等待接听状态,并释放尚未使用的媒体资源。远端通过 `onInvitationCancelled` 更新。", "description": "使用 Android SDK 取消尚未接通的通话邀请。", "headings": [], "sourcePath": "/sdk/android/calling/managing-calls/cancel-call", "title": "取消通话邀请" }, "/sdk/android/calling/managing-calls/hang-up-call": { - "body": "通话已经建立后,参与者调用 `signalingHungUp()`。传入的 `SignalingInfo` 应保留本次通话的完整邀请信息,其中 `roomID` 必须与当前媒体房间一致。\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingHungUp(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n releaseCallResources(activeInfo.getInvitation().getRoomID());\n }\n\n @Override\n public void onError(int code, String error) {\n showHangUpError(code, error);\n }\n },\n activeInfo\n);\n```\n\n成功回调只表示挂断信令请求完成。应用还需要停止本地采集、断开媒体房间,并释放摄像头和麦克风。取消、拒绝、超时和挂断应进入同一套按 `roomID` 幂等执行的清理流程。", + "body": "通话建立后,任一参与者都可以调用 `signalingHungUp()` 挂断。传入当前通话保存的完整 `SignalingInfo`,其中的 `roomID` 必须与当前媒体房间一致。\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingHungUp(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n releaseCallResources(signalingInfo.getInvitation().getRoomID());\n }\n\n @Override\n public void onError(int code, String error) {\n showHangUpError(code, error);\n }\n },\n signalingInfo\n);\n```\n\n成功回调只表示挂断信令请求已完成,不代表本地资源已自动释放。应用应关闭通话界面、停止本地采集、断开媒体房间,并释放摄像头和麦克风。", "description": "使用 Android SDK 挂断已经建立的通话。", "headings": [], "sourcePath": "/sdk/android/calling/managing-calls/hang-up-call", "title": "挂断通话" }, "/sdk/android/calling/managing-calls/handle-call-events": { - "body": "通话状态层应集中设置一次 `OnSignalingListener`,并按 `roomID` 合并邀请生命周期、参与者连接状态和媒体流变化。\n\n```java\nOpenIMClient.getInstance().signalingManager.setSignalingListener(\n new OnSignalingListener() {\n @Override\n public void onReceiveNewInvitation(SignalingInfo info) {\n upsertCall(info, \"ringing\");\n }\n\n @Override\n public void onInviteeAccepted(SignalingInfo info) {\n mergeCallEvent(\"accepted\", info);\n }\n\n @Override\n public void onInviteeRejected(SignalingInfo info) {\n mergeCallEvent(\"rejected\", info);\n }\n\n @Override\n public void onInvitationCancelled(SignalingInfo info) {\n mergeCallEvent(\"cancelled\", info);\n }\n\n @Override\n public void onInvitationTimeout(SignalingInfo info) {\n mergeCallEvent(\"timeout\", info);\n }\n\n @Override\n public void onInviteeAcceptedByOtherDevice(SignalingInfo info) {\n mergeCallEvent(\"accepted-by-other-device\", info);\n }\n\n @Override\n public void onInviteeRejectedByOtherDevice(SignalingInfo info) {\n mergeCallEvent(\"rejected-by-other-device\", info);\n }\n\n @Override\n public void onHangup(SignalingInfo info) {\n finishCall(info.getInvitation().getRoomID());\n }\n\n @Override\n public void onRoomParticipantConnected(RoomCallingInfo room) {\n mergeConnectedParticipants(room.getRoomID(), room.getParticipant());\n }\n\n @Override\n public void onRoomParticipantDisconnected(RoomCallingInfo room) {\n mergeDisconnectedParticipants(room.getRoomID(), room.getParticipant());\n }\n\n @Override\n public void onStreamChange(String streamInfo) {\n mergeStreamChange(streamInfo);\n }\n }\n);\n```\n\n本页是除 `onReceiveCustomSignal` 外 11 个已接入 Android 适配层的通话回调的完整归属页。自定义信令的处理边界见[发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal)。\n\n邀请事件使用 `SignalingInfo.invitation.roomID` 合并。参与者状态使用 `RoomCallingInfo.roomID`,并结合参与者的用户 ID 更新;不要按事件顺序、展示名称或数组位置合并。`onStreamChange` 当前提供字符串载荷,应由接入层按服务端实际协议解析并校验。\n\n`SignalingManager` 只设置一个 listener,后一次设置会替换先前实例,并且没有公开移除方法。自定义信令回调必须与本页的其他回调组合在同一个应用级 listener 中。退出登录或切换账号时,应停止向旧账号状态写入,并用新账号的完整 listener 覆盖。", + "body": "在应用的通话状态管理处注册一次 `OnSignalingListener`。SDK 通过这些回调通知来电、接听、拒绝、取消、超时、挂断以及成员进出房间;应用据此更新通话界面和本地通话状态。\n\n`SignalingManager` 同时只保留一个 listener,重复调用 `setSignalingListener()` 会替换之前的 listener。退出登录或切换账号时,先停止更新旧账号的通话状态,再为新账号设置 listener。\n\n```java\nOpenIMClient.getInstance().signalingManager.setSignalingListener(\n new OnSignalingListener() {\n @Override\n public void onReceiveNewInvitation(SignalingInfo info) {\n showIncomingCall(info);\n }\n\n @Override\n public void onInviteeAccepted(SignalingInfo info) {\n updateCallStatus(info, \"accepted\");\n }\n\n @Override\n public void onInviteeRejected(SignalingInfo info) {\n updateCallStatus(info, \"rejected\");\n }\n\n @Override\n public void onInvitationCancelled(SignalingInfo info) {\n endCall(info);\n }\n\n @Override\n public void onInvitationTimeout(SignalingInfo info) {\n endCall(info);\n }\n\n @Override\n public void onInviteeAcceptedByOtherDevice(SignalingInfo info) {\n endCall(info);\n }\n\n @Override\n public void onInviteeRejectedByOtherDevice(SignalingInfo info) {\n endCall(info);\n }\n\n @Override\n public void onHangup(SignalingInfo info) {\n endCall(info);\n }\n\n @Override\n public void onRoomParticipantConnected(RoomCallingInfo room) {\n updateParticipantStatus(room, true);\n }\n\n @Override\n public void onRoomParticipantDisconnected(RoomCallingInfo room) {\n updateParticipantStatus(room, false);\n }\n\n @Override\n public void onStreamChange(String streamInfo) {\n handleStreamChange(streamInfo);\n }\n }\n);\n```\n\n| 回调 | 何时触发 | 应用应做什么 |\n| --- | --- | --- |\n| `onReceiveNewInvitation` | 收到新的通话邀请。 | 保存 `SignalingInfo`,显示来电界面,并让用户选择接听或拒绝。 |\n| `onInviteeAccepted`、`onInviteeRejected` | 某位被邀请者接听或拒绝。 | 更新该成员的通话状态;群聊中不应影响其他成员。 |\n| `onInvitationCancelled`、`onInvitationTimeout`、`onHangup` | 邀请被取消、超时或任一方挂断。 | 关闭对应通话界面,断开媒体房间并释放本地资源。 |\n| `onInviteeAcceptedByOtherDevice`、`onInviteeRejectedByOtherDevice` | 同一账号的另一台设备已接听或拒绝。 | 结束当前设备上的来电界面,避免两台设备同时处理同一邀请。 |\n| `onRoomParticipantConnected`、`onRoomParticipantDisconnected` | 成员进入或离开媒体房间。 | 更新群聊中的成员状态。 |\n| `onStreamChange` | 服务端发送媒体流变化信息。 | 按接入服务端实际约定解析字符串,再更新媒体流。 |", "description": "集中设置 Android SDK 的通话邀请、参与者和媒体流 listener。", "headings": [], "sourcePath": "/sdk/android/calling/managing-calls/handle-call-events", "title": "处理通话事件" }, "/sdk/android/calling/retrieving-call-information/restore-pending-invitation": { - "body": "`getSignalingInvitationInfoStartApp()` 不接收业务参数,返回应用启动或恢复时需要处理的邀请快照:\n\n```java\nOpenIMClient.getInstance().signalingManager.getSignalingInvitationInfoStartApp(\n new OnBase() {\n @Override\n public void onSuccess(SignalingInfo info) {\n if (info != null\n && info.getInvitation() != null\n && info.getInvitation().getRoomID() != null\n && !info.getInvitation().getRoomID().isEmpty()) {\n restoreIncomingCall(info);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n clearExpiredIncomingCall();\n }\n }\n);\n```\n\n成功回调只表示取得当前快照,不会替代通话 listener。仅在 `invitation` 和 `roomID` 有效时恢复来电界面;随后仍需处理取消、超时、接受和挂断,完整处理见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。", + "body": "`getSignalingInvitationInfoStartApp()` 用于在应用启动或恢复时获取未处理的通话邀请。\n\n```java\nOpenIMClient.getInstance().signalingManager.getSignalingInvitationInfoStartApp(\n new OnBase() {\n @Override\n public void onSuccess(SignalingInfo info) {\n if (info != null\n && info.getInvitation() != null\n && info.getInvitation().getRoomID() != null\n && !info.getInvitation().getRoomID().isEmpty()) {\n restoreIncomingCall(info);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n clearExpiredIncomingCall();\n }\n }\n);\n```\n\n成功回调返回的是调用时的邀请快照,不会接通通话,仍需自行处理取消、超时、接受通话邀请。", "description": "使用 Android SDK 恢复应用启动时尚未处理的通话邀请。", "headings": [], "sourcePath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", "title": "恢复启动前收到的通话邀请" }, "/sdk/android/calling/retrieving-call-information/get-room-by-group-id": { - "body": "`signalingGetRoomByGroupID()` 的参数是群组 ID,不是自定义 `roomID`:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID(\n new OnBase() {\n @Override\n public void onSuccess(RoomCallingInfo room) {\n if (room.getRoomID() != null && !room.getRoomID().isEmpty()) {\n renderParticipants(room.getParticipant());\n }\n }\n\n @Override\n public void onError(int code, String error) {\n showNoActiveGroupCall();\n }\n },\n groupID\n);\n```\n\n成功回调返回 `RoomCallingInfo` 快照,其中包含房间 ID、原始邀请、参与者、群组 ID、Token 和连接地址。参与者资料中的账号资料、群内资料和群资料属于不同数据源,不应相互覆盖。\n\n没有进行中的群通话时,应把错误或空房间视为“当前没有可恢复的通话”,不要继续使用旧凭据。即使业务为群通话使用自定义房间 ID,本方法仍然传入 `groupID`。", + "body": "`signalingGetRoomByGroupID()` 的参数是群组 ID,不是 `roomID`,即使通话使用了自定义 `roomID`。\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID(\n new OnBase() {\n @Override\n public void onSuccess(RoomCallingInfo room) {\n if (room.getRoomID() != null && !room.getRoomID().isEmpty()) {\n renderParticipants(room.getParticipant());\n }\n }\n\n @Override\n public void onError(int code, String error) {\n showNoActiveGroupCall();\n }\n },\n groupID\n);\n```\n\n成功回调返回 `RoomCallingInfo` 快照,其中包含房间 ID、原始邀请、参与者、群组 ID、Token 和连接地址。\n\n如果当前群组没有进行中的通话,接口可能返回错误或空房间。此时应清除本地保存的通话状态和房间凭据,不要继续尝试加入旧房间。", "description": "使用 Android SDK 按群组 ID 查询进行中的通话房间。", "headings": [], "sourcePath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", "title": "查询群组通话房间" }, "/sdk/android/calling/retrieving-call-information/get-token-by-room-id": { - "body": "已经知道 `roomID`、但需要重新获取入会凭据时,调用 `signalingGetTokenByRoomID()`:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingGetTokenByRoomID(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n if (credentials.getToken() != null\n && credentials.getRoomID() != null) {\n joinMediaRoom(\n credentials.getRoomID(),\n credentials.getToken(),\n credentials.getLiveURL()\n );\n }\n }\n\n @Override\n public void onError(int code, String error) {\n showCredentialError(code, error);\n }\n },\n roomID\n);\n```\n\n成功回调返回 `SignalingCertificate`,字段含义见[发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)。只有取得有效的 `token` 和 `roomID` 后才能连接媒体引擎。\n\n房间 Token 是短期敏感凭据,只在内存中使用,不要写入日志、URL、分析事件或持久化存储。", + "body": "已经知道 `roomID`、但需要重新获取入会凭据时,调用 `signalingGetTokenByRoomID()`:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingGetTokenByRoomID(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n if (credentials.getToken() != null\n && credentials.getRoomID() != null) {\n joinMediaRoom(\n credentials.getRoomID(),\n credentials.getToken(),\n credentials.getLiveURL()\n );\n }\n }\n\n @Override\n public void onError(int code, String error) {\n showCredentialError(code, error);\n }\n },\n roomID\n);\n```\n\n成功回调返回 `SignalingCertificate`,可获取接入音视频房间所需的 `token` 和 `liveURL`。\n\n房间 Token 是短期敏感凭据,只在内存中使用,不要写入日志、URL、分析事件或持久化存储。", "description": "使用 Android SDK 按房间 ID 重新获取入会凭据。", "headings": [], "sourcePath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", "title": "获取通话房间 Token" }, "/sdk/android/calling/sending-custom-signals/send-a-custom-signal": { - "body": "`signalingSendCustomSignal()` 用于向指定通话房间发送轻量级业务协商数据,例如举手、切换布局提示或业务侧状态同步。它不是聊天消息接口,也不能替代媒体引擎的数据通道。\n\n## 发送信令\n\n`roomID` 与 `customInfo` 都是必填字符串。需要传递结构化数据时,应定义稳定的数据格式并序列化为 JSON。\n\n```java\nJSONObject signal = new JSONObject();\nsignal.put(\"version\", 1);\nsignal.put(\"eventID\", eventID);\nsignal.put(\"type\", \"hand-raised\");\nsignal.put(\"userID\", currentUserID);\nsignal.put(\"sentAt\", System.currentTimeMillis());\n\nOpenIMClient.getInstance().signalingManager.signalingSendCustomSignal(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n markSignalSent(eventID);\n }\n\n @Override\n public void onError(int code, String error) {\n showSignalError(code, error);\n }\n },\n roomID,\n signal.toString()\n);\n```\n\n成功回调表示本次自定义信令发送请求已经完成,不等于其他参与者已经处理。自定义信令应保持精简,并包含协议版本和业务幂等 ID。大文件、聊天记录、长期状态和敏感凭据不应放入 `customInfo`。\n\n## 接收信令\n\n`OnSignalingListener.onReceiveCustomSignal` 返回 `CustomSignalingInfo`。应用应先校验房间和自有业务协议,再更新界面:\n\n```java\n@Override\npublic void onReceiveCustomSignal(CustomSignalingInfo info) {\n if (info == null || !activeRoomID.equals(info.getRoomID())) {\n return;\n }\n\n CallSignal signal = parseAndValidateCallSignal(info.getCustomInfo());\n String mergeID = info.getRoomID() + \":\" + signal.getEventID();\n if (hasAppliedSignal(mergeID)) {\n return;\n }\n applyCallSignal(signal);\n}\n```\n\n本页是 `onReceiveCustomSignal` 的完整处理归属页。`parseAndValidateCallSignal()` 应检查 JSON 结构、协议版本、`eventID`、`type` 和业务字段。按 `roomID:eventID` 幂等处理,不要依赖事件顺序。\n\n`SignalingManager` 只设置一个 listener。接收自定义信令的回调应合并到[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)所示的应用级 listener 中,不能为本页单独设置一个新 listener,否则会覆盖其他通话回调。\n\n客户端自定义信令不能用于授予主持人、付费或隐私权限。需要权威校验的状态应由可信后端保存和判断;连接恢复后,通过房间查询或业务后端校准长期状态。", + "body": "`signalingSendCustomSignal()` 用于在指定通话房间内发送少量与通话相关的业务信息,例如举手、切换布局提示或临时状态同步。它不是聊天消息接口,也不适合发送大量数据或文件。\n\n## 发送信令\n\n`roomID` 与 `customInfo` 都是必填字符串。需要传递结构化数据时,应定义稳定的数据格式并序列化为 JSON。\n\n```java\nJSONObject signal = new JSONObject();\nsignal.put(\"version\", 1);\nsignal.put(\"eventID\", eventID);\nsignal.put(\"type\", \"hand-raised\");\nsignal.put(\"userID\", currentUserID);\nsignal.put(\"sentAt\", System.currentTimeMillis());\n\nOpenIMClient.getInstance().signalingManager.signalingSendCustomSignal(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n markSignalSent(eventID);\n }\n\n @Override\n public void onError(int code, String error) {\n showSignalError(code, error);\n }\n },\n roomID,\n signal.toString()\n);\n```\n\n成功回调只表示发送请求已完成,不表示其他参与者已收到或处理该信令。建议在 `customInfo` 中包含协议版本和唯一的 `eventID`,以便接收方识别重复消息。不要放入大文件、聊天记录、长期状态或敏感凭据。\n\n## 接收信令\n\n收到自定义信令时,`OnSignalingListener.onReceiveCustomSignal` 会返回 `CustomSignalingInfo`。先确认它属于当前房间并校验数据格式,再更新界面:\n\n```java\n@Override\npublic void onReceiveCustomSignal(CustomSignalingInfo info) {\n if (info == null || !activeRoomID.equals(info.getRoomID())) {\n return;\n }\n\n CallSignal signal = parseAndValidateCallSignal(info.getCustomInfo());\n String mergeID = info.getRoomID() + \":\" + signal.getEventID();\n if (hasAppliedSignal(mergeID)) {\n return;\n }\n applyCallSignal(signal);\n}\n```\n\n如果业务需要避免重复处理,可以在自定义信令中携带唯一事件 ID,并在接收端记录已处理的事件。消息可能不会按发送顺序到达,因此不要依赖到达顺序决定业务状态。\n\n将 `onReceiveCustomSignal` 与其他通话回调一起注册到[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)中的 listener。`SignalingManager` 只保留一个 listener;重新设置会覆盖已有的其他通话回调。\n\n客户端自定义信令不能用于授予主持人、付费或隐私权限。这类需要可信校验的状态应由服务端保存和判断;在连接断连恢复时,应该从房间查询或业务后端恢复长期状态。", "description": "使用 Android SDK 在通话房间中发送和接收自定义信令。", "headings": [ { @@ -1856,7 +1856,7 @@ "title": "发送自定义信令" }, "/sdk/android/events/overview-events": { - "body": "OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。\n\n连接 listener 是例外:`OnConnListener` 在 `initSDK()` 时传入,其完整处理见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。\n\n## 集中设置 listener\n\n下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。\n\n```java\npublic final class OpenIMEventCenter {\n private final OpenIMClient client = OpenIMClient.getInstance();\n\n private final OnUserListener userListener = buildUserListener();\n private final OnFriendshipListener friendshipListener = buildFriendshipListener();\n private final OnConversationListener conversationListener = buildConversationListener();\n private final OnGroupListener groupListener = buildGroupListener();\n private final OnAdvanceMsgListener messageListener = buildMessageListener();\n private final OnCustomBusinessListener businessListener = buildBusinessListener();\n private final OnSignalingListener signalingListener = buildSignalingListener();\n\n public void registerBeforeLogin() {\n client.userInfoManager.setOnUserListener(userListener);\n client.friendshipManager.setOnFriendshipListener(friendshipListener);\n client.conversationManager.setOnConversationListener(conversationListener);\n client.groupManager.setOnGroupListener(groupListener);\n client.messageManager.setAdvancedMsgListener(messageListener);\n client.messageManager.setCustomBusinessListener(businessListener);\n client.signalingManager.setSignalingListener(signalingListener);\n }\n}\n```\n\nAndroid SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。\n\n## 事件归属\n\n| 事件范围 | Listener | 对应页面 |\n| --- | --- | --- |\n| 连接、Token 和强制下线 | `OnConnListener` | [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) |\n| 当前用户资料 | `OnUserListener` | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) |\n| 在线状态 | `OnUserListener` | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) |\n| 好友关系与资料 | `OnFriendshipListener` | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) |\n| 好友申请 | `OnFriendshipListener` | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) |\n| 黑名单 | `OnFriendshipListener` | [拉黑用户](/sdk/android/user/blacklist/add-blacklist)、[移出黑名单](/sdk/android/user/blacklist/remove-blacklist) |\n| 会话列表 | `OnConversationListener` | [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) |\n| 总未读数 | `OnConversationListener` | [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) |\n| 输入状态 | `OnConversationListener` | [上报输入状态](/sdk/android/message/composing-messages/update-typing-status) |\n| 群资料、成员和群申请 | `OnGroupListener` | [群组概览](/sdk/android/group/overview-group) |\n| 新消息、离线消息和在线消息 | `OnAdvanceMsgListener` | [接收消息](/sdk/android/message/receiving-messages/receive-messages) |\n| 消息撤回 | `OnAdvanceMsgListener` | [撤回消息](/sdk/android/message/managing-messages/revoke-a-message) |\n| 消息删除 | `OnAdvanceMsgListener` | [批量删除消息](/sdk/android/message/managing-messages/delete-saved-messages) |\n| 消息修改 | `OnAdvanceMsgListener` | [修改消息](/sdk/android/message/managing-messages/modify-a-message) |\n| 置顶消息 | `OnAdvanceMsgListener` | [置顶或取消置顶消息](/sdk/android/message/managing-messages/set-message-pinned) |\n| 单聊已读回执 | `OnAdvanceMsgListener` | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) |\n| 自定义业务消息 | `OnCustomBusinessListener` | [接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) |\n| 通话 | `OnSignalingListener` | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events) |\n| 通话自定义信令 | `OnSignalingListener` | [发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) |\n| SDK 数据同步 | `OnConversationListener` | [监听初始化同步](#监听初始化同步) |\n\n查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。\n\n## 监听初始化同步\n\n同步生命周期属于应用级 `OnConversationListener`。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑:\n\n```java\nprivate OnConversationListener buildConversationListener() {\n return new OnConversationListener() {\n @Override\n public void onNewConversation(List conversations) {\n mergeNewConversations(conversations);\n }\n\n @Override\n public void onConversationChanged(List conversations) {\n mergeChangedConversations(conversations);\n }\n\n @Override\n public void onTotalUnreadMessageCountChanged(int total) {\n updateTotalUnreadCount(total);\n }\n\n @Override\n public void onConversationUserInputStatusChanged(String payload) {\n handleInputStatus(payload);\n }\n\n @Override\n public void onSyncServerStart(boolean reinstall) {\n setSyncState(\"syncing\", 0, reinstall);\n }\n\n @Override\n public void onSyncServerProgress(long progress) {\n setSyncProgress(progress);\n }\n\n @Override\n public void onSyncServerFinish(boolean reinstall) {\n setSyncState(\"ready\", 100, reinstall);\n reloadVisibleSnapshots();\n }\n\n @Override\n public void onSyncServerFailed(boolean reinstall) {\n setSyncState(\"failed\", 0, reinstall);\n }\n };\n}\n```\n\n`reinstall` 为 `true` 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。`onSyncServerProgress` 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。\n\n本页是 `onSyncServerStart`、`onSyncServerProgress`、`onSyncServerFinish` 和 `onSyncServerFailed` 的完整处理归属页。同步状态没有业务实体合并键,应按当前 `OpenIMClient` 单例和登录用户隔离。", + "body": "OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。每个 manager 同时只保留一个 listener;再次设置会覆盖之前设置的 listener。因此应在应用中统一管理这些 listener,并在登录前设置一次,不要在 Activity、Fragment、Compose 页面或各功能组件中重复设置。\n\nIM Server 连接状态由 `OnConnListener` 监听。它不通过 manager 单独设置,而是在调用 `initSDK()` 时传入;完整处理方式见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。\n\n## 集中设置 listener\n\n以下示例在应用的统一位置注册各类 listener。每个 listener 只处理其所属业务的事件,例如消息、会话、好友和通话。\n\n```java\npublic final class OpenIMEventCenter {\n private final OpenIMClient client = OpenIMClient.getInstance();\n\n private final OnUserListener userListener = new OnUserListener() {\n // 处理用户资料和在线状态变化\n };\n private final OnFriendshipListener friendshipListener = new OnFriendshipListener() {\n // 处理好友关系、好友申请和黑名单变化\n };\n private final OnConversationListener conversationListener = new OnConversationListener() {\n // 处理会话、未读数、输入状态和初始化同步\n };\n private final OnGroupListener groupListener = new OnGroupListener() {\n // 处理群组、群成员和群申请变化\n };\n private final OnAdvanceMsgListener messageListener = new OnAdvanceMsgListener() {\n // 处理新消息、撤回、删除、修改和已读回执\n };\n private final OnCustomBusinessListener businessListener = new OnCustomBusinessListener() {\n // 处理自定义业务消息\n };\n private final OnSignalingListener signalingListener = new OnSignalingListener() {\n // 处理通话邀请、成员状态和自定义通话信令\n };\n\n public void registerBeforeLogin() {\n client.userInfoManager.setOnUserListener(userListener);\n client.friendshipManager.setOnFriendshipListener(friendshipListener);\n client.conversationManager.setOnConversationListener(conversationListener);\n client.groupManager.setOnGroupListener(groupListener);\n client.messageManager.setAdvancedMsgListener(messageListener);\n client.messageManager.setCustomBusinessListener(businessListener);\n client.signalingManager.setSignalingListener(signalingListener);\n }\n}\n```\n\nAndroid SDK 不提供移除 listener 的方法。退出登录、切换账号或页面销毁时,应停止用回调更新旧账号数据和已销毁界面,并清理应用自身持有的引用。下次登录前,重新设置新账号使用的各类 listener。\n\n## 事件归属\n\n| 事件范围 | Listener | 对应页面 |\n| --- | --- | --- |\n| 连接、Token 和强制下线 | `OnConnListener` | [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) |\n| 当前用户资料 | `OnUserListener` | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) |\n| 在线状态 | `OnUserListener` | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) |\n| 好友关系与资料 | `OnFriendshipListener` | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) |\n| 好友申请 | `OnFriendshipListener` | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) |\n| 黑名单 | `OnFriendshipListener` | [拉黑用户](/sdk/android/user/blacklist/add-blacklist)、[移出黑名单](/sdk/android/user/blacklist/remove-blacklist) |\n| 会话列表 | `OnConversationListener` | [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) |\n| 总未读数 | `OnConversationListener` | [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) |\n| 输入状态 | `OnConversationListener` | [上报输入状态](/sdk/android/message/composing-messages/update-typing-status) |\n| 群资料、成员和群申请 | `OnGroupListener` | [群组概览](/sdk/android/group/overview-group) |\n| 新消息、离线消息和在线消息 | `OnAdvanceMsgListener` | [接收消息](/sdk/android/message/receiving-messages/receive-messages) |\n| 消息撤回 | `OnAdvanceMsgListener` | [撤回消息](/sdk/android/message/managing-messages/revoke-a-message) |\n| 消息删除 | `OnAdvanceMsgListener` | [批量删除消息](/sdk/android/message/managing-messages/delete-saved-messages) |\n| 消息修改 | `OnAdvanceMsgListener` | [修改消息](/sdk/android/message/managing-messages/modify-a-message) |\n| 置顶消息 | `OnAdvanceMsgListener` | [置顶或取消置顶消息](/sdk/android/message/managing-messages/set-message-pinned) |\n| 单聊已读回执 | `OnAdvanceMsgListener` | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) |\n| 自定义业务消息 | `OnCustomBusinessListener` | [接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) |\n| 通话 | `OnSignalingListener` | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events) |\n| 通话自定义信令 | `OnSignalingListener` | [发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) |\n| SDK 数据同步 | `OnConversationListener` | [监听初始化同步](#监听初始化同步) |\n\n## 监听初始化同步\n\n同步生命周期属于 `OnConversationListener`,该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示初始化同步相关的回调:\n\n```java\nprivate final OnConversationListener conversationListener = new OnConversationListener() {\n @Override\n public void onSyncServerStart(boolean reinstall) {\n // 开始同步:更新同步状态并按需显示加载界面\n }\n\n @Override\n public void onSyncServerProgress(long progress) {\n // 同步中:更新同步进度\n }\n\n @Override\n public void onSyncServerFinish(boolean reinstall) {\n // 同步完成:刷新依赖完整数据的页面\n }\n\n @Override\n public void onSyncServerFailed(boolean reinstall) {\n // 同步失败:更新同步失败状态并等待重试或连接恢复\n }\n\n // conversationListener 的其他回调函数...\n};\n```\n\n`reinstall` 表示本次是否为本地数据重建后的同步:`true` 表示应用重装、清除本地数据等场景后的同步,本地通常没有可用缓存;`false` 表示普通登录后的同步。`onSyncServerProgress` 提供当前同步进度;同步完成后重新查询当前界面需要的数据,失败时更新同步失败状态并等待重试或连接恢复。", "description": "集中设置 Android SDK listener,并按业务领域分发连接、同步和数据事件。", "headings": [ { @@ -1879,7 +1879,7 @@ "title": "事件概览" }, "/sdk/android/logger": { - "body": "OpenIM Android SDK 日志用于定位初始化、连接和业务 API 调用问题。开发和预发布环境可以输出较详细的信息;生产环境应减少日志量,并避免记录 Token、完整消息正文、原始文件 URL、通话房间凭据和用户隐私字段。\n\n## 初始化日志配置\n\n日志选项属于 `InitConfig`,必须在 `initSDK()` 前设置:\n\n```java\nFile dataDirectory = new File(application.getFilesDir(), \"openim\");\nFile logDirectory = new File(application.getFilesDir(), \"openim-logs\");\n\nInitConfig config = new InitConfig(\n apiAddr,\n wsAddr,\n dataDirectory.getAbsolutePath()\n);\nconfig.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn;\nconfig.isLogStandardOutput = BuildConfig.DEBUG;\nconfig.logFilePath = logDirectory.getAbsolutePath();\n\nboolean initialized = OpenIMClient.getInstance().initSDK(\n application,\n config,\n connectionListener\n);\n```\n\n| 字段 | 说明 |\n| --- | --- |\n| `logLevel` | 使用 `LogLevel` 常量控制详细程度。可选值包括 `DebugWithSQL`、`Debug`、`Info`、`Warn`、`Error`、`Panic` 和 `Fatal`。 |\n| `isLogStandardOutput` | 是否把 SDK 日志输出到 Android 标准日志;开发诊断时开启。 |\n| `logFilePath` | 可选日志目录,应位于应用可写范围并纳入容量与保留期管理。 |\n\n开发诊断可以使用 `Debug`;只有排查数据库问题时才临时启用 `DebugWithSQL`。生产环境通常使用 `Warn` 或 `Error`,并关闭不必要的标准输出。\n\n## 写入应用诊断日志\n\n需要把业务上下文写入 SDK 日志时,使用未废弃的 `logs()` 重载:\n\n```java\nOpenIMClient.getInstance().logs(\n LogLevel.Error,\n ChatRepository.class.getSimpleName(),\n 184,\n \"send_message_failed\",\n errorMessage,\n \"conversationID\", conversationID,\n \"clientMsgID\", clientMsgID\n);\n```\n\n`currentClassName` 和 `currentLineNum` 用于定位调用位置,`msgStr` 是简短动作描述,`errStr` 是错误信息。`Warn`、`Error`、`Panic` 和 `Fatal` 级别必须提供非空错误信息。末尾的 `extra` 按“键、值”成对传入;只记录排查所需的非敏感标识。\n\n旧的带 `OnBase`、`Map` 参数的 `logs()` 重载已经废弃,不应在新代码中使用。\n\n## 上传诊断日志\n\n只在用户明确同意提交诊断信息后调用 `uploadLogs()`。Android API 保留了 `params` 参数;没有额外参数时传空列表。`line` 表示本次上传读取的日志行数配置。\n\n```java\nString uploadID = UUID.randomUUID().toString();\n\nOpenIMClient.getInstance().uploadLogs(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n showLogUploadCompleted();\n }\n\n @Override\n public void onError(int code, String error) {\n showLogUploadError(code, error);\n }\n },\n Collections.emptyList(),\n 2000,\n uploadID,\n \"support-ticket-42\",\n new UploadLogProgress() {\n @Override\n public void onProgress(long current, long total) {\n updateLogUploadProgress(current, total);\n }\n }\n);\n```\n\n| 参数 | 说明 |\n| --- | --- |\n| `line` | 本次上传读取的日志行数配置。 |\n| `cancelID` | 本次上传的稳定标识,可使用业务生成的 UUID。 |\n| `ex` | 附加到上传任务的诊断说明,例如工单 ID;不能包含凭据或隐私数据。 |\n| `UploadLogProgress` | 提供当前进度和总量,用于更新上传界面。 |\n\n成功 callback 表示本次日志上传请求完成,不会修改用户、会话或消息状态,也不会触发业务领域事件。上传失败时记录错误码、当前用户和业务诊断 ID,不要再次输出完整日志内容。\n\n## operationID 与业务追踪\n\nAndroid Java wrapper 的公共业务方法不接收 `operationID`。每次调用时,wrapper 会通过 `ParamsUtil.buildOperationID()` 自动生成并传给 Core,因此应用通常不需要创建或传递该值。\n\n应用日志应另外维护自己的 trace ID,并记录业务动作、错误码以及必要的 `conversationID`、`clientMsgID`、`groupID` 或 `roomID`。应用 trace ID 用于串联多步骤业务流程;SDK 的 `operationID` 用于单次 SDK 调用链路,两者都不是身份凭据或业务幂等键。\n\n## 相关页面\n\n- [按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation)\n- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)\n- [发送消息](/sdk/android/message/sending-messages/send-message)", + "body": "OpenIM Android SDK 日志用于定位初始化、连接和业务 API 调用问题。开发和预发布环境可以输出较详细的信息;生产环境应减少日志量,并避免记录 Token、完整消息正文、原始文件 URL、通话房间凭据和用户隐私字段。\n\n## 初始化日志配置\n\n在调用 `initSDK()` 时配置日志:\n\n```java\nFile dataDirectory = new File(application.getFilesDir(), \"openim\");\nFile logDirectory = new File(application.getFilesDir(), \"openim-logs\");\n\nInitConfig config = new InitConfig(\n apiAddr,\n wsAddr,\n dataDirectory.getAbsolutePath()\n);\nconfig.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn;\nconfig.isLogStandardOutput = BuildConfig.DEBUG;\nconfig.logFilePath = logDirectory.getAbsolutePath();\n\nboolean initialized = OpenIMClient.getInstance().initSDK(\n application,\n config,\n connectionListener\n);\n```\n\n| 字段 | 说明 |\n| --- | --- |\n| `logLevel` | 使用 `LogLevel` 常量控制详细程度。可选值包括 `DebugWithSQL`、`Debug`、`Info`、`Warn`、`Error`、`Panic` 和 `Fatal`。 |\n| `isLogStandardOutput` | 是否把 SDK 日志输出到 Android 标准日志;开发诊断时开启。 |\n| `logFilePath` | 可选日志目录,应位于应用可写范围并纳入容量与保留期管理。 |\n\n开发诊断可以使用 `Debug`;只有排查数据库问题时才临时启用 `DebugWithSQL`。生产环境通常使用 `Warn` 或 `Error`,并关闭不必要的标准输出。\n\n## 写入应用日志\n\n需要把业务日志写入 SDK 日志时,使用 `logs()`:\n\n```java\nOpenIMClient.getInstance().logs(\n LogLevel.Error,\n ChatRepository.class.getSimpleName(),\n 184,\n \"send_message_failed\",\n errorMessage,\n \"conversationID\", conversationID,\n \"clientMsgID\", clientMsgID\n);\n```\n\n`currentClassName` 和 `currentLineNum` 用于定位调用位置,`msgStr` 是简短动作描述,`errStr` 是错误信息。`Warn`、`Error`、`Panic` 和 `Fatal` 级别必须提供非空错误信息。末尾的 `extra` 按“键、值”成对传入;只记录排查所需的非敏感标识。\n\n旧版带 `OnBase`、`Map` 参数的 `logs()` 重载已经废弃,不应在新代码中使用。\n\n## 上传日志\n\n`uploadLogs()` 可将客户端日志上传至服务器,主要使用场景是用户主动提交诊断日志。\n\n```java\nString cancelID = UUID.randomUUID().toString();\n\nOpenIMClient.getInstance().uploadLogs(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n showLogUploadCompleted();\n }\n\n @Override\n public void onError(int code, String error) {\n showLogUploadError(code, error);\n }\n },\n new ArrayList<>(),\n 2000, // line\n cancelID,\n \"support-ticket-42\", // ex\n new UploadLogProgress() {\n @Override\n public void onProgress(long current, long total) {\n updateLogUploadProgress(current, total);\n }\n }\n);\n```\n\n| 参数 | 说明 |\n| --- | --- |\n| `params` | 历史遗留参数,当前 SDK 不使用;传入空列表,例如 `new ArrayList<>()`。 |\n| `line` | 本次上传读取的日志行数配置。 |\n| `cancelID` | 本次上传的稳定标识,可使用业务生成的 UUID。 |\n| `ex` | 附加到上传任务的诊断说明,例如工单 ID;不能包含凭据或隐私数据。 |\n| `UploadLogProgress` | 提供当前进度和总量,用于更新上传界面。 |\n\n成功 callback 表示本次日志上传请求完成。\n\n## 使用 operationID 定位一次 SDK 调用\n\nOpenIM Android SDK 的公共业务方法不接收 `operationID` 参数。每次调用 SDK 时,会自动生成 `operationID`。`operationID` 只对应一次 SDK 调用,不是用户身份、权限凭据、业务幂等键或业务 ID。\n\n排查问题时,在客户端 SDK 日志中找到报错或异常调用附近的 `operationID`,可用它定位这一次 SDK 调用的相关日志。向技术支持提供日志时,同时提供发生时间、用户 ID、操作名称,以及必要的 `conversationID`、`clientMsgID`、`groupID` 或 `roomID`,有助于更快找到对应记录。\n\n## 相关页面\n\n- [按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation)\n- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)\n- [发送消息](/sdk/android/message/sending-messages/send-message)", "description": "配置 Android SDK 日志、写入应用诊断信息并上传日志。", "headings": [ { @@ -1889,18 +1889,18 @@ }, { "depth": 2, - "title": "写入应用诊断日志", - "url": "#写入应用诊断日志" + "title": "写入应用日志", + "url": "#写入应用日志" }, { "depth": 2, - "title": "上传诊断日志", - "url": "#上传诊断日志" + "title": "上传日志", + "url": "#上传日志" }, { "depth": 2, - "title": "operationID 与业务追踪", - "url": "#operationid-与业务追踪" + "title": "使用 operationID 定位一次 SDK 调用", + "url": "#使用-operationid-定位一次-sdk-调用" }, { "depth": 2, diff --git a/src/generated/search-index-zh.json b/src/generated/search-index-zh.json index 5c0901b3ab..4071431a72 100644 --- a/src/generated/search-index-zh.json +++ b/src/generated/search-index-zh.json @@ -2733,7 +2733,7 @@ "description": "使用 sendMessage 将 Message 发送到单聊或群聊。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message sending-messages send-message", - "content": "单聊填写 recvUid ,群聊填写 recvGid ,另一个目标参数传 null 。 OnMsgSendCallback 同时承载成功、失败和媒体进度。 messageManager.sendMessage new OnMsgSendCallback @Override public void onSuccess String id mergeSentMessage message ; @Override public void onError int code, String error showSendError error ; , message, peerUserID, null, offlinePushInfo ;" + "content": "单聊填写 recvUid ,群聊填写 recvGid ,另一个目标参数传 null 。 OnMsgSendCallback 同时承载成功、失败和媒体进度。 messageManager.sendMessage new OnMsgSendCallback @Override public void onSuccess Message sentMessage mergeSentMessage sentMessage ; @Override public void onError int code, String error showSendError error ; , message, peerUserID, null, offlinePushInfo ;" }, { "path": "/sdk/android/message/sending-messages/send-message-not-oss", @@ -2749,7 +2749,7 @@ "description": "通过 OnMsgSendCallback 的进度回调更新媒体发送进度。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message sending-messages set-msg-send-progress-listener", - "content": "Android 没有独立的全局发送进度 listener;进度随每次 sendMessage 或 sendMessageNotOss 传入的 OnMsgSendCallback 返回。 messageManager.sendMessage new OnMsgSendCallback @Override public void onProgress long progress updateProgress progress ; @Override public void onSuccess String id finishProgress ; @Override public void onError int code, String error failProgress error ; , message, peerUserID, null, offlinePushInfo ;" + "content": "Android 没有独立的全局发送进度 listener;进度随每次 sendMessage 或 sendMessageNotOss 传入的 OnMsgSendCallback 返回。 messageManager.sendMessage new OnMsgSendCallback @Override public void onProgress long progress updateProgress progress ; @Override public void onSuccess Message sentMessage finishProgress ; @Override public void onError int code, String error failProgress error ; , message, peerUserID, null, offlinePushInfo ;" }, { "path": "/sdk/android/message/receiving-messages/receive-messages", @@ -2773,7 +2773,7 @@ "description": "使用 getAdvancedHistoryMessageList 分页加载会话历史消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message retrieving-messages load-older-messages", - "content": "首次查询传 startMsg 为 null ,后续将上一页边界消息作为起点。按返回的 clientMsgID 去重。 messageManager.getAdvancedHistoryMessageList callback, conversationID, startMessage, 20, ViewType.NORMAL ;" + "content": "首次查询传 startMsg 为 null ,后续将上一页边界消息作为起点。普通历史消息使用 ViewType.History ,按返回的 clientMsgID 去重。 messageManager.getAdvancedHistoryMessageList callback, conversationID, startMessage, 20, ViewType.History ;" }, { "path": "/sdk/android/message/retrieving-messages/load-newer-messages", @@ -2781,7 +2781,7 @@ "description": "使用 getAdvancedHistoryMessageListReverse 加载起点之后的消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message retrieving-messages load-newer-messages", - "content": "该方法用于从消息定位点向后读取,适合搜索定位或上下文分页。 messageManager.getAdvancedHistoryMessageListReverse callback, conversationID, startMessage, 20, ViewType.NORMAL ;" + "content": "该方法用于从消息定位点向后读取下一页历史消息。此类方向历史分页使用 ViewType.History 。 messageManager.getAdvancedHistoryMessageListReverse callback, conversationID, startMessage, 20, ViewType.History ;" }, { "path": "/sdk/android/message/retrieving-messages/find-messages-by-id", @@ -2965,7 +2965,7 @@ "description": "使用 Android SDK 发起单聊音视频通话。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls start-single-call", - "content": "signalingInvite 发起单聊通话。Android SDK 负责通话信令,应用仍需使用返回的房间凭据接入实时音视频媒体引擎。 参数说明 | 字段 | 类型 | 是否必填 | 说明 | | | | | | | userID | String | 是 | 执行邀请操作的当前登录用户 ID。 | | inviterUserID | String | 是 | 邀请方用户 ID,通常与当前登录用户一致。 | | inviteeUserIDList | List | 是 | 被邀请用户列表;单聊只填写对方一个用户。 | | groupID | String | 是 | 单聊固定传空字符串。 | | roomID | String | 是 | 本次通话的唯一房间标识,后续状态按它合并。 | | timeout | long | 是 | 邀请等待时长,单位为秒。 | | mediaType | String | 是 | 媒体类型,业务通常约定为 audio 或 video 。 | | sessionType | int | 是 | 单聊使用 ConversationType.SINGLE CHAT 。 | | platformID | int | 是 | Android 手机端使用 Platform.ANDROID 。 | | customData | String | 否 | 随邀请携带的业务扩展字符串。 | | offlinePushInfo | OfflinePushInfo | 否 | 被邀请人离线时使用的推送内容。 | SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList Collections.singletonList peerUserID ; invitation.setGroupID \"\" ; invitation.setRoomID roomID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.SINGLE CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"contact card\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setUserID currentUserID ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInvite new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCallError code, error ; , info ; 成功回调返回 SignalingCertificate 。其中 roomID 是媒体房间 ID, token 是加入房间使用的短期凭据, liveURL 是媒体服务提供的连接地址, busyLineUserIDList 是忙线用户列表。 只有取得有效的 token 和 roomID 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态由 处理通话事件 /sdk/android/calling/managing calls/handle call events 合并。" + "content": "signalingInvite 发起单聊通话。Android SDK 负责通话信令,应用仍需使用返回的房间凭据接入实时音视频媒体引擎。 参数说明 调用方法: signalingInvite OnBase callback, SignalingInfo info 下表字段均为 info 的属性;使用点号表示嵌套对象。仅列出 Android SDK 与 WASM SDK 共有的参数。 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | invitation | SignalingInvitationInfo | 是 | 本次通话邀请。 | | invitation.inviterUserID | String | 是 | 邀请者,传入当前登录用户 ID。 | | invitation.inviteeUserIDList | List | 是 | 被邀请用户列表;单聊只填写对方一个用户。 | | invitation.groupID | String | 是 | 群ID,单聊固定传空字符串。 | | invitation.roomID | String | 是 | 本次通话的唯一房间标识,后续状态按它合并。 | | invitation.timeout | long | 是 | 邀请等待时长,单位为秒。 | | invitation.mediaType | String | 是 | 媒体类型,业务通常约定为 audio 或 video 。 | | invitation.sessionType | int | 是 | 单聊使用 ConversationType.SINGLE CHAT ,群聊使用 ConversationType.SUPER GROUP CHAT 。 | | invitation.platformID | int | 是 | 当前客户端平台,固定传入 Platform.ANDROID 。 | | invitation.customData | String | 否 | 随邀请携带的业务扩展字符串。 | | invitation.initiateTime | long | 否 | 邀请发起时间。通常由信令链路维护,无需手动填写。 | | offlinePushInfo | OfflinePushInfo | 否 | 被邀请人离线时使用的推送内容。 | | offlinePushInfo.title | String | 条件必填 | 推送标题,提供 offlinePushInfo 时必填 | | offlinePushInfo.desc | String | 条件必填 | 推送正文,提供 offlinePushInfo 时必填 | | offlinePushInfo.ex | String | 条件必填 | 推送扩展字符串,没有内容时传空字符串。 | | offlinePushInfo.iOSPushSound | String | 条件必填 | iOS 推送声音,提供 offlinePushInfo 时必填 | | offlinePushInfo.iOSBadgeCount | boolean | 条件必填 | 是否更新 iOS 角标,提供 offlinePushInfo 时必填 | SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList Collections.singletonList peerUserID ; invitation.setGroupID \"\" ; invitation.setRoomID roomID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.SINGLE CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"contact card\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInvite new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCallError code, error ; , info ; 成功回调返回 SignalingCertificate 。其中 roomID 是媒体房间 ID, token 是加入房间使用的短期凭据, liveURL 是媒体服务提供的连接地址, busyLineUserIDList 是忙线用户列表。 只有取得有效的 token 和 roomID 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态见 处理通话事件 /sdk/android/calling/managing calls/handle call events 。" }, { "path": "/sdk/android/calling/managing-calls/start-group-call", @@ -2973,7 +2973,7 @@ "description": "使用 Android SDK 发起群聊音视频通话。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls start-group-call", - "content": "signalingInviteInGroup 发起群聊通话,只邀请 inviteeUserIDList 明确列出的群成员,不会因为填写 groupID 自动邀请全群。 SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList selectedGroupMemberIDs ; invitation.setGroupID groupID ; invitation.setRoomID groupID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.GROUP CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"group call\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setUserID currentUserID ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInviteInGroup new OnBase @Override public void onSuccess SignalingCertificate credentials startGroupCall credentials ; @Override public void onError int code, String error showCallError code, error ; , info ; groupID 不能为空, inviteeUserIDList 应排除当前用户、空值和重复成员。示例沿用群组 ID 作为房间 ID;若业务自行生成 roomID ,所有参与端必须使用同一个值。 成功回调返回 SignalingCertificate ,字段含义见 发起单聊通话 /sdk/android/calling/managing calls/start single call 。 busyLineUserIDList 只表示部分成员忙线,不应中止其他成员的邀请流程;成功也不表示其他成员已经接听。" + "content": "signalingInviteInGroup 发起群聊通话,参数类型与 发起单聊通话 /sdk/android/calling/managing calls/start single call 相同。群聊通话时, invitation.groupID 必须传入群组 ID, invitation.sessionType 固定为 ConversationType.GROUP CHAT 。 只会邀请 inviteeUserIDList 中列出的成员,填写 groupID 不会自动邀请全群。 inviteeUserIDList 列表应排除当前用户、空值和重复成员。示例以群组 ID 作为房间 ID;若自行生成 roomID ,所有参与者必须使用相同的值。 SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList selectedGroupMemberIDs ; invitation.setGroupID groupID ; invitation.setRoomID groupID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.GROUP CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"group call\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInviteInGroup new OnBase @Override public void onSuccess SignalingCertificate credentials startGroupCall credentials ; @Override public void onError int code, String error showCallError code, error ; , info ; 成功回调返回 SignalingCertificate ,其中 roomID 是媒体房间 ID, token 是加入房间使用的短期凭据, liveURL 是媒体服务提供的连接地址, busyLineUserIDList 是忙线用户列表。忙线用户不影响其余成员的邀请;成功也不表示已有成员接听。 只有取得有效的 token 和 roomID 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态见 处理通话事件 /sdk/android/calling/managing calls/handle call events 。" }, { "path": "/sdk/android/calling/managing-calls/accept-call", @@ -2981,7 +2981,7 @@ "description": "使用 Android SDK 接受通话邀请并获取房间凭据。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls accept-call", - "content": "从 onReceiveNewInvitation 取得原始 SignalingInfo 后,使用 signalingAccept 接受邀请: OpenIMClient.getInstance .signalingManager.signalingAccept new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showAcceptError code, error ; , receivedInfo ; receivedInfo 必须保留收到的原始 roomID 、邀请人、被邀请人和会话类型,不能重新构造为只包含 roomID 的对象。 成功回调返回 SignalingCertificate 。取得有效的 token 和 roomID 后再连接媒体房间;远端状态由 处理通话事件 /sdk/android/calling/managing calls/handle call events 继续合并。" + "content": "从 onReceiveNewInvitation 取得原始 SignalingInfo 后,使用 signalingAccept 接受邀请: OpenIMClient.getInstance .signalingManager.signalingAccept new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showAcceptError code, error ; , receivedInfo ; receivedInfo 必须保留收到的原始 roomID 、邀请人、被邀请人和会话类型,不能重新构造为只包含 roomID 的对象。 成功回调返回 SignalingCertificate 。取得有效的 token 和 roomID 后再连接媒体房间;API 成功仅表示已向服务端提交接听请求,不代表通话已建立,请继续监听 处理通话事件 /sdk/android/calling/managing calls/handle call events ,根据邀请方、其他设备或房间参与者返回的事件更新通话界面和状态。" }, { "path": "/sdk/android/calling/managing-calls/reject-call", @@ -2989,7 +2989,7 @@ "description": "使用 Android SDK 拒绝通话邀请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls reject-call", - "content": "用户拒绝来电时,将收到的原始 SignalingInfo 交给 signalingReject : OpenIMClient.getInstance .signalingManager.signalingReject new OnBase @Override public void onSuccess String result closeIncomingCallUI ; @Override public void onError int code, String error showRejectError code, error ; , receivedInfo ; 成功回调只表示拒绝信令请求完成。发起端随后通过 onInviteeRejected 更新界面;完整处理见 处理通话事件 /sdk/android/calling/managing calls/handle call events 。" + "content": "用户拒绝来电时,将收到的原始 SignalingInfo 交给 signalingReject : OpenIMClient.getInstance .signalingManager.signalingReject new OnBase @Override public void onSuccess String result closeIncomingCallUI ; @Override public void onError int code, String error showRejectError code, error ; , signalingInfo ; 成功回调只表示拒绝信令请求完成。发起端随后通过 onInviteeRejected 更新界面;完整处理见 处理通话事件 /sdk/android/calling/managing calls/handle call events 。" }, { "path": "/sdk/android/calling/managing-calls/cancel-call", @@ -2997,7 +2997,7 @@ "description": "使用 Android SDK 取消尚未接通的通话邀请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls cancel-call", - "content": "邀请尚未接通时,发起方调用 signalingCancel : OpenIMClient.getInstance .signalingManager.signalingCancel new OnBase @Override public void onSuccess String result stopWaitingForAnswer activeInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showCancelError code, error ; , activeInfo ; 必须传入发起时保存的完整 SignalingInfo ,不能只构造一个 roomID 。成功回调表示取消信令请求完成;应用还应结束本地等待接听状态,并释放尚未使用的媒体资源。远端通过 onInvitationCancelled 更新。" + "content": "邀请尚未接通时,发起方可调用 signalingCancel 取消通话邀请: OpenIMClient.getInstance .signalingManager.signalingCancel new OnBase @Override public void onSuccess String result stopWaitingForAnswer activeInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showCancelError code, error ; , activeInfo ; 必须传入发起时保存的完整 SignalingInfo ,不能只构造一个 roomID 。成功回调表示取消信令请求完成;应用还应结束本地等待接听状态,并释放尚未使用的媒体资源。远端通过 onInvitationCancelled 更新。" }, { "path": "/sdk/android/calling/managing-calls/hang-up-call", @@ -3005,7 +3005,7 @@ "description": "使用 Android SDK 挂断已经建立的通话。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls hang-up-call", - "content": "通话已经建立后,参与者调用 signalingHungUp 。传入的 SignalingInfo 应保留本次通话的完整邀请信息,其中 roomID 必须与当前媒体房间一致。 OpenIMClient.getInstance .signalingManager.signalingHungUp new OnBase @Override public void onSuccess String result releaseCallResources activeInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showHangUpError code, error ; , activeInfo ; 成功回调只表示挂断信令请求完成。应用还需要停止本地采集、断开媒体房间,并释放摄像头和麦克风。取消、拒绝、超时和挂断应进入同一套按 roomID 幂等执行的清理流程。" + "content": "通话建立后,任一参与者都可以调用 signalingHungUp 挂断。传入当前通话保存的完整 SignalingInfo ,其中的 roomID 必须与当前媒体房间一致。 OpenIMClient.getInstance .signalingManager.signalingHungUp new OnBase @Override public void onSuccess String result releaseCallResources signalingInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showHangUpError code, error ; , signalingInfo ; 成功回调只表示挂断信令请求已完成,不代表本地资源已自动释放。应用应关闭通话界面、停止本地采集、断开媒体房间,并释放摄像头和麦克风。" }, { "path": "/sdk/android/calling/managing-calls/handle-call-events", @@ -3013,7 +3013,7 @@ "description": "集中设置 Android SDK 的通话邀请、参与者和媒体流 listener。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls handle-call-events", - "content": "通话状态层应集中设置一次 OnSignalingListener ,并按 roomID 合并邀请生命周期、参与者连接状态和媒体流变化。 OpenIMClient.getInstance .signalingManager.setSignalingListener new OnSignalingListener @Override public void onReceiveNewInvitation SignalingInfo info upsertCall info, \"ringing\" ; @Override public void onInviteeAccepted SignalingInfo info mergeCallEvent \"accepted\", info ; @Override public void onInviteeRejected SignalingInfo info mergeCallEvent \"rejected\", info ; @Override public void onInvitationCancelled SignalingInfo info mergeCallEvent \"cancelled\", info ; @Override public void onInvitationTimeout SignalingInfo info mergeCallEvent \"timeout\", info ; @Override public void onInviteeAcceptedByOtherDevice SignalingInfo info mergeCallEvent \"accepted by other device\", info ; @Override public void onInviteeRejectedByOtherDevice SignalingInfo info mergeCallEvent \"rejected by other device\", info ; @Override public void onHangup SignalingInfo info finishCall info.getInvitation .getRoomID ; @Override public void onRoomParticipantConnected RoomCallingInfo room mergeConnectedParticipants room.getRoomID , room.getParticipant ; @Override public void onRoomParticipantDisconnected RoomCallingInfo room mergeDisconnectedParticipants room.getRoomID , room.getParticipant ; @Override public void onStreamChange String streamInfo mergeStreamChange streamInfo ; ; 本页是除 onReceiveCustomSignal 外 11 个已接入 Android 适配层的通话回调的完整归属页。自定义信令的处理边界见 发送自定义信令 /sdk/android/calling/sending custom signals/send a custom signal 。 邀请事件使用 SignalingInfo.invitation.roomID 合并。参与者状态使用 RoomCallingInfo.roomID ,并结合参与者的用户 ID 更新;不要按事件顺序、展示名称或数组位置合并。 onStreamChange 当前提供字符串载荷,应由接入层按服务端实际协议解析并校验。 SignalingManager 只设置一个 listener,后一次设置会替换先前实例,并且没有公开移除方法。自定义信令回调必须与本页的其他回调组合在同一个应用级 listener 中。退出登录或切换账号时,应停止向旧账号状态写入,并用新账号的完整 listener 覆盖。" + "content": "在应用的通话状态管理处注册一次 OnSignalingListener 。SDK 通过这些回调通知来电、接听、拒绝、取消、超时、挂断以及成员进出房间;应用据此更新通话界面和本地通话状态。 SignalingManager 同时只保留一个 listener,重复调用 setSignalingListener 会替换之前的 listener。退出登录或切换账号时,先停止更新旧账号的通话状态,再为新账号设置 listener。 OpenIMClient.getInstance .signalingManager.setSignalingListener new OnSignalingListener @Override public void onReceiveNewInvitation SignalingInfo info showIncomingCall info ; @Override public void onInviteeAccepted SignalingInfo info updateCallStatus info, \"accepted\" ; @Override public void onInviteeRejected SignalingInfo info updateCallStatus info, \"rejected\" ; @Override public void onInvitationCancelled SignalingInfo info endCall info ; @Override public void onInvitationTimeout SignalingInfo info endCall info ; @Override public void onInviteeAcceptedByOtherDevice SignalingInfo info endCall info ; @Override public void onInviteeRejectedByOtherDevice SignalingInfo info endCall info ; @Override public void onHangup SignalingInfo info endCall info ; @Override public void onRoomParticipantConnected RoomCallingInfo room updateParticipantStatus room, true ; @Override public void onRoomParticipantDisconnected RoomCallingInfo room updateParticipantStatus room, false ; @Override public void onStreamChange String streamInfo handleStreamChange streamInfo ; ; | 回调 | 何时触发 | 应用应做什么 | | | | | | onReceiveNewInvitation | 收到新的通话邀请。 | 保存 SignalingInfo ,显示来电界面,并让用户选择接听或拒绝。 | | onInviteeAccepted 、 onInviteeRejected | 某位被邀请者接听或拒绝。 | 更新该成员的通话状态;群聊中不应影响其他成员。 | | onInvitationCancelled 、 onInvitationTimeout 、 onHangup | 邀请被取消、超时或任一方挂断。 | 关闭对应通话界面,断开媒体房间并释放本地资源。 | | onInviteeAcceptedByOtherDevice 、 onInviteeRejectedByOtherDevice | 同一账号的另一台设备已接听或拒绝。 | 结束当前设备上的来电界面,避免两台设备同时处理同一邀请。 | | onRoomParticipantConnected 、 onRoomParticipantDisconnected | 成员进入或离开媒体房间。 | 更新群聊中的成员状态。 | | onStreamChange | 服务端发送媒体流变化信息。 | 按接入服务端实际约定解析字符串,再更新媒体流。 |" }, { "path": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", @@ -3021,7 +3021,7 @@ "description": "使用 Android SDK 恢复应用启动时尚未处理的通话邀请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling retrieving-call-information restore-pending-invitation", - "content": "getSignalingInvitationInfoStartApp 不接收业务参数,返回应用启动或恢复时需要处理的邀请快照: OpenIMClient.getInstance .signalingManager.getSignalingInvitationInfoStartApp new OnBase @Override public void onSuccess SignalingInfo info if info = null && info.getInvitation = null && info.getInvitation .getRoomID = null && info.getInvitation .getRoomID .isEmpty restoreIncomingCall info ; @Override public void onError int code, String error clearExpiredIncomingCall ; ; 成功回调只表示取得当前快照,不会替代通话 listener。仅在 invitation 和 roomID 有效时恢复来电界面;随后仍需处理取消、超时、接受和挂断,完整处理见 处理通话事件 /sdk/android/calling/managing calls/handle call events 。" + "content": "getSignalingInvitationInfoStartApp 用于在应用启动或恢复时获取未处理的通话邀请。 OpenIMClient.getInstance .signalingManager.getSignalingInvitationInfoStartApp new OnBase @Override public void onSuccess SignalingInfo info if info = null && info.getInvitation = null && info.getInvitation .getRoomID = null && info.getInvitation .getRoomID .isEmpty restoreIncomingCall info ; @Override public void onError int code, String error clearExpiredIncomingCall ; ; 成功回调返回的是调用时的邀请快照,不会接通通话,仍需自行处理取消、超时、接受通话邀请。" }, { "path": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", @@ -3029,7 +3029,7 @@ "description": "使用 Android SDK 按群组 ID 查询进行中的通话房间。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling retrieving-call-information get-room-by-group-id", - "content": "signalingGetRoomByGroupID 的参数是群组 ID,不是自定义 roomID : OpenIMClient.getInstance .signalingManager.signalingGetRoomByGroupID new OnBase @Override public void onSuccess RoomCallingInfo room if room.getRoomID = null && room.getRoomID .isEmpty renderParticipants room.getParticipant ; @Override public void onError int code, String error showNoActiveGroupCall ; , groupID ; 成功回调返回 RoomCallingInfo 快照,其中包含房间 ID、原始邀请、参与者、群组 ID、Token 和连接地址。参与者资料中的账号资料、群内资料和群资料属于不同数据源,不应相互覆盖。 没有进行中的群通话时,应把错误或空房间视为“当前没有可恢复的通话”,不要继续使用旧凭据。即使业务为群通话使用自定义房间 ID,本方法仍然传入 groupID 。" + "content": "signalingGetRoomByGroupID 的参数是群组 ID,不是 roomID ,即使通话使用了自定义 roomID 。 OpenIMClient.getInstance .signalingManager.signalingGetRoomByGroupID new OnBase @Override public void onSuccess RoomCallingInfo room if room.getRoomID = null && room.getRoomID .isEmpty renderParticipants room.getParticipant ; @Override public void onError int code, String error showNoActiveGroupCall ; , groupID ; 成功回调返回 RoomCallingInfo 快照,其中包含房间 ID、原始邀请、参与者、群组 ID、Token 和连接地址。 如果当前群组没有进行中的通话,接口可能返回错误或空房间。此时应清除本地保存的通话状态和房间凭据,不要继续尝试加入旧房间。" }, { "path": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", @@ -3037,7 +3037,7 @@ "description": "使用 Android SDK 按房间 ID 重新获取入会凭据。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling retrieving-call-information get-token-by-room-id", - "content": "已经知道 roomID 、但需要重新获取入会凭据时,调用 signalingGetTokenByRoomID : OpenIMClient.getInstance .signalingManager.signalingGetTokenByRoomID new OnBase @Override public void onSuccess SignalingCertificate credentials if credentials.getToken = null && credentials.getRoomID = null joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCredentialError code, error ; , roomID ; 成功回调返回 SignalingCertificate ,字段含义见 发起单聊通话 /sdk/android/calling/managing calls/start single call 。只有取得有效的 token 和 roomID 后才能连接媒体引擎。 房间 Token 是短期敏感凭据,只在内存中使用,不要写入日志、URL、分析事件或持久化存储。" + "content": "已经知道 roomID 、但需要重新获取入会凭据时,调用 signalingGetTokenByRoomID : OpenIMClient.getInstance .signalingManager.signalingGetTokenByRoomID new OnBase @Override public void onSuccess SignalingCertificate credentials if credentials.getToken = null && credentials.getRoomID = null joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCredentialError code, error ; , roomID ; 成功回调返回 SignalingCertificate ,可获取接入音视频房间所需的 token 和 liveURL 。 房间 Token 是短期敏感凭据,只在内存中使用,不要写入日志、URL、分析事件或持久化存储。" }, { "path": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", @@ -3045,7 +3045,7 @@ "description": "使用 Android SDK 在通话房间中发送和接收自定义信令。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling sending-custom-signals send-a-custom-signal", - "content": "signalingSendCustomSignal 用于向指定通话房间发送轻量级业务协商数据,例如举手、切换布局提示或业务侧状态同步。它不是聊天消息接口,也不能替代媒体引擎的数据通道。 发送信令 roomID 与 customInfo 都是必填字符串。需要传递结构化数据时,应定义稳定的数据格式并序列化为 JSON。 JSONObject signal = new JSONObject ; signal.put \"version\", 1 ; signal.put \"eventID\", eventID ; signal.put \"type\", \"hand raised\" ; signal.put \"userID\", currentUserID ; signal.put \"sentAt\", System.currentTimeMillis ; OpenIMClient.getInstance .signalingManager.signalingSendCustomSignal new OnBase @Override public void onSuccess String result markSignalSent eventID ; @Override public void onError int code, String error showSignalError code, error ; , roomID, signal.toString ; 成功回调表示本次自定义信令发送请求已经完成,不等于其他参与者已经处理。自定义信令应保持精简,并包含协议版本和业务幂等 ID。大文件、聊天记录、长期状态和敏感凭据不应放入 customInfo 。 接收信令 OnSignalingListener.onReceiveCustomSignal 返回 CustomSignalingInfo 。应用应先校验房间和自有业务协议,再更新界面: @Override public void onReceiveCustomSignal CustomSignalingInfo info if info == null || activeRoomID.equals info.getRoomID return; CallSignal signal = parseAndValidateCallSignal info.getCustomInfo ; String mergeID = info.getRoomID + \":\" + signal.getEventID ; if hasAppliedSignal mergeID return; applyCallSignal signal ; 本页是 onReceiveCustomSignal 的完整处理归属页。 parseAndValidateCallSignal 应检查 JSON 结构、协议版本、 eventID 、 type 和业务字段。按 roomID:eventID 幂等处理,不要依赖事件顺序。 SignalingManager 只设置一个 listener。接收自定义信令的回调应合并到 处理通话事件 /sdk/android/calling/managing calls/handle call events 所示的应用级 listener 中,不能为本页单独设置一个新 listener,否则会覆盖其他通话回调。 客户端自定义信令不能用于授予主持人、付费或隐私权限。需要权威校验的状态应由可信后端保存和判断;连接恢复后,通过房间查询或业务后端校准长期状态。" + "content": "signalingSendCustomSignal 用于在指定通话房间内发送少量与通话相关的业务信息,例如举手、切换布局提示或临时状态同步。它不是聊天消息接口,也不适合发送大量数据或文件。 发送信令 roomID 与 customInfo 都是必填字符串。需要传递结构化数据时,应定义稳定的数据格式并序列化为 JSON。 JSONObject signal = new JSONObject ; signal.put \"version\", 1 ; signal.put \"eventID\", eventID ; signal.put \"type\", \"hand raised\" ; signal.put \"userID\", currentUserID ; signal.put \"sentAt\", System.currentTimeMillis ; OpenIMClient.getInstance .signalingManager.signalingSendCustomSignal new OnBase @Override public void onSuccess String result markSignalSent eventID ; @Override public void onError int code, String error showSignalError code, error ; , roomID, signal.toString ; 成功回调只表示发送请求已完成,不表示其他参与者已收到或处理该信令。建议在 customInfo 中包含协议版本和唯一的 eventID ,以便接收方识别重复消息。不要放入大文件、聊天记录、长期状态或敏感凭据。 接收信令 收到自定义信令时, OnSignalingListener.onReceiveCustomSignal 会返回 CustomSignalingInfo 。先确认它属于当前房间并校验数据格式,再更新界面: @Override public void onReceiveCustomSignal CustomSignalingInfo info if info == null || activeRoomID.equals info.getRoomID return; CallSignal signal = parseAndValidateCallSignal info.getCustomInfo ; String mergeID = info.getRoomID + \":\" + signal.getEventID ; if hasAppliedSignal mergeID return; applyCallSignal signal ; 如果业务需要避免重复处理,可以在自定义信令中携带唯一事件 ID,并在接收端记录已处理的事件。消息可能不会按发送顺序到达,因此不要依赖到达顺序决定业务状态。 将 onReceiveCustomSignal 与其他通话回调一起注册到 处理通话事件 /sdk/android/calling/managing calls/handle call events 中的 listener。 SignalingManager 只保留一个 listener;重新设置会覆盖已有的其他通话回调。 客户端自定义信令不能用于授予主持人、付费或隐私权限。这类需要可信校验的状态应由服务端保存和判断;在连接断连恢复时,应该从房间查询或业务后端恢复长期状态。" }, { "path": "/sdk/android/events/overview-events", @@ -3053,7 +3053,7 @@ "description": "集中设置 Android SDK listener,并按业务领域分发连接、同步和数据事件。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android events overview-events", - "content": "OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。 连接 listener 是例外: OnConnListener 在 initSDK 时传入,其完整处理见 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。 集中设置 listener 下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。 public final class OpenIMEventCenter private final OpenIMClient client = OpenIMClient.getInstance ; private final OnUserListener userListener = buildUserListener ; private final OnFriendshipListener friendshipListener = buildFriendshipListener ; private final OnConversationListener conversationListener = buildConversationListener ; private final OnGroupListener groupListener = buildGroupListener ; private final OnAdvanceMsgListener messageListener = buildMessageListener ; private final OnCustomBusinessListener businessListener = buildBusinessListener ; private final OnSignalingListener signalingListener = buildSignalingListener ; public void registerBeforeLogin client.userInfoManager.setOnUserListener userListener ; client.friendshipManager.setOnFriendshipListener friendshipListener ; client.conversationManager.setOnConversationListener conversationListener ; client.groupManager.setOnGroupListener groupListener ; client.messageManager.setAdvancedMsgListener messageListener ; client.messageManager.setCustomBusinessListener businessListener ; client.signalingManager.setSignalingListener signalingListener ; Android SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。 事件归属 | 事件范围 | Listener | 对应页面 | | | | | | 连接、Token 和强制下线 | OnConnListener | 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session | | 当前用户资料 | OnUserListener | 更新当前用户资料 /sdk/android/user/user profile/set self info | | 在线状态 | OnUserListener | 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status | | 好友关系与资料 | OnFriendshipListener | 分页获取好友列表 /sdk/android/user/friends/get friend list page | | 好友申请 | OnFriendshipListener | 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list | | 黑名单 | OnFriendshipListener | 拉黑用户 /sdk/android/user/blacklist/add blacklist 、 移出黑名单 /sdk/android/user/blacklist/remove blacklist | | 会话列表 | OnConversationListener | 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list | | 总未读数 | OnConversationListener | 获取消息总未读数 /sdk/android/conversation/managing conversations/get total unread count | | 输入状态 | OnConversationListener | 上报输入状态 /sdk/android/message/composing messages/update typing status | | 群资料、成员和群申请 | OnGroupListener | 群组概览 /sdk/android/group/overview group | | 新消息、离线消息和在线消息 | OnAdvanceMsgListener | 接收消息 /sdk/android/message/receiving messages/receive messages | | 消息撤回 | OnAdvanceMsgListener | 撤回消息 /sdk/android/message/managing messages/revoke a message | | 消息删除 | OnAdvanceMsgListener | 批量删除消息 /sdk/android/message/managing messages/delete saved messages | | 消息修改 | OnAdvanceMsgListener | 修改消息 /sdk/android/message/managing messages/modify a message | | 置顶消息 | OnAdvanceMsgListener | 置顶或取消置顶消息 /sdk/android/message/managing messages/set message pinned | | 单聊已读回执 | OnAdvanceMsgListener | 标记会话已读 /sdk/android/conversation/managing conversations/mark conversation read | | 自定义业务消息 | OnCustomBusinessListener | 接收自定义业务消息 /sdk/android/message/receiving messages/receive custom business messages | | 通话 | OnSignalingListener | 处理通话事件 /sdk/android/calling/managing calls/handle call events | | 通话自定义信令 | OnSignalingListener | 发送自定义信令 /sdk/android/calling/sending custom signals/send a custom signal | | SDK 数据同步 | OnConversationListener | 监听初始化同步 监听初始化同步 | 查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。 监听初始化同步 同步生命周期属于应用级 OnConversationListener 。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑: private OnConversationListener buildConversationListener return new OnConversationListener @Override public void onNewConversation List conversations mergeNewConversations conversations ; @Override public void onConversationChanged List conversations mergeChangedConversations conversations ; @Override public void onTotalUnreadMessageCountChanged int total updateTotalUnreadCount total ; @Override public void onConversationUserInputStatusChanged String payload handleInputStatus payload ; @Override public void onSyncServerStart boolean reinstall setSyncState \"syncing\", 0, reinstall ; @Override public void onSyncServerProgress long progress setSyncProgress progress ; @Override public void onSyncServerFinish boolean reinstall setSyncState \"ready\", 100, reinstall ; reloadVisibleSnapshots ; @Override public void onSyncServerFailed boolean reinstall setSyncState \"failed\", 0, reinstall ; ; reinstall 为 true 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。 onSyncServerProgress 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。 本页是 onSyncServerStart 、 onSyncServerProgress 、 onSyncServerFinish 和 onSyncServerFailed 的完整处理归属页。同步状态没有业务实体合并键,应按当前 OpenIMClient 单例和登录用户隔离。" + "content": "OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。每个 manager 同时只保留一个 listener;再次设置会覆盖之前设置的 listener。因此应在应用中统一管理这些 listener,并在登录前设置一次,不要在 Activity、Fragment、Compose 页面或各功能组件中重复设置。 IM Server 连接状态由 OnConnListener 监听。它不通过 manager 单独设置,而是在调用 initSDK 时传入;完整处理方式见 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。 集中设置 listener 以下示例在应用的统一位置注册各类 listener。每个 listener 只处理其所属业务的事件,例如消息、会话、好友和通话。 public final class OpenIMEventCenter private final OpenIMClient client = OpenIMClient.getInstance ; private final OnUserListener userListener = new OnUserListener // 处理用户资料和在线状态变化 ; private final OnFriendshipListener friendshipListener = new OnFriendshipListener // 处理好友关系、好友申请和黑名单变化 ; private final OnConversationListener conversationListener = new OnConversationListener // 处理会话、未读数、输入状态和初始化同步 ; private final OnGroupListener groupListener = new OnGroupListener // 处理群组、群成员和群申请变化 ; private final OnAdvanceMsgListener messageListener = new OnAdvanceMsgListener // 处理新消息、撤回、删除、修改和已读回执 ; private final OnCustomBusinessListener businessListener = new OnCustomBusinessListener // 处理自定义业务消息 ; private final OnSignalingListener signalingListener = new OnSignalingListener // 处理通话邀请、成员状态和自定义通话信令 ; public void registerBeforeLogin client.userInfoManager.setOnUserListener userListener ; client.friendshipManager.setOnFriendshipListener friendshipListener ; client.conversationManager.setOnConversationListener conversationListener ; client.groupManager.setOnGroupListener groupListener ; client.messageManager.setAdvancedMsgListener messageListener ; client.messageManager.setCustomBusinessListener businessListener ; client.signalingManager.setSignalingListener signalingListener ; Android SDK 不提供移除 listener 的方法。退出登录、切换账号或页面销毁时,应停止用回调更新旧账号数据和已销毁界面,并清理应用自身持有的引用。下次登录前,重新设置新账号使用的各类 listener。 事件归属 | 事件范围 | Listener | 对应页面 | | | | | | 连接、Token 和强制下线 | OnConnListener | 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session | | 当前用户资料 | OnUserListener | 更新当前用户资料 /sdk/android/user/user profile/set self info | | 在线状态 | OnUserListener | 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status | | 好友关系与资料 | OnFriendshipListener | 分页获取好友列表 /sdk/android/user/friends/get friend list page | | 好友申请 | OnFriendshipListener | 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list | | 黑名单 | OnFriendshipListener | 拉黑用户 /sdk/android/user/blacklist/add blacklist 、 移出黑名单 /sdk/android/user/blacklist/remove blacklist | | 会话列表 | OnConversationListener | 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list | | 总未读数 | OnConversationListener | 获取消息总未读数 /sdk/android/conversation/managing conversations/get total unread count | | 输入状态 | OnConversationListener | 上报输入状态 /sdk/android/message/composing messages/update typing status | | 群资料、成员和群申请 | OnGroupListener | 群组概览 /sdk/android/group/overview group | | 新消息、离线消息和在线消息 | OnAdvanceMsgListener | 接收消息 /sdk/android/message/receiving messages/receive messages | | 消息撤回 | OnAdvanceMsgListener | 撤回消息 /sdk/android/message/managing messages/revoke a message | | 消息删除 | OnAdvanceMsgListener | 批量删除消息 /sdk/android/message/managing messages/delete saved messages | | 消息修改 | OnAdvanceMsgListener | 修改消息 /sdk/android/message/managing messages/modify a message | | 置顶消息 | OnAdvanceMsgListener | 置顶或取消置顶消息 /sdk/android/message/managing messages/set message pinned | | 单聊已读回执 | OnAdvanceMsgListener | 标记会话已读 /sdk/android/conversation/managing conversations/mark conversation read | | 自定义业务消息 | OnCustomBusinessListener | 接收自定义业务消息 /sdk/android/message/receiving messages/receive custom business messages | | 通话 | OnSignalingListener | 处理通话事件 /sdk/android/calling/managing calls/handle call events | | 通话自定义信令 | OnSignalingListener | 发送自定义信令 /sdk/android/calling/sending custom signals/send a custom signal | | SDK 数据同步 | OnConversationListener | 监听初始化同步 监听初始化同步 | 监听初始化同步 同步生命周期属于 OnConversationListener ,该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示初始化同步相关的回调: private final OnConversationListener conversationListener = new OnConversationListener @Override public void onSyncServerStart boolean reinstall // 开始同步:更新同步状态并按需显示加载界面 @Override public void onSyncServerProgress long progress // 同步中:更新同步进度 @Override public void onSyncServerFinish boolean reinstall // 同步完成:刷新依赖完整数据的页面 @Override public void onSyncServerFailed boolean reinstall // 同步失败:更新同步失败状态并等待重试或连接恢复 // conversationListener 的其他回调函数... ; reinstall 表示本次是否为本地数据重建后的同步: true 表示应用重装、清除本地数据等场景后的同步,本地通常没有可用缓存; false 表示普通登录后的同步。 onSyncServerProgress 提供当前同步进度;同步完成后重新查询当前界面需要的数据,失败时更新同步失败状态并等待重试或连接恢复。" }, { "path": "/sdk/android/logger", @@ -3061,7 +3061,7 @@ "description": "配置 Android SDK 日志、写入应用诊断信息并上传日志。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android logger", - "content": "OpenIM Android SDK 日志用于定位初始化、连接和业务 API 调用问题。开发和预发布环境可以输出较详细的信息;生产环境应减少日志量,并避免记录 Token、完整消息正文、原始文件 URL、通话房间凭据和用户隐私字段。 初始化日志配置 日志选项属于 InitConfig ,必须在 initSDK 前设置: File dataDirectory = new File application.getFilesDir , \"openim\" ; File logDirectory = new File application.getFilesDir , \"openim logs\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn; config.isLogStandardOutput = BuildConfig.DEBUG; config.logFilePath = logDirectory.getAbsolutePath ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; | 字段 | 说明 | | | | | logLevel | 使用 LogLevel 常量控制详细程度。可选值包括 DebugWithSQL 、 Debug 、 Info 、 Warn 、 Error 、 Panic 和 Fatal 。 | | isLogStandardOutput | 是否把 SDK 日志输出到 Android 标准日志;开发诊断时开启。 | | logFilePath | 可选日志目录,应位于应用可写范围并纳入容量与保留期管理。 | 开发诊断可以使用 Debug ;只有排查数据库问题时才临时启用 DebugWithSQL 。生产环境通常使用 Warn 或 Error ,并关闭不必要的标准输出。 写入应用诊断日志 需要把业务上下文写入 SDK 日志时,使用未废弃的 logs 重载: OpenIMClient.getInstance .logs LogLevel.Error, ChatRepository.class.getSimpleName , 184, \"send message failed\", errorMessage, \"conversationID\", conversationID, \"clientMsgID\", clientMsgID ; currentClassName 和 currentLineNum 用于定位调用位置, msgStr 是简短动作描述, errStr 是错误信息。 Warn 、 Error 、 Panic 和 Fatal 级别必须提供非空错误信息。末尾的 extra 按“键、值”成对传入;只记录排查所需的非敏感标识。 旧的带 OnBase 、 Map 参数的 logs 重载已经废弃,不应在新代码中使用。 上传诊断日志 只在用户明确同意提交诊断信息后调用 uploadLogs 。Android API 保留了 params 参数;没有额外参数时传空列表。 line 表示本次上传读取的日志行数配置。 String uploadID = UUID.randomUUID .toString ; OpenIMClient.getInstance .uploadLogs new OnBase @Override public void onSuccess String data showLogUploadCompleted ; @Override public void onError int code, String error showLogUploadError code, error ; , Collections.emptyList , 2000, uploadID, \"support ticket 42\", new UploadLogProgress @Override public void onProgress long current, long total updateLogUploadProgress current, total ; ; | 参数 | 说明 | | | | | line | 本次上传读取的日志行数配置。 | | cancelID | 本次上传的稳定标识,可使用业务生成的 UUID。 | | ex | 附加到上传任务的诊断说明,例如工单 ID;不能包含凭据或隐私数据。 | | UploadLogProgress | 提供当前进度和总量,用于更新上传界面。 | 成功 callback 表示本次日志上传请求完成,不会修改用户、会话或消息状态,也不会触发业务领域事件。上传失败时记录错误码、当前用户和业务诊断 ID,不要再次输出完整日志内容。 operationID 与业务追踪 Android Java wrapper 的公共业务方法不接收 operationID 。每次调用时,wrapper 会通过 ParamsUtil.buildOperationID 自动生成并传给 Core,因此应用通常不需要创建或传递该值。 应用日志应另外维护自己的 trace ID,并记录业务动作、错误码以及必要的 conversationID 、 clientMsgID 、 groupID 或 roomID 。应用 trace ID 用于串联多步骤业务流程;SDK 的 operationID 用于单次 SDK 调用链路,两者都不是身份凭据或业务幂等键。 相关页面 按 Android 环境接入 /sdk/android/getting started/environment specific implementation 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 发送消息 /sdk/android/message/sending messages/send message" + "content": "OpenIM Android SDK 日志用于定位初始化、连接和业务 API 调用问题。开发和预发布环境可以输出较详细的信息;生产环境应减少日志量,并避免记录 Token、完整消息正文、原始文件 URL、通话房间凭据和用户隐私字段。 初始化日志配置 在调用 initSDK 时配置日志: File dataDirectory = new File application.getFilesDir , \"openim\" ; File logDirectory = new File application.getFilesDir , \"openim logs\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn; config.isLogStandardOutput = BuildConfig.DEBUG; config.logFilePath = logDirectory.getAbsolutePath ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; | 字段 | 说明 | | | | | logLevel | 使用 LogLevel 常量控制详细程度。可选值包括 DebugWithSQL 、 Debug 、 Info 、 Warn 、 Error 、 Panic 和 Fatal 。 | | isLogStandardOutput | 是否把 SDK 日志输出到 Android 标准日志;开发诊断时开启。 | | logFilePath | 可选日志目录,应位于应用可写范围并纳入容量与保留期管理。 | 开发诊断可以使用 Debug ;只有排查数据库问题时才临时启用 DebugWithSQL 。生产环境通常使用 Warn 或 Error ,并关闭不必要的标准输出。 写入应用日志 需要把业务日志写入 SDK 日志时,使用 logs : OpenIMClient.getInstance .logs LogLevel.Error, ChatRepository.class.getSimpleName , 184, \"send message failed\", errorMessage, \"conversationID\", conversationID, \"clientMsgID\", clientMsgID ; currentClassName 和 currentLineNum 用于定位调用位置, msgStr 是简短动作描述, errStr 是错误信息。 Warn 、 Error 、 Panic 和 Fatal 级别必须提供非空错误信息。末尾的 extra 按“键、值”成对传入;只记录排查所需的非敏感标识。 旧版带 OnBase 、 Map 参数的 logs 重载已经废弃,不应在新代码中使用。 上传日志 uploadLogs 可将客户端日志上传至服务器,主要使用场景是用户主动提交诊断日志。 String cancelID = UUID.randomUUID .toString ; OpenIMClient.getInstance .uploadLogs new OnBase @Override public void onSuccess String data showLogUploadCompleted ; @Override public void onError int code, String error showLogUploadError code, error ; , new ArrayList< , 2000, // line cancelID, \"support ticket 42\", // ex new UploadLogProgress @Override public void onProgress long current, long total updateLogUploadProgress current, total ; ; | 参数 | 说明 | | | | | params | 历史遗留参数,当前 SDK 不使用;传入空列表,例如 new ArrayList< 。 | | line | 本次上传读取的日志行数配置。 | | cancelID | 本次上传的稳定标识,可使用业务生成的 UUID。 | | ex | 附加到上传任务的诊断说明,例如工单 ID;不能包含凭据或隐私数据。 | | UploadLogProgress | 提供当前进度和总量,用于更新上传界面。 | 成功 callback 表示本次日志上传请求完成。 使用 operationID 定位一次 SDK 调用 OpenIM Android SDK 的公共业务方法不接收 operationID 参数。每次调用 SDK 时,会自动生成 operationID 。 operationID 只对应一次 SDK 调用,不是用户身份、权限凭据、业务幂等键或业务 ID。 排查问题时,在客户端 SDK 日志中找到报错或异常调用附近的 operationID ,可用它定位这一次 SDK 调用的相关日志。向技术支持提供日志时,同时提供发生时间、用户 ID、操作名称,以及必要的 conversationID 、 clientMsgID 、 groupID 或 roomID ,有助于更快找到对应记录。 相关页面 按 Android 环境接入 /sdk/android/getting started/environment specific implementation 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 发送消息 /sdk/android/message/sending messages/send message" }, { "path": "/sdk/flutter/overview", diff --git a/src/generated/search-index.json b/src/generated/search-index.json index f72a177757..d9dec7a763 100644 --- a/src/generated/search-index.json +++ b/src/generated/search-index.json @@ -2733,7 +2733,7 @@ "description": "Use sendMessage to send a Message to a one-to-one or group conversation.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message sending-messages send-message", - "content": "For a one to one message, set recvUid and pass null for the group target. For a group message, set recvGid and pass null for the user target. OnMsgSendCallback reports success, failure, and media upload progress. messageManager.sendMessage new OnMsgSendCallback @Override public void onSuccess String id mergeSentMessage message ; @Override public void onError int code, String error showSendError error ; , message, peerUserID, null, offlinePushInfo ;" + "content": "For a one to one message, set recvUid and pass null for the group target. For a group message, set recvGid and pass null for the user target. OnMsgSendCallback reports success, failure, and media upload progress. messageManager.sendMessage new OnMsgSendCallback @Override public void onSuccess Message sentMessage mergeSentMessage sentMessage ; @Override public void onError int code, String error showSendError error ; , message, peerUserID, null, offlinePushInfo ;" }, { "path": "/sdk/android/message/sending-messages/send-message-not-oss", @@ -2749,7 +2749,7 @@ "description": "Use the progress callback on OnMsgSendCallback to update media sending progress.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message sending-messages set-msg-send-progress-listener", - "content": "Android does not provide a separate global send progress listener. Each call to sendMessage or sendMessageNotOss reports progress through its own OnMsgSendCallback . messageManager.sendMessage new OnMsgSendCallback @Override public void onProgress long progress updateProgress progress ; @Override public void onSuccess String id finishProgress ; @Override public void onError int code, String error failProgress error ; , message, peerUserID, null, offlinePushInfo ;" + "content": "Android does not provide a separate global send progress listener. Each call to sendMessage or sendMessageNotOss reports progress through its own OnMsgSendCallback . messageManager.sendMessage new OnMsgSendCallback @Override public void onProgress long progress updateProgress progress ; @Override public void onSuccess Message sentMessage finishProgress ; @Override public void onError int code, String error failProgress error ; , message, peerUserID, null, offlinePushInfo ;" }, { "path": "/sdk/android/message/receiving-messages/receive-messages", @@ -2773,7 +2773,7 @@ "description": "Use getAdvancedHistoryMessageList to load conversation history by page.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message retrieving-messages load-older-messages", - "content": "Pass null for startMsg on the first query. For each subsequent page, use the boundary message from the previous page as the starting point. Deduplicate returned messages by clientMsgID . messageManager.getAdvancedHistoryMessageList callback, conversationID, startMessage, 20, ViewType.NORMAL ;" + "content": "Pass null for startMsg on the first query. For each subsequent page, use the boundary message from the previous page as the starting point. Use ViewType.History for ordinary history loading and deduplicate returned messages by clientMsgID . messageManager.getAdvancedHistoryMessageList callback, conversationID, startMessage, 20, ViewType.History ;" }, { "path": "/sdk/android/message/retrieving-messages/load-newer-messages", @@ -2781,7 +2781,7 @@ "description": "Use getAdvancedHistoryMessageListReverse to load messages after a starting point.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message retrieving-messages load-newer-messages", - "content": "Use this method to read forward from a located message, such as when opening a search result or loading the following page of context. messageManager.getAdvancedHistoryMessageListReverse callback, conversationID, startMessage, 20, ViewType.NORMAL ;" + "content": "Use this method to read forward from a message anchor when loading the following page of history. Use ViewType.History for this directional history paging. messageManager.getAdvancedHistoryMessageListReverse callback, conversationID, startMessage, 20, ViewType.History ;" }, { "path": "/sdk/android/message/retrieving-messages/find-messages-by-id", @@ -2965,7 +2965,7 @@ "description": "Start a one-to-one audio or video call with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls start-single-call", - "content": "signalingInvite starts a one to one call. The Android SDK handles call signaling; your application must connect a real time audio/video engine with the returned room credentials. Parameters | Field | Type | Required | Description | | | | | | | userID | String | Yes | The current signed in user performing the invite operation. | | inviterUserID | String | Yes | The inviter, normally the current signed in user. | | inviteeUserIDList | List | Yes | The invitees; for a one to one call, include only the other user. | | groupID | String | Yes | Use an empty string for a one to one call. | | roomID | String | Yes | The call's unique room identifier and the primary key for subsequent state. | | timeout | long | Yes | Invitation timeout in seconds. | | mediaType | String | Yes | The application defined media type, typically audio or video . | | sessionType | int | Yes | Use ConversationType.SINGLE CHAT . | | platformID | int | Yes | Use Platform.ANDROID for an Android phone client. | | customData | String | No | Application extra data carried with the invitation. | | offlinePushInfo | OfflinePushInfo | No | Push content used when the invitee is offline. | SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList Collections.singletonList peerUserID ; invitation.setGroupID \"\" ; invitation.setRoomID roomID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.SINGLE CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"contact card\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setUserID currentUserID ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInvite new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCallError code, error ; , info ; The success callback returns SignalingCertificate . roomID identifies the media room, token is a short lived join credential, liveURL is the media service address, and busyLineUserIDList contains busy users. Connect the media engine only after receiving a valid token and roomID . API success does not mean the invitee accepted; merge subsequent state through Handle call events /sdk/android/calling/managing calls/handle call events ." + "content": "signalingInvite starts a one to one call. The Android SDK handles call signaling; your application must connect a real time audio/video engine with the returned room credentials. Parameters Call signature: signalingInvite OnBase callback, SignalingInfo info All fields below belong to info ; dot notation represents nested objects. Only parameters shared by the Android and WASM SDKs are listed. | Parameter | Type | Required | Description | | | | | | | invitation | SignalingInvitationInfo | Yes | The call invitation. | | invitation.inviterUserID | String | Yes | The inviter; pass the current signed in user ID. | | invitation.inviteeUserIDList | List | Yes | The invitees; for a one to one call, include only the other user. | | invitation.groupID | String | Yes | Group ID. Pass an empty string for a one to one call. | | invitation.roomID | String | Yes | The call's unique room identifier and the primary key for subsequent state. | | invitation.timeout | long | Yes | Invitation timeout in seconds. | | invitation.mediaType | String | Yes | The application defined media type, typically audio or video . | | invitation.sessionType | int | Yes | Use ConversationType.SINGLE CHAT for one to one calls and ConversationType.SUPER GROUP CHAT for group calls. | | invitation.platformID | int | Yes | The current client platform; pass Platform.ANDROID . | | invitation.customData | String | No | Application extra data carried with the invitation. | | invitation.initiateTime | long | No | The invitation start time. It is normally maintained by the signaling flow and does not need to be set manually. | | offlinePushInfo | OfflinePushInfo | No | Push content used when the invitee is offline. | | offlinePushInfo.title | String | Conditionally required | Push title; required when offlinePushInfo is provided. | | offlinePushInfo.desc | String | Conditionally required | Push body; required when offlinePushInfo is provided. | | offlinePushInfo.ex | String | Conditionally required | Push extension string; pass an empty string when there is no content. | | offlinePushInfo.iOSPushSound | String | Conditionally required | iOS push sound; required when offlinePushInfo is provided. | | offlinePushInfo.iOSBadgeCount | boolean | Conditionally required | Whether to update the iOS badge; required when offlinePushInfo is provided. | SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList Collections.singletonList peerUserID ; invitation.setGroupID \"\" ; invitation.setRoomID roomID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.SINGLE CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"contact card\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInvite new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCallError code, error ; , info ; The success callback returns SignalingCertificate . roomID identifies the media room, token is a short lived join credential, liveURL is the media service address, and busyLineUserIDList contains busy users. Connect the media engine only after receiving a valid token and roomID . API success does not mean the invitee accepted; merge subsequent state through Handle call events /sdk/android/calling/managing calls/handle call events ." }, { "path": "/sdk/android/calling/managing-calls/start-group-call", @@ -2973,7 +2973,7 @@ "description": "Start a group audio or video call with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls start-group-call", - "content": "signalingInviteInGroup starts a group call. It invites only the members explicitly listed in inviteeUserIDList ; setting groupID does not automatically invite every group member. SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList selectedGroupMemberIDs ; invitation.setGroupID groupID ; invitation.setRoomID groupID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.GROUP CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"group call\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setUserID currentUserID ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInviteInGroup new OnBase @Override public void onSuccess SignalingCertificate credentials startGroupCall credentials ; @Override public void onError int code, String error showCallError code, error ; , info ; groupID must not be empty. Remove the current user, empty IDs, and duplicates from inviteeUserIDList . The example reuses the group ID as the room ID. If your application generates another roomID , every participant must use the same value. The success callback returns SignalingCertificate ; see Start a one to one call /sdk/android/calling/managing calls/start single call for its fields. busyLineUserIDList only identifies some unavailable members and should not stop invitations to the others. Success does not mean that any member has accepted." + "content": "signalingInviteInGroup starts a group call and uses the same parameter types as Start a one to one call /sdk/android/calling/managing calls/start single call . For group calls, invitation.groupID must contain the group ID and invitation.sessionType is always ConversationType.GROUP CHAT . Only members in inviteeUserIDList are invited; setting groupID does not invite every group member automatically. Exclude the current user, empty IDs, and duplicates from the list. This example uses the group ID as the room ID; if you generate a separate roomID , every participant must use the same value. SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList selectedGroupMemberIDs ; invitation.setGroupID groupID ; invitation.setRoomID groupID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.GROUP CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"group call\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInviteInGroup new OnBase @Override public void onSuccess SignalingCertificate credentials startGroupCall credentials ; @Override public void onError int code, String error showCallError code, error ; , info ; The success callback returns SignalingCertificate . roomID is the media room ID, token is the short lived credential for joining it, liveURL is the media service address, and busyLineUserIDList lists busy users. Busy users do not prevent invitations to the remaining members, and a successful callback does not mean that any member has accepted. Connect to the media room only after obtaining a valid token and roomID . A successful API call does not mean the invitees have accepted; merge subsequent state through Handle call events /sdk/android/calling/managing calls/handle call events ." }, { "path": "/sdk/android/calling/managing-calls/accept-call", @@ -2981,7 +2981,7 @@ "description": "Accept a call invitation with the Android SDK and retrieve room credentials.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls accept-call", - "content": "After receiving the original SignalingInfo from onReceiveNewInvitation , pass it to signalingAccept : OpenIMClient.getInstance .signalingManager.signalingAccept new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showAcceptError code, error ; , receivedInfo ; Preserve the original roomID , inviter, invitees, and session type in receivedInfo . Do not rebuild it as an object that contains only roomID . The success callback returns SignalingCertificate . Connect the media room only after receiving a valid token and roomID , then keep merging remote state through Handle call events /sdk/android/calling/managing calls/handle call events ." + "content": "After receiving the original SignalingInfo from onReceiveNewInvitation , pass it to signalingAccept : OpenIMClient.getInstance .signalingManager.signalingAccept new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showAcceptError code, error ; , receivedInfo ; Preserve the original roomID , inviter, invitees, and session type in receivedInfo . Do not rebuild it as an object that contains only roomID . The success callback returns SignalingCertificate . Connect to the media room only after obtaining a valid token and roomID . A successful API call only confirms that the accept request was submitted to the server; it does not mean the call is established. Continue listening for call events /sdk/android/calling/managing calls/handle call events and update the call UI and state based on events from the inviter, other devices, or room participants." }, { "path": "/sdk/android/calling/managing-calls/reject-call", @@ -2989,7 +2989,7 @@ "description": "Reject a call invitation with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls reject-call", - "content": "When the user declines an incoming call, pass the original SignalingInfo to signalingReject : OpenIMClient.getInstance .signalingManager.signalingReject new OnBase @Override public void onSuccess String result closeIncomingCallUI ; @Override public void onError int code, String error showRejectError code, error ; , receivedInfo ; The success callback only means that the reject signaling request completed. The inviter later updates its interface through onInviteeRejected ; see Handle call events /sdk/android/calling/managing calls/handle call events ." + "content": "When the user declines an incoming call, pass the original SignalingInfo to signalingReject : OpenIMClient.getInstance .signalingManager.signalingReject new OnBase @Override public void onSuccess String result closeIncomingCallUI ; @Override public void onError int code, String error showRejectError code, error ; , signalingInfo ; The success callback only means that the reject signaling request completed. The inviter later updates its interface through onInviteeRejected ; see Handle call events /sdk/android/calling/managing calls/handle call events ." }, { "path": "/sdk/android/calling/managing-calls/cancel-call", @@ -2997,7 +2997,7 @@ "description": "Cancel a call invitation before it is accepted with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls cancel-call", - "content": "Before an invitation is accepted, the inviter can call signalingCancel : OpenIMClient.getInstance .signalingManager.signalingCancel new OnBase @Override public void onSuccess String result stopWaitingForAnswer activeInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showCancelError code, error ; , activeInfo ; Pass the complete SignalingInfo saved when the call was started, not a new object containing only roomID . A successful callback means that the cancel request completed. End the local waiting state and release unused media resources; remote clients update through onInvitationCancelled ." + "content": "Before an invitation is accepted, the inviter can call signalingCancel : OpenIMClient.getInstance .signalingManager.signalingCancel new OnBase @Override public void onSuccess String result stopWaitingForAnswer activeInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showCancelError code, error ; , activeInfo ; Pass the complete SignalingInfo saved when the call was started, not a new object containing only roomID . A successful callback means that the cancel signaling request completed; the application should also end the local pending answer state and release unused media resources. Remote clients update through onInvitationCancelled ." }, { "path": "/sdk/android/calling/managing-calls/hang-up-call", @@ -3005,7 +3005,7 @@ "description": "Hang up an established call with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls hang-up-call", - "content": "After a call is established, a participant can call signalingHungUp . The supplied SignalingInfo should preserve the complete invitation, and its roomID must match the active media room. OpenIMClient.getInstance .signalingManager.signalingHungUp new OnBase @Override public void onSuccess String result releaseCallResources activeInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showHangUpError code, error ; , activeInfo ; The success callback only means that the hang up request completed. Stop local capture, disconnect the media room, and release the camera and microphone. Cancellation, rejection, timeout, and hang up should all enter one idempotent cleanup flow keyed by roomID ." + "content": "After a call is established, any participant can call signalingHungUp to hang up. Pass the complete SignalingInfo saved for the active call; its roomID must match the active media room. OpenIMClient.getInstance .signalingManager.signalingHungUp new OnBase @Override public void onSuccess String result releaseCallResources signalingInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showHangUpError code, error ; , signalingInfo ; The success callback only confirms that the hang up signaling request completed; it does not release local resources automatically. Close the call UI, stop local capture, disconnect from the media room, and release the camera and microphone." }, { "path": "/sdk/android/calling/managing-calls/handle-call-events", @@ -3013,7 +3013,7 @@ "description": "Register Android SDK invitation, participant, and media-stream callbacks in one call listener.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls handle-call-events", - "content": "Register OnSignalingListener once in the call state layer. Merge invitation lifecycle, participant connection, and media stream changes by roomID . OpenIMClient.getInstance .signalingManager.setSignalingListener new OnSignalingListener @Override public void onReceiveNewInvitation SignalingInfo info upsertCall info, \"ringing\" ; @Override public void onInviteeAccepted SignalingInfo info mergeCallEvent \"accepted\", info ; @Override public void onInviteeRejected SignalingInfo info mergeCallEvent \"rejected\", info ; @Override public void onInvitationCancelled SignalingInfo info mergeCallEvent \"cancelled\", info ; @Override public void onInvitationTimeout SignalingInfo info mergeCallEvent \"timeout\", info ; @Override public void onInviteeAcceptedByOtherDevice SignalingInfo info mergeCallEvent \"accepted by other device\", info ; @Override public void onInviteeRejectedByOtherDevice SignalingInfo info mergeCallEvent \"rejected by other device\", info ; @Override public void onHangup SignalingInfo info finishCall info.getInvitation .getRoomID ; @Override public void onRoomParticipantConnected RoomCallingInfo room mergeConnectedParticipants room.getRoomID , room.getParticipant ; @Override public void onRoomParticipantDisconnected RoomCallingInfo room mergeDisconnectedParticipants room.getRoomID , room.getParticipant ; @Override public void onStreamChange String streamInfo mergeStreamChange streamInfo ; ; This page owns the complete handling contract for the 11 call callbacks exposed by the Android adapter other than onReceiveCustomSignal . Custom signaling belongs to Send a custom signal /sdk/android/calling/sending custom signals/send a custom signal . Merge invitation events with SignalingInfo.invitation.roomID . Merge participant state with RoomCallingInfo.roomID plus the participant user ID. Do not merge by event order, display name, or array position. onStreamChange currently carries a string payload; parse and validate it according to the actual server protocol used by your deployment. SignalingManager retains one listener. Setting another replaces the previous instance, and there is no public remove method. Combine custom signaling with these callbacks in the same application level listener. When signing out or switching accounts, stop writing into old account state and replace the listener with the complete listener for the new account." + "content": "Register OnSignalingListener once in your application's call state manager. The SDK uses these callbacks to notify your app about incoming invitations, acceptances, rejections, cancellations, timeouts, hang ups, and participants joining or leaving a room. Use them to update the call UI and local call state. SignalingManager retains only one listener: calling setSignalingListener again replaces the previous listener. When signing out or switching accounts, first stop updating the old account's call state, then set the listener for the new account. OpenIMClient.getInstance .signalingManager.setSignalingListener new OnSignalingListener @Override public void onReceiveNewInvitation SignalingInfo info showIncomingCall info ; @Override public void onInviteeAccepted SignalingInfo info updateCallStatus info, \"accepted\" ; @Override public void onInviteeRejected SignalingInfo info updateCallStatus info, \"rejected\" ; @Override public void onInvitationCancelled SignalingInfo info endCall info ; @Override public void onInvitationTimeout SignalingInfo info endCall info ; @Override public void onInviteeAcceptedByOtherDevice SignalingInfo info endCall info ; @Override public void onInviteeRejectedByOtherDevice SignalingInfo info endCall info ; @Override public void onHangup SignalingInfo info endCall info ; @Override public void onRoomParticipantConnected RoomCallingInfo room updateParticipantStatus room, true ; @Override public void onRoomParticipantDisconnected RoomCallingInfo room updateParticipantStatus room, false ; @Override public void onStreamChange String streamInfo handleStreamChange streamInfo ; ; | Callback | When it is called | What your app should do | | | | | | onReceiveNewInvitation | A new call invitation arrives. | Save the SignalingInfo , show the incoming call UI, and let the user accept or reject it. | | onInviteeAccepted , onInviteeRejected | An invitee accepts or rejects. | Update that member's call status. In a group call, do not affect the other members. | | onInvitationCancelled , onInvitationTimeout , onHangup | An invitation is cancelled or times out, or either party hangs up. | Close the matching call UI, disconnect from the media room, and release local resources. | | onInviteeAcceptedByOtherDevice , onInviteeRejectedByOtherDevice | Another device signed in to the same account accepts or rejects. | End the incoming call UI on this device so that two devices do not handle the same invitation. | | onRoomParticipantConnected , onRoomParticipantDisconnected | A member joins or leaves the media room. | Update the member's status in a group call. | | onStreamChange | The server sends media stream change information. | Parse the string according to your server integration, then update the media stream. |" }, { "path": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", @@ -3021,7 +3021,7 @@ "description": "Restore a call invitation that was received before the Android application started or resumed.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling retrieving-call-information restore-pending-invitation", - "content": "getSignalingInvitationInfoStartApp takes no application parameters. It returns the invitation snapshot that should be handled when the application starts or resumes. OpenIMClient.getInstance .signalingManager.getSignalingInvitationInfoStartApp new OnBase @Override public void onSuccess SignalingInfo info if info = null && info.getInvitation = null && info.getInvitation .getRoomID = null && info.getInvitation .getRoomID .isEmpty restoreIncomingCall info ; @Override public void onError int code, String error clearExpiredIncomingCall ; ; Success only means that the current snapshot was retrieved; it does not replace the call listener. Restore the incoming call interface only when both invitation and roomID are valid. Continue handling cancellation, timeout, acceptance, and hang up through Handle call events /sdk/android/calling/managing calls/handle call events ." + "content": "Use getSignalingInvitationInfoStartApp to retrieve an unhandled call invitation when the application starts or resumes. OpenIMClient.getInstance .signalingManager.getSignalingInvitationInfoStartApp new OnBase @Override public void onSuccess SignalingInfo info if info = null && info.getInvitation = null && info.getInvitation .getRoomID = null && info.getInvitation .getRoomID .isEmpty restoreIncomingCall info ; @Override public void onError int code, String error clearExpiredIncomingCall ; ; The success callback returns an invitation snapshot at the time of the call; it does not connect the call. Continue handling cancellation, timeout, and acceptance of the call invitation yourself." }, { "path": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", @@ -3029,7 +3029,7 @@ "description": "Use the Android SDK to retrieve an active call room by group ID.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling retrieving-call-information get-room-by-group-id", - "content": "signalingGetRoomByGroupID takes a group ID, not a custom roomID . OpenIMClient.getInstance .signalingManager.signalingGetRoomByGroupID new OnBase @Override public void onSuccess RoomCallingInfo room if room.getRoomID = null && room.getRoomID .isEmpty renderParticipants room.getParticipant ; @Override public void onError int code, String error showNoActiveGroupCall ; , groupID ; The success callback returns a RoomCallingInfo snapshot containing the room ID, original invitation, participants, group ID, token, and connection address. Account profiles, group member profiles, and group profiles inside participant data come from different sources and must not overwrite one another. If no group call is active, treat an error or empty room as “no call to restore” and discard old credentials. Even when your group call uses a custom room ID, this method still receives groupID ." + "content": "signalingGetRoomByGroupID takes a group ID, not roomID , even when the call uses a custom roomID . OpenIMClient.getInstance .signalingManager.signalingGetRoomByGroupID new OnBase @Override public void onSuccess RoomCallingInfo room if room.getRoomID = null && room.getRoomID .isEmpty renderParticipants room.getParticipant ; @Override public void onError int code, String error showNoActiveGroupCall ; , groupID ; The success callback returns a RoomCallingInfo snapshot containing the room ID, original invitation, participants, group ID, token, and connection address. If there is no active call in the group, the API can return an error or an empty room. Clear locally saved call state and room credentials, and do not attempt to join the old room." }, { "path": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", @@ -3037,7 +3037,7 @@ "description": "Use the Android SDK to retrieve fresh join credentials for a known room ID.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling retrieving-call-information get-token-by-room-id", - "content": "When you know the roomID but need new join credentials, call signalingGetTokenByRoomID . OpenIMClient.getInstance .signalingManager.signalingGetTokenByRoomID new OnBase @Override public void onSuccess SignalingCertificate credentials if credentials.getToken = null && credentials.getRoomID = null joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCredentialError code, error ; , roomID ; The success callback returns SignalingCertificate ; see Start a one to one call /sdk/android/calling/managing calls/start single call for its fields. Connect the media engine only after receiving a valid token and roomID . A room token is a short lived sensitive credential. Keep it in memory and do not write it to logs, URLs, analytics events, or persistent storage." + "content": "When you know the roomID but need new join credentials, call signalingGetTokenByRoomID . OpenIMClient.getInstance .signalingManager.signalingGetTokenByRoomID new OnBase @Override public void onSuccess SignalingCertificate credentials if credentials.getToken = null && credentials.getRoomID = null joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCredentialError code, error ; , roomID ; The success callback returns SignalingCertificate , which provides the token and liveURL required to join the audio/video room. A room token is a short lived sensitive credential. Keep it in memory and do not write it to logs, URLs, analytics events, or persistent storage." }, { "path": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", @@ -3045,7 +3045,7 @@ "description": "Send and receive custom signaling data in an Android SDK call room.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling sending-custom-signals send-a-custom-signal", - "content": "signalingSendCustomSignal sends lightweight application negotiation data to a call room, such as a raised hand action, layout hint, or application state update. It is not a chat message API and does not replace the media engine's data channel. Send a signal Both roomID and customInfo are required strings. Define a stable schema and serialize structured data as JSON. JSONObject signal = new JSONObject ; signal.put \"version\", 1 ; signal.put \"eventID\", eventID ; signal.put \"type\", \"hand raised\" ; signal.put \"userID\", currentUserID ; signal.put \"sentAt\", System.currentTimeMillis ; OpenIMClient.getInstance .signalingManager.signalingSendCustomSignal new OnBase @Override public void onSuccess String result markSignalSent eventID ; @Override public void onError int code, String error showSignalError code, error ; , roomID, signal.toString ; The success callback means that the send request completed, not that other participants processed it. Keep custom signals small and include a protocol version and application idempotency ID. Do not place large files, chat history, long lived state, or sensitive credentials in customInfo . Receive a signal OnSignalingListener.onReceiveCustomSignal returns CustomSignalingInfo . Validate the room and your application protocol before updating the interface. @Override public void onReceiveCustomSignal CustomSignalingInfo info if info == null || activeRoomID.equals info.getRoomID return; CallSignal signal = parseAndValidateCallSignal info.getCustomInfo ; String mergeID = info.getRoomID + \":\" + signal.getEventID ; if hasAppliedSignal mergeID return; applyCallSignal signal ; This page owns the complete handling contract for onReceiveCustomSignal . parseAndValidateCallSignal should check the JSON structure, protocol version, eventID , type , and application fields. Process signals idempotently by roomID:eventID and do not depend on event order. SignalingManager retains only one listener. Add the custom signal callback to the application level listener shown in Handle call events /sdk/android/calling/managing calls/handle call events . Registering another listener from this feature would replace all other call callbacks. Custom client signaling must not grant host, payment, or privacy permissions. Store and validate authoritative state on a trusted backend. After reconnecting, reconcile long lived state through a room query or the application backend." + "content": "Use signalingSendCustomSignal to send small pieces of call related application information to a call room, such as a raised hand action, layout hint, or temporary state update. It is not suitable for chat content, large data, or files. Send a signal Both roomID and customInfo are required strings. Define a stable schema and serialize structured data as JSON. JSONObject signal = new JSONObject ; signal.put \"version\", 1 ; signal.put \"eventID\", eventID ; signal.put \"type\", \"hand raised\" ; signal.put \"userID\", currentUserID ; signal.put \"sentAt\", System.currentTimeMillis ; OpenIMClient.getInstance .signalingManager.signalingSendCustomSignal new OnBase @Override public void onSuccess String result markSignalSent eventID ; @Override public void onError int code, String error showSignalError code, error ; , roomID, signal.toString ; The success callback only confirms that the send request completed; it does not mean that other participants received or processed the signal. Include a protocol version and a unique eventID in customInfo so receivers can identify duplicate messages. Do not include large files, chat history, long lived state, or sensitive credentials. Receive a signal When a custom signal arrives, OnSignalingListener.onReceiveCustomSignal receives CustomSignalingInfo . Confirm that it belongs to the active room and validate its format before updating the UI. @Override public void onReceiveCustomSignal CustomSignalingInfo info if info == null || activeRoomID.equals info.getRoomID return; CallSignal signal = parseAndValidateCallSignal info.getCustomInfo ; String mergeID = info.getRoomID + \":\" + signal.getEventID ; if hasAppliedSignal mergeID return; applyCallSignal signal ; If your application needs to avoid duplicate processing, include a unique event ID in the custom signal and record processed events on the receiving side. Messages may not arrive in send order, so do not rely on arrival order to determine application state. Register onReceiveCustomSignal together with the other call callbacks in the listener shown in Handle call events /sdk/android/calling/managing calls/handle call events . SignalingManager retains only one listener; registering another one replaces the existing call callbacks. Do not grant host, payment, or privacy permissions based only on custom client signals. Store and validate these trusted states on your backend; after reconnecting, restore long lived state from a room query or your backend." }, { "path": "/sdk/android/events/overview-events", @@ -3053,15 +3053,15 @@ "description": "Register Android SDK listeners centrally and route connection, synchronization, and data events by domain.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android events overview-events", - "content": "OpenIM Android SDK uses listeners to report connection, synchronization, user, friendship, conversation, group, message, and calling changes. Listener setters on each manager use replacement semantics: a later call replaces the previous instance. Combine all callbacks in an application level event center and register them once before login. Do not register them repeatedly from an Activity, Fragment, Compose screen, or feature component. The connection listener is the exception. OnConnListener is passed to initSDK ; its complete handling contract is described in Authenticate and manage a session /sdk/android/getting started/authenticate and manage session . Register listeners centrally The following entry point uses stable application level listeners. Each listener should include all callbacks for its domain; detailed merge behavior remains on the page that owns each event. public final class OpenIMEventCenter private final OpenIMClient client = OpenIMClient.getInstance ; private final OnUserListener userListener = buildUserListener ; private final OnFriendshipListener friendshipListener = buildFriendshipListener ; private final OnConversationListener conversationListener = buildConversationListener ; private final OnGroupListener groupListener = buildGroupListener ; private final OnAdvanceMsgListener messageListener = buildMessageListener ; private final OnCustomBusinessListener businessListener = buildBusinessListener ; private final OnSignalingListener signalingListener = buildSignalingListener ; public void registerBeforeLogin client.userInfoManager.setOnUserListener userListener ; client.friendshipManager.setOnFriendshipListener friendshipListener ; client.conversationManager.setOnConversationListener conversationListener ; client.groupManager.setOnGroupListener groupListener ; client.messageManager.setAdvancedMsgListener messageListener ; client.messageManager.setCustomBusinessListener businessListener ; client.signalingManager.setSignalingListener signalingListener ; The Android SDK does not expose remove or unset methods for these listeners. When signing out, switching accounts, or destroying the application state layer, stop dispatching into old account state and destroyed screens. Before the next login, replace each listener with the complete listener set for the new account. Event ownership | Event scope | Listener | Corresponding page | | | | | | Connection, token, and forced logout | OnConnListener | Authenticate and manage a session /sdk/android/getting started/authenticate and manage session | | Current user profile | OnUserListener | Update the current user profile /sdk/android/user/user profile/set self info | | Online status | OnUserListener | Subscribe to user online status /sdk/android/user/online status/subscribe users online status | | Friend relationships and profiles | OnFriendshipListener | Get the friend list by page /sdk/android/user/friends/get friend list page | | Friend applications | OnFriendshipListener | Get received friend requests /sdk/android/user/friend applications/get recv friend application list | | Blacklist | OnFriendshipListener | Block a user /sdk/android/user/blacklist/add blacklist , Remove a user from the blacklist /sdk/android/user/blacklist/remove blacklist | | Conversation list | OnConversationListener | Retrieve the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list | | Total unread count | OnConversationListener | Get the total unread count /sdk/android/conversation/managing conversations/get total unread count | | Typing state | OnConversationListener | Update typing status /sdk/android/message/composing messages/update typing status | | Group profiles, members, and applications | OnGroupListener | Group overview /sdk/android/group/overview group | | New, offline, and online only messages | OnAdvanceMsgListener | Receive messages /sdk/android/message/receiving messages/receive messages | | Message revocation | OnAdvanceMsgListener | Revoke a message /sdk/android/message/managing messages/revoke a message | | Message deletion | OnAdvanceMsgListener | Delete messages in a batch /sdk/android/message/managing messages/delete saved messages | | Message modification | OnAdvanceMsgListener | Modify a message /sdk/android/message/managing messages/modify a message | | Pinned messages | OnAdvanceMsgListener | Pin or unpin a message /sdk/android/message/managing messages/set message pinned | | One to one read receipts | OnAdvanceMsgListener | Mark a conversation as read /sdk/android/conversation/managing conversations/mark conversation read | | Custom business messages | OnCustomBusinessListener | Receive custom business messages /sdk/android/message/receiving messages/receive custom business messages | | Calls | OnSignalingListener | Handle call events /sdk/android/calling/managing calls/handle call events | | Custom call signaling | OnSignalingListener | Send a custom signal /sdk/android/calling/sending custom signals/send a custom signal | | SDK data synchronization | OnConversationListener | Handle initial synchronization handle initial synchronization | Query APIs establish snapshots, and listeners merge subsequent changes. Query results, successful API callbacks, and event delivery are three independent stages and cannot replace one another. Handle initial synchronization The synchronization lifecycle belongs to the application level OnConversationListener . That listener must also include conversation list, unread count, and typing status callbacks. The following example only highlights synchronization logic owned by this page. private OnConversationListener buildConversationListener return new OnConversationListener @Override public void onNewConversation List conversations mergeNewConversations conversations ; @Override public void onConversationChanged List conversations mergeChangedConversations conversations ; @Override public void onTotalUnreadMessageCountChanged int total updateTotalUnreadCount total ; @Override public void onConversationUserInputStatusChanged String payload handleInputStatus payload ; @Override public void onSyncServerStart boolean reinstall setSyncState \"syncing\", 0, reinstall ; @Override public void onSyncServerProgress long progress setSyncProgress progress ; @Override public void onSyncServerFinish boolean reinstall setSyncState \"ready\", 100, reinstall ; reloadVisibleSnapshots ; @Override public void onSyncServerFailed boolean reinstall setSyncState \"failed\", 0, reinstall ; ; When reinstall is true , treat local data as being rebuilt. Show a more complete synchronization state and avoid relying on old cache data until synchronization completes. onSyncServerProgress reports current progress. After completion, query the snapshots needed by visible screens again. On failure, record the error and wait for retry or connection recovery. This page owns the complete handling contract for onSyncServerStart , onSyncServerProgress , onSyncServerFinish , and onSyncServerFailed . Synchronization state has no business entity key; isolate it by the current OpenIMClient singleton and signed in user." + "content": "OpenIM Android SDK uses listeners to report connection, synchronization, user, friendship, conversation, group, message, and calling changes. Each manager keeps only one listener; setting another one replaces the previous listener. Manage these listeners in one place in your application and set them once before login. Do not register them repeatedly from an Activity, Fragment, Compose screen, or feature component. OnConnListener monitors the connection status to IM Server. It is not set separately through a manager; pass it when calling initSDK . For complete handling guidance, see Authenticate and manage a session /sdk/android/getting started/authenticate and manage session . Register listeners centrally The following example registers each listener in one place in the application. Each listener handles events for its own domain, such as messages, conversations, friends, or calls. public final class OpenIMEventCenter private final OpenIMClient client = OpenIMClient.getInstance ; private final OnUserListener userListener = new OnUserListener // Handles user profile and online status changes. ; private final OnFriendshipListener friendshipListener = new OnFriendshipListener // Handles friend relationships, friend applications, and blacklist changes. ; private final OnConversationListener conversationListener = new OnConversationListener // Handles conversations, unread counts, input status, and initial synchronization. ; private final OnGroupListener groupListener = new OnGroupListener // Handles groups, group members, and group application changes. ; private final OnAdvanceMsgListener messageListener = new OnAdvanceMsgListener // Handles new messages, revocations, deletions, modifications, and read receipts. ; private final OnCustomBusinessListener businessListener = new OnCustomBusinessListener // Handles custom business messages. ; private final OnSignalingListener signalingListener = new OnSignalingListener // Handles call invitations, participant status, and custom call signals. ; public void registerBeforeLogin client.userInfoManager.setOnUserListener userListener ; client.friendshipManager.setOnFriendshipListener friendshipListener ; client.conversationManager.setOnConversationListener conversationListener ; client.groupManager.setOnGroupListener groupListener ; client.messageManager.setAdvancedMsgListener messageListener ; client.messageManager.setCustomBusinessListener businessListener ; client.signalingManager.setSignalingListener signalingListener ; The Android SDK does not provide a way to remove listeners. When signing out, switching accounts, or destroying a screen, stop callbacks from updating old account data or destroyed UI and clear references held by your application. Before the next login, set each listener again for the new account. Event ownership | Event scope | Listener | Corresponding page | | | | | | Connection, token, and forced logout | OnConnListener | Authenticate and manage a session /sdk/android/getting started/authenticate and manage session | | Current user profile | OnUserListener | Update the current user profile /sdk/android/user/user profile/set self info | | Online status | OnUserListener | Subscribe to user online status /sdk/android/user/online status/subscribe users online status | | Friend relationships and profiles | OnFriendshipListener | Get the friend list by page /sdk/android/user/friends/get friend list page | | Friend applications | OnFriendshipListener | Get received friend requests /sdk/android/user/friend applications/get recv friend application list | | Blacklist | OnFriendshipListener | Block a user /sdk/android/user/blacklist/add blacklist , Remove a user from the blacklist /sdk/android/user/blacklist/remove blacklist | | Conversation list | OnConversationListener | Retrieve the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list | | Total unread count | OnConversationListener | Get the total unread count /sdk/android/conversation/managing conversations/get total unread count | | Typing state | OnConversationListener | Update typing status /sdk/android/message/composing messages/update typing status | | Group profiles, members, and applications | OnGroupListener | Group overview /sdk/android/group/overview group | | New, offline, and online only messages | OnAdvanceMsgListener | Receive messages /sdk/android/message/receiving messages/receive messages | | Message revocation | OnAdvanceMsgListener | Revoke a message /sdk/android/message/managing messages/revoke a message | | Message deletion | OnAdvanceMsgListener | Delete messages in a batch /sdk/android/message/managing messages/delete saved messages | | Message modification | OnAdvanceMsgListener | Modify a message /sdk/android/message/managing messages/modify a message | | Pinned messages | OnAdvanceMsgListener | Pin or unpin a message /sdk/android/message/managing messages/set message pinned | | One to one read receipts | OnAdvanceMsgListener | Mark a conversation as read /sdk/android/conversation/managing conversations/mark conversation read | | Custom business messages | OnCustomBusinessListener | Receive custom business messages /sdk/android/message/receiving messages/receive custom business messages | | Calls | OnSignalingListener | Handle call events /sdk/android/calling/managing calls/handle call events | | Custom call signaling | OnSignalingListener | Send a custom signal /sdk/android/calling/sending custom signals/send a custom signal | | SDK data synchronization | OnConversationListener | Handle initial synchronization handle initial synchronization | Handle initial synchronization The synchronization lifecycle belongs to OnConversationListener , which also includes callbacks for the conversation list, unread count, and typing status. The following example shows only the callbacks related to initial synchronization: private final OnConversationListener conversationListener = new OnConversationListener @Override public void onSyncServerStart boolean reinstall // Synchronization started: update the sync state and show loading UI when needed. @Override public void onSyncServerProgress long progress // Synchronization in progress: update the progress indicator. @Override public void onSyncServerFinish boolean reinstall // Synchronization finished: refresh screens that require complete data. @Override public void onSyncServerFailed boolean reinstall // Synchronization failed: update the failure state and wait for retry or connection recovery. // Other conversationListener callbacks... ; reinstall indicates whether synchronization follows a local data rebuild: true means synchronization after the application is reinstalled, local data is cleared, or a similar scenario, when local cache is usually unavailable; false means ordinary synchronization after login. onSyncServerProgress reports the current synchronization progress. After synchronization completes, query the data required by the current screen again. On failure, update the synchronization failure state and wait for retry or connection recovery." }, { "path": "/sdk/android/logger", "title": "Logging", - "description": "Configure Android SDK logging, write application diagnostics, and upload logs.", + "description": "Configure Android SDK logging, write application logs, and upload logs.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android logger", - "content": "OpenIM Android SDK logs help diagnose initialization, connection, and business API problems. Development and staging builds can use more detailed output. Production builds should reduce log volume and must avoid recording tokens, complete message bodies, raw file URLs, call room credentials, and private user fields. Configure logging during initialization Logging options belong to InitConfig and must be set before initSDK . File dataDirectory = new File application.getFilesDir , \"openim\" ; File logDirectory = new File application.getFilesDir , \"openim logs\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn; config.isLogStandardOutput = BuildConfig.DEBUG; config.logFilePath = logDirectory.getAbsolutePath ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; | Field | Description | | | | | logLevel | Controls verbosity with a LogLevel constant. Available values include DebugWithSQL , Debug , Info , Warn , Error , Panic , and Fatal . | | isLogStandardOutput | Writes SDK logs to Android standard output when enabled; use it for development diagnostics. | | logFilePath | Optional log directory. Keep it within application writable storage and manage its size and retention. | Use Debug for ordinary development diagnostics. Enable DebugWithSQL temporarily and only when diagnosing database problems. Production builds normally use Warn or Error and disable unnecessary standard output. Write application diagnostic logs Use the non deprecated logs overload to add application context to SDK logs. OpenIMClient.getInstance .logs LogLevel.Error, ChatRepository.class.getSimpleName , 184, \"send message failed\", errorMessage, \"conversationID\", conversationID, \"clientMsgID\", clientMsgID ; currentClassName and currentLineNum identify the call site. msgStr is a short action description, and errStr is the error information. Warn , Error , Panic , and Fatal require a non empty error string. Pass trailing extra values as key value pairs and include only non sensitive identifiers needed for diagnosis. The older logs overload with OnBase and Map parameters is deprecated and should not be used in new code. Upload diagnostic logs Call uploadLogs only after the user explicitly agrees to submit diagnostic information. The Android API retains the params argument; pass an empty list when no additional parameters are needed. line configures how many log lines are read for the upload. String uploadID = UUID.randomUUID .toString ; OpenIMClient.getInstance .uploadLogs new OnBase @Override public void onSuccess String data showLogUploadCompleted ; @Override public void onError int code, String error showLogUploadError code, error ; , Collections.emptyList , 2000, uploadID, \"support ticket 42\", new UploadLogProgress @Override public void onProgress long current, long total updateLogUploadProgress current, total ; ; | Parameter | Description | | | | | line | Number of log lines configured for this upload. | | cancelID | Stable identifier for this upload, such as an application generated UUID. | | ex | Diagnostic context attached to the task, such as a support ticket ID. It must not contain credentials or private data. | | UploadLogProgress | Reports current progress and total work for the upload interface. | The success callback means that the log upload request completed. It does not change user, conversation, or message state and does not trigger a business domain event. On failure, record the error code, current user, and application diagnostic ID without printing the complete logs again. operationID and application tracing Public methods in the Android Java wrapper do not accept operationID . The wrapper generates one with ParamsUtil.buildOperationID for each call and passes it to Core, so applications normally do not create or supply this value. Maintain a separate application trace ID in your own logs. Record the business action, error code, and only the required conversationID , clientMsgID , groupID , or roomID . The application trace ID links a multi step business flow, while the SDK operationID links one SDK call. Neither is an identity credential or a business idempotency key. Related pages Implement for the Android environment /sdk/android/getting started/environment specific implementation Authenticate and manage a session /sdk/android/getting started/authenticate and manage session Send a message /sdk/android/message/sending messages/send message" + "content": "OpenIM Android SDK logs help diagnose initialization, connection, and business API problems. Development and staging builds can use more detailed output. Production builds should reduce log volume and must avoid recording tokens, complete message bodies, raw file URLs, call room credentials, and private user fields. Configure logging during initialization Configure logging when calling initSDK : File dataDirectory = new File application.getFilesDir , \"openim\" ; File logDirectory = new File application.getFilesDir , \"openim logs\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn; config.isLogStandardOutput = BuildConfig.DEBUG; config.logFilePath = logDirectory.getAbsolutePath ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; | Field | Description | | | | | logLevel | Controls verbosity with a LogLevel constant. Available values include DebugWithSQL , Debug , Info , Warn , Error , Panic , and Fatal . | | isLogStandardOutput | Writes SDK logs to Android standard output when enabled; use it for development diagnostics. | | logFilePath | Optional log directory. Keep it within application writable storage and manage its size and retention. | Use Debug for ordinary development diagnostics. Enable DebugWithSQL temporarily and only when diagnosing database problems. Production builds normally use Warn or Error and disable unnecessary standard output. Write application logs Use logs to write application logs to the SDK log: OpenIMClient.getInstance .logs LogLevel.Error, ChatRepository.class.getSimpleName , 184, \"send message failed\", errorMessage, \"conversationID\", conversationID, \"clientMsgID\", clientMsgID ; currentClassName and currentLineNum identify the call site. msgStr is a short action description, and errStr is the error information. Warn , Error , Panic , and Fatal require a non empty error string. Pass trailing extra values as key value pairs and include only non sensitive identifiers needed for diagnosis. The older logs overload with OnBase and Map parameters is deprecated and should not be used in new code. Upload logs Use uploadLogs to upload client logs to the server, primarily when a user actively submits diagnostic logs. String cancelID = UUID.randomUUID .toString ; OpenIMClient.getInstance .uploadLogs new OnBase @Override public void onSuccess String data showLogUploadCompleted ; @Override public void onError int code, String error showLogUploadError code, error ; , new ArrayList< , 2000, // line cancelID, \"support ticket 42\", // ex new UploadLogProgress @Override public void onProgress long current, long total updateLogUploadProgress current, total ; ; | Parameter | Description | | | | | params | Legacy parameter that the current SDK does not use. Pass an empty list, such as new ArrayList< . | | line | Number of log lines configured for this upload. | | cancelID | Stable identifier for this upload, such as an application generated UUID. | | ex | Diagnostic context attached to the task, such as a support ticket ID. It must not contain credentials or private data. | | UploadLogProgress | Reports current progress and total work for the upload interface. | The success callback means that the log upload request completed. Use operationID to locate an SDK call Public methods in the OpenIM Android SDK do not accept operationID . Each SDK call generates an operationID automatically. operationID identifies only one SDK call; it is not a user identity, permission credential, business idempotency key, or business ID. When investigating a problem, find the operationID near the failed or unexpected call in the client SDK logs. It identifies the related log records for that SDK call. When providing logs to support, also include the time of the issue, user ID, action name, and any relevant conversationID , clientMsgID , groupID , or roomID to help locate the records. Related pages Implement for the Android environment /sdk/android/getting started/environment specific implementation Authenticate and manage a session /sdk/android/getting started/authenticate and manage session Send a message /sdk/android/message/sending messages/send message" }, { "path": "/sdk/flutter/overview", From 66f6427265086975e0fa26442c0341fff6b826d5 Mon Sep 17 00:00:00 2001 From: chan <1499188352@qq.com> Date: Mon, 17 Aug 2026 19:31:23 +0800 Subject: [PATCH 04/12] docs(android): publish Android SDK file-uploads/messages documentation --- .../track-file-upload-progress.mdx | 51 ------ .../sdk/android/file-uploads/upload-file.mdx | 31 +++- .../composing-messages/get-typing-status.mdx | 6 +- .../update-typing-status.mdx | 8 +- .../create-advanced-quote-message.mdx | 2 +- .../creating-messages/create-face-message.mdx | 2 +- .../create-merger-message.mdx | 2 +- .../create-quote-message.mdx | 2 +- .../creating-messages/create-text-message.mdx | 2 +- .../delete-saved-messages.mdx | 8 +- .../delete-user-messages.mdx | 10 +- .../managing-messages/get-pinned-messages.mdx | 4 +- .../insert-local-single-message.mdx | 4 +- .../managing-messages/modify-a-message.mdx | 16 +- .../managing-messages/revoke-a-message.mdx | 19 +-- .../managing-messages/set-message-pinned.mdx | 8 +- .../get-group-message-readers.mdx | 4 +- .../send-group-read-receipts.mdx | 8 +- .../sdk/android/message/overview-message.mdx | 134 ++++++++++++++- .../receive-custom-business-messages.mdx | 6 +- .../receiving-messages/receive-messages.mdx | 2 +- .../find-messages-by-id.mdx | 4 +- .../load-message-context.mdx | 4 +- .../sending-messages/send-message-not-oss.mdx | 2 +- .../message/sending-messages/send-message.mdx | 2 +- .../set-msg-send-progress-listener.mdx | 2 +- .../track-file-upload-progress.mdx | 44 ----- .../sdk/android/file-uploads/upload-file.mdx | 43 +++-- .../composing-messages/get-typing-status.mdx | 4 +- .../update-typing-status.mdx | 6 +- .../create-advanced-quote-message.mdx | 2 +- .../creating-messages/create-face-message.mdx | 2 +- .../create-merger-message.mdx | 2 +- .../create-quote-message.mdx | 2 +- .../create-text-at-message.mdx | 2 +- .../creating-messages/create-text-message.mdx | 2 +- .../delete-saved-messages.mdx | 6 +- .../delete-user-messages.mdx | 8 +- .../managing-messages/get-pinned-messages.mdx | 2 +- .../insert-local-single-message.mdx | 2 +- .../managing-messages/modify-a-message.mdx | 14 +- .../managing-messages/revoke-a-message.mdx | 17 +- .../managing-messages/set-message-pinned.mdx | 6 +- .../get-group-message-readers.mdx | 2 +- .../send-group-read-receipts.mdx | 6 +- .../sdk/android/message/overview-message.mdx | 124 +++++++++++++- .../receive-custom-business-messages.mdx | 6 +- .../receiving-messages/receive-messages.mdx | 2 +- .../find-messages-by-id.mdx | 2 +- .../load-message-context.mdx | 2 +- .../sending-messages/send-message-not-oss.mdx | 2 +- .../message/sending-messages/send-message.mdx | 2 +- .../set-msg-send-progress-listener.mdx | 2 +- data/structure/android-content-audit.json | 153 +++++++----------- data/structure/android-navigation-labels.json | 8 +- data/structure/android-sidebar.json | 16 +- data/structure/chat-pages.json | 8 - scripts/sync-client-sdk-route-skeletons.mjs | 1 - src/generated/android-sdk-zh-content.json | 105 +++++++----- src/generated/navigation.json | 72 +++------ src/generated/routes.json | 18 --- src/generated/search-index-zh.json | 60 +++---- src/generated/search-index.json | 58 +++---- 63 files changed, 610 insertions(+), 546 deletions(-) delete mode 100644 content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx delete mode 100644 content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx diff --git a/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx b/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx deleted file mode 100644 index 79f9e2b579..0000000000 --- a/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: 'Track file upload progress' -description: 'Use OnPutFileListener to track an individual Android SDK file upload.' -product: 'sdk' -context: 'chat/sdk/android' -template: 'guide' -status: 'published' -lastUpdated: '2026-08-10' -version: 'v4' -platform: 'android' -sourcePath: '/sdk/android/file-uploads/track-file-upload-progress' ---- - -The Android SDK does not use a global file-upload listener. Pass an `OnPutFileListener` to each `uploadFile()` call. That listener receives progress, part completion, and final result callbacks for the current task. - -```java -OnPutFileListener uploadListener = new OnPutFileListener() { - @Override - public void open(long size) { - initializeUploadProgress(uploadTaskID, size); - } - - @Override - public void uploadID(String id) { - bindSdkUploadID(uploadTaskID, id); - } - - @Override - public void uploadComplete(long fileSize, long uploadedSize, long storageSize) { - updateUploadProgress(uploadTaskID, uploadedSize, fileSize); - } - - @Override - public void uploadPartComplete(long partNumber, long partSize, String partHash) { - markPartComplete(uploadTaskID, partNumber, partSize, partHash); - } - - @Override - public void complete(long size, String url, long type) { - completeUpload(uploadTaskID, size, url, type); - } -}; - -OpenIMClient.getInstance().uploadFile(resultCallback, uploadListener, putArgs); -``` - -Use `open()` to initialize the total size, `uploadID()` to receive the SDK upload identifier, `uploadComplete()` for in-progress byte counts, `uploadPartComplete()` when one part finishes, and `complete()` for the final size, remote URL, and resource type. Most progress bars only need the progress and completion callbacks; process part details only when the product exposes them. - -Generate a stable application-level `uploadTaskID` and capture it in the listener. Do not use the SDK upload ID, file name, or array position as the task's primary key. Give each task its own listener, and stop dispatching callbacks into destroyed page or account state. - -For complete argument construction and error handling, see [Upload a file](/sdk/android/file-uploads/upload-file). diff --git a/content/docs/chat/sdk/android/file-uploads/upload-file.mdx b/content/docs/chat/sdk/android/file-uploads/upload-file.mdx index 2a71ae182a..531e2a5ef9 100644 --- a/content/docs/chat/sdk/android/file-uploads/upload-file.mdx +++ b/content/docs/chat/sdk/android/file-uploads/upload-file.mdx @@ -18,7 +18,7 @@ sourcePath: '/sdk/android/file-uploads/upload-file' | Parameter | Type | Required | Description | | ------------------ | ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------- | | `base` | `OnBase` | Yes | Receives the final success or failure result for the upload request. | -| `listener` | `OnPutFileListener` | Yes | Receives progress, part completion, and final file information for this task. | +| `listener` | `OnPutFileListener` | Yes | Receives file, part, hash, and completion information for this task. | | `putArgs.filepath` | `String` | Yes | A local file path readable by the Android application. | | `putArgs.name` | `String` | Yes | The upload file name. `PutArgs` initially uses the supplied path; replace it with the original file name when appropriate. | | `putArgs.cuase` | `String` | No | An application-defined upload reason. The spelling follows the Android SDK `PutArgs` declaration. | @@ -43,8 +43,18 @@ OpenIMClient.getInstance().uploadFile( }, new OnPutFileListener() { @Override - public void uploadComplete(long fileSize, long uploadedSize, long storageSize) { - updateUploadProgress(uploadTaskID, uploadedSize, fileSize); + public void open(long size) { + initializeUpload(uploadTaskID, size); + } + + @Override + public void uploadID(String id) { + bindSdkUploadID(uploadTaskID, id); + } + + @Override + public void uploadComplete(long fileSize, long streamSize, long storageSize) { + recordUploadSizes(uploadTaskID, fileSize, streamSize, storageSize); } @Override @@ -56,6 +66,19 @@ OpenIMClient.getInstance().uploadFile( ); ``` -Each call receives its own `OnPutFileListener`, so no global upload listener is required. For parallel uploads, generate a stable task ID and capture it in the callbacks. Do not use a file name or list position as the unique identifier. See [Track file upload progress](/sdk/android/file-uploads/track-file-upload-progress) for callback responsibilities. +## Callbacks + +`OnPutFileListener` provides the following callbacks and parameters: + +| Callback | Parameters | Description | +| -------------------- | --------------------------------------- | ------------------------------------------------------------------------------ | +| `open` | `size` | Opens a file of the given size; use it to initialize the task. | +| `partSize` | `partSize`, `num` | The size of each part and the total number of parts. | +| `hashPartProgress` | `index`, `size`, `partHash` | The part index, size, and hash after a part is hashed. | +| `hashPartComplete` | `partsHash`, `fileHash` | The combined part hash and final file hash after all parts are hashed. | +| `uploadID` | `uploadID` | The upload identifier generated by the SDK. | +| `uploadPartComplete` | `index`, `partSize`, `partHash` | The part index, size, and hash when a part upload completes. | +| `uploadComplete` | `fileSize`, `streamSize`, `storageSize` | File size, stream size, and storage size for the completed file-upload stage. | +| `complete` | `size`, `url`, `type` | The final file size, remote URL, and resource type after the upload completes. | The URL returned by `complete()` can be used later to update an avatar, store an attachment address, or create a URL-based media message. Upload success only means that the resource was written remotely; profile updates, message creation, and message sending remain separate API calls. diff --git a/content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx b/content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx index 531230a50c..b917b49f26 100644 --- a/content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx +++ b/content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx @@ -5,13 +5,13 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-17' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/composing-messages/get-typing-status' --- -When opening a conversation, restoring a connection, or reconciling state, query the platform IDs on which a specified user is currently typing. +Query the platform IDs on which a specified user is currently typing. ```java OpenIMClient.getInstance().conversationManager.getInputState( @@ -32,4 +32,4 @@ OpenIMClient.getInstance().conversationManager.getInputState( ); ``` -The callback returns a snapshot array of platform IDs. An empty array means that no platform was typing at query time. The query itself does not trigger a typing-status event. In a group chat, do not poll every member frequently. Query relevant members only when opening the screen, restoring a connection, or reconciling state, and maintain incremental updates through the listener owned by [Report typing status](/sdk/android/message/composing-messages/update-typing-status). +The success callback returns a list of platform IDs. An empty list means that the user is not currently typing on any platform. To receive typing-status changes, use the callback described in [Update typing status](/sdk/android/message/composing-messages/update-typing-status). diff --git a/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx b/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx index 8499b1c100..df8cac9c53 100644 --- a/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx +++ b/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-17' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/composing-messages/update-typing-status' @@ -37,7 +37,7 @@ Clear the state promptly when typing ends: conversationManager.changeInputState(callback, conversationID, false); ``` -Coalesce consecutive focus changes and attempt to report `false` before the screen closes or the connection is interrupted. A successful callback means only that the report request completed; it does not mean that other clients have updated their interfaces. +Avoid repeatedly reporting the same state. A successful callback means that the report request completed. Other clients receive typing-state changes through `OnConversationListener.onConversationUserInputStatusChanged`. The Android SDK returns the event payload as a string, so validate the JSON before parsing it: @@ -59,6 +59,6 @@ public void onConversationUserInputStatusChanged(String payload) { } ``` -Merge typing states by `conversationID:userID` and clear them after an application-defined timeout. `ConversationManager` retains only one conversation listener, so combine this callback with conversation-list, total-unread, and synchronization events in one listener. +The callback's `conversationID`, `userID`, and `platformIDs` identify the conversation, user, and platforms on which the user is typing. `ConversationManager` can retain only one `OnConversationListener`. If the application handles other conversation events, implement their callbacks in the same listener. -When opening a conversation or restoring a connection, use [Get typing status](/sdk/android/message/composing-messages/get-typing-status) to retrieve the current snapshot. +To query whether a specified user is currently typing, use [Retrieve typing status](/sdk/android/message/composing-messages/get-typing-status). diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx index 83c301d6e4..46a14a3b8d 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx @@ -27,4 +27,4 @@ Message message = OpenIMClient.getInstance().messageManager.createAdvancedQuoteM ); ``` -The quoted `originalMessage` should contain a stable `clientMsgID`, and every entity range must match the final reply text. Use the same application protocol for `type`, `url`, and `info` as described in [Create a rich-text message](/sdk/android/message/creating-messages/create-advanced-text-message). This method only creates an object waiting to be sent. +Every entity range must match the final reply text. Use the same application protocol for `type`, `url`, and `info` as described in [Create a rich-text message](/sdk/android/message/creating-messages/create-advanced-text-message). This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx index 86147d2552..0283423238 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-face-message' --- -`index` identifies the emoji position, while `data` stores JSON such as an emoji URL. +`data` stores JSON such as an emoji URL. ```java Message message = OpenIMClient.getInstance().messageManager.createFaceMessage(index, dataJson); diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx index 639286caf4..9b8ce0b139 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-merger-message' --- -Pass the message list, title, and summary list. Keep summary ordering consistent with the display protocol used by your clients. +Pass the message list, title, and summary list. ```java Message message = OpenIMClient.getInstance().messageManager.createMergerMessage( diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx index 331231460d..00980f1c3a 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-quote-message' --- -A quote message stores the complete quoted `Message`. Before sending, make sure the quoted object has a stable `clientMsgID`. +A quote message stores the complete quoted `Message`. ```java Message message = OpenIMClient.getInstance().messageManager diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx index af34a3229f..94cd4f20ab 100644 --- a/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx +++ b/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/message/creating-messages/create-text-message' --- -`createTextMessage()` only creates a local message object. It does not send the message. +`createTextMessage()` only creates a `Message` ready to be sent. It does not send the message. ```java Message message = OpenIMClient.getInstance().messageManager.createTextMessage(text); diff --git a/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx index 37bd744399..0244f3b587 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-17' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/delete-saved-messages' @@ -43,13 +43,11 @@ With `isSync` set to `false`, the operation deletes the current device's copy an The success callback means that the deletion request has completed. When synchronization is enabled, it does not mean that other clients have already received the event or updated their interfaces. -This page owns `OnAdvanceMsgListener.onMsgDeleted`. Determine the conversation from the message routing fields, then remove the message idempotently by `clientMsgID`. +When synchronization is enabled, other clients can receive the deleted message through `OnAdvanceMsgListener.onMsgDeleted`: ```java @Override public void onMsgDeleted(Message message) { - removeMessage(resolveConversationID(message), message.getClientMsgID()); + handleDeletedMessage(message); } ``` - -To reconcile the current message snapshot, query the corresponding conversation history again. diff --git a/content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx index 1f99329d66..1ef37403ee 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-17' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/delete-user-messages' @@ -29,15 +29,13 @@ messageManager.deleteUserAllMessagesInConv( ); ``` -This API is available only for group chats and deletes every message sent by the specified user in the target group conversation. It is a high-impact group moderation action and should not appear in an ordinary single-message menu. OpenIMServer validates the operator's permission. A successful callback does not mean that the event has already arrived. +This API is available only for group chats and deletes every message sent by the specified user in the target group conversation. If the caller does not have permission, `onError` returns the error. -This page owns `OnAdvanceMsgListener.onDeleteUserAllMsgsInConv`. When the event arrives, use its `conversationID` and `userID` to remove messages from that sender in the cached conversation, or reload conversation history to reconcile the state. +Other clients receive the deletion notification through `OnAdvanceMsgListener.onDeleteUserAllMsgsInConv`. The callback includes the corresponding `conversationID` and `userID`: ```java @Override public void onDeleteUserAllMsgsInConv(DeleteUserAllMsgsListenerMsg event) { - removeMessagesBySender(event.getConversationID(), event.getUserID()); + handleUserMessagesDeleted(event.getConversationID(), event.getUserID()); } ``` - -Callback completion, event arrival, and a new history query are three independent stages. diff --git a/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx index c9ba3d657c..6764cb9f50 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx @@ -5,13 +5,13 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-17' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/get-pinned-messages' --- -The result is a snapshot of the messages currently pinned in the specified conversation. +The success callback returns the messages currently pinned in the specified conversation. ```java messageManager.getConversationPinnedMsgs(new OnBase>() { diff --git a/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx index c776d12b79..4ce57cedd2 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx @@ -5,13 +5,13 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-17' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/insert-local-single-message' --- -This method does not send the message to the server. `receiver` and `sender` determine how the local message is associated with the conversation. +This method does not send the message to the server. `receiver` is the recipient's user ID, and `sender` is the sender's user ID. ```java messageManager.insertSingleMessageToLocalStorage(callback, message, receiverUserID, senderUserID); diff --git a/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx index ebee0737f3..6cca59d3f1 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx @@ -5,31 +5,27 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-17' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/modify-a-message' --- -Use `modifyMessage` to change an existing message in a conversation. Preserve the original conversation ID, `clientMsgID`, routing fields, sender, and other message data in the request, and update only the supported content. +Use `modifyMessage` to change an existing message in a conversation. Normally, start with the original message, change the supported content, and preserve its other fields. ```java messageManager.modifyMessage(callback, modifyRequest); ``` -The success callback means that the modification request completed; it does not mean that every client interface has updated. Other clients receive the complete modified `Message` through `OnAdvanceMsgListener.onMessageModified`. +The success callback means that the modification request completed. -This page is the complete owner of `onMessageModified`. Resolve the `conversationID` from the message routing fields, then replace the original message by `conversationID:clientMsgID`. Do not match by array position or displayed text: +After a message is modified, other clients receive the complete modified `Message` through `OnAdvanceMsgListener.onMessageModified`: ```java @Override public void onMessageModified(Message message) { - String conversationID = resolveConversationID(message); - if (conversationID == null) { - return; - } - replaceMessage(conversationID, message.getClientMsgID(), message); + handleModifiedMessage(message); } ``` -Add this callback to the application's single `OnAdvanceMsgListener`; see [Events](/sdk/android/events/overview-events) for centralized setup. Callback completion, event delivery, and a new history query are three independent stages. +`MessageManager` can retain only one `OnAdvanceMsgListener`. If the application handles other message events, implement their callbacks in the same listener. See [Events](/sdk/android/events/overview-events) for setup. diff --git a/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx index eb3fb3e856..b94bd82c30 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx @@ -5,34 +5,27 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-17' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/revoke-a-message' --- -Revoking a message causes other clients to display the original message in a revoked state. Before calling the API, confirm that the message was sent successfully and enforce the revocation time window in the application interface. The server makes the final authorization decision. +Revoking a message causes other clients to display the original message in a revoked state. If the call fails, the error callback returns an error code and message. ```java messageManager.revokeMessageV2(callback, conversationID, clientMsgID); ``` -The success callback means that the server completed the revocation request; it does not mean that every client has received the event. Receiving clients merge the change through `OnAdvanceMsgListener.onRecvMessageRevokedV2`. +The success callback means that the revocation request completed. Other clients receive the revocation notification through `OnAdvanceMsgListener.onRecvMessageRevokedV2`. -This page is the complete owner of `onRecvMessageRevokedV2`. `RevokedInfo` contains the `clientMsgID`, revoker, and revocation time, but not the `conversationID`. Resolve the owning conversation from the current account's message index, then update by `conversationID:clientMsgID`: +`RevokedInfo` contains the `clientMsgID`, revoker, and revocation time: ```java @Override public void onRecvMessageRevokedV2(RevokedInfo info) { - String clientMsgID = info.getClientMsgID(); - String conversationID = findConversationIDByClientMsgID(clientMsgID); - if (conversationID == null) { - return; - } - markMessageRevoked(conversationID, clientMsgID, info); + handleRevokedMessage(info); } ``` -Update the matching message to a revoked state instead of deleting it from the list. Add this callback to the application's single `OnAdvanceMsgListener`; see [Events](/sdk/android/events/overview-events) for centralized setup. - -Callback completion, event delivery, and a new history query are three independent stages. Re-query the corresponding conversation history when reconciliation is required. +Update the matching message to a revoked state instead of deleting it from the list. `MessageManager` can retain only one `OnAdvanceMsgListener`. If the application handles other message events, implement their callbacks in the same listener. See [Events](/sdk/android/events/overview-events) for setup. diff --git a/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx b/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx index a7eef200b6..bf37fecfa2 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-17' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-messages/set-message-pinned' @@ -24,13 +24,13 @@ messageManager.setConversationPinnedMsg( The success callback means that the request completed; it does not mean that the pinned-message event has arrived. -This page owns `OnAdvanceMsgListener.onChangedPinnedMsg`. `ChangedPinnedMsg` contains the `conversationID` and current pinned-message collection. Replace the collection for that conversation, then deduplicate its messages by `clientMsgID`: +When pinned messages change, `OnAdvanceMsgListener.onChangedPinnedMsg` returns the corresponding `conversationID` and current list of pinned messages: ```java @Override public void onChangedPinnedMsg(ChangedPinnedMsg event) { - replacePinnedMessages(event.getConversationID(), event.getMsgs()); + handlePinnedMessagesChanged(event.getConversationID(), event.getMsgs()); } ``` -Add this callback to the application's single `OnAdvanceMsgListener`; see [Events](/sdk/android/events/overview-events) for centralized setup. Callback completion, event delivery, and the snapshot from [View pinned messages](/sdk/android/message/managing-messages/get-pinned-messages) are three independent stages. +`MessageManager` can retain only one `OnAdvanceMsgListener`. If the application handles other message events, implement their callbacks in the same listener. See [Events](/sdk/android/events/overview-events) for setup. To retrieve the current pinned messages directly, use [View pinned messages](/sdk/android/message/managing-messages/get-pinned-messages). diff --git a/content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx b/content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx index 91c5e8f5fc..3d92c57d68 100644 --- a/content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx +++ b/content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-17' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-read-status/get-group-message-readers' @@ -42,4 +42,4 @@ messageManager.getGroupMessageReaderList( ); ``` -The success callback returns the current page of `GroupMembersInfo` objects. For field descriptions, see [List group members](/sdk/android/group/retrieving-group-members/get-group-member-list). Deduplicate by `groupID:userID`. The query establishes a snapshot and does not trigger a receipt event. Continue paging when the complete list is required. +The success callback returns the current page of `GroupMembersInfo` objects. For field descriptions, see [List group members](/sdk/android/group/retrieving-group-members/get-group-member-list). Continue paging when the complete list is required. diff --git a/content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx b/content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx index 0ff04b682a..57c7733234 100644 --- a/content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx +++ b/content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-17' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/managing-read-status/send-group-read-receipts' @@ -31,13 +31,13 @@ messageManager.sendGroupMessageReadReceipt( Every message in one batch must belong to the target group conversation. A successful callback means only that the server accepted the report; it does not mean that other client interfaces have already updated. The conversation unread count is maintained separately through `markConversationMessageAsRead`. -Other clients receive member-level group read changes through `OnAdvanceMsgListener.onRecvGroupMessageReadReceipt`. This page is the canonical reference for that event. Merge read counts, unread counts, and member information using the receipt's `conversationID` and message IDs. +Other clients receive group-message read receipts through `OnAdvanceMsgListener.onRecvGroupMessageReadReceipt`: ```java @Override public void onRecvGroupMessageReadReceipt(GroupMessageReceipt receipt) { - mergeGroupReadReceipt(receipt); + handleGroupMessageReadReceipt(receipt); } ``` -The report callback, the group receipt event, and the member snapshot from [Get members who read a group message](/sdk/android/message/managing-read-status/get-group-message-readers) are three independent stages. +To retrieve members who have or have not read a specific group message, use [Get members who read a group message](/sdk/android/message/managing-read-status/get-group-message-readers). diff --git a/content/docs/chat/sdk/android/message/overview-message.mdx b/content/docs/chat/sdk/android/message/overview-message.mdx index 5173f3fd3b..a9310e580a 100644 --- a/content/docs/chat/sdk/android/message/overview-message.mdx +++ b/content/docs/chat/sdk/android/message/overview-message.mdx @@ -11,12 +11,138 @@ platform: 'android' sourcePath: '/sdk/android/message/overview-message' --- -Android messages are represented by `Message`. Use `clientMsgID` for deduplication, and use `sessionType`, `recvID`, and `groupID` to distinguish one-to-one chats from group chats. Message content is stored in the corresponding element field. Sending, receiving, revoking, and deleting are separate state changes. +The Android SDK represents each message as `Message`. Message creation, sending, receiving, querying, and state changes are separate stages: creating a `Message` does not send it, and a successful send does not mean that other clients have already received it. + +Use `clientMsgID` as the client-side deduplication and update key, together with the conversation context that identifies a one-to-one or group chat. `Message` does not contain `conversationID`; obtain it from the active conversation, history query, or message event context. + +## Message processing flow + +| Stage | Android API or callback | Description | +| ------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | +| Create | `MessageManager.create*Message()` | Creates a `Message` object ready to be sent, without writing it to the server or triggering a new-message callback. | +| Send | `sendMessage()` or `sendMessageNotOss()` | Pass `recvUid` for a one-to-one chat or `recvGid` for a group chat. | +| Receive | `OnAdvanceMsgListener` | Handles live, offline, online-only, revoked, deleted, and read-receipt changes. | +| Query | History, ID lookup, or search APIs | Queries return a message snapshot and do not replace real-time message listening. | +| Update | Revoke, delete, modify, pin, read, and local-extension APIs | Handle API results, related events, and any necessary list re-query separately. | ```java -OpenIMClient.getInstance().messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { - @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); } +messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override + public void onRecvNewMessage(Message message) { + messageStore.merge(message); + } + + @Override + public void onRecvOfflineNewMessage(List messages) { + messageStore.mergeAll(messages); + } + + @Override + public void onRecvMessageRevokedV2(RevokedInfo info) { + messageStore.markRevoked(info); + } + + @Override + public void onMsgDeleted(Message message) { + messageStore.remove(message.getClientMsgID()); + } }); ``` -Queries establish a snapshot, while `OnAdvanceMsgListener` merges incremental changes. Setting a listener on `MessageManager` replaces the current listener, so register it once in a shared state layer. +Calling `setAdvancedMsgListener()` on the same `MessageManager` replaces the current listener. Register it in the shared message state layer and dispatch the resulting changes to screens. + +## Message fields + +The message object returned by creation, sending, receiving, and querying APIs is a `Message`. Common fields include: + +| Field | Type | Description | +| ---------------------- | ----------------- | ------------------------------------------------------------------------------------------------ | +| `clientMsgID` | `String` | Client message ID used for list deduplication, state updates, and message lookup. | +| `serverMsgID` | `String` | Server message ID; it may not have a valid value before a message is sent successfully. | +| `sessionType` | `int` | Conversation type; use it with `recvID` and `groupID` to distinguish one-to-one and group chats. | +| `sendID` | `String` | Sender user ID. | +| `recvID` | `String` | Recipient user ID for a one-to-one message. | +| `groupID` | `String` | Group ID for a group message. | +| `msgFrom` | `int` | Indicates whether the message is user-level or system-level. | +| `contentType` | `int` | Message type; use `MessageType` constants to select the content field. | +| `createTime` | `long` | Message creation time; the Android model documents this value in nanoseconds. | +| `sendTime` | `long` | Message send time; the Android model documents this value in milliseconds. | +| `seq` | `int` | Server message sequence number. | +| `status` | `int` | Send state; use `MessageStatus` constants to interpret it. | +| `isRead` | `boolean` | Read-state snapshot stored on the current client. | +| `platformID` | `int` | Client platform from which the message was sent. | +| `senderNickname` | `String` | Snapshot of the sender's nickname. | +| `senderFaceUrl` | `String` | Snapshot of the sender's avatar URL. | +| `isReact` | `boolean` | Whether the message carries a reaction marker. | +| `isExternalExtensions` | `boolean` | Whether the message uses external extensions. | +| `offlinePush` | `OfflinePushInfo` | Offline-push content. | +| `attachedInfo` | `String` | SDK attachment information. | +| `ext` | `Object` | Android message attachment field. | +| `ex` | `Object` | Message attachment field. | +| `localEx` | `Object` | Message extension field stored only on the current device. | + +The message body is stored in the element field selected by `contentType`. Do not infer the message type from list position or rendered text: + +| Message content | Corresponding field | +| ---------------------------------------- | ---------------------------------------------------- | +| Text and rich text | `textElem`, `advancedTextElem` | +| Image, audio, video, and file | `pictureElem`, `soundElem`, `videoElem`, `fileElem` | +| @ mention and reply | `atTextElem`, `quoteElem` | +| Merged forward | `mergeElem` | +| Contact card, location, and emoji | `cardElem`, `locationElem`, `faceElem` | +| Custom message | `customElem` | +| Notification, typing, and attached state | `notificationElem`, `typingElem`, `attachedInfoElem` | + +## Create and send different content types + +Sending a message has two steps: + +1. Call the `create*Message()` method for the desired content to obtain a pending `Message`. +2. Pass that `Message` to [`sendMessage()`](/sdk/android/message/sending-messages/send-message). For a one-to-one chat, set `recvUid`; for a group chat, set `recvGid`. + +The available message types and creation methods are: + +| Message content | Creation API | +| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Text | [`createTextMessage()`](/sdk/android/message/creating-messages/create-text-message) | +| Rich text | [`createAdvancedTextMessage()`](/sdk/android/message/creating-messages/create-advanced-text-message) | +| @ mention | [`createTextAtMessage()`](/sdk/android/message/creating-messages/create-text-at-message) | +| Image | [`createImageMessage()`](/sdk/android/message/creating-messages/create-image-message), [`createImageMessageFromFullPath()`](/sdk/android/message/creating-messages/create-image-message-by-file), [`createImageMessageByURL()`](/sdk/android/message/creating-messages/create-image-message-by-url) | +| Audio | [`createSoundMessage()`](/sdk/android/message/creating-messages/create-sound-message), [`createSoundMessageFromFullPath()`](/sdk/android/message/creating-messages/create-sound-message-by-file), [`createSoundMessageByURL()`](/sdk/android/message/creating-messages/create-sound-message-by-url) | +| Video | [`createVideoMessage()`](/sdk/android/message/creating-messages/create-video-message), [`createVideoMessageFromFullPath()`](/sdk/android/message/creating-messages/create-video-message-by-file), [`createVideoMessageByURL()`](/sdk/android/message/creating-messages/create-video-message-by-url) | +| File | [`createFileMessage()`](/sdk/android/message/creating-messages/create-file-message), [`createFileMessageFromFullPath()`](/sdk/android/message/creating-messages/create-file-message-by-file), [`createFileMessageByURL()`](/sdk/android/message/creating-messages/create-file-message-by-url) | +| Contact card | [`createCardMessage()`](/sdk/android/message/creating-messages/create-card-message) | +| Location | [`createLocationMessage()`](/sdk/android/message/creating-messages/create-location-message) | +| Emoji | [`createFaceMessage()`](/sdk/android/message/creating-messages/create-face-message) | +| Reply | [`createQuoteMessage()`](/sdk/android/message/creating-messages/create-quote-message), [`createAdvancedQuoteMessage()`](/sdk/android/message/creating-messages/create-advanced-quote-message) | +| Forward | [`createForwardMessage()`](/sdk/android/message/creating-messages/create-forward-message) | +| Merged forward | [`createMergerMessage()`](/sdk/android/message/creating-messages/create-merger-message) | +| Custom message | [`createCustomMessage()`](/sdk/android/message/creating-messages/create-custom-message) | + +Choose the send method based on the media source. For a message created from a local path or local file, call `sendMessage()` so the SDK uploads the media during sending. For a message created from an existing remote URL with `create*MessageByURL()`, call [`sendMessageNotOss()`](/sdk/android/message/sending-messages/send-message-not-oss) to send the message without uploading the media again. + +## Find a page by task + +| Task | Page | +| -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Send an ordinary message or already-uploaded media | [Send a message](/sdk/android/message/sending-messages/send-message), [Send an uploaded media message](/sdk/android/message/sending-messages/send-message-not-oss) | +| Receive live, offline, and online-only messages | [Receive messages](/sdk/android/message/receiving-messages/receive-messages), [Receive custom business messages](/sdk/android/message/receiving-messages/receive-custom-business-messages) | +| Load message history or load it in reverse | [Load message history](/sdk/android/message/retrieving-messages/load-older-messages), [Load message history in reverse](/sdk/android/message/retrieving-messages/load-newer-messages) | +| Locate or search messages | [Find messages by ID](/sdk/android/message/retrieving-messages/find-messages-by-id), [Search messages](/sdk/android/message/searching-messages/search-messages) | +| Delete, revoke, modify, or pin messages | [Delete messages](/sdk/android/message/managing-messages/delete-saved-messages), [Revoke a message](/sdk/android/message/managing-messages/revoke-a-message), [Modify a message](/sdk/android/message/managing-messages/modify-a-message), [Pin a message](/sdk/android/message/managing-messages/set-message-pinned) | +| Manage conversation unread state and group read receipts | [Mark a conversation as read](/sdk/android/conversation/managing-conversations/mark-conversation-read), [Report group messages as read](/sdk/android/message/managing-read-status/send-group-read-receipts), [Get group message readers](/sdk/android/message/managing-read-status/get-group-message-readers) | +| Report or retrieve typing status | [Update typing status](/sdk/android/message/composing-messages/update-typing-status), [Get typing status](/sdk/android/message/composing-messages/get-typing-status) | +| Insert, delete, or extend current-device-only messages | [Insert a local one-to-one message](/sdk/android/message/managing-messages/insert-local-single-message), [Delete a local message](/sdk/android/message/managing-messages/delete-local-message), [Set a local message extension](/sdk/android/message/managing-messages/set-message-local-ex) | + +## State synchronization boundaries + +| Change | Handling location | Merge strategy | +| --------------------------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------- | +| New and offline messages | [Receive messages](/sdk/android/message/receiving-messages/receive-messages) | Determine the target conversation, then merge by `clientMsgID`. | +| Message revocation | `onRecvMessageRevokedV2` | Update the original message by the ID in the revoke information. | +| Message deletion | `onMsgDeleted` | Remove the message from the current conversation by ID. | +| C2C and group read receipts | `onRecvC2CReadReceipt`, `onRecvGroupMessageReadReceipt` | Update the corresponding message or conversation read state. | +| Message extension changes | `onRecvMessageExtensionsChanged` and related callbacks | Update extension fields by message ID without replacing the message body. | +| Typing status | [Update typing status](/sdk/android/message/composing-messages/update-typing-status) | Maintain temporary state by conversation and user, outside the ordinary message list. | + +For message revocation, deletion, read receipts, and extension changes, handle the API result first, then process the related `OnAdvanceMsgListener` callbacks. Re-query the message list when necessary. diff --git a/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx b/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx index 596a219233..586051b37f 100644 --- a/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx +++ b/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx @@ -11,14 +11,10 @@ platform: 'android' sourcePath: '/sdk/android/message/receiving-messages/receive-custom-business-messages' --- -The custom business callback carries a string payload. Validate its source and JSON structure according to your application protocol instead of rendering it directly as a `Message`. +The custom business callback carries a string payload. Parse it according to your application format instead of rendering it directly as a `Message`. ```java messageManager.setCustomBusinessListener(new OnCustomBusinessListener() { @Override public void onRecvCustomBusinessMessage(String payload) { handleBusiness(payload); } }); ``` - -This page owns the complete handling contract for `onRecvCustomBusinessMessage`. Include a protocol version and stable idempotency ID in the payload, and deduplicate by that ID. Do not depend on callback order or use a custom business message to grant client-side permissions. - -`MessageManager` retains only one custom business listener; setting another replaces the previous one. Register it once in an application-level event center, and stop dispatching into the previous account's state when signing out or switching accounts. diff --git a/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx b/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx index 309676bb92..a457313916 100644 --- a/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx +++ b/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/message/receiving-messages/receive-messages' --- -After calling `setAdvancedMsgListener()`, `onRecvNewMessage` receives real-time messages, `onRecvOfflineNewMessage` receives offline batches, and `onRecvOnlineOnlyMessage` receives online-only message strings. Merge all messages idempotently by `clientMsgID`. +After calling `setAdvancedMsgListener()`, `onRecvNewMessage` receives real-time messages, `onRecvOfflineNewMessage` receives offline batches, and `onRecvOnlineOnlyMessage` receives online-only messages. ```java messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx index f4cba4da2e..c2c9e15cd1 100644 --- a/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx +++ b/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx @@ -5,13 +5,13 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-17' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/retrieving-messages/find-messages-by-id' --- -Create a list of `SearchParams` for the messages you need. Merge returned records by message ID rather than treating their list positions as stable identifiers. +Create a list of `SearchParams` for the messages you need. ```java messageManager.findMessageList(new OnBase() { diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx index d9437e7ece..b66b1d3ba7 100644 --- a/content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx +++ b/content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-17' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/retrieving-messages/load-message-context' @@ -47,4 +47,4 @@ messageManager.fetchSurroundingMessages( In the success callback, `messages.getData()` is the list retrieved before and after the anchor. For message fields, see [Message overview](/sdk/android/message/overview-message). -`before` and `after` independently limit the number of messages on either side. The result can contain fewer messages than requested when the anchor is near a history boundary or some messages have been deleted. Merge by `conversationID:clientMsgID`; do not rely on fixed array positions. If the message must first be located, see [Find messages by ID](/sdk/android/message/retrieving-messages/find-messages-by-id). +`before` and `after` independently limit the number of messages on either side. The result can contain fewer messages than requested when the anchor is near a history boundary or some messages have been deleted. If the message must first be located, see [Find messages by ID](/sdk/android/message/retrieving-messages/find-messages-by-id). diff --git a/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx b/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx index 70819a9e5c..96c9639a0d 100644 --- a/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx +++ b/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/message/sending-messages/send-message-not-oss' --- -Use this method when the media URLs in the message are already available. It prevents the SDK from entering its built-in upload flow again. +Use this method when the media URLs are already included in the message. The media files do not need to be uploaded again. ```java messageManager.sendMessageNotOss(callback, message, peerUserID, null, offlinePushInfo); diff --git a/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx b/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx index 470ee3532e..7647163d67 100644 --- a/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx +++ b/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/message/sending-messages/send-message' --- -For a one-to-one message, set `recvUid` and pass `null` for the group target. For a group message, set `recvGid` and pass `null` for the user target. `OnMsgSendCallback` reports success, failure, and media upload progress. +For a one-to-one message, set `recvUid`. For a group message, set `recvGid`. `OnMsgSendCallback` reports success, failure, and media upload progress. ```java messageManager.sendMessage(new OnMsgSendCallback() { diff --git a/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx b/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx index a9048f9032..6e4246c9e5 100644 --- a/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx +++ b/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/message/sending-messages/set-msg-send-progress-listener' --- -Android does not provide a separate global send-progress listener. Each call to `sendMessage()` or `sendMessageNotOss()` reports progress through its own `OnMsgSendCallback`. +Use `OnMsgSendCallback.onProgress()` to receive progress updates for the current message. ```java messageManager.sendMessage(new OnMsgSendCallback() { diff --git a/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx b/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx deleted file mode 100644 index 984a0e57b7..0000000000 --- a/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: '监听文件上传进度' -description: '使用 Android SDK 的 OnPutFileListener 跟踪单次文件上传任务。' -sourcePath: '/sdk/android/file-uploads/track-file-upload-progress' ---- - -Android SDK 不设置全局文件上传 listener。每次调用 `uploadFile()` 时传入一个 `OnPutFileListener`,由该 listener 接收当前上传任务的进度、分片状态和完成信息。 - -```java -OnPutFileListener uploadListener = new OnPutFileListener() { - @Override - public void open(long size) { - initializeUploadProgress(uploadTaskID, size); - } - - @Override - public void uploadID(String id) { - bindSdkUploadID(uploadTaskID, id); - } - - @Override - public void uploadComplete(long fileSize, long uploadedSize, long storageSize) { - updateUploadProgress(uploadTaskID, uploadedSize, fileSize); - } - - @Override - public void uploadPartComplete(long partNumber, long partSize, String partHash) { - markPartComplete(uploadTaskID, partNumber, partSize, partHash); - } - - @Override - public void complete(long size, String url, long type) { - completeUpload(uploadTaskID, size, url, type); - } -}; - -OpenIMClient.getInstance().uploadFile(resultCallback, uploadListener, putArgs); -``` - -`open()` 可用于初始化总大小,`uploadID()` 返回 SDK 上传任务标识,`uploadComplete()` 提供上传过程数据,`uploadPartComplete()` 表示一个分片已经完成,`complete()` 返回最终大小、远端 URL 和资源类型。只有业务需要展示分片细节时才处理分片回调;普通进度条通常只需要过程回调和最终完成回调。 - -业务层仍应生成自己的稳定 `uploadTaskID`,并在 listener 闭包中关联界面状态。SDK 上传 ID、文件名和数组位置都不应代替业务任务主键。每个上传任务使用独立 listener;页面或账号状态销毁后应停止向旧状态分发回调。 - -完整的参数构造和错误处理见[上传文件](/sdk/android/file-uploads/upload-file)。 diff --git a/content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx b/content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx index b0e10e9ffd..10a925a3e1 100644 --- a/content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx +++ b/content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx @@ -8,13 +8,13 @@ sourcePath: '/sdk/android/file-uploads/upload-file' ## 参数说明 -| 参数 | 类型 | 是否必填 | 说明 | -| --- | --- | --- | --- | -| `base` | `OnBase` | 是 | 接收上传请求的最终成功或失败结果。 | -| `listener` | `OnPutFileListener` | 是 | 接收当前任务的上传进度、分片状态和完成信息。 | -| `putArgs.filepath` | `String` | 是 | Android 应用可读取的本地文件路径。 | -| `putArgs.name` | `String` | 是 | 上传使用的文件名;`PutArgs` 默认使用传入路径,可按业务需要改为原始文件名。 | -| `putArgs.cuase` | `String` | 否 | 业务约定的上传原因。字段名以 Android SDK 的 `PutArgs` 声明为准。 | +| 参数 | 类型 | 是否必填 | 说明 | +| ------------------ | ------------------- | -------- | -------------------------------------------------------------------------- | +| `base` | `OnBase` | 是 | 接收上传请求的最终成功或失败结果。 | +| `listener` | `OnPutFileListener` | 是 | 接收当前任务的文件、分片、哈希及上传完成信息。 | +| `putArgs.filepath` | `String` | 是 | Android 应用可读取的本地文件路径。 | +| `putArgs.name` | `String` | 是 | 上传使用的文件名;`PutArgs` 默认使用传入路径,可按业务需要改为原始文件名。 | +| `putArgs.cuase` | `String` | 否 | 业务约定的上传原因。字段名以 Android SDK 的 `PutArgs` 声明为准。 | ```java File file = new File(localPath); @@ -36,8 +36,18 @@ OpenIMClient.getInstance().uploadFile( }, new OnPutFileListener() { @Override - public void uploadComplete(long fileSize, long uploadedSize, long storageSize) { - updateUploadProgress(uploadTaskID, uploadedSize, fileSize); + public void open(long size) { + initializeUpload(uploadTaskID, size); + } + + @Override + public void uploadID(String id) { + bindSdkUploadID(uploadTaskID, id); + } + + @Override + public void uploadComplete(long fileSize, long streamSize, long storageSize) { + recordUploadSizes(uploadTaskID, fileSize, streamSize, storageSize); } @Override @@ -49,6 +59,19 @@ OpenIMClient.getInstance().uploadFile( ); ``` -每次调用都传入独立的 `OnPutFileListener`,因此无需设置全局上传 listener。并行上传时应由业务层为任务生成稳定 ID,并在回调闭包中关联对应任务,不要使用文件名或列表位置作为唯一标识。各回调的职责见[跟踪文件上传进度](/sdk/android/file-uploads/track-file-upload-progress)。 +## 回调说明 + +`OnPutFileListener` 的回调和参数如下: + +| 回调 | 参数 | 说明 | +| -------------------- | --------------------------------------- | ---------------------------------------------------- | +| `open` | `size` | 打开指定大小的文件,可用于初始化任务。 | +| `partSize` | `partSize`, `num` | 单个分片大小和分片总数。 | +| `hashPartProgress` | `index`, `size`, `partHash` | 单个分片完成哈希计算时的分片索引、大小和哈希值。 | +| `hashPartComplete` | `partsHash`, `fileHash` | 所有分片完成哈希计算后的组合哈希和最终文件哈希。 | +| `uploadID` | `uploadID` | SDK 生成的上传标识。 | +| `uploadPartComplete` | `index`, `partSize`, `partHash` | 一个分片上传完成时的分片索引、大小和哈希值。 | +| `uploadComplete` | `fileSize`, `streamSize`, `storageSize` | 整个文件上传阶段的数据:文件大小、流大小和存储大小。 | +| `complete` | `size`, `url`, `type` | 文件上传完成后的最终大小、远端 URL 和资源类型。 | `complete()` 返回的 URL 可用于后续更新头像、保存附件地址或创建 URL 类型的媒体消息。上传成功只表示文件资源已经写入远端;资料更新、消息创建和消息发送仍需分别调用对应 API。 diff --git a/content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx b/content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx index 279f782485..805d1ab4b7 100644 --- a/content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx +++ b/content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx @@ -4,7 +4,7 @@ description: '使用 getInputState 查询指定用户在会话中的当前输入 sourcePath: '/sdk/android/message/composing-messages/get-typing-status' --- -进入会话、连接恢复或需要校准状态时,查询指定用户当前正在输入的平台 ID 列表。 +查询指定用户当前正在输入的平台 ID 列表。 ```java OpenIMClient.getInstance().conversationManager.getInputState( @@ -25,4 +25,4 @@ OpenIMClient.getInstance().conversationManager.getInputState( ); ``` -成功 callback 返回平台 ID 数组快照;空列表表示查询时没有平台处于输入状态。查询本身不会触发输入状态事件。群聊中不要频繁轮询全部成员,只在进入页面、连接恢复或补偿状态时查询重点成员;在线增量由[上报输入状态](/sdk/android/message/composing-messages/update-typing-status)归属的 listener 维护。 +成功回调返回平台 ID 列表;空列表表示该用户当前没有平台处于输入状态。输入状态发生变化时,通过[上报输入状态](/sdk/android/message/composing-messages/update-typing-status)页面介绍的回调接收通知。 diff --git a/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx b/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx index 83c36e8052..438680a073 100644 --- a/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx +++ b/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx @@ -30,7 +30,7 @@ conversationManager.changeInputState( conversationManager.changeInputState(callback, conversationID, false); ``` -调用侧应合并连续的焦点变化,并在页面退出或连接中断前尝试上报 `false`。成功回调只表示上报请求完成,不表示其他客户端已经更新界面。 +避免频繁重复上报相同状态。成功回调表示上报请求已经完成。 其他客户端通过 `OnConversationListener.onConversationUserInputStatusChanged` 接收输入状态变化。Android SDK 以字符串形式返回事件载荷,应在校验 JSON 后再解析: @@ -52,6 +52,6 @@ public void onConversationUserInputStatusChanged(String payload) { } ``` -输入状态按 `conversationID:userID` 合并,并设置业务侧超时自动清除。`ConversationManager` 只保存一个会话 listener,本回调应与会话列表、总未读数和同步事件组合后统一设置。 +回调中的 `conversationID`、`userID` 和 `platformIDs` 分别表示会话、用户和正在输入的平台。`ConversationManager` 只能设置一个 `OnConversationListener`;如果应用还需要处理其他会话事件,请在同一个 listener 中实现相应回调。 -进入会话或连接恢复时,可通过[查询输入状态](/sdk/android/message/composing-messages/get-typing-status)获取当前快照。 +需要主动查询指定用户是否正在输入时,使用[查询输入状态](/sdk/android/message/composing-messages/get-typing-status)。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx index e9375d42cf..f2e48fd9b4 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx @@ -20,4 +20,4 @@ Message message = OpenIMClient.getInstance().messageManager.createAdvancedQuoteM ); ``` -被引用的 `originalMessage` 应包含稳定的 `clientMsgID`,实体范围必须对应最终回复正文。`type`、`url` 和 `info` 的业务协议与[创建富文本消息](/sdk/android/message/creating-messages/create-advanced-text-message)相同。本方法只创建待发送对象,不会自动发送。 +实体范围必须对应最终回复正文。`type`、`url` 和 `info` 的业务协议与[创建富文本消息](/sdk/android/message/creating-messages/create-advanced-text-message)相同。本方法只创建待发送对象,不会自动发送。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx index c803bbacc7..2497938947 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx @@ -4,7 +4,7 @@ description: '使用 createFaceMessage 创建自定义表情消息。' sourcePath: '/sdk/android/message/creating-messages/create-face-message' --- -`index` 表示表情位置,`data` 保存表情 URL 等 JSON 数据。 +`data` 保存表情 URL 等 JSON 数据。 ```java Message message = OpenIMClient.getInstance().messageManager.createFaceMessage(index, dataJson); diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx index a1526dfaed..9fc9b32b93 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx @@ -4,7 +4,7 @@ description: '使用 createMergerMessage 将多条消息合并为一条摘要消 sourcePath: '/sdk/android/message/creating-messages/create-merger-message' --- -传入消息列表、标题和摘要列表;摘要顺序应与展示协议保持一致。 +传入消息列表、标题和摘要列表。 ```java Message message = OpenIMClient.getInstance().messageManager.createMergerMessage( diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx index 977ef62f22..a60d9fd428 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx @@ -4,7 +4,7 @@ description: '使用 createQuoteMessage 创建引用已有消息的回复。' sourcePath: '/sdk/android/message/creating-messages/create-quote-message' --- -引用消息保存被引用的完整 `Message`,发送前应确保引用对象包含稳定的 `clientMsgID`。 +引用消息保存被引用的完整 `Message`。 ```java Message message = OpenIMClient.getInstance().messageManager diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx index 61732847ed..3ec208f970 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx @@ -4,7 +4,7 @@ description: '使用 createTextAtMessage 创建带成员提醒的文本消息。 sourcePath: '/sdk/android/message/creating-messages/create-text-at-message' --- -传入文本、被提醒用户 ID、`AtUserInfo` 列表和可选引用消息。 +传入文本、被 @ 用户 ID、`AtUserInfo` 列表和可选引用消息。 ```java Message message = OpenIMClient.getInstance().messageManager.createTextAtMessage( diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx index 080407ba62..f4ba2f887b 100644 --- a/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx @@ -4,7 +4,7 @@ description: '使用 createTextMessage 创建文本 Message。' sourcePath: '/sdk/android/message/creating-messages/create-text-message' --- -`createTextMessage()` 只创建本地消息对象,不发送消息。 +`createTextMessage()` 只创建待发送的 `Message`,不会发送消息。 ```java Message message = OpenIMClient.getInstance().messageManager.createTextMessage(text); diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx index dcb41dae6e..5e586f2381 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx @@ -36,13 +36,11 @@ messageManager.deleteMessages(request, new OnBase() { 成功回调表示删除请求已经完成;开启同步时,不代表其他客户端已经收到事件或完成界面更新。 -`OnAdvanceMsgListener.onMsgDeleted` 是本页归属事件。根据消息路由字段确定会话后,按 `clientMsgID` 幂等移除消息。 +开启同步后,其他客户端可通过 `OnAdvanceMsgListener.onMsgDeleted` 接收删除的消息: ```java @Override public void onMsgDeleted(Message message) { - removeMessage(resolveConversationID(message), message.getClientMsgID()); + handleDeletedMessage(message); } ``` - -需要校准当前消息快照时,重新查询对应会话的历史消息。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx index 63239d1731..1e929bb17b 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx @@ -22,15 +22,13 @@ messageManager.deleteUserAllMessagesInConv( ); ``` -该 API 只用于群聊,可删除指定用户在目标群会话中的全部消息。这是高影响的群组管控操作,不应放入普通单条消息菜单;操作者权限由 OpenIMServer 校验。成功回调不代表事件已经到达。 +该 API 只用于群聊,可删除指定用户在目标群会话中的全部消息。调用者没有操作权限时,通过 `onError` 返回错误。 -`OnAdvanceMsgListener.onDeleteUserAllMsgsInConv` 是本页归属事件。收到事件后,根据 `conversationID` 和 `userID` 移除缓存中该用户发送的消息,或重新读取会话历史进行校准。 +其他客户端通过 `OnAdvanceMsgListener.onDeleteUserAllMsgsInConv` 接收删除通知。回调参数包含对应的 `conversationID` 和 `userID`: ```java @Override public void onDeleteUserAllMsgsInConv(DeleteUserAllMsgsListenerMsg event) { - removeMessagesBySender(event.getConversationID(), event.getUserID()); + handleUserMessagesDeleted(event.getConversationID(), event.getUserID()); } ``` - -成功回调、事件到达和重新查询历史是三个独立阶段。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx index a8886cb400..2117a64206 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx @@ -4,7 +4,7 @@ description: '使用 getConversationPinnedMsgs 查询会话中的置顶消息。 sourcePath: '/sdk/android/message/managing-messages/get-pinned-messages' --- -查询结果是指定会话当前的置顶消息快照。 +成功回调返回指定会话当前的置顶消息列表。 ```java messageManager.getConversationPinnedMsgs(new OnBase>() { diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx index 398f05f14a..d9264d7ef0 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx @@ -4,7 +4,7 @@ description: '使用 insertSingleMessageToLocalStorage 插入仅当前设备可 sourcePath: '/sdk/android/message/managing-messages/insert-local-single-message' --- -该方法不向服务器发送消息,`receiver` 和 `sender` 用于建立本地消息归属。 +该方法不向服务器发送消息。`receiver` 是接收者用户 ID,`sender` 是发送者用户 ID。 ```java messageManager.insertSingleMessageToLocalStorage(callback, message, receiverUserID, senderUserID); diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx index ef13cc038a..5ca54ee1c2 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx @@ -4,25 +4,21 @@ description: '修改支持编辑的消息内容,并处理其他客户端收到 sourcePath: '/sdk/android/message/managing-messages/modify-a-message' --- -`modifyMessage` 用于修改会话中已经存在的消息。请求对象应保留原消息的会话 ID、`clientMsgID`、路由和发送者等字段,只更新允许修改的内容。 +`modifyMessage` 用于修改会话中已经存在的消息。通常应以原消息为基础修改支持编辑的内容,并保留其他字段。 ```java messageManager.modifyMessage(callback, modifyRequest); ``` -成功回调表示修改请求已经完成,不代表所有客户端界面都已经更新。其他客户端通过 `OnAdvanceMsgListener.onMessageModified` 接收修改后的完整 `Message`。 +成功回调表示修改请求已经完成。 -本页是 `onMessageModified` 的完整事件归属页。根据消息路由解析 `conversationID`,再按 `conversationID:clientMsgID` 替换原消息,不要按数组位置或显示文本匹配: +消息修改后,其他客户端通过 `OnAdvanceMsgListener.onMessageModified` 接收修改后的完整 `Message`: ```java @Override public void onMessageModified(Message message) { - String conversationID = resolveConversationID(message); - if (conversationID == null) { - return; - } - replaceMessage(conversationID, message.getClientMsgID(), message); + handleModifiedMessage(message); } ``` -该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。成功回调、修改事件到达和重新查询历史是三个独立阶段。 +`MessageManager` 只能设置一个 `OnAdvanceMsgListener`;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见[事件概览](/sdk/android/events/overview-events)。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx index 7479c49769..e614784ef1 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx @@ -4,28 +4,21 @@ description: '撤回已发送消息,并处理其他客户端收到的撤回通 sourcePath: '/sdk/android/message/managing-messages/revoke-a-message' --- -撤回会使其他客户端把原消息显示为撤回状态。调用前应确认消息已经发送成功,并由业务界面限制可撤回时间;最终权限由服务端校验。 +撤回会使其他客户端把原消息显示为撤回状态。调用失败时,通过错误回调获取错误码和错误信息。 ```java messageManager.revokeMessageV2(callback, conversationID, clientMsgID); ``` -成功回调表示服务端完成撤回请求,不代表所有客户端都已经收到事件。接收端通过 `OnAdvanceMsgListener.onRecvMessageRevokedV2` 合并撤回变化。 +成功回调表示撤回请求已经完成。其他客户端通过 `OnAdvanceMsgListener.onRecvMessageRevokedV2` 接收撤回通知。 -本页是 `onRecvMessageRevokedV2` 的完整事件归属页。`RevokedInfo` 包含 `clientMsgID`、撤回者和撤回时间,但不包含 `conversationID`,应先从当前账号的消息索引解析所属会话,再按 `conversationID:clientMsgID` 更新消息: +`RevokedInfo` 包含 `clientMsgID`、撤回者和撤回时间: ```java @Override public void onRecvMessageRevokedV2(RevokedInfo info) { - String clientMsgID = info.getClientMsgID(); - String conversationID = findConversationIDByClientMsgID(clientMsgID); - if (conversationID == null) { - return; - } - markMessageRevoked(conversationID, clientMsgID, info); + handleRevokedMessage(info); } ``` -接收端应把对应消息更新为撤回状态,而不是直接从列表删除。该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。 - -成功回调、撤回事件到达和重新查询历史是三个独立阶段。需要校准时重新读取对应会话的历史消息。 +接收端应把对应消息更新为撤回状态,而不是直接从列表删除。`MessageManager` 只能设置一个 `OnAdvanceMsgListener`;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见[事件概览](/sdk/android/events/overview-events)。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx index 8c812ae422..34fa3c24e7 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx @@ -17,13 +17,13 @@ messageManager.setConversationPinnedMsg( 成功回调表示设置请求完成,不代表置顶变化事件已经到达。 -`OnAdvanceMsgListener.onChangedPinnedMsg` 是本页归属事件。回调中的 `ChangedPinnedMsg` 包含 `conversationID` 和当前置顶消息集合;按会话替换集合,并按每条置顶消息的 `clientMsgID` 去重: +置顶消息发生变化时,`OnAdvanceMsgListener.onChangedPinnedMsg` 返回对应的 `conversationID` 和当前置顶消息列表: ```java @Override public void onChangedPinnedMsg(ChangedPinnedMsg event) { - replacePinnedMessages(event.getConversationID(), event.getMsgs()); + handlePinnedMessagesChanged(event.getConversationID(), event.getMsgs()); } ``` -该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。成功回调、事件到达和[查询会话置顶消息](/sdk/android/message/managing-messages/get-pinned-messages)取得的快照是三个独立阶段。 +`MessageManager` 只能设置一个 `OnAdvanceMsgListener`;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见[事件概览](/sdk/android/events/overview-events)。需要主动获取当前置顶消息时,使用[查询会话置顶消息](/sdk/android/message/managing-messages/get-pinned-messages)。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx b/content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx index 667a270226..69cb232f33 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx @@ -35,4 +35,4 @@ messageManager.getGroupMessageReaderList( ); ``` -成功回调返回当前页 `GroupMembersInfo` 列表,字段含义见[分页查询群成员](/sdk/android/group/retrieving-group-members/get-group-member-list)。按 `groupID:userID` 去重;查询只建立当前快照,不触发回执事件。需要完整列表时继续分页。 +成功回调返回当前页 `GroupMembersInfo` 列表,字段含义见[分页查询群成员](/sdk/android/group/retrieving-group-members/get-group-member-list)。需要完整列表时继续分页。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx b/content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx index aa0852b8dc..ad6f6fbdc6 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx @@ -24,13 +24,13 @@ messageManager.sendGroupMessageReadReceipt( 同一批消息必须属于目标群会话。成功回调只表示服务端接受上报,不代表其他客户端界面已经更新。会话未读数仍由 `markConversationMessageAsRead` 独立维护。 -其他客户端通过 `OnAdvanceMsgListener.onRecvGroupMessageReadReceipt` 接收群聊成员级已读变化。本页是该事件的完整监听归属页;根据 `conversationID` 以及回执中的消息 ID 合并消息已读数、未读数和成员信息。 +其他客户端通过 `OnAdvanceMsgListener.onRecvGroupMessageReadReceipt` 接收群消息已读回执: ```java @Override public void onRecvGroupMessageReadReceipt(GroupMessageReceipt receipt) { - mergeGroupReadReceipt(receipt); + handleGroupMessageReadReceipt(receipt); } ``` -上报回调、群回执事件和[查询群消息已读成员](/sdk/android/message/managing-read-status/get-group-message-readers)取得的成员快照是三个独立阶段。 +需要查询某条群消息的已读或未读成员时,使用[查询群消息已读成员](/sdk/android/message/managing-read-status/get-group-message-readers)。 diff --git a/content/zh/docs/chat/sdk/android/message/overview-message.mdx b/content/zh/docs/chat/sdk/android/message/overview-message.mdx index 57abdea9ad..7882702afe 100644 --- a/content/zh/docs/chat/sdk/android/message/overview-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/overview-message.mdx @@ -4,12 +4,128 @@ description: '了解 Android SDK 的 Message 模型、消息生命周期和消 sourcePath: '/sdk/android/message/overview-message' --- -Android 消息以 `Message` 表示,使用 `clientMsgID` 去重,使用 `sessionType`、`recvID` 和 `groupID` 区分单聊与群聊。消息内容由对应的 element 字段承载,发送、接收、撤回和删除是不同的状态变化。 +Android SDK 使用 `Message` 表示一条消息。消息创建、发送、接收、查询和状态变更是不同阶段;创建 `Message` 不会发送消息,发送成功也不代表其他客户端已经完成接收。 + +消息列表通常以 `clientMsgID` 作为客户端去重和更新键,并结合当前会话上下文判断消息属于单聊还是群聊。`Message` 本身不包含 `conversationID`,会话 ID 来自当前会话、历史查询参数或消息事件上下文。 + +## 消息处理流程 + +| 阶段 | Android API 或回调 | 说明 | +| ---- | ------------------------------------------ | ----------------------------------------------------------------- | +| 创建 | `MessageManager.create*Message()` | 创建待发送的 `Message` 对象,不写入服务端,也不会触发新消息回调。 | +| 发送 | `sendMessage()` 或 `sendMessageNotOss()` | 单聊传入 `recvUid`,群聊传入 `recvGid`。 | +| 接收 | `OnAdvanceMsgListener` | 处理实时、离线、在线消息以及撤回、删除和已读回执等变化。 | +| 查询 | 历史消息、按 ID 查找或搜索 API | 查询结果是调用时的消息快照,不代替实时消息监听。 | +| 更新 | 撤回、删除、修改、置顶、已读和本地扩展 API | 分别处理 API 结果、对应事件和必要的列表重新查询。 | ```java -OpenIMClient.getInstance().messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { - @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); } +messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override + public void onRecvNewMessage(Message message) { + messageStore.merge(message); + } + + @Override + public void onRecvOfflineNewMessage(List messages) { + messageStore.mergeAll(messages); + } + + @Override + public void onRecvMessageRevokedV2(RevokedInfo info) { + messageStore.markRevoked(info); + } + + @Override + public void onMsgDeleted(Message message) { + messageStore.remove(message.getClientMsgID()); + } }); ``` -查询建立快照,`OnAdvanceMsgListener` 合并增量;`MessageManager` 的 listener 设置会替换当前 listener。 +重复调用 `MessageManager` 的 `setAdvancedMsgListener()` 会覆盖之前设置的 listener。应用应在统一的消息状态层注册一次,再把回调中的消息变化分发给页面。 + +## Message 字段 + +创建、发送、接收和查询返回的消息对象都是 `Message`。常用字段如下: + +| 字段 | 类型 | 说明 | +| ---------------- | ----------------- | --------------------------------------------------- | +| `clientMsgID` | `String` | 客户端消息 ID,用于列表去重、状态更新和定位消息。 | +| `serverMsgID` | `String` | 服务端消息 ID;消息尚未成功发送时可能没有有效值。 | +| `sessionType` | `int` | 会话类型;结合 `recvID`、`groupID` 判断单聊或群聊。 | +| `sendID` | `String` | 发送者用户 ID。 | +| `recvID` | `String` | 单聊接收方用户 ID。 | +| `groupID` | `String` | 群聊对应的群组 ID。 | +| `msgFrom` | `int` | 标识消息是用户级别还是系统级别。 | +| `contentType` | `int` | 消息类型,使用 `MessageType` 常量判断内容字段。 | +| `createTime` | `long` | 消息对象创建时间,Android SDK 模型注释约定为纳秒。 | +| `sendTime` | `long` | 消息发送时间,Android SDK 模型注释约定为毫秒。 | +| `seq` | `int` | 服务端消息序号。 | +| `status` | `int` | 发送状态,使用 `MessageStatus` 常量判断。 | +| `isRead` | `boolean` | 当前客户端保存的已读状态。 | +| `platformID` | `int` | 发送消息的客户端平台。 | +| `senderNickname` | `String` | 发送者昵称快照。 | +| `senderFaceUrl` | `String` | 发送者头像 URL 快照。 | +| `offlinePush` | `OfflinePushInfo` | 离线推送内容。 | +| `attachedInfo` | `String` | SDK 附加信息。 | +| `ext` | `Object` | Android 消息附加字段。 | +| `ex` | `Object` | 消息附加字段。 | +| `localEx` | `Object` | 仅保存在当前设备的消息扩展字段。 | + +消息正文位于与 `contentType` 对应的 element 字段中,不要根据列表位置或展示文本判断消息类型: + +| 消息内容 | 对应字段 | +| ------------------------ | ---------------------------------------------------- | +| 文本、富文本 | `textElem`、`advancedTextElem` | +| 图片、音频、视频、文件 | `pictureElem`、`soundElem`、`videoElem`、`fileElem` | +| @ 消息、回复消息 | `atTextElem`、`quoteElem` | +| 合并转发 | `mergeElem` | +| 名片、位置、表情 | `cardElem`、`locationElem`、`faceElem` | +| 自定义消息 | `customElem` | +| 通知、输入状态和附加状态 | `notificationElem`、`typingElem`、`attachedInfoElem` | + +## 创建和发送不同内容 + +发送一条消息分为两个步骤: + +1. 调用对应内容类型的 `create*Message()` 方法,获得待发送的 `Message`。 +2. 将该 `Message` 传给 [`sendMessage()`](/sdk/android/message/sending-messages/send-message)。单聊设置 `recvUid`,群聊设置 `recvGid`。 + +下表列出了可创建的消息类型及其对应页面: + +| 内容 | 页面 | +| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 文本与富文本 | [创建文本消息](/sdk/android/message/creating-messages/create-text-message)、[创建富文本消息](/sdk/android/message/creating-messages/create-advanced-text-message) | +| @ 消息 | [创建 @ 消息](/sdk/android/message/creating-messages/create-text-at-message) | +| 图片、音频、视频和文件 | [创建图片消息](/sdk/android/message/creating-messages/create-image-message)、[创建文件消息](/sdk/android/message/creating-messages/create-file-message) | +| 名片、位置和表情 | [创建名片消息](/sdk/android/message/creating-messages/create-card-message)、[创建位置消息](/sdk/android/message/creating-messages/create-location-message)、[创建表情消息](/sdk/android/message/creating-messages/create-face-message) | +| 回复、转发和合并转发 | [创建回复消息](/sdk/android/message/creating-messages/create-quote-message)、[创建转发消息](/sdk/android/message/creating-messages/create-forward-message)、[创建合并转发消息](/sdk/android/message/creating-messages/create-merger-message) | +| 自定义业务内容 | [创建自定义消息](/sdk/android/message/creating-messages/create-custom-message) | + +发送本地路径或本地文件创建的媒体消息时,调用 `sendMessage()`,SDK 会在发送过程中上传媒体文件。使用已有远端 URL 创建媒体消息时,调用对应的 `create*MessageByURL()` 方法,再通过 [`sendMessageNotOss()`](/sdk/android/message/sending-messages/send-message-not-oss) 发送,无需再次上传媒体文件。 + +## 按任务查找页面 + +| 任务 | 页面 | +| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 发送普通消息或已上传的媒体消息 | [发送消息](/sdk/android/message/sending-messages/send-message)、[发送不经 OSS 的消息](/sdk/android/message/sending-messages/send-message-not-oss) | +| 接收实时、离线和在线消息 | [接收消息](/sdk/android/message/receiving-messages/receive-messages)、[接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) | +| 加载历史消息或反向加载消息 | [加载历史消息](/sdk/android/message/retrieving-messages/load-older-messages)、[反向加载历史消息](/sdk/android/message/retrieving-messages/load-newer-messages) | +| 按 ID 定位或搜索消息 | [按 ID 查找消息](/sdk/android/message/retrieving-messages/find-messages-by-id)、[搜索消息](/sdk/android/message/searching-messages/search-messages) | +| 删除、撤回、修改或置顶消息 | [删除消息](/sdk/android/message/managing-messages/delete-saved-messages)、[撤回消息](/sdk/android/message/managing-messages/revoke-a-message)、[修改消息](/sdk/android/message/managing-messages/modify-a-message)、[设置消息置顶](/sdk/android/message/managing-messages/set-message-pinned) | +| 管理会话未读数和群聊已读回执 | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read)、[上报群消息已读](/sdk/android/message/managing-read-status/send-group-read-receipts)、[查询群消息已读成员](/sdk/android/message/managing-read-status/get-group-message-readers) | +| 上报或查询输入状态 | [更新输入状态](/sdk/android/message/composing-messages/update-typing-status)、[查询输入状态](/sdk/android/message/composing-messages/get-typing-status) | +| 插入、删除或扩展仅当前设备可见的消息 | [插入本地单聊消息](/sdk/android/message/managing-messages/insert-local-single-message)、[删除本地消息](/sdk/android/message/managing-messages/delete-local-message)、[设置消息本地扩展](/sdk/android/message/managing-messages/set-message-local-ex) | + +## 状态同步边界 + +| 变化 | 处理位置 | 合并方式 | +| ------------------ | ---------------------------------------------------------------------------- | ---------------------------------------------- | +| 新消息和离线消息 | [接收消息](/sdk/android/message/receiving-messages/receive-messages) | 先确定目标会话,再按 `clientMsgID` 合并。 | +| 消息撤回 | `onRecvMessageRevokedV2` | 按撤回信息中的消息 ID 更新原消息状态。 | +| 消息删除 | `onMsgDeleted` | 按消息 ID 从当前会话列表移除。 | +| C2C 和群聊已读回执 | `onRecvC2CReadReceipt`、`onRecvGroupMessageReadReceipt` | 更新对应消息或会话的已读状态。 | +| 消息扩展变化 | `onRecvMessageExtensionsChanged` 等回调 | 按消息 ID 更新扩展字段,不替换整条消息的正文。 | +| 输入状态 | [更新输入状态](/sdk/android/message/composing-messages/update-typing-status) | 按会话和用户更新临时状态,不写入普通消息列表。 | + +对于撤回、删除、已读和消息扩展等状态变化,应先处理 API 的调用结果,再通过 `OnAdvanceMsgListener` 同步相关回调;必要时重新查询消息列表。 diff --git a/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx index f1154c2d43..778fe7f27a 100644 --- a/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx @@ -4,14 +4,10 @@ description: '使用 setCustomBusinessListener 接收独立于普通聊天消息 sourcePath: '/sdk/android/message/receiving-messages/receive-custom-business-messages' --- -自定义业务回调携带字符串,业务侧应按协议校验来源和 JSON 结构,不要将其直接当作 `Message` 渲染。 +自定义业务回调携带字符串,业务侧应按约定格式解析,不要将其直接当作 `Message` 渲染。 ```java messageManager.setCustomBusinessListener(new OnCustomBusinessListener() { @Override public void onRecvCustomBusinessMessage(String payload) { handleBusiness(payload); } }); ``` - -本页是 `onRecvCustomBusinessMessage` 的完整处理归属页。载荷应包含业务协议版本和稳定幂等 ID,并按该 ID 去重;不要依赖回调顺序,也不要使用自定义业务消息授予客户端权限。 - -`MessageManager` 只保存一个自定义业务 listener,后一次设置会替换前一次。应在应用级事件中心设置一次,并在退出或切换账号时停止向旧账号状态分发。 diff --git a/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx index aba5b08446..a40a62f25f 100644 --- a/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx @@ -4,7 +4,7 @@ description: '使用 OnAdvanceMsgListener 接收新消息、离线消息和在 sourcePath: '/sdk/android/message/receiving-messages/receive-messages' --- -设置 `setAdvancedMsgListener()` 后,`onRecvNewMessage` 接收实时消息,`onRecvOfflineNewMessage` 接收离线批次,`onRecvOnlineOnlyMessage` 接收在线消息字符串。所有消息都按 `clientMsgID` 幂等合并。 +设置 `setAdvancedMsgListener()` 后,`onRecvNewMessage` 接收实时消息,`onRecvOfflineNewMessage` 接收离线批次,`onRecvOnlineOnlyMessage` 仅接收在线消息。 ```java messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx index 2583ae4544..61e502a207 100644 --- a/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx @@ -4,7 +4,7 @@ description: '使用 findMessageList 按 SearchParams 查询消息记录。' sourcePath: '/sdk/android/message/retrieving-messages/find-messages-by-id' --- -构造 `SearchParams` 列表查询消息。返回结果应按消息 ID 合并,不要用列表位置作为稳定标识。 +构造 `SearchParams` 列表查询消息。 ```java messageManager.findMessageList(new OnBase() { diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx index dcf4caaa73..a49bef9e50 100644 --- a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx @@ -40,4 +40,4 @@ messageManager.fetchSurroundingMessages( 成功回调中的 `messages.getData()` 是锚点前后取得的消息列表,消息字段见[消息概览](/sdk/android/message/overview-message)。 -`before` 和 `after` 分别限制锚点前后的数量。返回结果可能少于请求总数,例如锚点靠近历史边界或部分消息已经删除。按 `conversationID:clientMsgID` 合并,不要依赖固定数组位置。需要先定位消息时见[按 ID 查找消息](/sdk/android/message/retrieving-messages/find-messages-by-id)。 +`before` 和 `after` 分别限制锚点前后的数量。锚点靠近历史边界或部分消息已经删除时,返回结果可能少于请求总数。需要先定位消息时,见[按 ID 查找消息](/sdk/android/message/retrieving-messages/find-messages-by-id)。 diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx index 2d5fe56db3..70944a40e1 100644 --- a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx @@ -4,7 +4,7 @@ description: '使用 sendMessageNotOss 发送已经由业务上传资源的媒 sourcePath: '/sdk/android/message/sending-messages/send-message-not-oss' --- -消息中的媒体 URL 已准备好时使用该方法,避免 SDK 再次进入内置上传流程。 +消息中已有媒体 URL 时使用该方法,无需再次上传媒体文件。 ```java messageManager.sendMessageNotOss(callback, message, peerUserID, null, offlinePushInfo); diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx index d18b4047c5..e5238bbe27 100644 --- a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx @@ -4,7 +4,7 @@ description: '使用 sendMessage 将 Message 发送到单聊或群聊。' sourcePath: '/sdk/android/message/sending-messages/send-message' --- -单聊填写 `recvUid`,群聊填写 `recvGid`,另一个目标参数传 `null`。`OnMsgSendCallback` 同时承载成功、失败和媒体进度。 +单聊填写 `recvUid`,群聊填写 `recvGid`。通过 `OnMsgSendCallback` 处理发送成功、失败和媒体进度。 ```java messageManager.sendMessage(new OnMsgSendCallback() { diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx index 521d34e08e..52469a47f2 100644 --- a/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx @@ -4,7 +4,7 @@ description: '通过 OnMsgSendCallback 的进度回调更新媒体发送进度 sourcePath: '/sdk/android/message/sending-messages/set-msg-send-progress-listener' --- -Android 没有独立的全局发送进度 listener;进度随每次 `sendMessage()` 或 `sendMessageNotOss()` 传入的 `OnMsgSendCallback` 返回。 +通过 `OnMsgSendCallback.onProgress()` 获取当前消息的发送进度。 ```java messageManager.sendMessage(new OnMsgSendCallback() { diff --git a/data/structure/android-content-audit.json b/data/structure/android-content-audit.json index a8d324a7df..b88977ce5a 100644 --- a/data/structure/android-content-audit.json +++ b/data/structure/android-content-audit.json @@ -3312,7 +3312,9 @@ "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/Message.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/enums/MessageType.java" ], "sdkMethods": [ "setAdvancedMsgListener" @@ -3322,11 +3324,14 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" + "MessageManager.setAdvancedMsgListener", + "Message", + "MessageType", + "OnAdvanceMsgListener" ], "reason": null } @@ -3334,11 +3339,14 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" + "MessageManager.setAdvancedMsgListener", + "Message", + "MessageType", + "OnAdvanceMsgListener" ], "reason": null } @@ -3362,7 +3370,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -3374,7 +3382,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -3402,7 +3410,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4042,7 +4050,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4054,7 +4062,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4082,7 +4090,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4094,7 +4102,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4166,7 +4174,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4179,7 +4187,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4248,7 +4256,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4260,7 +4268,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4288,7 +4296,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4300,7 +4308,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4328,7 +4336,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4340,7 +4348,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4366,7 +4374,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4378,7 +4386,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4407,7 +4415,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4419,7 +4427,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4450,7 +4458,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4463,7 +4471,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4572,7 +4580,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4584,7 +4592,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4613,7 +4621,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4626,7 +4634,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4699,7 +4707,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4712,7 +4720,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4741,7 +4749,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4753,7 +4761,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4823,7 +4831,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4836,7 +4844,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4869,7 +4877,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4882,7 +4890,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4913,7 +4921,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4926,7 +4934,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4957,7 +4965,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4970,7 +4978,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -4999,7 +5007,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -5011,7 +5019,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -5041,7 +5049,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -5054,7 +5062,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -5083,7 +5091,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -5095,7 +5103,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -5287,7 +5295,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -5300,7 +5308,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -5330,7 +5338,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -5342,7 +5350,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-17", "exampleVerification": { "status": "verified", "evidence": [ @@ -5354,47 +5362,6 @@ }, "redirectTo": null }, - { - "currentPath": "/sdk/android/file-uploads/track-file-upload-progress", - "targetPath": "/sdk/android/file-uploads/track-file-upload-progress", - "sourceKind": "openim-specific", - "disposition": "adapt", - "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnPutFileListener.java" - ], - "sdkMethods": [], - "sdkEvents": [], - "locales": { - "zh": { - "reviewStatus": "published", - "reviewer": "Codex", - "reviewedAt": "2026-08-10", - "exampleVerification": { - "status": "verified", - "evidence": [ - "OpenIMClient.uploadFile", - "OnPutFileListener" - ], - "reason": null - } - }, - "en": { - "reviewStatus": "published", - "reviewer": "Codex", - "reviewedAt": "2026-08-10", - "exampleVerification": { - "status": "verified", - "evidence": [ - "OpenIMClient.uploadFile", - "OnPutFileListener" - ], - "reason": null - } - } - }, - "redirectTo": null - }, { "currentPath": "/sdk/android/file-uploads/upload-file", "targetPath": "/sdk/android/file-uploads/upload-file", diff --git a/data/structure/android-navigation-labels.json b/data/structure/android-navigation-labels.json index e75bc1a784..ab448d4393 100644 --- a/data/structure/android-navigation-labels.json +++ b/data/structure/android-navigation-labels.json @@ -307,8 +307,8 @@ "load-message-context": "读取消息上下文", "Search messages": "搜索消息", "search-messages": "搜索消息", - "Composing messages": "编辑消息", - "composing-messages": "编辑消息", + "Typing status": "输入状态", + "composing-messages": "输入状态", "Update typing status": "上报输入状态", "update-typing-status": "上报输入状态", "Get typing status": "查询输入状态", @@ -364,10 +364,6 @@ "Insert a local group message": "插入本地群聊消息", "Clear local and server messages": "清理全部消息", "Set a local message extension": "设置消息本地扩展", - "File uploads": "文件上传", - "file-uploads": "文件上传", - "Track file upload progress": "监听文件上传进度", - "track-file-upload-progress": "监听文件上传进度", "Upload a file": "上传文件", "upload-file": "上传文件", "Calling": "音视频通话", diff --git a/data/structure/android-sidebar.json b/data/structure/android-sidebar.json index c1cef64e32..544936e1d7 100644 --- a/data/structure/android-sidebar.json +++ b/data/structure/android-sidebar.json @@ -493,7 +493,7 @@ }, { "id": "message/composing-messages", - "title": "Composing messages", + "title": "Typing status", "children": [ { "path": "/sdk/android/message/composing-messages/update-typing-status", @@ -546,18 +546,8 @@ ] }, { - "id": "file-uploads", - "title": "File uploads", - "children": [ - { - "path": "/sdk/android/file-uploads/track-file-upload-progress", - "navigationTitle": "Track file upload progress" - }, - { - "path": "/sdk/android/file-uploads/upload-file", - "navigationTitle": "Upload a file" - } - ] + "path": "/sdk/android/file-uploads/upload-file", + "navigationTitle": "Upload a file" }, { "id": "calling", diff --git a/data/structure/chat-pages.json b/data/structure/chat-pages.json index 8417219876..4bf7db140d 100644 --- a/data/structure/chat-pages.json +++ b/data/structure/chat-pages.json @@ -2935,14 +2935,6 @@ "template": "guide", "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx" }, - { - "sourcePath": "/sdk/android/file-uploads/track-file-upload-progress", - "openimPath": "/sdk/android/file-uploads/track-file-upload-progress", - "title": "Track file upload progress", - "context": "chat/sdk/android", - "template": "guide", - "contentFile": "content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx" - }, { "sourcePath": "/sdk/android/file-uploads/upload-file", "openimPath": "/sdk/android/file-uploads/upload-file", diff --git a/scripts/sync-client-sdk-route-skeletons.mjs b/scripts/sync-client-sdk-route-skeletons.mjs index 6d7826555d..397fb52bcc 100644 --- a/scripts/sync-client-sdk-route-skeletons.mjs +++ b/scripts/sync-client-sdk-route-skeletons.mjs @@ -58,7 +58,6 @@ const androidRouteTitles = { 'message/creating-messages/create-advanced-text-message': 'Create a rich-text message', 'message/creating-messages/create-advanced-quote-message': 'Create a rich-text reply', 'message/composing-messages/get-typing-status': 'Retrieve typing status', - 'file-uploads/track-file-upload-progress': 'Track file upload progress', }; const conversationGroupTitles = { diff --git a/src/generated/android-sdk-zh-content.json b/src/generated/android-sdk-zh-content.json index f080996bbc..9956fc6840 100644 --- a/src/generated/android-sdk-zh-content.json +++ b/src/generated/android-sdk-zh-content.json @@ -1,8 +1,8 @@ { "sourceContext": "chat/sdk/android", "sourceRoot": "content/zh/docs/chat/sdk/android", - "pageCount": 146, - "manualPageCount": 146, + "pageCount": 145, + "manualPageCount": 145, "pendingPaths": [], "reviewStates": { "/sdk/android/overview": "published", @@ -135,7 +135,6 @@ "/sdk/android/message/managing-messages/set-message-local-ex": "published", "/sdk/android/message/managing-read-status/send-group-read-receipts": "published", "/sdk/android/message/managing-read-status/get-group-message-readers": "published", - "/sdk/android/file-uploads/track-file-upload-progress": "published", "/sdk/android/file-uploads/upload-file": "published", "/sdk/android/calling/overview-calling": "published", "/sdk/android/calling/managing-calls/start-single-call": "published", @@ -461,8 +460,8 @@ "load-message-context": "读取消息上下文", "Search messages": "搜索消息", "search-messages": "搜索消息", - "Composing messages": "编辑消息", - "composing-messages": "编辑消息", + "Typing status": "输入状态", + "composing-messages": "输入状态", "Update typing status": "上报输入状态", "update-typing-status": "上报输入状态", "Get typing status": "查询输入状态", @@ -517,10 +516,6 @@ "Insert a local one-to-one message": "插入本地单聊消息", "Clear local and server messages": "清理全部消息", "Set a local message extension": "设置消息本地扩展", - "File uploads": "文件上传", - "file-uploads": "文件上传", - "Track file upload progress": "监听文件上传进度", - "track-file-upload-progress": "监听文件上传进度", "Upload a file": "上传文件", "upload-file": "上传文件", "Calling": "音视频通话", @@ -1346,21 +1341,47 @@ "title": "设置群成员禁言" }, "/sdk/android/message/overview-message": { - "body": "Android 消息以 `Message` 表示,使用 `clientMsgID` 去重,使用 `sessionType`、`recvID` 和 `groupID` 区分单聊与群聊。消息内容由对应的 element 字段承载,发送、接收、撤回和删除是不同的状态变化。\n\n```java\nOpenIMClient.getInstance().messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); }\n});\n```\n\n查询建立快照,`OnAdvanceMsgListener` 合并增量;`MessageManager` 的 listener 设置会替换当前 listener。", + "body": "Android SDK 使用 `Message` 表示一条消息。消息创建、发送、接收、查询和状态变更是不同阶段;创建 `Message` 不会发送消息,发送成功也不代表其他客户端已经完成接收。\n\n消息列表通常以 `clientMsgID` 作为客户端去重和更新键,并结合当前会话上下文判断消息属于单聊还是群聊。`Message` 本身不包含 `conversationID`,会话 ID 来自当前会话、历史查询参数或消息事件上下文。\n\n## 消息处理流程\n\n| 阶段 | Android API 或回调 | 说明 |\n| ---- | ------------------------------------------ | ----------------------------------------------------------------- |\n| 创建 | `MessageManager.create*Message()` | 创建待发送的 `Message` 对象,不写入服务端,也不会触发新消息回调。 |\n| 发送 | `sendMessage()` 或 `sendMessageNotOss()` | 单聊传入 `recvUid`,群聊传入 `recvGid`。 |\n| 接收 | `OnAdvanceMsgListener` | 处理实时、离线、在线消息以及撤回、删除和已读回执等变化。 |\n| 查询 | 历史消息、按 ID 查找或搜索 API | 查询结果是调用时的消息快照,不代替实时消息监听。 |\n| 更新 | 撤回、删除、修改、置顶、已读和本地扩展 API | 分别处理 API 结果、对应事件和必要的列表重新查询。 |\n\n```java\nmessageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override\n public void onRecvNewMessage(Message message) {\n messageStore.merge(message);\n }\n\n @Override\n public void onRecvOfflineNewMessage(List messages) {\n messageStore.mergeAll(messages);\n }\n\n @Override\n public void onRecvMessageRevokedV2(RevokedInfo info) {\n messageStore.markRevoked(info);\n }\n\n @Override\n public void onMsgDeleted(Message message) {\n messageStore.remove(message.getClientMsgID());\n }\n});\n```\n\n重复调用 `MessageManager` 的 `setAdvancedMsgListener()` 会覆盖之前设置的 listener。应用应在统一的消息状态层注册一次,再把回调中的消息变化分发给页面。\n\n## Message 字段\n\n创建、发送、接收和查询返回的消息对象都是 `Message`。常用字段如下:\n\n| 字段 | 类型 | 说明 |\n| ---------------- | ----------------- | --------------------------------------------------- |\n| `clientMsgID` | `String` | 客户端消息 ID,用于列表去重、状态更新和定位消息。 |\n| `serverMsgID` | `String` | 服务端消息 ID;消息尚未成功发送时可能没有有效值。 |\n| `sessionType` | `int` | 会话类型;结合 `recvID`、`groupID` 判断单聊或群聊。 |\n| `sendID` | `String` | 发送者用户 ID。 |\n| `recvID` | `String` | 单聊接收方用户 ID。 |\n| `groupID` | `String` | 群聊对应的群组 ID。 |\n| `msgFrom` | `int` | 标识消息是用户级别还是系统级别。 |\n| `contentType` | `int` | 消息类型,使用 `MessageType` 常量判断内容字段。 |\n| `createTime` | `long` | 消息对象创建时间,Android SDK 模型注释约定为纳秒。 |\n| `sendTime` | `long` | 消息发送时间,Android SDK 模型注释约定为毫秒。 |\n| `seq` | `int` | 服务端消息序号。 |\n| `status` | `int` | 发送状态,使用 `MessageStatus` 常量判断。 |\n| `isRead` | `boolean` | 当前客户端保存的已读状态。 |\n| `platformID` | `int` | 发送消息的客户端平台。 |\n| `senderNickname` | `String` | 发送者昵称快照。 |\n| `senderFaceUrl` | `String` | 发送者头像 URL 快照。 |\n| `offlinePush` | `OfflinePushInfo` | 离线推送内容。 |\n| `attachedInfo` | `String` | SDK 附加信息。 |\n| `ext` | `Object` | Android 消息附加字段。 |\n| `ex` | `Object` | 消息附加字段。 |\n| `localEx` | `Object` | 仅保存在当前设备的消息扩展字段。 |\n\n消息正文位于与 `contentType` 对应的 element 字段中,不要根据列表位置或展示文本判断消息类型:\n\n| 消息内容 | 对应字段 |\n| ------------------------ | ---------------------------------------------------- |\n| 文本、富文本 | `textElem`、`advancedTextElem` |\n| 图片、音频、视频、文件 | `pictureElem`、`soundElem`、`videoElem`、`fileElem` |\n| @ 消息、回复消息 | `atTextElem`、`quoteElem` |\n| 合并转发 | `mergeElem` |\n| 名片、位置、表情 | `cardElem`、`locationElem`、`faceElem` |\n| 自定义消息 | `customElem` |\n| 通知、输入状态和附加状态 | `notificationElem`、`typingElem`、`attachedInfoElem` |\n\n## 创建和发送不同内容\n\n发送一条消息分为两个步骤:\n\n1. 调用对应内容类型的 `create*Message()` 方法,获得待发送的 `Message`。\n2. 将该 `Message` 传给 [`sendMessage()`](/sdk/android/message/sending-messages/send-message)。单聊设置 `recvUid`,群聊设置 `recvGid`。\n\n下表列出了可创建的消息类型及其对应页面:\n\n| 内容 | 页面 |\n| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 文本与富文本 | [创建文本消息](/sdk/android/message/creating-messages/create-text-message)、[创建富文本消息](/sdk/android/message/creating-messages/create-advanced-text-message) |\n| @ 消息 | [创建 @ 消息](/sdk/android/message/creating-messages/create-text-at-message) |\n| 图片、音频、视频和文件 | [创建图片消息](/sdk/android/message/creating-messages/create-image-message)、[创建文件消息](/sdk/android/message/creating-messages/create-file-message) |\n| 名片、位置和表情 | [创建名片消息](/sdk/android/message/creating-messages/create-card-message)、[创建位置消息](/sdk/android/message/creating-messages/create-location-message)、[创建表情消息](/sdk/android/message/creating-messages/create-face-message) |\n| 回复、转发和合并转发 | [创建回复消息](/sdk/android/message/creating-messages/create-quote-message)、[创建转发消息](/sdk/android/message/creating-messages/create-forward-message)、[创建合并转发消息](/sdk/android/message/creating-messages/create-merger-message) |\n| 自定义业务内容 | [创建自定义消息](/sdk/android/message/creating-messages/create-custom-message) |\n\n发送本地路径或本地文件创建的媒体消息时,调用 `sendMessage()`,SDK 会在发送过程中上传媒体文件。使用已有远端 URL 创建媒体消息时,调用对应的 `create*MessageByURL()` 方法,再通过 [`sendMessageNotOss()`](/sdk/android/message/sending-messages/send-message-not-oss) 发送,无需再次上传媒体文件。\n\n## 按任务查找页面\n\n| 任务 | 页面 |\n| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 发送普通消息或已上传的媒体消息 | [发送消息](/sdk/android/message/sending-messages/send-message)、[发送不经 OSS 的消息](/sdk/android/message/sending-messages/send-message-not-oss) |\n| 接收实时、离线和在线消息 | [接收消息](/sdk/android/message/receiving-messages/receive-messages)、[接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) |\n| 加载历史消息或反向加载消息 | [加载历史消息](/sdk/android/message/retrieving-messages/load-older-messages)、[反向加载历史消息](/sdk/android/message/retrieving-messages/load-newer-messages) |\n| 按 ID 定位或搜索消息 | [按 ID 查找消息](/sdk/android/message/retrieving-messages/find-messages-by-id)、[搜索消息](/sdk/android/message/searching-messages/search-messages) |\n| 删除、撤回、修改或置顶消息 | [删除消息](/sdk/android/message/managing-messages/delete-saved-messages)、[撤回消息](/sdk/android/message/managing-messages/revoke-a-message)、[修改消息](/sdk/android/message/managing-messages/modify-a-message)、[设置消息置顶](/sdk/android/message/managing-messages/set-message-pinned) |\n| 管理会话未读数和群聊已读回执 | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read)、[上报群消息已读](/sdk/android/message/managing-read-status/send-group-read-receipts)、[查询群消息已读成员](/sdk/android/message/managing-read-status/get-group-message-readers) |\n| 上报或查询输入状态 | [更新输入状态](/sdk/android/message/composing-messages/update-typing-status)、[查询输入状态](/sdk/android/message/composing-messages/get-typing-status) |\n| 插入、删除或扩展仅当前设备可见的消息 | [插入本地单聊消息](/sdk/android/message/managing-messages/insert-local-single-message)、[删除本地消息](/sdk/android/message/managing-messages/delete-local-message)、[设置消息本地扩展](/sdk/android/message/managing-messages/set-message-local-ex) |\n\n## 状态同步边界\n\n| 变化 | 处理位置 | 合并方式 |\n| ------------------ | ---------------------------------------------------------------------------- | ---------------------------------------------- |\n| 新消息和离线消息 | [接收消息](/sdk/android/message/receiving-messages/receive-messages) | 先确定目标会话,再按 `clientMsgID` 合并。 |\n| 消息撤回 | `onRecvMessageRevokedV2` | 按撤回信息中的消息 ID 更新原消息状态。 |\n| 消息删除 | `onMsgDeleted` | 按消息 ID 从当前会话列表移除。 |\n| C2C 和群聊已读回执 | `onRecvC2CReadReceipt`、`onRecvGroupMessageReadReceipt` | 更新对应消息或会话的已读状态。 |\n| 消息扩展变化 | `onRecvMessageExtensionsChanged` 等回调 | 按消息 ID 更新扩展字段,不替换整条消息的正文。 |\n| 输入状态 | [更新输入状态](/sdk/android/message/composing-messages/update-typing-status) | 按会话和用户更新临时状态,不写入普通消息列表。 |\n\n对于撤回、删除、已读和消息扩展等状态变化,应先处理 API 的调用结果,再通过 `OnAdvanceMsgListener` 同步相关回调;必要时重新查询消息列表。", "description": "了解 Android SDK 的 Message 模型、消息生命周期和消息监听。", - "headings": [], + "headings": [ + { + "depth": 2, + "title": "消息处理流程", + "url": "#消息处理流程" + }, + { + "depth": 2, + "title": "Message 字段", + "url": "#message-字段" + }, + { + "depth": 2, + "title": "创建和发送不同内容", + "url": "#创建和发送不同内容" + }, + { + "depth": 2, + "title": "按任务查找页面", + "url": "#按任务查找页面" + }, + { + "depth": 2, + "title": "状态同步边界", + "url": "#状态同步边界" + } + ], "sourcePath": "/sdk/android/message/overview-message", "title": "消息概览" }, "/sdk/android/message/creating-messages/create-text-message": { - "body": "`createTextMessage()` 只创建本地消息对象,不发送消息。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createTextMessage(text);\n```", + "body": "`createTextMessage()` 只创建待发送的 `Message`,不会发送消息。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createTextMessage(text);\n```", "description": "使用 createTextMessage 创建文本 Message。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-text-message", "title": "创建文本消息" }, "/sdk/android/message/creating-messages/create-text-at-message": { - "body": "传入文本、被提醒用户 ID、`AtUserInfo` 列表和可选引用消息。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createTextAtMessage(\n text, userIDs, atUserInfos, quoteMessage);\n```", + "body": "传入文本、被 @ 用户 ID、`AtUserInfo` 列表和可选引用消息。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createTextAtMessage(\n text, userIDs, atUserInfos, quoteMessage);\n```", "description": "使用 createTextAtMessage 创建带成员提醒的文本消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-text-at-message", @@ -1472,14 +1493,14 @@ "title": "创建位置消息" }, "/sdk/android/message/creating-messages/create-face-message": { - "body": "`index` 表示表情位置,`data` 保存表情 URL 等 JSON 数据。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createFaceMessage(index, dataJson);\n```", + "body": "`data` 保存表情 URL 等 JSON 数据。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createFaceMessage(index, dataJson);\n```", "description": "使用 createFaceMessage 创建自定义表情消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-face-message", "title": "创建表情消息" }, "/sdk/android/message/creating-messages/create-quote-message": { - "body": "引用消息保存被引用的完整 `Message`,发送前应确保引用对象包含稳定的 `clientMsgID`。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createQuoteMessage(replyText, quotedMessage);\n```", + "body": "引用消息保存被引用的完整 `Message`。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager\n .createQuoteMessage(replyText, quotedMessage);\n```", "description": "使用 createQuoteMessage 创建引用已有消息的回复。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-quote-message", @@ -1493,7 +1514,7 @@ "title": "创建富文本消息" }, "/sdk/android/message/creating-messages/create-advanced-quote-message": { - "body": "富文本回复同时保存回复正文、被引用的原消息和正文中的 `RichMessage` 实体范围。\n\n```java\nRichMessage mention = new RichMessage();\nmention.setType(\"mention\");\nmention.setOffset(0);\nmention.setLength(6);\nmention.setInfo(\"{\\\"userID\\\":\\\"user_a\\\"}\");\n\nMessage message = OpenIMClient.getInstance().messageManager.createAdvancedQuoteMessage(\n \"OpenIM agreed\",\n originalMessage,\n Collections.singletonList(mention)\n);\n```\n\n被引用的 `originalMessage` 应包含稳定的 `clientMsgID`,实体范围必须对应最终回复正文。`type`、`url` 和 `info` 的业务协议与[创建富文本消息](/sdk/android/message/creating-messages/create-advanced-text-message)相同。本方法只创建待发送对象,不会自动发送。", + "body": "富文本回复同时保存回复正文、被引用的原消息和正文中的 `RichMessage` 实体范围。\n\n```java\nRichMessage mention = new RichMessage();\nmention.setType(\"mention\");\nmention.setOffset(0);\nmention.setLength(6);\nmention.setInfo(\"{\\\"userID\\\":\\\"user_a\\\"}\");\n\nMessage message = OpenIMClient.getInstance().messageManager.createAdvancedQuoteMessage(\n \"OpenIM agreed\",\n originalMessage,\n Collections.singletonList(mention)\n);\n```\n\n实体范围必须对应最终回复正文。`type`、`url` 和 `info` 的业务协议与[创建富文本消息](/sdk/android/message/creating-messages/create-advanced-text-message)相同。本方法只创建待发送对象,不会自动发送。", "description": "使用 createAdvancedQuoteMessage 创建带富文本实体的引用回复消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-advanced-quote-message", @@ -1507,42 +1528,42 @@ "title": "创建转发消息" }, "/sdk/android/message/creating-messages/create-merger-message": { - "body": "传入消息列表、标题和摘要列表;摘要顺序应与展示协议保持一致。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createMergerMessage(\n messages, title, summaries);\n```", + "body": "传入消息列表、标题和摘要列表。\n\n```java\nMessage message = OpenIMClient.getInstance().messageManager.createMergerMessage(\n messages, title, summaries);\n```", "description": "使用 createMergerMessage 将多条消息合并为一条摘要消息。", "headings": [], "sourcePath": "/sdk/android/message/creating-messages/create-merger-message", "title": "创建合并消息" }, "/sdk/android/message/sending-messages/send-message": { - "body": "单聊填写 `recvUid`,群聊填写 `recvGid`,另一个目标参数传 `null`。`OnMsgSendCallback` 同时承载成功、失败和媒体进度。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onSuccess(Message sentMessage) { mergeSentMessage(sentMessage); }\n @Override public void onError(int code, String error) { showSendError(error); }\n}, message, peerUserID, null, offlinePushInfo);\n```", + "body": "单聊填写 `recvUid`,群聊填写 `recvGid`。通过 `OnMsgSendCallback` 处理发送成功、失败和媒体进度。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onSuccess(Message sentMessage) { mergeSentMessage(sentMessage); }\n @Override public void onError(int code, String error) { showSendError(error); }\n}, message, peerUserID, null, offlinePushInfo);\n```", "description": "使用 sendMessage 将 Message 发送到单聊或群聊。", "headings": [], "sourcePath": "/sdk/android/message/sending-messages/send-message", "title": "发送消息" }, "/sdk/android/message/sending-messages/send-message-not-oss": { - "body": "消息中的媒体 URL 已准备好时使用该方法,避免 SDK 再次进入内置上传流程。\n\n```java\nmessageManager.sendMessageNotOss(callback, message, peerUserID, null, offlinePushInfo);\n```", + "body": "消息中已有媒体 URL 时使用该方法,无需再次上传媒体文件。\n\n```java\nmessageManager.sendMessageNotOss(callback, message, peerUserID, null, offlinePushInfo);\n```", "description": "使用 sendMessageNotOss 发送已经由业务上传资源的媒体消息。", "headings": [], "sourcePath": "/sdk/android/message/sending-messages/send-message-not-oss", "title": "发送不经 OSS 的消息" }, "/sdk/android/message/sending-messages/set-msg-send-progress-listener": { - "body": "Android 没有独立的全局发送进度 listener;进度随每次 `sendMessage()` 或 `sendMessageNotOss()` 传入的 `OnMsgSendCallback` 返回。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onProgress(long progress) { updateProgress(progress); }\n @Override public void onSuccess(Message sentMessage) { finishProgress(); }\n @Override public void onError(int code, String error) { failProgress(error); }\n}, message, peerUserID, null, offlinePushInfo);\n```", + "body": "通过 `OnMsgSendCallback.onProgress()` 获取当前消息的发送进度。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onProgress(long progress) { updateProgress(progress); }\n @Override public void onSuccess(Message sentMessage) { finishProgress(); }\n @Override public void onError(int code, String error) { failProgress(error); }\n}, message, peerUserID, null, offlinePushInfo);\n```", "description": "通过 OnMsgSendCallback 的进度回调更新媒体发送进度。", "headings": [], "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", "title": "监听消息发送进度" }, "/sdk/android/message/receiving-messages/receive-messages": { - "body": "设置 `setAdvancedMsgListener()` 后,`onRecvNewMessage` 接收实时消息,`onRecvOfflineNewMessage` 接收离线批次,`onRecvOnlineOnlyMessage` 接收在线消息字符串。所有消息都按 `clientMsgID` 幂等合并。\n\n```java\nmessageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); }\n @Override public void onRecvOfflineNewMessage(List messages) { messageStore.mergeAll(messages); }\n});\n```", + "body": "设置 `setAdvancedMsgListener()` 后,`onRecvNewMessage` 接收实时消息,`onRecvOfflineNewMessage` 接收离线批次,`onRecvOnlineOnlyMessage` 仅接收在线消息。\n\n```java\nmessageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); }\n @Override public void onRecvOfflineNewMessage(List messages) { messageStore.mergeAll(messages); }\n});\n```", "description": "使用 OnAdvanceMsgListener 接收新消息、离线消息和在线消息。", "headings": [], "sourcePath": "/sdk/android/message/receiving-messages/receive-messages", "title": "接收消息" }, "/sdk/android/message/receiving-messages/receive-custom-business-messages": { - "body": "自定义业务回调携带字符串,业务侧应按协议校验来源和 JSON 结构,不要将其直接当作 `Message` 渲染。\n\n```java\nmessageManager.setCustomBusinessListener(new OnCustomBusinessListener() {\n @Override public void onRecvCustomBusinessMessage(String payload) { handleBusiness(payload); }\n});\n```\n\n本页是 `onRecvCustomBusinessMessage` 的完整处理归属页。载荷应包含业务协议版本和稳定幂等 ID,并按该 ID 去重;不要依赖回调顺序,也不要使用自定义业务消息授予客户端权限。\n\n`MessageManager` 只保存一个自定义业务 listener,后一次设置会替换前一次。应在应用级事件中心设置一次,并在退出或切换账号时停止向旧账号状态分发。", + "body": "自定义业务回调携带字符串,业务侧应按约定格式解析,不要将其直接当作 `Message` 渲染。\n\n```java\nmessageManager.setCustomBusinessListener(new OnCustomBusinessListener() {\n @Override public void onRecvCustomBusinessMessage(String payload) { handleBusiness(payload); }\n});\n```", "description": "使用 setCustomBusinessListener 接收独立于普通聊天消息的业务回调。", "headings": [], "sourcePath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", @@ -1563,14 +1584,14 @@ "title": "反向加载历史消息" }, "/sdk/android/message/retrieving-messages/find-messages-by-id": { - "body": "构造 `SearchParams` 列表查询消息。返回结果应按消息 ID 合并,不要用列表位置作为稳定标识。\n\n```java\nmessageManager.findMessageList(new OnBase() {\n @Override public void onSuccess(SearchResult result) { showFoundMessages(result); }\n @Override public void onError(int code, String error) { showQueryError(error); }\n}, searchParams);\n```", + "body": "构造 `SearchParams` 列表查询消息。\n\n```java\nmessageManager.findMessageList(new OnBase() {\n @Override public void onSuccess(SearchResult result) { showFoundMessages(result); }\n @Override public void onError(int code, String error) { showQueryError(error); }\n}, searchParams);\n```", "description": "使用 findMessageList 按 SearchParams 查询消息记录。", "headings": [], "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", "title": "按 ID 查找消息" }, "/sdk/android/message/retrieving-messages/load-message-context": { - "body": "从搜索结果或引用消息跳入聊天上下文时,把已经取得的 `Message` 作为锚点。\n\n## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `conversationID` | `String` | 是 | 锚点消息所在的会话 ID。 |\n| `startMsg` | `Message` | 是 | 已经取得的锚点消息。 |\n| `type` | `ViewType` | 是 | 上下文查看类型;引用消息使用 `ViewType.History`,搜索结果使用 `ViewType.Search`。 |\n| `before` | `int` | 是 | 锚点之前最多读取的消息数量。 |\n| `after` | `int` | 是 | 锚点之后最多读取的消息数量。 |\n\n```java\nmessageManager.fetchSurroundingMessages(\n new OnBase() {\n @Override\n public void onSuccess(Messages messages) {\n List surrounding = messages.getData();\n renderMessages(surrounding);\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n },\n conversationID,\n targetMessage,\n ViewType.Search,\n 20,\n 20\n);\n```\n\n成功回调中的 `messages.getData()` 是锚点前后取得的消息列表,消息字段见[消息概览](/sdk/android/message/overview-message)。\n\n`before` 和 `after` 分别限制锚点前后的数量。返回结果可能少于请求总数,例如锚点靠近历史边界或部分消息已经删除。按 `conversationID:clientMsgID` 合并,不要依赖固定数组位置。需要先定位消息时见[按 ID 查找消息](/sdk/android/message/retrieving-messages/find-messages-by-id)。", + "body": "从搜索结果或引用消息跳入聊天上下文时,把已经取得的 `Message` 作为锚点。\n\n## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `conversationID` | `String` | 是 | 锚点消息所在的会话 ID。 |\n| `startMsg` | `Message` | 是 | 已经取得的锚点消息。 |\n| `type` | `ViewType` | 是 | 上下文查看类型;引用消息使用 `ViewType.History`,搜索结果使用 `ViewType.Search`。 |\n| `before` | `int` | 是 | 锚点之前最多读取的消息数量。 |\n| `after` | `int` | 是 | 锚点之后最多读取的消息数量。 |\n\n```java\nmessageManager.fetchSurroundingMessages(\n new OnBase() {\n @Override\n public void onSuccess(Messages messages) {\n List surrounding = messages.getData();\n renderMessages(surrounding);\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n },\n conversationID,\n targetMessage,\n ViewType.Search,\n 20,\n 20\n);\n```\n\n成功回调中的 `messages.getData()` 是锚点前后取得的消息列表,消息字段见[消息概览](/sdk/android/message/overview-message)。\n\n`before` 和 `after` 分别限制锚点前后的数量。锚点靠近历史边界或部分消息已经删除时,返回结果可能少于请求总数。需要先定位消息时,见[按 ID 查找消息](/sdk/android/message/retrieving-messages/find-messages-by-id)。", "description": "使用 Android SDK 读取一条消息前后的上下文。", "headings": [ { @@ -1590,14 +1611,14 @@ "title": "搜索消息" }, "/sdk/android/message/composing-messages/update-typing-status": { - "body": "进入输入状态时,将 `focus` 设为 `true`;输入结束、输入框失去焦点或退出会话时,将其设为 `false`。\n\n```java\nconversationManager.changeInputState(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 输入状态已上报\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n },\n conversationID,\n true\n);\n```\n\n输入结束时及时清除状态:\n\n```java\nconversationManager.changeInputState(callback, conversationID, false);\n```\n\n调用侧应合并连续的焦点变化,并在页面退出或连接中断前尝试上报 `false`。成功回调只表示上报请求完成,不表示其他客户端已经更新界面。\n\n其他客户端通过 `OnConversationListener.onConversationUserInputStatusChanged` 接收输入状态变化。Android SDK 以字符串形式返回事件载荷,应在校验 JSON 后再解析:\n\n```java\n@Override\npublic void onConversationUserInputStatusChanged(String payload) {\n InputStatesChangedData state = JsonUtil.toObj(\n payload,\n InputStatesChangedData.class\n );\n if (state == null || state.getConversationID() == null) {\n return;\n }\n updateTypingState(\n state.getConversationID(),\n state.getUserID(),\n state.getPlatformIDs()\n );\n}\n```\n\n输入状态按 `conversationID:userID` 合并,并设置业务侧超时自动清除。`ConversationManager` 只保存一个会话 listener,本回调应与会话列表、总未读数和同步事件组合后统一设置。\n\n进入会话或连接恢复时,可通过[查询输入状态](/sdk/android/message/composing-messages/get-typing-status)获取当前快照。", + "body": "进入输入状态时,将 `focus` 设为 `true`;输入结束、输入框失去焦点或退出会话时,将其设为 `false`。\n\n```java\nconversationManager.changeInputState(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 输入状态已上报\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n },\n conversationID,\n true\n);\n```\n\n输入结束时及时清除状态:\n\n```java\nconversationManager.changeInputState(callback, conversationID, false);\n```\n\n避免频繁重复上报相同状态。成功回调表示上报请求已经完成。\n\n其他客户端通过 `OnConversationListener.onConversationUserInputStatusChanged` 接收输入状态变化。Android SDK 以字符串形式返回事件载荷,应在校验 JSON 后再解析:\n\n```java\n@Override\npublic void onConversationUserInputStatusChanged(String payload) {\n InputStatesChangedData state = JsonUtil.toObj(\n payload,\n InputStatesChangedData.class\n );\n if (state == null || state.getConversationID() == null) {\n return;\n }\n updateTypingState(\n state.getConversationID(),\n state.getUserID(),\n state.getPlatformIDs()\n );\n}\n```\n\n回调中的 `conversationID`、`userID` 和 `platformIDs` 分别表示会话、用户和正在输入的平台。`ConversationManager` 只能设置一个 `OnConversationListener`;如果应用还需要处理其他会话事件,请在同一个 listener 中实现相应回调。\n\n需要主动查询指定用户是否正在输入时,使用[查询输入状态](/sdk/android/message/composing-messages/get-typing-status)。", "description": "使用 Android SDK 上报当前会话的输入状态。", "headings": [], "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", "title": "上报输入状态" }, "/sdk/android/message/composing-messages/get-typing-status": { - "body": "进入会话、连接恢复或需要校准状态时,查询指定用户当前正在输入的平台 ID 列表。\n\n```java\nOpenIMClient.getInstance().conversationManager.getInputState(\n new OnBase>() {\n @Override\n public void onSuccess(List platformIDs) {\n boolean typing = platformIDs != null && !platformIDs.isEmpty();\n updateTypingState(conversationID, userID, typing);\n }\n\n @Override\n public void onError(int code, String error) {\n recordTypingStatusQueryFailure(code, error);\n }\n },\n conversationID,\n userID\n);\n```\n\n成功 callback 返回平台 ID 数组快照;空列表表示查询时没有平台处于输入状态。查询本身不会触发输入状态事件。群聊中不要频繁轮询全部成员,只在进入页面、连接恢复或补偿状态时查询重点成员;在线增量由[上报输入状态](/sdk/android/message/composing-messages/update-typing-status)归属的 listener 维护。", + "body": "查询指定用户当前正在输入的平台 ID 列表。\n\n```java\nOpenIMClient.getInstance().conversationManager.getInputState(\n new OnBase>() {\n @Override\n public void onSuccess(List platformIDs) {\n boolean typing = platformIDs != null && !platformIDs.isEmpty();\n updateTypingState(conversationID, userID, typing);\n }\n\n @Override\n public void onError(int code, String error) {\n recordTypingStatusQueryFailure(code, error);\n }\n },\n conversationID,\n userID\n);\n```\n\n成功回调返回平台 ID 列表;空列表表示该用户当前没有平台处于输入状态。输入状态发生变化时,通过[上报输入状态](/sdk/android/message/composing-messages/update-typing-status)页面介绍的回调接收通知。", "description": "使用 getInputState 查询指定用户在会话中的当前输入状态。", "headings": [], "sourcePath": "/sdk/android/message/composing-messages/get-typing-status", @@ -1611,7 +1632,7 @@ "title": "删除本地消息" }, "/sdk/android/message/managing-messages/delete-saved-messages": { - "body": "## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `conversationID` | `String` | 是 | 要删除消息所在的会话 ID。 |\n| `clientMsgIDs` | `String[]` | 是 | 要删除的消息 ID 列表;同一批 ID 必须属于同一会话。 |\n| `isSync` | `boolean` | 是 | 是否把删除动作同步到当前账号的其他客户端。 |\n\n```java\nDeleteMessagesReq request = new DeleteMessagesReq(\n true,\n conversationID,\n selectedClientMsgIDs.toArray(new String[0])\n);\n\nmessageManager.deleteMessages(request, new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 删除请求已完成\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n});\n```\n\n`isSync` 为 `false` 时,删除当前设备及当前账号服务端保存的记录;为 `true` 时,还会请求把删除动作同步到当前账号的其他客户端。该操作不会删除其他会话成员持有的副本,也不会产生撤回提示。\n\n成功回调表示删除请求已经完成;开启同步时,不代表其他客户端已经收到事件或完成界面更新。\n\n`OnAdvanceMsgListener.onMsgDeleted` 是本页归属事件。根据消息路由字段确定会话后,按 `clientMsgID` 幂等移除消息。\n\n```java\n@Override\npublic void onMsgDeleted(Message message) {\n removeMessage(resolveConversationID(message), message.getClientMsgID());\n}\n```\n\n需要校准当前消息快照时,重新查询对应会话的历史消息。", + "body": "## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `conversationID` | `String` | 是 | 要删除消息所在的会话 ID。 |\n| `clientMsgIDs` | `String[]` | 是 | 要删除的消息 ID 列表;同一批 ID 必须属于同一会话。 |\n| `isSync` | `boolean` | 是 | 是否把删除动作同步到当前账号的其他客户端。 |\n\n```java\nDeleteMessagesReq request = new DeleteMessagesReq(\n true,\n conversationID,\n selectedClientMsgIDs.toArray(new String[0])\n);\n\nmessageManager.deleteMessages(request, new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 删除请求已完成\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n});\n```\n\n`isSync` 为 `false` 时,删除当前设备及当前账号服务端保存的记录;为 `true` 时,还会请求把删除动作同步到当前账号的其他客户端。该操作不会删除其他会话成员持有的副本,也不会产生撤回提示。\n\n成功回调表示删除请求已经完成;开启同步时,不代表其他客户端已经收到事件或完成界面更新。\n\n开启同步后,其他客户端可通过 `OnAdvanceMsgListener.onMsgDeleted` 接收删除的消息:\n\n```java\n@Override\npublic void onMsgDeleted(Message message) {\n handleDeletedMessage(message);\n}\n```", "description": "使用 Android SDK 批量删除当前账号在同一会话中的消息。", "headings": [ { @@ -1624,42 +1645,42 @@ "title": "批量删除消息" }, "/sdk/android/message/managing-messages/delete-user-messages": { - "body": "```java\nmessageManager.deleteUserAllMessagesInConv(\n conversationID,\n targetUserID,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 删除请求已完成\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n }\n);\n```\n\n该 API 只用于群聊,可删除指定用户在目标群会话中的全部消息。这是高影响的群组管控操作,不应放入普通单条消息菜单;操作者权限由 OpenIMServer 校验。成功回调不代表事件已经到达。\n\n`OnAdvanceMsgListener.onDeleteUserAllMsgsInConv` 是本页归属事件。收到事件后,根据 `conversationID` 和 `userID` 移除缓存中该用户发送的消息,或重新读取会话历史进行校准。\n\n```java\n@Override\npublic void onDeleteUserAllMsgsInConv(DeleteUserAllMsgsListenerMsg event) {\n removeMessagesBySender(event.getConversationID(), event.getUserID());\n}\n```\n\n成功回调、事件到达和重新查询历史是三个独立阶段。", + "body": "```java\nmessageManager.deleteUserAllMessagesInConv(\n conversationID,\n targetUserID,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 删除请求已完成\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n }\n);\n```\n\n该 API 只用于群聊,可删除指定用户在目标群会话中的全部消息。调用者没有操作权限时,通过 `onError` 返回错误。\n\n其他客户端通过 `OnAdvanceMsgListener.onDeleteUserAllMsgsInConv` 接收删除通知。回调参数包含对应的 `conversationID` 和 `userID`:\n\n```java\n@Override\npublic void onDeleteUserAllMsgsInConv(DeleteUserAllMsgsListenerMsg event) {\n handleUserMessagesDeleted(event.getConversationID(), event.getUserID());\n}\n```", "description": "使用 Android SDK 删除指定用户在群聊中的全部消息。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/delete-user-messages", "title": "删除群聊中指定用户的全部消息" }, "/sdk/android/message/managing-messages/revoke-a-message": { - "body": "撤回会使其他客户端把原消息显示为撤回状态。调用前应确认消息已经发送成功,并由业务界面限制可撤回时间;最终权限由服务端校验。\n\n```java\nmessageManager.revokeMessageV2(callback, conversationID, clientMsgID);\n```\n\n成功回调表示服务端完成撤回请求,不代表所有客户端都已经收到事件。接收端通过 `OnAdvanceMsgListener.onRecvMessageRevokedV2` 合并撤回变化。\n\n本页是 `onRecvMessageRevokedV2` 的完整事件归属页。`RevokedInfo` 包含 `clientMsgID`、撤回者和撤回时间,但不包含 `conversationID`,应先从当前账号的消息索引解析所属会话,再按 `conversationID:clientMsgID` 更新消息:\n\n```java\n@Override\npublic void onRecvMessageRevokedV2(RevokedInfo info) {\n String clientMsgID = info.getClientMsgID();\n String conversationID = findConversationIDByClientMsgID(clientMsgID);\n if (conversationID == null) {\n return;\n }\n markMessageRevoked(conversationID, clientMsgID, info);\n}\n```\n\n接收端应把对应消息更新为撤回状态,而不是直接从列表删除。该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。\n\n成功回调、撤回事件到达和重新查询历史是三个独立阶段。需要校准时重新读取对应会话的历史消息。", + "body": "撤回会使其他客户端把原消息显示为撤回状态。调用失败时,通过错误回调获取错误码和错误信息。\n\n```java\nmessageManager.revokeMessageV2(callback, conversationID, clientMsgID);\n```\n\n成功回调表示撤回请求已经完成。其他客户端通过 `OnAdvanceMsgListener.onRecvMessageRevokedV2` 接收撤回通知。\n\n`RevokedInfo` 包含 `clientMsgID`、撤回者和撤回时间:\n\n```java\n@Override\npublic void onRecvMessageRevokedV2(RevokedInfo info) {\n handleRevokedMessage(info);\n}\n```\n\n接收端应把对应消息更新为撤回状态,而不是直接从列表删除。`MessageManager` 只能设置一个 `OnAdvanceMsgListener`;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见[事件概览](/sdk/android/events/overview-events)。", "description": "撤回已发送消息,并处理其他客户端收到的撤回通知。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", "title": "撤回消息" }, "/sdk/android/message/managing-messages/modify-a-message": { - "body": "`modifyMessage` 用于修改会话中已经存在的消息。请求对象应保留原消息的会话 ID、`clientMsgID`、路由和发送者等字段,只更新允许修改的内容。\n\n```java\nmessageManager.modifyMessage(callback, modifyRequest);\n```\n\n成功回调表示修改请求已经完成,不代表所有客户端界面都已经更新。其他客户端通过 `OnAdvanceMsgListener.onMessageModified` 接收修改后的完整 `Message`。\n\n本页是 `onMessageModified` 的完整事件归属页。根据消息路由解析 `conversationID`,再按 `conversationID:clientMsgID` 替换原消息,不要按数组位置或显示文本匹配:\n\n```java\n@Override\npublic void onMessageModified(Message message) {\n String conversationID = resolveConversationID(message);\n if (conversationID == null) {\n return;\n }\n replaceMessage(conversationID, message.getClientMsgID(), message);\n}\n```\n\n该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。成功回调、修改事件到达和重新查询历史是三个独立阶段。", + "body": "`modifyMessage` 用于修改会话中已经存在的消息。通常应以原消息为基础修改支持编辑的内容,并保留其他字段。\n\n```java\nmessageManager.modifyMessage(callback, modifyRequest);\n```\n\n成功回调表示修改请求已经完成。\n\n消息修改后,其他客户端通过 `OnAdvanceMsgListener.onMessageModified` 接收修改后的完整 `Message`:\n\n```java\n@Override\npublic void onMessageModified(Message message) {\n handleModifiedMessage(message);\n}\n```\n\n`MessageManager` 只能设置一个 `OnAdvanceMsgListener`;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见[事件概览](/sdk/android/events/overview-events)。", "description": "修改支持编辑的消息内容,并处理其他客户端收到的消息修改事件。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", "title": "修改消息" }, "/sdk/android/message/managing-messages/get-pinned-messages": { - "body": "查询结果是指定会话当前的置顶消息快照。\n\n```java\nmessageManager.getConversationPinnedMsgs(new OnBase>() {\n @Override public void onSuccess(List messages) { showPinned(messages); }\n @Override public void onError(int code, String error) { showPinnedError(error); }\n}, conversationID);\n```", + "body": "成功回调返回指定会话当前的置顶消息列表。\n\n```java\nmessageManager.getConversationPinnedMsgs(new OnBase>() {\n @Override public void onSuccess(List messages) { showPinned(messages); }\n @Override public void onError(int code, String error) { showPinnedError(error); }\n}, conversationID);\n```", "description": "使用 getConversationPinnedMsgs 查询会话中的置顶消息。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", "title": "查询会话置顶消息" }, "/sdk/android/message/managing-messages/set-message-pinned": { - "body": "最后一个参数为 `true` 时置顶消息,为 `false` 时取消置顶:\n\n```java\nmessageManager.setConversationPinnedMsg(\n callback,\n conversationID,\n clientMsgID,\n true\n);\n```\n\n成功回调表示设置请求完成,不代表置顶变化事件已经到达。\n\n`OnAdvanceMsgListener.onChangedPinnedMsg` 是本页归属事件。回调中的 `ChangedPinnedMsg` 包含 `conversationID` 和当前置顶消息集合;按会话替换集合,并按每条置顶消息的 `clientMsgID` 去重:\n\n```java\n@Override\npublic void onChangedPinnedMsg(ChangedPinnedMsg event) {\n replacePinnedMessages(event.getConversationID(), event.getMsgs());\n}\n```\n\n该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。成功回调、事件到达和[查询会话置顶消息](/sdk/android/message/managing-messages/get-pinned-messages)取得的快照是三个独立阶段。", + "body": "最后一个参数为 `true` 时置顶消息,为 `false` 时取消置顶:\n\n```java\nmessageManager.setConversationPinnedMsg(\n callback,\n conversationID,\n clientMsgID,\n true\n);\n```\n\n成功回调表示设置请求完成,不代表置顶变化事件已经到达。\n\n置顶消息发生变化时,`OnAdvanceMsgListener.onChangedPinnedMsg` 返回对应的 `conversationID` 和当前置顶消息列表:\n\n```java\n@Override\npublic void onChangedPinnedMsg(ChangedPinnedMsg event) {\n handlePinnedMessagesChanged(event.getConversationID(), event.getMsgs());\n}\n```\n\n`MessageManager` 只能设置一个 `OnAdvanceMsgListener`;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见[事件概览](/sdk/android/events/overview-events)。需要主动获取当前置顶消息时,使用[查询会话置顶消息](/sdk/android/message/managing-messages/get-pinned-messages)。", "description": "设置会话消息的置顶状态,并处理置顶消息变化事件。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", "title": "置顶或取消置顶消息" }, "/sdk/android/message/managing-messages/insert-local-single-message": { - "body": "该方法不向服务器发送消息,`receiver` 和 `sender` 用于建立本地消息归属。\n\n```java\nmessageManager.insertSingleMessageToLocalStorage(callback, message, receiverUserID, senderUserID);\n```", + "body": "该方法不向服务器发送消息。`receiver` 是接收者用户 ID,`sender` 是发送者用户 ID。\n\n```java\nmessageManager.insertSingleMessageToLocalStorage(callback, message, receiverUserID, senderUserID);\n```", "description": "使用 insertSingleMessageToLocalStorage 插入仅当前设备可见的单聊消息。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/insert-local-single-message", @@ -1694,14 +1715,14 @@ "title": "设置消息本地扩展" }, "/sdk/android/message/managing-read-status/send-group-read-receipts": { - "body": "```java\nmessageManager.sendGroupMessageReadReceipt(\n conversationID,\n visibleClientMsgIDs,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 已读回执已上报\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n }\n);\n```\n\n同一批消息必须属于目标群会话。成功回调只表示服务端接受上报,不代表其他客户端界面已经更新。会话未读数仍由 `markConversationMessageAsRead` 独立维护。\n\n其他客户端通过 `OnAdvanceMsgListener.onRecvGroupMessageReadReceipt` 接收群聊成员级已读变化。本页是该事件的完整监听归属页;根据 `conversationID` 以及回执中的消息 ID 合并消息已读数、未读数和成员信息。\n\n```java\n@Override\npublic void onRecvGroupMessageReadReceipt(GroupMessageReceipt receipt) {\n mergeGroupReadReceipt(receipt);\n}\n```\n\n上报回调、群回执事件和[查询群消息已读成员](/sdk/android/message/managing-read-status/get-group-message-readers)取得的成员快照是三个独立阶段。", + "body": "```java\nmessageManager.sendGroupMessageReadReceipt(\n conversationID,\n visibleClientMsgIDs,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 已读回执已上报\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n }\n);\n```\n\n同一批消息必须属于目标群会话。成功回调只表示服务端接受上报,不代表其他客户端界面已经更新。会话未读数仍由 `markConversationMessageAsRead` 独立维护。\n\n其他客户端通过 `OnAdvanceMsgListener.onRecvGroupMessageReadReceipt` 接收群消息已读回执:\n\n```java\n@Override\npublic void onRecvGroupMessageReadReceipt(GroupMessageReceipt receipt) {\n handleGroupMessageReadReceipt(receipt);\n}\n```\n\n需要查询某条群消息的已读或未读成员时,使用[查询群消息已读成员](/sdk/android/message/managing-read-status/get-group-message-readers)。", "description": "使用 Android SDK 上报群消息已读回执。", "headings": [], "sourcePath": "/sdk/android/message/managing-read-status/send-group-read-receipts", "title": "上报群消息已读" }, "/sdk/android/message/managing-read-status/get-group-message-readers": { - "body": "## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `conversationID` | `String` | 是 | 群聊会话 ID。 |\n| `clientMsgID` | `String` | 是 | 要查询阅读成员的消息 ID。 |\n| `filter` | `int` | 是 | `0` 查询已读成员,`1` 查询未读成员。 |\n| `offset` | `int` | 是 | 分页偏移量,首页传 `0`。 |\n| `count` | `int` | 是 | 本次请求的成员数量。 |\n\n```java\nmessageManager.getGroupMessageReaderList(\n conversationID,\n clientMsgID,\n 0,\n 0,\n 50,\n new OnBase>() {\n @Override\n public void onSuccess(List members) {\n renderMembers(members);\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n }\n);\n```\n\n成功回调返回当前页 `GroupMembersInfo` 列表,字段含义见[分页查询群成员](/sdk/android/group/retrieving-group-members/get-group-member-list)。按 `groupID:userID` 去重;查询只建立当前快照,不触发回执事件。需要完整列表时继续分页。", + "body": "## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `conversationID` | `String` | 是 | 群聊会话 ID。 |\n| `clientMsgID` | `String` | 是 | 要查询阅读成员的消息 ID。 |\n| `filter` | `int` | 是 | `0` 查询已读成员,`1` 查询未读成员。 |\n| `offset` | `int` | 是 | 分页偏移量,首页传 `0`。 |\n| `count` | `int` | 是 | 本次请求的成员数量。 |\n\n```java\nmessageManager.getGroupMessageReaderList(\n conversationID,\n clientMsgID,\n 0,\n 0,\n 50,\n new OnBase>() {\n @Override\n public void onSuccess(List members) {\n renderMembers(members);\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n }\n);\n```\n\n成功回调返回当前页 `GroupMembersInfo` 列表,字段含义见[分页查询群成员](/sdk/android/group/retrieving-group-members/get-group-member-list)。需要完整列表时继续分页。", "description": "使用 Android SDK 分页查询群消息的已读或未读成员。", "headings": [ { @@ -1713,21 +1734,19 @@ "sourcePath": "/sdk/android/message/managing-read-status/get-group-message-readers", "title": "查询群消息已读成员" }, - "/sdk/android/file-uploads/track-file-upload-progress": { - "body": "Android SDK 不设置全局文件上传 listener。每次调用 `uploadFile()` 时传入一个 `OnPutFileListener`,由该 listener 接收当前上传任务的进度、分片状态和完成信息。\n\n```java\nOnPutFileListener uploadListener = new OnPutFileListener() {\n @Override\n public void open(long size) {\n initializeUploadProgress(uploadTaskID, size);\n }\n\n @Override\n public void uploadID(String id) {\n bindSdkUploadID(uploadTaskID, id);\n }\n\n @Override\n public void uploadComplete(long fileSize, long uploadedSize, long storageSize) {\n updateUploadProgress(uploadTaskID, uploadedSize, fileSize);\n }\n\n @Override\n public void uploadPartComplete(long partNumber, long partSize, String partHash) {\n markPartComplete(uploadTaskID, partNumber, partSize, partHash);\n }\n\n @Override\n public void complete(long size, String url, long type) {\n completeUpload(uploadTaskID, size, url, type);\n }\n};\n\nOpenIMClient.getInstance().uploadFile(resultCallback, uploadListener, putArgs);\n```\n\n`open()` 可用于初始化总大小,`uploadID()` 返回 SDK 上传任务标识,`uploadComplete()` 提供上传过程数据,`uploadPartComplete()` 表示一个分片已经完成,`complete()` 返回最终大小、远端 URL 和资源类型。只有业务需要展示分片细节时才处理分片回调;普通进度条通常只需要过程回调和最终完成回调。\n\n业务层仍应生成自己的稳定 `uploadTaskID`,并在 listener 闭包中关联界面状态。SDK 上传 ID、文件名和数组位置都不应代替业务任务主键。每个上传任务使用独立 listener;页面或账号状态销毁后应停止向旧状态分发回调。\n\n完整的参数构造和错误处理见[上传文件](/sdk/android/file-uploads/upload-file)。", - "description": "使用 Android SDK 的 OnPutFileListener 跟踪单次文件上传任务。", - "headings": [], - "sourcePath": "/sdk/android/file-uploads/track-file-upload-progress", - "title": "监听文件上传进度" - }, "/sdk/android/file-uploads/upload-file": { - "body": "`uploadFile()` 是独立文件上传能力,可用于头像、群头像、资料附件或其他业务文件。上传过程不从属于消息,也不会自动创建消息或更新用户资料。\n\n## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `base` | `OnBase` | 是 | 接收上传请求的最终成功或失败结果。 |\n| `listener` | `OnPutFileListener` | 是 | 接收当前任务的上传进度、分片状态和完成信息。 |\n| `putArgs.filepath` | `String` | 是 | Android 应用可读取的本地文件路径。 |\n| `putArgs.name` | `String` | 是 | 上传使用的文件名;`PutArgs` 默认使用传入路径,可按业务需要改为原始文件名。 |\n| `putArgs.cuase` | `String` | 否 | 业务约定的上传原因。字段名以 Android SDK 的 `PutArgs` 声明为准。 |\n\n```java\nFile file = new File(localPath);\nPutArgs args = new PutArgs(file.getAbsolutePath());\nargs.name = file.getName();\nargs.cuase = \"user-avatar\";\n\nOpenIMClient.getInstance().uploadFile(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n finishUploadRequest(result);\n }\n\n @Override\n public void onError(int code, String error) {\n showUploadError(code, error);\n }\n },\n new OnPutFileListener() {\n @Override\n public void uploadComplete(long fileSize, long uploadedSize, long storageSize) {\n updateUploadProgress(uploadTaskID, uploadedSize, fileSize);\n }\n\n @Override\n public void complete(long size, String url, long type) {\n completeUpload(uploadTaskID, size, url, type);\n }\n },\n args\n);\n```\n\n每次调用都传入独立的 `OnPutFileListener`,因此无需设置全局上传 listener。并行上传时应由业务层为任务生成稳定 ID,并在回调闭包中关联对应任务,不要使用文件名或列表位置作为唯一标识。各回调的职责见[跟踪文件上传进度](/sdk/android/file-uploads/track-file-upload-progress)。\n\n`complete()` 返回的 URL 可用于后续更新头像、保存附件地址或创建 URL 类型的媒体消息。上传成功只表示文件资源已经写入远端;资料更新、消息创建和消息发送仍需分别调用对应 API。", + "body": "`uploadFile()` 是独立文件上传能力,可用于头像、群头像、资料附件或其他业务文件。上传过程不从属于消息,也不会自动创建消息或更新用户资料。\n\n## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| ------------------ | ------------------- | -------- | -------------------------------------------------------------------------- |\n| `base` | `OnBase` | 是 | 接收上传请求的最终成功或失败结果。 |\n| `listener` | `OnPutFileListener` | 是 | 接收当前任务的文件、分片、哈希及上传完成信息。 |\n| `putArgs.filepath` | `String` | 是 | Android 应用可读取的本地文件路径。 |\n| `putArgs.name` | `String` | 是 | 上传使用的文件名;`PutArgs` 默认使用传入路径,可按业务需要改为原始文件名。 |\n| `putArgs.cuase` | `String` | 否 | 业务约定的上传原因。字段名以 Android SDK 的 `PutArgs` 声明为准。 |\n\n```java\nFile file = new File(localPath);\nPutArgs args = new PutArgs(file.getAbsolutePath());\nargs.name = file.getName();\nargs.cuase = \"user-avatar\";\n\nOpenIMClient.getInstance().uploadFile(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n finishUploadRequest(result);\n }\n\n @Override\n public void onError(int code, String error) {\n showUploadError(code, error);\n }\n },\n new OnPutFileListener() {\n @Override\n public void open(long size) {\n initializeUpload(uploadTaskID, size);\n }\n\n @Override\n public void uploadID(String id) {\n bindSdkUploadID(uploadTaskID, id);\n }\n\n @Override\n public void uploadComplete(long fileSize, long streamSize, long storageSize) {\n recordUploadSizes(uploadTaskID, fileSize, streamSize, storageSize);\n }\n\n @Override\n public void complete(long size, String url, long type) {\n completeUpload(uploadTaskID, size, url, type);\n }\n },\n args\n);\n```\n\n## 回调说明\n\n`OnPutFileListener` 的回调和参数如下:\n\n| 回调 | 参数 | 说明 |\n| -------------------- | --------------------------------------- | ---------------------------------------------------- |\n| `open` | `size` | 打开指定大小的文件,可用于初始化任务。 |\n| `partSize` | `partSize`, `num` | 单个分片大小和分片总数。 |\n| `hashPartProgress` | `index`, `size`, `partHash` | 单个分片完成哈希计算时的分片索引、大小和哈希值。 |\n| `hashPartComplete` | `partsHash`, `fileHash` | 所有分片完成哈希计算后的组合哈希和最终文件哈希。 |\n| `uploadID` | `uploadID` | SDK 生成的上传标识。 |\n| `uploadPartComplete` | `index`, `partSize`, `partHash` | 一个分片上传完成时的分片索引、大小和哈希值。 |\n| `uploadComplete` | `fileSize`, `streamSize`, `storageSize` | 整个文件上传阶段的数据:文件大小、流大小和存储大小。 |\n| `complete` | `size`, `url`, `type` | 文件上传完成后的最终大小、远端 URL 和资源类型。 |\n\n`complete()` 返回的 URL 可用于后续更新头像、保存附件地址或创建 URL 类型的媒体消息。上传成功只表示文件资源已经写入远端;资料更新、消息创建和消息发送仍需分别调用对应 API。", "description": "使用 Android SDK 独立上传文件并获取远端资源地址。", "headings": [ { "depth": 2, "title": "参数说明", "url": "#参数说明" + }, + { + "depth": 2, + "title": "回调说明", + "url": "#回调说明" } ], "sourcePath": "/sdk/android/file-uploads/upload-file", diff --git a/src/generated/navigation.json b/src/generated/navigation.json index f3de5e84cd..56e74d7315 100644 --- a/src/generated/navigation.json +++ b/src/generated/navigation.json @@ -5848,34 +5848,14 @@ "minIndex": 209 }, { - "id": "file-uploads", - "segment": "file-uploads", - "title": "File uploads", - "href": null, - "type": "folder", - "children": [ - { - "id": "file-uploads/track-file-upload-progress", - "segment": "track-file-upload-progress", - "title": "Track file upload progress", - "href": "/sdk/android/file-uploads/track-file-upload-progress", - "type": "page", - "children": [], - "minIndex": 259, - "navigationTitle": "Track file upload progress" - }, - { - "id": "file-uploads/upload-file", - "segment": "upload-file", - "title": "Upload a file", - "href": "/sdk/android/file-uploads/upload-file", - "type": "page", - "children": [], - "minIndex": 260, - "navigationTitle": "Upload a file" - } - ], - "minIndex": 259 + "id": "file-uploads/upload-file", + "segment": "upload-file", + "title": "Upload a file", + "href": "/sdk/android/file-uploads/upload-file", + "type": "page", + "children": [], + "minIndex": 259, + "navigationTitle": "Upload a file" }, { "id": "calling", @@ -5891,7 +5871,7 @@ "href": "/sdk/android/calling/overview-calling", "type": "page", "children": [], - "minIndex": 261 + "minIndex": 260 }, { "id": "calling/managing-calls", @@ -5907,7 +5887,7 @@ "href": "/sdk/android/calling/managing-calls/start-single-call", "type": "page", "children": [], - "minIndex": 262, + "minIndex": 261, "navigationTitle": "Start a one-to-one call" }, { @@ -5917,7 +5897,7 @@ "href": "/sdk/android/calling/managing-calls/start-group-call", "type": "page", "children": [], - "minIndex": 263, + "minIndex": 262, "navigationTitle": "Start a group call" }, { @@ -5927,7 +5907,7 @@ "href": "/sdk/android/calling/managing-calls/accept-call", "type": "page", "children": [], - "minIndex": 264, + "minIndex": 263, "navigationTitle": "Accept a call" }, { @@ -5937,7 +5917,7 @@ "href": "/sdk/android/calling/managing-calls/reject-call", "type": "page", "children": [], - "minIndex": 265, + "minIndex": 264, "navigationTitle": "Reject a call" }, { @@ -5947,7 +5927,7 @@ "href": "/sdk/android/calling/managing-calls/cancel-call", "type": "page", "children": [], - "minIndex": 266, + "minIndex": 265, "navigationTitle": "Cancel a call invitation" }, { @@ -5957,7 +5937,7 @@ "href": "/sdk/android/calling/managing-calls/hang-up-call", "type": "page", "children": [], - "minIndex": 267, + "minIndex": 266, "navigationTitle": "Hang up a call" }, { @@ -5967,11 +5947,11 @@ "href": "/sdk/android/calling/managing-calls/handle-call-events", "type": "page", "children": [], - "minIndex": 268, + "minIndex": 267, "navigationTitle": "Handle call events" } ], - "minIndex": 262 + "minIndex": 261 }, { "id": "calling/retrieving-call-information", @@ -5987,7 +5967,7 @@ "href": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", "type": "page", "children": [], - "minIndex": 269, + "minIndex": 268, "navigationTitle": "Restore a pending invitation" }, { @@ -5997,7 +5977,7 @@ "href": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", "type": "page", "children": [], - "minIndex": 270, + "minIndex": 269, "navigationTitle": "Get a group call room" }, { @@ -6007,11 +5987,11 @@ "href": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", "type": "page", "children": [], - "minIndex": 271, + "minIndex": 270, "navigationTitle": "Get room credentials" } ], - "minIndex": 269 + "minIndex": 268 }, { "id": "calling/sending-custom-signals/send-a-custom-signal", @@ -6020,10 +6000,10 @@ "href": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", "type": "page", "children": [], - "minIndex": 272 + "minIndex": 271 } ], - "minIndex": 261 + "minIndex": 260 }, { "id": "events/overview-events", @@ -6032,7 +6012,7 @@ "href": "/sdk/android/events/overview-events", "type": "page", "children": [], - "minIndex": 273, + "minIndex": 272, "navigationTitle": "Events" }, { @@ -6042,10 +6022,10 @@ "href": "/sdk/android/logger", "type": "page", "children": [], - "minIndex": 274 + "minIndex": 273 } ], - "pageCount": 146, + "pageCount": 145, "sidebarExpansion": "active-path" }, { diff --git a/src/generated/routes.json b/src/generated/routes.json index 2998f2f101..cd3b625543 100644 --- a/src/generated/routes.json +++ b/src/generated/routes.json @@ -6605,24 +6605,6 @@ "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx", "navOrder": 258 }, - { - "id": 1482, - "path": "/sdk/android/file-uploads/track-file-upload-progress", - "relativePath": "sdk/android/file-uploads/track-file-upload-progress", - "sourcePath": "/sdk/android/file-uploads/track-file-upload-progress", - "title": "Track file upload progress", - "description": "Use OnPutFileListener to track an individual Android SDK file upload.", - "product": "sdk", - "version": "v4", - "platform": "android", - "contextKey": "chat/sdk/android", - "contextTitle": "SDKs · Android · v4", - "template": "guide", - "status": "published", - "sourceIndex": 2852, - "contentFile": "content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx", - "navOrder": 259 - }, { "id": 1483, "path": "/sdk/android/file-uploads/upload-file", diff --git a/src/generated/search-index-zh.json b/src/generated/search-index-zh.json index 4071431a72..82236ed584 100644 --- a/src/generated/search-index-zh.json +++ b/src/generated/search-index-zh.json @@ -2541,7 +2541,7 @@ "description": "了解 Android SDK 的 Message 模型、消息生命周期和消息监听。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message overview-message", - "content": "Android 消息以 Message 表示,使用 clientMsgID 去重,使用 sessionType 、 recvID 和 groupID 区分单聊与群聊。消息内容由对应的 element 字段承载,发送、接收、撤回和删除是不同的状态变化。 OpenIMClient.getInstance .messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; ; 查询建立快照, OnAdvanceMsgListener 合并增量; MessageManager 的 listener 设置会替换当前 listener。" + "content": "Android SDK 使用 Message 表示一条消息。消息创建、发送、接收、查询和状态变更是不同阶段;创建 Message 不会发送消息,发送成功也不代表其他客户端已经完成接收。 消息列表通常以 clientMsgID 作为客户端去重和更新键,并结合当前会话上下文判断消息属于单聊还是群聊。 Message 本身不包含 conversationID ,会话 ID 来自当前会话、历史查询参数或消息事件上下文。 消息处理流程 | 阶段 | Android API 或回调 | 说明 | | | | | | 创建 | MessageManager.create Message | 创建待发送的 Message 对象,不写入服务端,也不会触发新消息回调。 | | 发送 | sendMessage 或 sendMessageNotOss | 单聊传入 recvUid ,群聊传入 recvGid 。 | | 接收 | OnAdvanceMsgListener | 处理实时、离线、在线消息以及撤回、删除和已读回执等变化。 | | 查询 | 历史消息、按 ID 查找或搜索 API | 查询结果是调用时的消息快照,不代替实时消息监听。 | | 更新 | 撤回、删除、修改、置顶、已读和本地扩展 API | 分别处理 API 结果、对应事件和必要的列表重新查询。 | messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; @Override public void onRecvOfflineNewMessage List messages messageStore.mergeAll messages ; @Override public void onRecvMessageRevokedV2 RevokedInfo info messageStore.markRevoked info ; @Override public void onMsgDeleted Message message messageStore.remove message.getClientMsgID ; ; 重复调用 MessageManager 的 setAdvancedMsgListener 会覆盖之前设置的 listener。应用应在统一的消息状态层注册一次,再把回调中的消息变化分发给页面。 Message 字段 创建、发送、接收和查询返回的消息对象都是 Message 。常用字段如下: | 字段 | 类型 | 说明 | | | | | | clientMsgID | String | 客户端消息 ID,用于列表去重、状态更新和定位消息。 | | serverMsgID | String | 服务端消息 ID;消息尚未成功发送时可能没有有效值。 | | sessionType | int | 会话类型;结合 recvID 、 groupID 判断单聊或群聊。 | | sendID | String | 发送者用户 ID。 | | recvID | String | 单聊接收方用户 ID。 | | groupID | String | 群聊对应的群组 ID。 | | msgFrom | int | 标识消息是用户级别还是系统级别。 | | contentType | int | 消息类型,使用 MessageType 常量判断内容字段。 | | createTime | long | 消息对象创建时间,Android SDK 模型注释约定为纳秒。 | | sendTime | long | 消息发送时间,Android SDK 模型注释约定为毫秒。 | | seq | int | 服务端消息序号。 | | status | int | 发送状态,使用 MessageStatus 常量判断。 | | isRead | boolean | 当前客户端保存的已读状态。 | | platformID | int | 发送消息的客户端平台。 | | senderNickname | String | 发送者昵称快照。 | | senderFaceUrl | String | 发送者头像 URL 快照。 | | offlinePush | OfflinePushInfo | 离线推送内容。 | | attachedInfo | String | SDK 附加信息。 | | ext | Object | Android 消息附加字段。 | | ex | Object | 消息附加字段。 | | localEx | Object | 仅保存在当前设备的消息扩展字段。 | 消息正文位于与 contentType 对应的 element 字段中,不要根据列表位置或展示文本判断消息类型: | 消息内容 | 对应字段 | | | | | 文本、富文本 | textElem 、 advancedTextElem | | 图片、音频、视频、文件 | pictureElem 、 soundElem 、 videoElem 、 fileElem | | @ 消息、回复消息 | atTextElem 、 quoteElem | | 合并转发 | mergeElem | | 名片、位置、表情 | cardElem 、 locationElem 、 faceElem | | 自定义消息 | customElem | | 通知、输入状态和附加状态 | notificationElem 、 typingElem 、 attachedInfoElem | 创建和发送不同内容 发送一条消息分为两个步骤: 1. 调用对应内容类型的 create Message 方法,获得待发送的 Message 。 2. 将该 Message 传给 sendMessage /sdk/android/message/sending messages/send message 。单聊设置 recvUid ,群聊设置 recvGid 。 下表列出了可创建的消息类型及其对应页面: | 内容 | 页面 | | | | | 文本与富文本 | 创建文本消息 /sdk/android/message/creating messages/create text message 、 创建富文本消息 /sdk/android/message/creating messages/create advanced text message | | @ 消息 | 创建 @ 消息 /sdk/android/message/creating messages/create text at message | | 图片、音频、视频和文件 | 创建图片消息 /sdk/android/message/creating messages/create image message 、 创建文件消息 /sdk/android/message/creating messages/create file message | | 名片、位置和表情 | 创建名片消息 /sdk/android/message/creating messages/create card message 、 创建位置消息 /sdk/android/message/creating messages/create location message 、 创建表情消息 /sdk/android/message/creating messages/create face message | | 回复、转发和合并转发 | 创建回复消息 /sdk/android/message/creating messages/create quote message 、 创建转发消息 /sdk/android/message/creating messages/create forward message 、 创建合并转发消息 /sdk/android/message/creating messages/create merger message | | 自定义业务内容 | 创建自定义消息 /sdk/android/message/creating messages/create custom message | 发送本地路径或本地文件创建的媒体消息时,调用 sendMessage ,SDK 会在发送过程中上传媒体文件。使用已有远端 URL 创建媒体消息时,调用对应的 create MessageByURL 方法,再通过 sendMessageNotOss /sdk/android/message/sending messages/send message not oss 发送,无需再次上传媒体文件。 按任务查找页面 | 任务 | 页面 | | | | | 发送普通消息或已上传的媒体消息 | 发送消息 /sdk/android/message/sending messages/send message 、 发送不经 OSS 的消息 /sdk/android/message/sending messages/send message not oss | | 接收实时、离线和在线消息 | 接收消息 /sdk/android/message/receiving messages/receive messages 、 接收自定义业务消息 /sdk/android/message/receiving messages/receive custom business messages | | 加载历史消息或反向加载消息 | 加载历史消息 /sdk/android/message/retrieving messages/load older messages 、 反向加载历史消息 /sdk/android/message/retrieving messages/load newer messages | | 按 ID 定位或搜索消息 | 按 ID 查找消息 /sdk/android/message/retrieving messages/find messages by id 、 搜索消息 /sdk/android/message/searching messages/search messages | | 删除、撤回、修改或置顶消息 | 删除消息 /sdk/android/message/managing messages/delete saved messages 、 撤回消息 /sdk/android/message/managing messages/revoke a message 、 修改消息 /sdk/android/message/managing messages/modify a message 、 设置消息置顶 /sdk/android/message/managing messages/set message pinned | | 管理会话未读数和群聊已读回执 | 标记会话已读 /sdk/android/conversation/managing conversations/mark conversation read 、 上报群消息已读 /sdk/android/message/managing read status/send group read receipts 、 查询群消息已读成员 /sdk/android/message/managing read status/get group message readers | | 上报或查询输入状态 | 更新输入状态 /sdk/android/message/composing messages/update typing status 、 查询输入状态 /sdk/android/message/composing messages/get typing status | | 插入、删除或扩展仅当前设备可见的消息 | 插入本地单聊消息 /sdk/android/message/managing messages/insert local single message 、 删除本地消息 /sdk/android/message/managing messages/delete local message 、 设置消息本地扩展 /sdk/android/message/managing messages/set message local ex | 状态同步边界 | 变化 | 处理位置 | 合并方式 | | | | | | 新消息和离线消息 | 接收消息 /sdk/android/message/receiving messages/receive messages | 先确定目标会话,再按 clientMsgID 合并。 | | 消息撤回 | onRecvMessageRevokedV2 | 按撤回信息中的消息 ID 更新原消息状态。 | | 消息删除 | onMsgDeleted | 按消息 ID 从当前会话列表移除。 | | C2C 和群聊已读回执 | onRecvC2CReadReceipt 、 onRecvGroupMessageReadReceipt | 更新对应消息或会话的已读状态。 | | 消息扩展变化 | onRecvMessageExtensionsChanged 等回调 | 按消息 ID 更新扩展字段,不替换整条消息的正文。 | | 输入状态 | 更新输入状态 /sdk/android/message/composing messages/update typing status | 按会话和用户更新临时状态,不写入普通消息列表。 | 对于撤回、删除、已读和消息扩展等状态变化,应先处理 API 的调用结果,再通过 OnAdvanceMsgListener 同步相关回调;必要时重新查询消息列表。" }, { "path": "/sdk/android/message/creating-messages/create-text-message", @@ -2549,7 +2549,7 @@ "description": "使用 createTextMessage 创建文本 Message。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-text-message", - "content": "createTextMessage 只创建本地消息对象,不发送消息。 Message message = OpenIMClient.getInstance .messageManager.createTextMessage text ;" + "content": "createTextMessage 只创建待发送的 Message ,不会发送消息。 Message message = OpenIMClient.getInstance .messageManager.createTextMessage text ;" }, { "path": "/sdk/android/message/creating-messages/create-text-at-message", @@ -2557,7 +2557,7 @@ "description": "使用 createTextAtMessage 创建带成员提醒的文本消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-text-at-message", - "content": "传入文本、被提醒用户 ID、 AtUserInfo 列表和可选引用消息。 Message message = OpenIMClient.getInstance .messageManager.createTextAtMessage text, userIDs, atUserInfos, quoteMessage ;" + "content": "传入文本、被 @ 用户 ID、 AtUserInfo 列表和可选引用消息。 Message message = OpenIMClient.getInstance .messageManager.createTextAtMessage text, userIDs, atUserInfos, quoteMessage ;" }, { "path": "/sdk/android/message/creating-messages/create-custom-message", @@ -2685,7 +2685,7 @@ "description": "使用 createFaceMessage 创建自定义表情消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-face-message", - "content": "index 表示表情位置, data 保存表情 URL 等 JSON 数据。 Message message = OpenIMClient.getInstance .messageManager.createFaceMessage index, dataJson ;" + "content": "data 保存表情 URL 等 JSON 数据。 Message message = OpenIMClient.getInstance .messageManager.createFaceMessage index, dataJson ;" }, { "path": "/sdk/android/message/creating-messages/create-quote-message", @@ -2693,7 +2693,7 @@ "description": "使用 createQuoteMessage 创建引用已有消息的回复。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-quote-message", - "content": "引用消息保存被引用的完整 Message ,发送前应确保引用对象包含稳定的 clientMsgID 。 Message message = OpenIMClient.getInstance .messageManager .createQuoteMessage replyText, quotedMessage ;" + "content": "引用消息保存被引用的完整 Message 。 Message message = OpenIMClient.getInstance .messageManager .createQuoteMessage replyText, quotedMessage ;" }, { "path": "/sdk/android/message/creating-messages/create-advanced-text-message", @@ -2709,7 +2709,7 @@ "description": "使用 createAdvancedQuoteMessage 创建带富文本实体的引用回复消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-advanced-quote-message", - "content": "富文本回复同时保存回复正文、被引用的原消息和正文中的 RichMessage 实体范围。 RichMessage mention = new RichMessage ; mention.setType \"mention\" ; mention.setOffset 0 ; mention.setLength 6 ; mention.setInfo \" \\\"userID\\\":\\\"user a\\\" \" ; Message message = OpenIMClient.getInstance .messageManager.createAdvancedQuoteMessage \"OpenIM agreed\", originalMessage, Collections.singletonList mention ; 被引用的 originalMessage 应包含稳定的 clientMsgID ,实体范围必须对应最终回复正文。 type 、 url 和 info 的业务协议与 创建富文本消息 /sdk/android/message/creating messages/create advanced text message 相同。本方法只创建待发送对象,不会自动发送。" + "content": "富文本回复同时保存回复正文、被引用的原消息和正文中的 RichMessage 实体范围。 RichMessage mention = new RichMessage ; mention.setType \"mention\" ; mention.setOffset 0 ; mention.setLength 6 ; mention.setInfo \" \\\"userID\\\":\\\"user a\\\" \" ; Message message = OpenIMClient.getInstance .messageManager.createAdvancedQuoteMessage \"OpenIM agreed\", originalMessage, Collections.singletonList mention ; 实体范围必须对应最终回复正文。 type 、 url 和 info 的业务协议与 创建富文本消息 /sdk/android/message/creating messages/create advanced text message 相同。本方法只创建待发送对象,不会自动发送。" }, { "path": "/sdk/android/message/creating-messages/create-forward-message", @@ -2725,7 +2725,7 @@ "description": "使用 createMergerMessage 将多条消息合并为一条摘要消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-merger-message", - "content": "传入消息列表、标题和摘要列表;摘要顺序应与展示协议保持一致。 Message message = OpenIMClient.getInstance .messageManager.createMergerMessage messages, title, summaries ;" + "content": "传入消息列表、标题和摘要列表。 Message message = OpenIMClient.getInstance .messageManager.createMergerMessage messages, title, summaries ;" }, { "path": "/sdk/android/message/sending-messages/send-message", @@ -2733,7 +2733,7 @@ "description": "使用 sendMessage 将 Message 发送到单聊或群聊。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message sending-messages send-message", - "content": "单聊填写 recvUid ,群聊填写 recvGid ,另一个目标参数传 null 。 OnMsgSendCallback 同时承载成功、失败和媒体进度。 messageManager.sendMessage new OnMsgSendCallback @Override public void onSuccess Message sentMessage mergeSentMessage sentMessage ; @Override public void onError int code, String error showSendError error ; , message, peerUserID, null, offlinePushInfo ;" + "content": "单聊填写 recvUid ,群聊填写 recvGid 。通过 OnMsgSendCallback 处理发送成功、失败和媒体进度。 messageManager.sendMessage new OnMsgSendCallback @Override public void onSuccess Message sentMessage mergeSentMessage sentMessage ; @Override public void onError int code, String error showSendError error ; , message, peerUserID, null, offlinePushInfo ;" }, { "path": "/sdk/android/message/sending-messages/send-message-not-oss", @@ -2741,7 +2741,7 @@ "description": "使用 sendMessageNotOss 发送已经由业务上传资源的媒体消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message sending-messages send-message-not-oss", - "content": "消息中的媒体 URL 已准备好时使用该方法,避免 SDK 再次进入内置上传流程。 messageManager.sendMessageNotOss callback, message, peerUserID, null, offlinePushInfo ;" + "content": "消息中已有媒体 URL 时使用该方法,无需再次上传媒体文件。 messageManager.sendMessageNotOss callback, message, peerUserID, null, offlinePushInfo ;" }, { "path": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", @@ -2749,7 +2749,7 @@ "description": "通过 OnMsgSendCallback 的进度回调更新媒体发送进度。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message sending-messages set-msg-send-progress-listener", - "content": "Android 没有独立的全局发送进度 listener;进度随每次 sendMessage 或 sendMessageNotOss 传入的 OnMsgSendCallback 返回。 messageManager.sendMessage new OnMsgSendCallback @Override public void onProgress long progress updateProgress progress ; @Override public void onSuccess Message sentMessage finishProgress ; @Override public void onError int code, String error failProgress error ; , message, peerUserID, null, offlinePushInfo ;" + "content": "通过 OnMsgSendCallback.onProgress 获取当前消息的发送进度。 messageManager.sendMessage new OnMsgSendCallback @Override public void onProgress long progress updateProgress progress ; @Override public void onSuccess Message sentMessage finishProgress ; @Override public void onError int code, String error failProgress error ; , message, peerUserID, null, offlinePushInfo ;" }, { "path": "/sdk/android/message/receiving-messages/receive-messages", @@ -2757,7 +2757,7 @@ "description": "使用 OnAdvanceMsgListener 接收新消息、离线消息和在线消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message receiving-messages receive-messages", - "content": "设置 setAdvancedMsgListener 后, onRecvNewMessage 接收实时消息, onRecvOfflineNewMessage 接收离线批次, onRecvOnlineOnlyMessage 接收在线消息字符串。所有消息都按 clientMsgID 幂等合并。 messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; @Override public void onRecvOfflineNewMessage List messages messageStore.mergeAll messages ; ;" + "content": "设置 setAdvancedMsgListener 后, onRecvNewMessage 接收实时消息, onRecvOfflineNewMessage 接收离线批次, onRecvOnlineOnlyMessage 仅接收在线消息。 messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; @Override public void onRecvOfflineNewMessage List messages messageStore.mergeAll messages ; ;" }, { "path": "/sdk/android/message/receiving-messages/receive-custom-business-messages", @@ -2765,7 +2765,7 @@ "description": "使用 setCustomBusinessListener 接收独立于普通聊天消息的业务回调。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message receiving-messages receive-custom-business-messages", - "content": "自定义业务回调携带字符串,业务侧应按协议校验来源和 JSON 结构,不要将其直接当作 Message 渲染。 messageManager.setCustomBusinessListener new OnCustomBusinessListener @Override public void onRecvCustomBusinessMessage String payload handleBusiness payload ; ; 本页是 onRecvCustomBusinessMessage 的完整处理归属页。载荷应包含业务协议版本和稳定幂等 ID,并按该 ID 去重;不要依赖回调顺序,也不要使用自定义业务消息授予客户端权限。 MessageManager 只保存一个自定义业务 listener,后一次设置会替换前一次。应在应用级事件中心设置一次,并在退出或切换账号时停止向旧账号状态分发。" + "content": "自定义业务回调携带字符串,业务侧应按约定格式解析,不要将其直接当作 Message 渲染。 messageManager.setCustomBusinessListener new OnCustomBusinessListener @Override public void onRecvCustomBusinessMessage String payload handleBusiness payload ; ;" }, { "path": "/sdk/android/message/retrieving-messages/load-older-messages", @@ -2789,7 +2789,7 @@ "description": "使用 findMessageList 按 SearchParams 查询消息记录。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message retrieving-messages find-messages-by-id", - "content": "构造 SearchParams 列表查询消息。返回结果应按消息 ID 合并,不要用列表位置作为稳定标识。 messageManager.findMessageList new OnBase @Override public void onSuccess SearchResult result showFoundMessages result ; @Override public void onError int code, String error showQueryError error ; , searchParams ;" + "content": "构造 SearchParams 列表查询消息。 messageManager.findMessageList new OnBase @Override public void onSuccess SearchResult result showFoundMessages result ; @Override public void onError int code, String error showQueryError error ; , searchParams ;" }, { "path": "/sdk/android/message/retrieving-messages/load-message-context", @@ -2797,7 +2797,7 @@ "description": "使用 Android SDK 读取一条消息前后的上下文。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message retrieving-messages load-message-context", - "content": "从搜索结果或引用消息跳入聊天上下文时,把已经取得的 Message 作为锚点。 参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | conversationID | String | 是 | 锚点消息所在的会话 ID。 | | startMsg | Message | 是 | 已经取得的锚点消息。 | | type | ViewType | 是 | 上下文查看类型;引用消息使用 ViewType.History ,搜索结果使用 ViewType.Search 。 | | before | int | 是 | 锚点之前最多读取的消息数量。 | | after | int | 是 | 锚点之后最多读取的消息数量。 | messageManager.fetchSurroundingMessages new OnBase @Override public void onSuccess Messages messages List surrounding = messages.getData ; renderMessages surrounding ; @Override public void onError int code, String error // 处理失败 , conversationID, targetMessage, ViewType.Search, 20, 20 ; 成功回调中的 messages.getData 是锚点前后取得的消息列表,消息字段见 消息概览 /sdk/android/message/overview message 。 before 和 after 分别限制锚点前后的数量。返回结果可能少于请求总数,例如锚点靠近历史边界或部分消息已经删除。按 conversationID:clientMsgID 合并,不要依赖固定数组位置。需要先定位消息时见 按 ID 查找消息 /sdk/android/message/retrieving messages/find messages by id 。" + "content": "从搜索结果或引用消息跳入聊天上下文时,把已经取得的 Message 作为锚点。 参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | conversationID | String | 是 | 锚点消息所在的会话 ID。 | | startMsg | Message | 是 | 已经取得的锚点消息。 | | type | ViewType | 是 | 上下文查看类型;引用消息使用 ViewType.History ,搜索结果使用 ViewType.Search 。 | | before | int | 是 | 锚点之前最多读取的消息数量。 | | after | int | 是 | 锚点之后最多读取的消息数量。 | messageManager.fetchSurroundingMessages new OnBase @Override public void onSuccess Messages messages List surrounding = messages.getData ; renderMessages surrounding ; @Override public void onError int code, String error // 处理失败 , conversationID, targetMessage, ViewType.Search, 20, 20 ; 成功回调中的 messages.getData 是锚点前后取得的消息列表,消息字段见 消息概览 /sdk/android/message/overview message 。 before 和 after 分别限制锚点前后的数量。锚点靠近历史边界或部分消息已经删除时,返回结果可能少于请求总数。需要先定位消息时,见 按 ID 查找消息 /sdk/android/message/retrieving messages/find messages by id 。" }, { "path": "/sdk/android/message/searching-messages/search-messages", @@ -2813,7 +2813,7 @@ "description": "使用 Android SDK 上报当前会话的输入状态。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message composing-messages update-typing-status", - "content": "进入输入状态时,将 focus 设为 true ;输入结束、输入框失去焦点或退出会话时,将其设为 false 。 conversationManager.changeInputState new OnBase @Override public void onSuccess String data // 输入状态已上报 @Override public void onError int code, String error // 处理失败 , conversationID, true ; 输入结束时及时清除状态: conversationManager.changeInputState callback, conversationID, false ; 调用侧应合并连续的焦点变化,并在页面退出或连接中断前尝试上报 false 。成功回调只表示上报请求完成,不表示其他客户端已经更新界面。 其他客户端通过 OnConversationListener.onConversationUserInputStatusChanged 接收输入状态变化。Android SDK 以字符串形式返回事件载荷,应在校验 JSON 后再解析: @Override public void onConversationUserInputStatusChanged String payload InputStatesChangedData state = JsonUtil.toObj payload, InputStatesChangedData.class ; if state == null || state.getConversationID == null return; updateTypingState state.getConversationID , state.getUserID , state.getPlatformIDs ; 输入状态按 conversationID:userID 合并,并设置业务侧超时自动清除。 ConversationManager 只保存一个会话 listener,本回调应与会话列表、总未读数和同步事件组合后统一设置。 进入会话或连接恢复时,可通过 查询输入状态 /sdk/android/message/composing messages/get typing status 获取当前快照。" + "content": "进入输入状态时,将 focus 设为 true ;输入结束、输入框失去焦点或退出会话时,将其设为 false 。 conversationManager.changeInputState new OnBase @Override public void onSuccess String data // 输入状态已上报 @Override public void onError int code, String error // 处理失败 , conversationID, true ; 输入结束时及时清除状态: conversationManager.changeInputState callback, conversationID, false ; 避免频繁重复上报相同状态。成功回调表示上报请求已经完成。 其他客户端通过 OnConversationListener.onConversationUserInputStatusChanged 接收输入状态变化。Android SDK 以字符串形式返回事件载荷,应在校验 JSON 后再解析: @Override public void onConversationUserInputStatusChanged String payload InputStatesChangedData state = JsonUtil.toObj payload, InputStatesChangedData.class ; if state == null || state.getConversationID == null return; updateTypingState state.getConversationID , state.getUserID , state.getPlatformIDs ; 回调中的 conversationID 、 userID 和 platformIDs 分别表示会话、用户和正在输入的平台。 ConversationManager 只能设置一个 OnConversationListener ;如果应用还需要处理其他会话事件,请在同一个 listener 中实现相应回调。 需要主动查询指定用户是否正在输入时,使用 查询输入状态 /sdk/android/message/composing messages/get typing status 。" }, { "path": "/sdk/android/message/composing-messages/get-typing-status", @@ -2821,7 +2821,7 @@ "description": "使用 getInputState 查询指定用户在会话中的当前输入状态。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message composing-messages get-typing-status", - "content": "进入会话、连接恢复或需要校准状态时,查询指定用户当前正在输入的平台 ID 列表。 OpenIMClient.getInstance .conversationManager.getInputState new OnBase @Override public void onSuccess List platformIDs boolean typing = platformIDs = null && platformIDs.isEmpty ; updateTypingState conversationID, userID, typing ; @Override public void onError int code, String error recordTypingStatusQueryFailure code, error ; , conversationID, userID ; 成功 callback 返回平台 ID 数组快照;空列表表示查询时没有平台处于输入状态。查询本身不会触发输入状态事件。群聊中不要频繁轮询全部成员,只在进入页面、连接恢复或补偿状态时查询重点成员;在线增量由 上报输入状态 /sdk/android/message/composing messages/update typing status 归属的 listener 维护。" + "content": "查询指定用户当前正在输入的平台 ID 列表。 OpenIMClient.getInstance .conversationManager.getInputState new OnBase @Override public void onSuccess List platformIDs boolean typing = platformIDs = null && platformIDs.isEmpty ; updateTypingState conversationID, userID, typing ; @Override public void onError int code, String error recordTypingStatusQueryFailure code, error ; , conversationID, userID ; 成功回调返回平台 ID 列表;空列表表示该用户当前没有平台处于输入状态。输入状态发生变化时,通过 上报输入状态 /sdk/android/message/composing messages/update typing status 页面介绍的回调接收通知。" }, { "path": "/sdk/android/message/managing-messages/delete-local-message", @@ -2837,7 +2837,7 @@ "description": "使用 Android SDK 批量删除当前账号在同一会话中的消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages delete-saved-messages", - "content": "参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | conversationID | String | 是 | 要删除消息所在的会话 ID。 | | clientMsgIDs | String | 是 | 要删除的消息 ID 列表;同一批 ID 必须属于同一会话。 | | isSync | boolean | 是 | 是否把删除动作同步到当前账号的其他客户端。 | DeleteMessagesReq request = new DeleteMessagesReq true, conversationID, selectedClientMsgIDs.toArray new String 0 ; messageManager.deleteMessages request, new OnBase @Override public void onSuccess String data // 删除请求已完成 @Override public void onError int code, String error // 处理失败 ; isSync 为 false 时,删除当前设备及当前账号服务端保存的记录;为 true 时,还会请求把删除动作同步到当前账号的其他客户端。该操作不会删除其他会话成员持有的副本,也不会产生撤回提示。 成功回调表示删除请求已经完成;开启同步时,不代表其他客户端已经收到事件或完成界面更新。 OnAdvanceMsgListener.onMsgDeleted 是本页归属事件。根据消息路由字段确定会话后,按 clientMsgID 幂等移除消息。 @Override public void onMsgDeleted Message message removeMessage resolveConversationID message , message.getClientMsgID ; 需要校准当前消息快照时,重新查询对应会话的历史消息。" + "content": "参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | conversationID | String | 是 | 要删除消息所在的会话 ID。 | | clientMsgIDs | String | 是 | 要删除的消息 ID 列表;同一批 ID 必须属于同一会话。 | | isSync | boolean | 是 | 是否把删除动作同步到当前账号的其他客户端。 | DeleteMessagesReq request = new DeleteMessagesReq true, conversationID, selectedClientMsgIDs.toArray new String 0 ; messageManager.deleteMessages request, new OnBase @Override public void onSuccess String data // 删除请求已完成 @Override public void onError int code, String error // 处理失败 ; isSync 为 false 时,删除当前设备及当前账号服务端保存的记录;为 true 时,还会请求把删除动作同步到当前账号的其他客户端。该操作不会删除其他会话成员持有的副本,也不会产生撤回提示。 成功回调表示删除请求已经完成;开启同步时,不代表其他客户端已经收到事件或完成界面更新。 开启同步后,其他客户端可通过 OnAdvanceMsgListener.onMsgDeleted 接收删除的消息: @Override public void onMsgDeleted Message message handleDeletedMessage message ;" }, { "path": "/sdk/android/message/managing-messages/delete-user-messages", @@ -2845,7 +2845,7 @@ "description": "使用 Android SDK 删除指定用户在群聊中的全部消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages delete-user-messages", - "content": "messageManager.deleteUserAllMessagesInConv conversationID, targetUserID, new OnBase @Override public void onSuccess String data // 删除请求已完成 @Override public void onError int code, String error // 处理失败 ; 该 API 只用于群聊,可删除指定用户在目标群会话中的全部消息。这是高影响的群组管控操作,不应放入普通单条消息菜单;操作者权限由 OpenIMServer 校验。成功回调不代表事件已经到达。 OnAdvanceMsgListener.onDeleteUserAllMsgsInConv 是本页归属事件。收到事件后,根据 conversationID 和 userID 移除缓存中该用户发送的消息,或重新读取会话历史进行校准。 @Override public void onDeleteUserAllMsgsInConv DeleteUserAllMsgsListenerMsg event removeMessagesBySender event.getConversationID , event.getUserID ; 成功回调、事件到达和重新查询历史是三个独立阶段。" + "content": "messageManager.deleteUserAllMessagesInConv conversationID, targetUserID, new OnBase @Override public void onSuccess String data // 删除请求已完成 @Override public void onError int code, String error // 处理失败 ; 该 API 只用于群聊,可删除指定用户在目标群会话中的全部消息。调用者没有操作权限时,通过 onError 返回错误。 其他客户端通过 OnAdvanceMsgListener.onDeleteUserAllMsgsInConv 接收删除通知。回调参数包含对应的 conversationID 和 userID : @Override public void onDeleteUserAllMsgsInConv DeleteUserAllMsgsListenerMsg event handleUserMessagesDeleted event.getConversationID , event.getUserID ;" }, { "path": "/sdk/android/message/managing-messages/revoke-a-message", @@ -2853,7 +2853,7 @@ "description": "撤回已发送消息,并处理其他客户端收到的撤回通知。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages revoke-a-message", - "content": "撤回会使其他客户端把原消息显示为撤回状态。调用前应确认消息已经发送成功,并由业务界面限制可撤回时间;最终权限由服务端校验。 messageManager.revokeMessageV2 callback, conversationID, clientMsgID ; 成功回调表示服务端完成撤回请求,不代表所有客户端都已经收到事件。接收端通过 OnAdvanceMsgListener.onRecvMessageRevokedV2 合并撤回变化。 本页是 onRecvMessageRevokedV2 的完整事件归属页。 RevokedInfo 包含 clientMsgID 、撤回者和撤回时间,但不包含 conversationID ,应先从当前账号的消息索引解析所属会话,再按 conversationID:clientMsgID 更新消息: @Override public void onRecvMessageRevokedV2 RevokedInfo info String clientMsgID = info.getClientMsgID ; String conversationID = findConversationIDByClientMsgID clientMsgID ; if conversationID == null return; markMessageRevoked conversationID, clientMsgID, info ; 接收端应把对应消息更新为撤回状态,而不是直接从列表删除。该回调应纳入应用唯一的 OnAdvanceMsgListener ,集中设置入口见 事件概览 /sdk/android/events/overview events 。 成功回调、撤回事件到达和重新查询历史是三个独立阶段。需要校准时重新读取对应会话的历史消息。" + "content": "撤回会使其他客户端把原消息显示为撤回状态。调用失败时,通过错误回调获取错误码和错误信息。 messageManager.revokeMessageV2 callback, conversationID, clientMsgID ; 成功回调表示撤回请求已经完成。其他客户端通过 OnAdvanceMsgListener.onRecvMessageRevokedV2 接收撤回通知。 RevokedInfo 包含 clientMsgID 、撤回者和撤回时间: @Override public void onRecvMessageRevokedV2 RevokedInfo info handleRevokedMessage info ; 接收端应把对应消息更新为撤回状态,而不是直接从列表删除。 MessageManager 只能设置一个 OnAdvanceMsgListener ;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见 事件概览 /sdk/android/events/overview events 。" }, { "path": "/sdk/android/message/managing-messages/modify-a-message", @@ -2861,7 +2861,7 @@ "description": "修改支持编辑的消息内容,并处理其他客户端收到的消息修改事件。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages modify-a-message", - "content": "modifyMessage 用于修改会话中已经存在的消息。请求对象应保留原消息的会话 ID、 clientMsgID 、路由和发送者等字段,只更新允许修改的内容。 messageManager.modifyMessage callback, modifyRequest ; 成功回调表示修改请求已经完成,不代表所有客户端界面都已经更新。其他客户端通过 OnAdvanceMsgListener.onMessageModified 接收修改后的完整 Message 。 本页是 onMessageModified 的完整事件归属页。根据消息路由解析 conversationID ,再按 conversationID:clientMsgID 替换原消息,不要按数组位置或显示文本匹配: @Override public void onMessageModified Message message String conversationID = resolveConversationID message ; if conversationID == null return; replaceMessage conversationID, message.getClientMsgID , message ; 该回调应纳入应用唯一的 OnAdvanceMsgListener ,集中设置入口见 事件概览 /sdk/android/events/overview events 。成功回调、修改事件到达和重新查询历史是三个独立阶段。" + "content": "modifyMessage 用于修改会话中已经存在的消息。通常应以原消息为基础修改支持编辑的内容,并保留其他字段。 messageManager.modifyMessage callback, modifyRequest ; 成功回调表示修改请求已经完成。 消息修改后,其他客户端通过 OnAdvanceMsgListener.onMessageModified 接收修改后的完整 Message : @Override public void onMessageModified Message message handleModifiedMessage message ; MessageManager 只能设置一个 OnAdvanceMsgListener ;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见 事件概览 /sdk/android/events/overview events 。" }, { "path": "/sdk/android/message/managing-messages/get-pinned-messages", @@ -2869,7 +2869,7 @@ "description": "使用 getConversationPinnedMsgs 查询会话中的置顶消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages get-pinned-messages", - "content": "查询结果是指定会话当前的置顶消息快照。 messageManager.getConversationPinnedMsgs new OnBase @Override public void onSuccess List messages showPinned messages ; @Override public void onError int code, String error showPinnedError error ; , conversationID ;" + "content": "成功回调返回指定会话当前的置顶消息列表。 messageManager.getConversationPinnedMsgs new OnBase @Override public void onSuccess List messages showPinned messages ; @Override public void onError int code, String error showPinnedError error ; , conversationID ;" }, { "path": "/sdk/android/message/managing-messages/set-message-pinned", @@ -2877,7 +2877,7 @@ "description": "设置会话消息的置顶状态,并处理置顶消息变化事件。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages set-message-pinned", - "content": "最后一个参数为 true 时置顶消息,为 false 时取消置顶: messageManager.setConversationPinnedMsg callback, conversationID, clientMsgID, true ; 成功回调表示设置请求完成,不代表置顶变化事件已经到达。 OnAdvanceMsgListener.onChangedPinnedMsg 是本页归属事件。回调中的 ChangedPinnedMsg 包含 conversationID 和当前置顶消息集合;按会话替换集合,并按每条置顶消息的 clientMsgID 去重: @Override public void onChangedPinnedMsg ChangedPinnedMsg event replacePinnedMessages event.getConversationID , event.getMsgs ; 该回调应纳入应用唯一的 OnAdvanceMsgListener ,集中设置入口见 事件概览 /sdk/android/events/overview events 。成功回调、事件到达和 查询会话置顶消息 /sdk/android/message/managing messages/get pinned messages 取得的快照是三个独立阶段。" + "content": "最后一个参数为 true 时置顶消息,为 false 时取消置顶: messageManager.setConversationPinnedMsg callback, conversationID, clientMsgID, true ; 成功回调表示设置请求完成,不代表置顶变化事件已经到达。 置顶消息发生变化时, OnAdvanceMsgListener.onChangedPinnedMsg 返回对应的 conversationID 和当前置顶消息列表: @Override public void onChangedPinnedMsg ChangedPinnedMsg event handlePinnedMessagesChanged event.getConversationID , event.getMsgs ; MessageManager 只能设置一个 OnAdvanceMsgListener ;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见 事件概览 /sdk/android/events/overview events 。需要主动获取当前置顶消息时,使用 查询会话置顶消息 /sdk/android/message/managing messages/get pinned messages 。" }, { "path": "/sdk/android/message/managing-messages/insert-local-single-message", @@ -2885,7 +2885,7 @@ "description": "使用 insertSingleMessageToLocalStorage 插入仅当前设备可见的单聊消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages insert-local-single-message", - "content": "该方法不向服务器发送消息, receiver 和 sender 用于建立本地消息归属。 messageManager.insertSingleMessageToLocalStorage callback, message, receiverUserID, senderUserID ;" + "content": "该方法不向服务器发送消息。 receiver 是接收者用户 ID, sender 是发送者用户 ID。 messageManager.insertSingleMessageToLocalStorage callback, message, receiverUserID, senderUserID ;" }, { "path": "/sdk/android/message/managing-messages/insert-local-group-message", @@ -2925,7 +2925,7 @@ "description": "使用 Android SDK 上报群消息已读回执。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-read-status send-group-read-receipts", - "content": "messageManager.sendGroupMessageReadReceipt conversationID, visibleClientMsgIDs, new OnBase @Override public void onSuccess String data // 已读回执已上报 @Override public void onError int code, String error // 处理失败 ; 同一批消息必须属于目标群会话。成功回调只表示服务端接受上报,不代表其他客户端界面已经更新。会话未读数仍由 markConversationMessageAsRead 独立维护。 其他客户端通过 OnAdvanceMsgListener.onRecvGroupMessageReadReceipt 接收群聊成员级已读变化。本页是该事件的完整监听归属页;根据 conversationID 以及回执中的消息 ID 合并消息已读数、未读数和成员信息。 @Override public void onRecvGroupMessageReadReceipt GroupMessageReceipt receipt mergeGroupReadReceipt receipt ; 上报回调、群回执事件和 查询群消息已读成员 /sdk/android/message/managing read status/get group message readers 取得的成员快照是三个独立阶段。" + "content": "messageManager.sendGroupMessageReadReceipt conversationID, visibleClientMsgIDs, new OnBase @Override public void onSuccess String data // 已读回执已上报 @Override public void onError int code, String error // 处理失败 ; 同一批消息必须属于目标群会话。成功回调只表示服务端接受上报,不代表其他客户端界面已经更新。会话未读数仍由 markConversationMessageAsRead 独立维护。 其他客户端通过 OnAdvanceMsgListener.onRecvGroupMessageReadReceipt 接收群消息已读回执: @Override public void onRecvGroupMessageReadReceipt GroupMessageReceipt receipt handleGroupMessageReadReceipt receipt ; 需要查询某条群消息的已读或未读成员时,使用 查询群消息已读成员 /sdk/android/message/managing read status/get group message readers 。" }, { "path": "/sdk/android/message/managing-read-status/get-group-message-readers", @@ -2933,15 +2933,7 @@ "description": "使用 Android SDK 分页查询群消息的已读或未读成员。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-read-status get-group-message-readers", - "content": "参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | conversationID | String | 是 | 群聊会话 ID。 | | clientMsgID | String | 是 | 要查询阅读成员的消息 ID。 | | filter | int | 是 | 0 查询已读成员, 1 查询未读成员。 | | offset | int | 是 | 分页偏移量,首页传 0 。 | | count | int | 是 | 本次请求的成员数量。 | messageManager.getGroupMessageReaderList conversationID, clientMsgID, 0, 0, 50, new OnBase @Override public void onSuccess List members renderMembers members ; @Override public void onError int code, String error // 处理失败 ; 成功回调返回当前页 GroupMembersInfo 列表,字段含义见 分页查询群成员 /sdk/android/group/retrieving group members/get group member list 。按 groupID:userID 去重;查询只建立当前快照,不触发回执事件。需要完整列表时继续分页。" - }, - { - "path": "/sdk/android/file-uploads/track-file-upload-progress", - "title": "监听文件上传进度", - "description": "使用 Android SDK 的 OnPutFileListener 跟踪单次文件上传任务。", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android file-uploads track-file-upload-progress", - "content": "Android SDK 不设置全局文件上传 listener。每次调用 uploadFile 时传入一个 OnPutFileListener ,由该 listener 接收当前上传任务的进度、分片状态和完成信息。 OnPutFileListener uploadListener = new OnPutFileListener @Override public void open long size initializeUploadProgress uploadTaskID, size ; @Override public void uploadID String id bindSdkUploadID uploadTaskID, id ; @Override public void uploadComplete long fileSize, long uploadedSize, long storageSize updateUploadProgress uploadTaskID, uploadedSize, fileSize ; @Override public void uploadPartComplete long partNumber, long partSize, String partHash markPartComplete uploadTaskID, partNumber, partSize, partHash ; @Override public void complete long size, String url, long type completeUpload uploadTaskID, size, url, type ; ; OpenIMClient.getInstance .uploadFile resultCallback, uploadListener, putArgs ; open 可用于初始化总大小, uploadID 返回 SDK 上传任务标识, uploadComplete 提供上传过程数据, uploadPartComplete 表示一个分片已经完成, complete 返回最终大小、远端 URL 和资源类型。只有业务需要展示分片细节时才处理分片回调;普通进度条通常只需要过程回调和最终完成回调。 业务层仍应生成自己的稳定 uploadTaskID ,并在 listener 闭包中关联界面状态。SDK 上传 ID、文件名和数组位置都不应代替业务任务主键。每个上传任务使用独立 listener;页面或账号状态销毁后应停止向旧状态分发回调。 完整的参数构造和错误处理见 上传文件 /sdk/android/file uploads/upload file 。" + "content": "参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | conversationID | String | 是 | 群聊会话 ID。 | | clientMsgID | String | 是 | 要查询阅读成员的消息 ID。 | | filter | int | 是 | 0 查询已读成员, 1 查询未读成员。 | | offset | int | 是 | 分页偏移量,首页传 0 。 | | count | int | 是 | 本次请求的成员数量。 | messageManager.getGroupMessageReaderList conversationID, clientMsgID, 0, 0, 50, new OnBase @Override public void onSuccess List members renderMembers members ; @Override public void onError int code, String error // 处理失败 ; 成功回调返回当前页 GroupMembersInfo 列表,字段含义见 分页查询群成员 /sdk/android/group/retrieving group members/get group member list 。需要完整列表时继续分页。" }, { "path": "/sdk/android/file-uploads/upload-file", @@ -2949,7 +2941,7 @@ "description": "使用 Android SDK 独立上传文件并获取远端资源地址。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android file-uploads upload-file", - "content": "uploadFile 是独立文件上传能力,可用于头像、群头像、资料附件或其他业务文件。上传过程不从属于消息,也不会自动创建消息或更新用户资料。 参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | base | OnBase | 是 | 接收上传请求的最终成功或失败结果。 | | listener | OnPutFileListener | 是 | 接收当前任务的上传进度、分片状态和完成信息。 | | putArgs.filepath | String | 是 | Android 应用可读取的本地文件路径。 | | putArgs.name | String | 是 | 上传使用的文件名; PutArgs 默认使用传入路径,可按业务需要改为原始文件名。 | | putArgs.cuase | String | 否 | 业务约定的上传原因。字段名以 Android SDK 的 PutArgs 声明为准。 | File file = new File localPath ; PutArgs args = new PutArgs file.getAbsolutePath ; args.name = file.getName ; args.cuase = \"user avatar\"; OpenIMClient.getInstance .uploadFile new OnBase @Override public void onSuccess String result finishUploadRequest result ; @Override public void onError int code, String error showUploadError code, error ; , new OnPutFileListener @Override public void uploadComplete long fileSize, long uploadedSize, long storageSize updateUploadProgress uploadTaskID, uploadedSize, fileSize ; @Override public void complete long size, String url, long type completeUpload uploadTaskID, size, url, type ; , args ; 每次调用都传入独立的 OnPutFileListener ,因此无需设置全局上传 listener。并行上传时应由业务层为任务生成稳定 ID,并在回调闭包中关联对应任务,不要使用文件名或列表位置作为唯一标识。各回调的职责见 跟踪文件上传进度 /sdk/android/file uploads/track file upload progress 。 complete 返回的 URL 可用于后续更新头像、保存附件地址或创建 URL 类型的媒体消息。上传成功只表示文件资源已经写入远端;资料更新、消息创建和消息发送仍需分别调用对应 API。" + "content": "uploadFile 是独立文件上传能力,可用于头像、群头像、资料附件或其他业务文件。上传过程不从属于消息,也不会自动创建消息或更新用户资料。 参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | base | OnBase | 是 | 接收上传请求的最终成功或失败结果。 | | listener | OnPutFileListener | 是 | 接收当前任务的文件、分片、哈希及上传完成信息。 | | putArgs.filepath | String | 是 | Android 应用可读取的本地文件路径。 | | putArgs.name | String | 是 | 上传使用的文件名; PutArgs 默认使用传入路径,可按业务需要改为原始文件名。 | | putArgs.cuase | String | 否 | 业务约定的上传原因。字段名以 Android SDK 的 PutArgs 声明为准。 | File file = new File localPath ; PutArgs args = new PutArgs file.getAbsolutePath ; args.name = file.getName ; args.cuase = \"user avatar\"; OpenIMClient.getInstance .uploadFile new OnBase @Override public void onSuccess String result finishUploadRequest result ; @Override public void onError int code, String error showUploadError code, error ; , new OnPutFileListener @Override public void open long size initializeUpload uploadTaskID, size ; @Override public void uploadID String id bindSdkUploadID uploadTaskID, id ; @Override public void uploadComplete long fileSize, long streamSize, long storageSize recordUploadSizes uploadTaskID, fileSize, streamSize, storageSize ; @Override public void complete long size, String url, long type completeUpload uploadTaskID, size, url, type ; , args ; 回调说明 OnPutFileListener 的回调和参数如下: | 回调 | 参数 | 说明 | | | | | | open | size | 打开指定大小的文件,可用于初始化任务。 | | partSize | partSize , num | 单个分片大小和分片总数。 | | hashPartProgress | index , size , partHash | 单个分片完成哈希计算时的分片索引、大小和哈希值。 | | hashPartComplete | partsHash , fileHash | 所有分片完成哈希计算后的组合哈希和最终文件哈希。 | | uploadID | uploadID | SDK 生成的上传标识。 | | uploadPartComplete | index , partSize , partHash | 一个分片上传完成时的分片索引、大小和哈希值。 | | uploadComplete | fileSize , streamSize , storageSize | 整个文件上传阶段的数据:文件大小、流大小和存储大小。 | | complete | size , url , type | 文件上传完成后的最终大小、远端 URL 和资源类型。 | complete 返回的 URL 可用于后续更新头像、保存附件地址或创建 URL 类型的媒体消息。上传成功只表示文件资源已经写入远端;资料更新、消息创建和消息发送仍需分别调用对应 API。" }, { "path": "/sdk/android/calling/overview-calling", diff --git a/src/generated/search-index.json b/src/generated/search-index.json index d9dec7a763..59a303c4fc 100644 --- a/src/generated/search-index.json +++ b/src/generated/search-index.json @@ -2541,7 +2541,7 @@ "description": "Learn about the Android SDK Message model, message lifecycle, and message listener.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message overview-message", - "content": "Android messages are represented by Message . Use clientMsgID for deduplication, and use sessionType , recvID , and groupID to distinguish one to one chats from group chats. Message content is stored in the corresponding element field. Sending, receiving, revoking, and deleting are separate state changes. OpenIMClient.getInstance .messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; ; Queries establish a snapshot, while OnAdvanceMsgListener merges incremental changes. Setting a listener on MessageManager replaces the current listener, so register it once in a shared state layer." + "content": "The Android SDK represents each message as Message . Message creation, sending, receiving, querying, and state changes are separate stages: creating a Message does not send it, and a successful send does not mean that other clients have already received it. Use clientMsgID as the client side deduplication and update key, together with the conversation context that identifies a one to one or group chat. Message does not contain conversationID ; obtain it from the active conversation, history query, or message event context. Message processing flow | Stage | Android API or callback | Description | | | | | | Create | MessageManager.create Message | Creates a Message object ready to be sent, without writing it to the server or triggering a new message callback. | | Send | sendMessage or sendMessageNotOss | Pass recvUid for a one to one chat or recvGid for a group chat. | | Receive | OnAdvanceMsgListener | Handles live, offline, online only, revoked, deleted, and read receipt changes. | | Query | History, ID lookup, or search APIs | Queries return a message snapshot and do not replace real time message listening. | | Update | Revoke, delete, modify, pin, read, and local extension APIs | Handle API results, related events, and any necessary list re query separately. | messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; @Override public void onRecvOfflineNewMessage List messages messageStore.mergeAll messages ; @Override public void onRecvMessageRevokedV2 RevokedInfo info messageStore.markRevoked info ; @Override public void onMsgDeleted Message message messageStore.remove message.getClientMsgID ; ; Calling setAdvancedMsgListener on the same MessageManager replaces the current listener. Register it in the shared message state layer and dispatch the resulting changes to screens. Message fields The message object returned by creation, sending, receiving, and querying APIs is a Message . Common fields include: | Field | Type | Description | | | | | | clientMsgID | String | Client message ID used for list deduplication, state updates, and message lookup. | | serverMsgID | String | Server message ID; it may not have a valid value before a message is sent successfully. | | sessionType | int | Conversation type; use it with recvID and groupID to distinguish one to one and group chats. | | sendID | String | Sender user ID. | | recvID | String | Recipient user ID for a one to one message. | | groupID | String | Group ID for a group message. | | msgFrom | int | Indicates whether the message is user level or system level. | | contentType | int | Message type; use MessageType constants to select the content field. | | createTime | long | Message creation time; the Android model documents this value in nanoseconds. | | sendTime | long | Message send time; the Android model documents this value in milliseconds. | | seq | int | Server message sequence number. | | status | int | Send state; use MessageStatus constants to interpret it. | | isRead | boolean | Read state snapshot stored on the current client. | | platformID | int | Client platform from which the message was sent. | | senderNickname | String | Snapshot of the sender's nickname. | | senderFaceUrl | String | Snapshot of the sender's avatar URL. | | isReact | boolean | Whether the message carries a reaction marker. | | isExternalExtensions | boolean | Whether the message uses external extensions. | | offlinePush | OfflinePushInfo | Offline push content. | | attachedInfo | String | SDK attachment information. | | ext | Object | Android message attachment field. | | ex | Object | Message attachment field. | | localEx | Object | Message extension field stored only on the current device. | The message body is stored in the element field selected by contentType . Do not infer the message type from list position or rendered text: | Message content | Corresponding field | | | | | Text and rich text | textElem , advancedTextElem | | Image, audio, video, and file | pictureElem , soundElem , videoElem , fileElem | | @ mention and reply | atTextElem , quoteElem | | Merged forward | mergeElem | | Contact card, location, and emoji | cardElem , locationElem , faceElem | | Custom message | customElem | | Notification, typing, and attached state | notificationElem , typingElem , attachedInfoElem | Create and send different content types Sending a message has two steps: 1. Call the create Message method for the desired content to obtain a pending Message . 2. Pass that Message to sendMessage /sdk/android/message/sending messages/send message . For a one to one chat, set recvUid ; for a group chat, set recvGid . The available message types and creation methods are: | Message content | Creation API | | | | | Text | createTextMessage /sdk/android/message/creating messages/create text message | | Rich text | createAdvancedTextMessage /sdk/android/message/creating messages/create advanced text message | | @ mention | createTextAtMessage /sdk/android/message/creating messages/create text at message | | Image | createImageMessage /sdk/android/message/creating messages/create image message , createImageMessageFromFullPath /sdk/android/message/creating messages/create image message by file , createImageMessageByURL /sdk/android/message/creating messages/create image message by url | | Audio | createSoundMessage /sdk/android/message/creating messages/create sound message , createSoundMessageFromFullPath /sdk/android/message/creating messages/create sound message by file , createSoundMessageByURL /sdk/android/message/creating messages/create sound message by url | | Video | createVideoMessage /sdk/android/message/creating messages/create video message , createVideoMessageFromFullPath /sdk/android/message/creating messages/create video message by file , createVideoMessageByURL /sdk/android/message/creating messages/create video message by url | | File | createFileMessage /sdk/android/message/creating messages/create file message , createFileMessageFromFullPath /sdk/android/message/creating messages/create file message by file , createFileMessageByURL /sdk/android/message/creating messages/create file message by url | | Contact card | createCardMessage /sdk/android/message/creating messages/create card message | | Location | createLocationMessage /sdk/android/message/creating messages/create location message | | Emoji | createFaceMessage /sdk/android/message/creating messages/create face message | | Reply | createQuoteMessage /sdk/android/message/creating messages/create quote message , createAdvancedQuoteMessage /sdk/android/message/creating messages/create advanced quote message | | Forward | createForwardMessage /sdk/android/message/creating messages/create forward message | | Merged forward | createMergerMessage /sdk/android/message/creating messages/create merger message | | Custom message | createCustomMessage /sdk/android/message/creating messages/create custom message | Choose the send method based on the media source. For a message created from a local path or local file, call sendMessage so the SDK uploads the media during sending. For a message created from an existing remote URL with create MessageByURL , call sendMessageNotOss /sdk/android/message/sending messages/send message not oss to send the message without uploading the media again. Find a page by task | Task | Page | | | | | Send an ordinary message or already uploaded media | Send a message /sdk/android/message/sending messages/send message , Send an uploaded media message /sdk/android/message/sending messages/send message not oss | | Receive live, offline, and online only messages | Receive messages /sdk/android/message/receiving messages/receive messages , Receive custom business messages /sdk/android/message/receiving messages/receive custom business messages | | Load message history or load it in reverse | Load message history /sdk/android/message/retrieving messages/load older messages , Load message history in reverse /sdk/android/message/retrieving messages/load newer messages | | Locate or search messages | Find messages by ID /sdk/android/message/retrieving messages/find messages by id , Search messages /sdk/android/message/searching messages/search messages | | Delete, revoke, modify, or pin messages | Delete messages /sdk/android/message/managing messages/delete saved messages , Revoke a message /sdk/android/message/managing messages/revoke a message , Modify a message /sdk/android/message/managing messages/modify a message , Pin a message /sdk/android/message/managing messages/set message pinned | | Manage conversation unread state and group read receipts | Mark a conversation as read /sdk/android/conversation/managing conversations/mark conversation read , Report group messages as read /sdk/android/message/managing read status/send group read receipts , Get group message readers /sdk/android/message/managing read status/get group message readers | | Report or retrieve typing status | Update typing status /sdk/android/message/composing messages/update typing status , Get typing status /sdk/android/message/composing messages/get typing status | | Insert, delete, or extend current device only messages | Insert a local one to one message /sdk/android/message/managing messages/insert local single message , Delete a local message /sdk/android/message/managing messages/delete local message , Set a local message extension /sdk/android/message/managing messages/set message local ex | State synchronization boundaries | Change | Handling location | Merge strategy | | | | | | New and offline messages | Receive messages /sdk/android/message/receiving messages/receive messages | Determine the target conversation, then merge by clientMsgID . | | Message revocation | onRecvMessageRevokedV2 | Update the original message by the ID in the revoke information. | | Message deletion | onMsgDeleted | Remove the message from the current conversation by ID. | | C2C and group read receipts | onRecvC2CReadReceipt , onRecvGroupMessageReadReceipt | Update the corresponding message or conversation read state. | | Message extension changes | onRecvMessageExtensionsChanged and related callbacks | Update extension fields by message ID without replacing the message body. | | Typing status | Update typing status /sdk/android/message/composing messages/update typing status | Maintain temporary state by conversation and user, outside the ordinary message list. | For message revocation, deletion, read receipts, and extension changes, handle the API result first, then process the related OnAdvanceMsgListener callbacks. Re query the message list when necessary." }, { "path": "/sdk/android/message/creating-messages/create-text-message", @@ -2549,7 +2549,7 @@ "description": "Use createTextMessage to create a text Message.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-text-message", - "content": "createTextMessage only creates a local message object. It does not send the message. Message message = OpenIMClient.getInstance .messageManager.createTextMessage text ;" + "content": "createTextMessage only creates a Message ready to be sent. It does not send the message. Message message = OpenIMClient.getInstance .messageManager.createTextMessage text ;" }, { "path": "/sdk/android/message/creating-messages/create-text-at-message", @@ -2685,7 +2685,7 @@ "description": "Use createFaceMessage to create a custom emoji message.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-face-message", - "content": "index identifies the emoji position, while data stores JSON such as an emoji URL. Message message = OpenIMClient.getInstance .messageManager.createFaceMessage index, dataJson ;" + "content": "data stores JSON such as an emoji URL. Message message = OpenIMClient.getInstance .messageManager.createFaceMessage index, dataJson ;" }, { "path": "/sdk/android/message/creating-messages/create-quote-message", @@ -2693,7 +2693,7 @@ "description": "Use createQuoteMessage to reply while quoting an existing message.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-quote-message", - "content": "A quote message stores the complete quoted Message . Before sending, make sure the quoted object has a stable clientMsgID . Message message = OpenIMClient.getInstance .messageManager .createQuoteMessage replyText, quotedMessage ;" + "content": "A quote message stores the complete quoted Message . Message message = OpenIMClient.getInstance .messageManager .createQuoteMessage replyText, quotedMessage ;" }, { "path": "/sdk/android/message/creating-messages/create-advanced-text-message", @@ -2709,7 +2709,7 @@ "description": "Use createAdvancedQuoteMessage to create a quoted reply with rich-text entities.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-advanced-quote-message", - "content": "A rich text reply stores the reply text, the quoted message, and the RichMessage entity ranges in the reply text. RichMessage mention = new RichMessage ; mention.setType \"mention\" ; mention.setOffset 0 ; mention.setLength 6 ; mention.setInfo \" \\\"userID\\\":\\\"user a\\\" \" ; Message message = OpenIMClient.getInstance .messageManager.createAdvancedQuoteMessage \"OpenIM agreed\", originalMessage, Collections.singletonList mention ; The quoted originalMessage should contain a stable clientMsgID , and every entity range must match the final reply text. Use the same application protocol for type , url , and info as described in Create a rich text message /sdk/android/message/creating messages/create advanced text message . This method only creates an object waiting to be sent." + "content": "A rich text reply stores the reply text, the quoted message, and the RichMessage entity ranges in the reply text. RichMessage mention = new RichMessage ; mention.setType \"mention\" ; mention.setOffset 0 ; mention.setLength 6 ; mention.setInfo \" \\\"userID\\\":\\\"user a\\\" \" ; Message message = OpenIMClient.getInstance .messageManager.createAdvancedQuoteMessage \"OpenIM agreed\", originalMessage, Collections.singletonList mention ; Every entity range must match the final reply text. Use the same application protocol for type , url , and info as described in Create a rich text message /sdk/android/message/creating messages/create advanced text message . This method only creates an object waiting to be sent." }, { "path": "/sdk/android/message/creating-messages/create-forward-message", @@ -2725,7 +2725,7 @@ "description": "Use createMergerMessage to combine multiple messages into one summary message.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message creating-messages create-merger-message", - "content": "Pass the message list, title, and summary list. Keep summary ordering consistent with the display protocol used by your clients. Message message = OpenIMClient.getInstance .messageManager.createMergerMessage messages, title, summaries ;" + "content": "Pass the message list, title, and summary list. Message message = OpenIMClient.getInstance .messageManager.createMergerMessage messages, title, summaries ;" }, { "path": "/sdk/android/message/sending-messages/send-message", @@ -2733,7 +2733,7 @@ "description": "Use sendMessage to send a Message to a one-to-one or group conversation.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message sending-messages send-message", - "content": "For a one to one message, set recvUid and pass null for the group target. For a group message, set recvGid and pass null for the user target. OnMsgSendCallback reports success, failure, and media upload progress. messageManager.sendMessage new OnMsgSendCallback @Override public void onSuccess Message sentMessage mergeSentMessage sentMessage ; @Override public void onError int code, String error showSendError error ; , message, peerUserID, null, offlinePushInfo ;" + "content": "For a one to one message, set recvUid . For a group message, set recvGid . OnMsgSendCallback reports success, failure, and media upload progress. messageManager.sendMessage new OnMsgSendCallback @Override public void onSuccess Message sentMessage mergeSentMessage sentMessage ; @Override public void onError int code, String error showSendError error ; , message, peerUserID, null, offlinePushInfo ;" }, { "path": "/sdk/android/message/sending-messages/send-message-not-oss", @@ -2741,7 +2741,7 @@ "description": "Use sendMessageNotOss to send a media message whose resources were uploaded by your application.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message sending-messages send-message-not-oss", - "content": "Use this method when the media URLs in the message are already available. It prevents the SDK from entering its built in upload flow again. messageManager.sendMessageNotOss callback, message, peerUserID, null, offlinePushInfo ;" + "content": "Use this method when the media URLs are already included in the message. The media files do not need to be uploaded again. messageManager.sendMessageNotOss callback, message, peerUserID, null, offlinePushInfo ;" }, { "path": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", @@ -2749,7 +2749,7 @@ "description": "Use the progress callback on OnMsgSendCallback to update media sending progress.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message sending-messages set-msg-send-progress-listener", - "content": "Android does not provide a separate global send progress listener. Each call to sendMessage or sendMessageNotOss reports progress through its own OnMsgSendCallback . messageManager.sendMessage new OnMsgSendCallback @Override public void onProgress long progress updateProgress progress ; @Override public void onSuccess Message sentMessage finishProgress ; @Override public void onError int code, String error failProgress error ; , message, peerUserID, null, offlinePushInfo ;" + "content": "Use OnMsgSendCallback.onProgress to receive progress updates for the current message. messageManager.sendMessage new OnMsgSendCallback @Override public void onProgress long progress updateProgress progress ; @Override public void onSuccess Message sentMessage finishProgress ; @Override public void onError int code, String error failProgress error ; , message, peerUserID, null, offlinePushInfo ;" }, { "path": "/sdk/android/message/receiving-messages/receive-messages", @@ -2757,7 +2757,7 @@ "description": "Use OnAdvanceMsgListener to receive new, offline, and online-only messages.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message receiving-messages receive-messages", - "content": "After calling setAdvancedMsgListener , onRecvNewMessage receives real time messages, onRecvOfflineNewMessage receives offline batches, and onRecvOnlineOnlyMessage receives online only message strings. Merge all messages idempotently by clientMsgID . messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; @Override public void onRecvOfflineNewMessage List messages messageStore.mergeAll messages ; ;" + "content": "After calling setAdvancedMsgListener , onRecvNewMessage receives real time messages, onRecvOfflineNewMessage receives offline batches, and onRecvOnlineOnlyMessage receives online only messages. messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; @Override public void onRecvOfflineNewMessage List messages messageStore.mergeAll messages ; ;" }, { "path": "/sdk/android/message/receiving-messages/receive-custom-business-messages", @@ -2765,7 +2765,7 @@ "description": "Use setCustomBusinessListener to receive business callbacks that are separate from regular chat messages.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message receiving-messages receive-custom-business-messages", - "content": "The custom business callback carries a string payload. Validate its source and JSON structure according to your application protocol instead of rendering it directly as a Message . messageManager.setCustomBusinessListener new OnCustomBusinessListener @Override public void onRecvCustomBusinessMessage String payload handleBusiness payload ; ; This page owns the complete handling contract for onRecvCustomBusinessMessage . Include a protocol version and stable idempotency ID in the payload, and deduplicate by that ID. Do not depend on callback order or use a custom business message to grant client side permissions. MessageManager retains only one custom business listener; setting another replaces the previous one. Register it once in an application level event center, and stop dispatching into the previous account's state when signing out or switching accounts." + "content": "The custom business callback carries a string payload. Parse it according to your application format instead of rendering it directly as a Message . messageManager.setCustomBusinessListener new OnCustomBusinessListener @Override public void onRecvCustomBusinessMessage String payload handleBusiness payload ; ;" }, { "path": "/sdk/android/message/retrieving-messages/load-older-messages", @@ -2789,7 +2789,7 @@ "description": "Use findMessageList to retrieve message records with SearchParams.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message retrieving-messages find-messages-by-id", - "content": "Create a list of SearchParams for the messages you need. Merge returned records by message ID rather than treating their list positions as stable identifiers. messageManager.findMessageList new OnBase @Override public void onSuccess SearchResult result showFoundMessages result ; @Override public void onError int code, String error showQueryError error ; , searchParams ;" + "content": "Create a list of SearchParams for the messages you need. messageManager.findMessageList new OnBase @Override public void onSuccess SearchResult result showFoundMessages result ; @Override public void onError int code, String error showQueryError error ; , searchParams ;" }, { "path": "/sdk/android/message/retrieving-messages/load-message-context", @@ -2797,7 +2797,7 @@ "description": "Retrieve messages before and after a specified message with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message retrieving-messages load-message-context", - "content": "When navigating from a search result or referenced message into its chat context, use the Message already retrieved as the anchor. Parameters | Parameter | Type | Required | Description | | | | | | | conversationID | String | Yes | ID of the conversation containing the anchor message. | | startMsg | Message | Yes | Previously retrieved anchor message. | | type | ViewType | Yes | Context type. Use ViewType.History for a referenced message and ViewType.Search for a search result. | | before | int | Yes | Maximum number of messages to retrieve before the anchor. | | after | int | Yes | Maximum number of messages to retrieve after the anchor. | messageManager.fetchSurroundingMessages new OnBase @Override public void onSuccess Messages messages List surrounding = messages.getData ; renderMessages surrounding ; @Override public void onError int code, String error // Handle the failure , conversationID, targetMessage, ViewType.Search, 20, 20 ; In the success callback, messages.getData is the list retrieved before and after the anchor. For message fields, see Message overview /sdk/android/message/overview message . before and after independently limit the number of messages on either side. The result can contain fewer messages than requested when the anchor is near a history boundary or some messages have been deleted. Merge by conversationID:clientMsgID ; do not rely on fixed array positions. If the message must first be located, see Find messages by ID /sdk/android/message/retrieving messages/find messages by id ." + "content": "When navigating from a search result or referenced message into its chat context, use the Message already retrieved as the anchor. Parameters | Parameter | Type | Required | Description | | | | | | | conversationID | String | Yes | ID of the conversation containing the anchor message. | | startMsg | Message | Yes | Previously retrieved anchor message. | | type | ViewType | Yes | Context type. Use ViewType.History for a referenced message and ViewType.Search for a search result. | | before | int | Yes | Maximum number of messages to retrieve before the anchor. | | after | int | Yes | Maximum number of messages to retrieve after the anchor. | messageManager.fetchSurroundingMessages new OnBase @Override public void onSuccess Messages messages List surrounding = messages.getData ; renderMessages surrounding ; @Override public void onError int code, String error // Handle the failure , conversationID, targetMessage, ViewType.Search, 20, 20 ; In the success callback, messages.getData is the list retrieved before and after the anchor. For message fields, see Message overview /sdk/android/message/overview message . before and after independently limit the number of messages on either side. The result can contain fewer messages than requested when the anchor is near a history boundary or some messages have been deleted. If the message must first be located, see Find messages by ID /sdk/android/message/retrieving messages/find messages by id ." }, { "path": "/sdk/android/message/searching-messages/search-messages", @@ -2813,7 +2813,7 @@ "description": "Report the current conversation typing state with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message composing-messages update-typing-status", - "content": "Set focus to true when typing starts. Set it to false when typing ends, the input field loses focus, or the conversation screen closes. conversationManager.changeInputState new OnBase @Override public void onSuccess String data // The typing state has been reported @Override public void onError int code, String error // Handle the failure , conversationID, true ; Clear the state promptly when typing ends: conversationManager.changeInputState callback, conversationID, false ; Coalesce consecutive focus changes and attempt to report false before the screen closes or the connection is interrupted. A successful callback means only that the report request completed; it does not mean that other clients have updated their interfaces. Other clients receive typing state changes through OnConversationListener.onConversationUserInputStatusChanged . The Android SDK returns the event payload as a string, so validate the JSON before parsing it: @Override public void onConversationUserInputStatusChanged String payload InputStatesChangedData state = JsonUtil.toObj payload, InputStatesChangedData.class ; if state == null || state.getConversationID == null return; updateTypingState state.getConversationID , state.getUserID , state.getPlatformIDs ; Merge typing states by conversationID:userID and clear them after an application defined timeout. ConversationManager retains only one conversation listener, so combine this callback with conversation list, total unread, and synchronization events in one listener. When opening a conversation or restoring a connection, use Get typing status /sdk/android/message/composing messages/get typing status to retrieve the current snapshot." + "content": "Set focus to true when typing starts. Set it to false when typing ends, the input field loses focus, or the conversation screen closes. conversationManager.changeInputState new OnBase @Override public void onSuccess String data // The typing state has been reported @Override public void onError int code, String error // Handle the failure , conversationID, true ; Clear the state promptly when typing ends: conversationManager.changeInputState callback, conversationID, false ; Avoid repeatedly reporting the same state. A successful callback means that the report request completed. Other clients receive typing state changes through OnConversationListener.onConversationUserInputStatusChanged . The Android SDK returns the event payload as a string, so validate the JSON before parsing it: @Override public void onConversationUserInputStatusChanged String payload InputStatesChangedData state = JsonUtil.toObj payload, InputStatesChangedData.class ; if state == null || state.getConversationID == null return; updateTypingState state.getConversationID , state.getUserID , state.getPlatformIDs ; The callback's conversationID , userID , and platformIDs identify the conversation, user, and platforms on which the user is typing. ConversationManager can retain only one OnConversationListener . If the application handles other conversation events, implement their callbacks in the same listener. To query whether a specified user is currently typing, use Retrieve typing status /sdk/android/message/composing messages/get typing status ." }, { "path": "/sdk/android/message/composing-messages/get-typing-status", @@ -2821,7 +2821,7 @@ "description": "Use getInputState to retrieve a specified user’s current typing status in a conversation.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message composing-messages get-typing-status", - "content": "When opening a conversation, restoring a connection, or reconciling state, query the platform IDs on which a specified user is currently typing. OpenIMClient.getInstance .conversationManager.getInputState new OnBase @Override public void onSuccess List platformIDs boolean typing = platformIDs = null && platformIDs.isEmpty ; updateTypingState conversationID, userID, typing ; @Override public void onError int code, String error recordTypingStatusQueryFailure code, error ; , conversationID, userID ; The callback returns a snapshot array of platform IDs. An empty array means that no platform was typing at query time. The query itself does not trigger a typing status event. In a group chat, do not poll every member frequently. Query relevant members only when opening the screen, restoring a connection, or reconciling state, and maintain incremental updates through the listener owned by Report typing status /sdk/android/message/composing messages/update typing status ." + "content": "Query the platform IDs on which a specified user is currently typing. OpenIMClient.getInstance .conversationManager.getInputState new OnBase @Override public void onSuccess List platformIDs boolean typing = platformIDs = null && platformIDs.isEmpty ; updateTypingState conversationID, userID, typing ; @Override public void onError int code, String error recordTypingStatusQueryFailure code, error ; , conversationID, userID ; The success callback returns a list of platform IDs. An empty list means that the user is not currently typing on any platform. To receive typing status changes, use the callback described in Update typing status /sdk/android/message/composing messages/update typing status ." }, { "path": "/sdk/android/message/managing-messages/delete-local-message", @@ -2837,7 +2837,7 @@ "description": "Delete multiple messages from one conversation for the current account with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages delete-saved-messages", - "content": "Parameters | Parameter | Type | Required | Description | | | | | | | conversationID | String | Yes | ID of the conversation containing the messages to delete. | | clientMsgIDs | String | Yes | IDs of the messages to delete. Every ID in one batch must belong to the same conversation. | | isSync | boolean | Yes | Whether to synchronize the deletion to the current account's other clients. | DeleteMessagesReq request = new DeleteMessagesReq true, conversationID, selectedClientMsgIDs.toArray new String 0 ; messageManager.deleteMessages request, new OnBase @Override public void onSuccess String data // The deletion request has completed @Override public void onError int code, String error // Handle the failure ; With isSync set to false , the operation deletes the current device's copy and the current account's server side record. With true , it also requests deletion synchronization to the account's other clients. It does not delete copies held by other conversation members or display a revocation notice. The success callback means that the deletion request has completed. When synchronization is enabled, it does not mean that other clients have already received the event or updated their interfaces. This page owns OnAdvanceMsgListener.onMsgDeleted . Determine the conversation from the message routing fields, then remove the message idempotently by clientMsgID . @Override public void onMsgDeleted Message message removeMessage resolveConversationID message , message.getClientMsgID ; To reconcile the current message snapshot, query the corresponding conversation history again." + "content": "Parameters | Parameter | Type | Required | Description | | | | | | | conversationID | String | Yes | ID of the conversation containing the messages to delete. | | clientMsgIDs | String | Yes | IDs of the messages to delete. Every ID in one batch must belong to the same conversation. | | isSync | boolean | Yes | Whether to synchronize the deletion to the current account's other clients. | DeleteMessagesReq request = new DeleteMessagesReq true, conversationID, selectedClientMsgIDs.toArray new String 0 ; messageManager.deleteMessages request, new OnBase @Override public void onSuccess String data // The deletion request has completed @Override public void onError int code, String error // Handle the failure ; With isSync set to false , the operation deletes the current device's copy and the current account's server side record. With true , it also requests deletion synchronization to the account's other clients. It does not delete copies held by other conversation members or display a revocation notice. The success callback means that the deletion request has completed. When synchronization is enabled, it does not mean that other clients have already received the event or updated their interfaces. When synchronization is enabled, other clients can receive the deleted message through OnAdvanceMsgListener.onMsgDeleted : @Override public void onMsgDeleted Message message handleDeletedMessage message ;" }, { "path": "/sdk/android/message/managing-messages/delete-user-messages", @@ -2845,7 +2845,7 @@ "description": "Delete every message sent by a specified user in a group chat with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages delete-user-messages", - "content": "messageManager.deleteUserAllMessagesInConv conversationID, targetUserID, new OnBase @Override public void onSuccess String data // The deletion request has completed @Override public void onError int code, String error // Handle the failure ; This API is available only for group chats and deletes every message sent by the specified user in the target group conversation. It is a high impact group moderation action and should not appear in an ordinary single message menu. OpenIMServer validates the operator's permission. A successful callback does not mean that the event has already arrived. This page owns OnAdvanceMsgListener.onDeleteUserAllMsgsInConv . When the event arrives, use its conversationID and userID to remove messages from that sender in the cached conversation, or reload conversation history to reconcile the state. @Override public void onDeleteUserAllMsgsInConv DeleteUserAllMsgsListenerMsg event removeMessagesBySender event.getConversationID , event.getUserID ; Callback completion, event arrival, and a new history query are three independent stages." + "content": "messageManager.deleteUserAllMessagesInConv conversationID, targetUserID, new OnBase @Override public void onSuccess String data // The deletion request has completed @Override public void onError int code, String error // Handle the failure ; This API is available only for group chats and deletes every message sent by the specified user in the target group conversation. If the caller does not have permission, onError returns the error. Other clients receive the deletion notification through OnAdvanceMsgListener.onDeleteUserAllMsgsInConv . The callback includes the corresponding conversationID and userID : @Override public void onDeleteUserAllMsgsInConv DeleteUserAllMsgsListenerMsg event handleUserMessagesDeleted event.getConversationID , event.getUserID ;" }, { "path": "/sdk/android/message/managing-messages/revoke-a-message", @@ -2853,7 +2853,7 @@ "description": "Revoke a sent message and handle revocation notifications received by other clients.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages revoke-a-message", - "content": "Revoking a message causes other clients to display the original message in a revoked state. Before calling the API, confirm that the message was sent successfully and enforce the revocation time window in the application interface. The server makes the final authorization decision. messageManager.revokeMessageV2 callback, conversationID, clientMsgID ; The success callback means that the server completed the revocation request; it does not mean that every client has received the event. Receiving clients merge the change through OnAdvanceMsgListener.onRecvMessageRevokedV2 . This page is the complete owner of onRecvMessageRevokedV2 . RevokedInfo contains the clientMsgID , revoker, and revocation time, but not the conversationID . Resolve the owning conversation from the current account's message index, then update by conversationID:clientMsgID : @Override public void onRecvMessageRevokedV2 RevokedInfo info String clientMsgID = info.getClientMsgID ; String conversationID = findConversationIDByClientMsgID clientMsgID ; if conversationID == null return; markMessageRevoked conversationID, clientMsgID, info ; Update the matching message to a revoked state instead of deleting it from the list. Add this callback to the application's single OnAdvanceMsgListener ; see Events /sdk/android/events/overview events for centralized setup. Callback completion, event delivery, and a new history query are three independent stages. Re query the corresponding conversation history when reconciliation is required." + "content": "Revoking a message causes other clients to display the original message in a revoked state. If the call fails, the error callback returns an error code and message. messageManager.revokeMessageV2 callback, conversationID, clientMsgID ; The success callback means that the revocation request completed. Other clients receive the revocation notification through OnAdvanceMsgListener.onRecvMessageRevokedV2 . RevokedInfo contains the clientMsgID , revoker, and revocation time: @Override public void onRecvMessageRevokedV2 RevokedInfo info handleRevokedMessage info ; Update the matching message to a revoked state instead of deleting it from the list. MessageManager can retain only one OnAdvanceMsgListener . If the application handles other message events, implement their callbacks in the same listener. See Events /sdk/android/events/overview events for setup." }, { "path": "/sdk/android/message/managing-messages/modify-a-message", @@ -2861,7 +2861,7 @@ "description": "Modify supported message content and handle modification events received by other clients.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages modify-a-message", - "content": "Use modifyMessage to change an existing message in a conversation. Preserve the original conversation ID, clientMsgID , routing fields, sender, and other message data in the request, and update only the supported content. messageManager.modifyMessage callback, modifyRequest ; The success callback means that the modification request completed; it does not mean that every client interface has updated. Other clients receive the complete modified Message through OnAdvanceMsgListener.onMessageModified . This page is the complete owner of onMessageModified . Resolve the conversationID from the message routing fields, then replace the original message by conversationID:clientMsgID . Do not match by array position or displayed text: @Override public void onMessageModified Message message String conversationID = resolveConversationID message ; if conversationID == null return; replaceMessage conversationID, message.getClientMsgID , message ; Add this callback to the application's single OnAdvanceMsgListener ; see Events /sdk/android/events/overview events for centralized setup. Callback completion, event delivery, and a new history query are three independent stages." + "content": "Use modifyMessage to change an existing message in a conversation. Normally, start with the original message, change the supported content, and preserve its other fields. messageManager.modifyMessage callback, modifyRequest ; The success callback means that the modification request completed. After a message is modified, other clients receive the complete modified Message through OnAdvanceMsgListener.onMessageModified : @Override public void onMessageModified Message message handleModifiedMessage message ; MessageManager can retain only one OnAdvanceMsgListener . If the application handles other message events, implement their callbacks in the same listener. See Events /sdk/android/events/overview events for setup." }, { "path": "/sdk/android/message/managing-messages/get-pinned-messages", @@ -2869,7 +2869,7 @@ "description": "Use getConversationPinnedMsgs to retrieve pinned messages in a conversation.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages get-pinned-messages", - "content": "The result is a snapshot of the messages currently pinned in the specified conversation. messageManager.getConversationPinnedMsgs new OnBase @Override public void onSuccess List messages showPinned messages ; @Override public void onError int code, String error showPinnedError error ; , conversationID ;" + "content": "The success callback returns the messages currently pinned in the specified conversation. messageManager.getConversationPinnedMsgs new OnBase @Override public void onSuccess List messages showPinned messages ; @Override public void onError int code, String error showPinnedError error ; , conversationID ;" }, { "path": "/sdk/android/message/managing-messages/set-message-pinned", @@ -2877,7 +2877,7 @@ "description": "Change a conversation message’s pinned state and handle pinned-message change events.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages set-message-pinned", - "content": "Pass true as the final argument to pin the message or false to unpin it: messageManager.setConversationPinnedMsg callback, conversationID, clientMsgID, true ; The success callback means that the request completed; it does not mean that the pinned message event has arrived. This page owns OnAdvanceMsgListener.onChangedPinnedMsg . ChangedPinnedMsg contains the conversationID and current pinned message collection. Replace the collection for that conversation, then deduplicate its messages by clientMsgID : @Override public void onChangedPinnedMsg ChangedPinnedMsg event replacePinnedMessages event.getConversationID , event.getMsgs ; Add this callback to the application's single OnAdvanceMsgListener ; see Events /sdk/android/events/overview events for centralized setup. Callback completion, event delivery, and the snapshot from View pinned messages /sdk/android/message/managing messages/get pinned messages are three independent stages." + "content": "Pass true as the final argument to pin the message or false to unpin it: messageManager.setConversationPinnedMsg callback, conversationID, clientMsgID, true ; The success callback means that the request completed; it does not mean that the pinned message event has arrived. When pinned messages change, OnAdvanceMsgListener.onChangedPinnedMsg returns the corresponding conversationID and current list of pinned messages: @Override public void onChangedPinnedMsg ChangedPinnedMsg event handlePinnedMessagesChanged event.getConversationID , event.getMsgs ; MessageManager can retain only one OnAdvanceMsgListener . If the application handles other message events, implement their callbacks in the same listener. See Events /sdk/android/events/overview events for setup. To retrieve the current pinned messages directly, use View pinned messages /sdk/android/message/managing messages/get pinned messages ." }, { "path": "/sdk/android/message/managing-messages/insert-local-single-message", @@ -2885,7 +2885,7 @@ "description": "Use insertSingleMessageToLocalStorage to insert a one-to-one message visible only on the current device.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages insert-local-single-message", - "content": "This method does not send the message to the server. receiver and sender determine how the local message is associated with the conversation. messageManager.insertSingleMessageToLocalStorage callback, message, receiverUserID, senderUserID ;" + "content": "This method does not send the message to the server. receiver is the recipient's user ID, and sender is the sender's user ID. messageManager.insertSingleMessageToLocalStorage callback, message, receiverUserID, senderUserID ;" }, { "path": "/sdk/android/message/managing-messages/insert-local-group-message", @@ -2925,7 +2925,7 @@ "description": "Report group-message read receipts with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-read-status send-group-read-receipts", - "content": "messageManager.sendGroupMessageReadReceipt conversationID, visibleClientMsgIDs, new OnBase @Override public void onSuccess String data // The read receipts have been reported @Override public void onError int code, String error // Handle the failure ; Every message in one batch must belong to the target group conversation. A successful callback means only that the server accepted the report; it does not mean that other client interfaces have already updated. The conversation unread count is maintained separately through markConversationMessageAsRead . Other clients receive member level group read changes through OnAdvanceMsgListener.onRecvGroupMessageReadReceipt . This page is the canonical reference for that event. Merge read counts, unread counts, and member information using the receipt's conversationID and message IDs. @Override public void onRecvGroupMessageReadReceipt GroupMessageReceipt receipt mergeGroupReadReceipt receipt ; The report callback, the group receipt event, and the member snapshot from Get members who read a group message /sdk/android/message/managing read status/get group message readers are three independent stages." + "content": "messageManager.sendGroupMessageReadReceipt conversationID, visibleClientMsgIDs, new OnBase @Override public void onSuccess String data // The read receipts have been reported @Override public void onError int code, String error // Handle the failure ; Every message in one batch must belong to the target group conversation. A successful callback means only that the server accepted the report; it does not mean that other client interfaces have already updated. The conversation unread count is maintained separately through markConversationMessageAsRead . Other clients receive group message read receipts through OnAdvanceMsgListener.onRecvGroupMessageReadReceipt : @Override public void onRecvGroupMessageReadReceipt GroupMessageReceipt receipt handleGroupMessageReadReceipt receipt ; To retrieve members who have or have not read a specific group message, use Get members who read a group message /sdk/android/message/managing read status/get group message readers ." }, { "path": "/sdk/android/message/managing-read-status/get-group-message-readers", @@ -2933,15 +2933,7 @@ "description": "Retrieve members who have or have not read a group message using pagination.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-read-status get-group-message-readers", - "content": "Parameters | Parameter | Type | Required | Description | | | | | | | conversationID | String | Yes | ID of the group conversation. | | clientMsgID | String | Yes | ID of the message whose reader list to query. | | filter | int | Yes | Pass 0 for members who have read the message or 1 for members who have not read it. | | offset | int | Yes | Pagination offset. Pass 0 for the first page. | | count | int | Yes | Maximum number of members to retrieve. | messageManager.getGroupMessageReaderList conversationID, clientMsgID, 0, 0, 50, new OnBase @Override public void onSuccess List members renderMembers members ; @Override public void onError int code, String error // Handle the failure ; The success callback returns the current page of GroupMembersInfo objects. For field descriptions, see List group members /sdk/android/group/retrieving group members/get group member list . Deduplicate by groupID:userID . The query establishes a snapshot and does not trigger a receipt event. Continue paging when the complete list is required." - }, - { - "path": "/sdk/android/file-uploads/track-file-upload-progress", - "title": "Track file upload progress", - "description": "Use OnPutFileListener to track an individual Android SDK file upload.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android file-uploads track-file-upload-progress", - "content": "The Android SDK does not use a global file upload listener. Pass an OnPutFileListener to each uploadFile call. That listener receives progress, part completion, and final result callbacks for the current task. OnPutFileListener uploadListener = new OnPutFileListener @Override public void open long size initializeUploadProgress uploadTaskID, size ; @Override public void uploadID String id bindSdkUploadID uploadTaskID, id ; @Override public void uploadComplete long fileSize, long uploadedSize, long storageSize updateUploadProgress uploadTaskID, uploadedSize, fileSize ; @Override public void uploadPartComplete long partNumber, long partSize, String partHash markPartComplete uploadTaskID, partNumber, partSize, partHash ; @Override public void complete long size, String url, long type completeUpload uploadTaskID, size, url, type ; ; OpenIMClient.getInstance .uploadFile resultCallback, uploadListener, putArgs ; Use open to initialize the total size, uploadID to receive the SDK upload identifier, uploadComplete for in progress byte counts, uploadPartComplete when one part finishes, and complete for the final size, remote URL, and resource type. Most progress bars only need the progress and completion callbacks; process part details only when the product exposes them. Generate a stable application level uploadTaskID and capture it in the listener. Do not use the SDK upload ID, file name, or array position as the task's primary key. Give each task its own listener, and stop dispatching callbacks into destroyed page or account state. For complete argument construction and error handling, see Upload a file /sdk/android/file uploads/upload file ." + "content": "Parameters | Parameter | Type | Required | Description | | | | | | | conversationID | String | Yes | ID of the group conversation. | | clientMsgID | String | Yes | ID of the message whose reader list to query. | | filter | int | Yes | Pass 0 for members who have read the message or 1 for members who have not read it. | | offset | int | Yes | Pagination offset. Pass 0 for the first page. | | count | int | Yes | Maximum number of members to retrieve. | messageManager.getGroupMessageReaderList conversationID, clientMsgID, 0, 0, 50, new OnBase @Override public void onSuccess List members renderMembers members ; @Override public void onError int code, String error // Handle the failure ; The success callback returns the current page of GroupMembersInfo objects. For field descriptions, see List group members /sdk/android/group/retrieving group members/get group member list . Continue paging when the complete list is required." }, { "path": "/sdk/android/file-uploads/upload-file", @@ -2949,7 +2941,7 @@ "description": "Upload a standalone file with the Android SDK and retrieve its remote resource URL.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android file-uploads upload-file", - "content": "uploadFile uploads a standalone file for uses such as a user avatar, group avatar, profile attachment, or other application resource. The upload does not belong to a message and does not automatically create a message or update a profile. Parameters | Parameter | Type | Required | Description | | | | | | | base | OnBase | Yes | Receives the final success or failure result for the upload request. | | listener | OnPutFileListener | Yes | Receives progress, part completion, and final file information for this task. | | putArgs.filepath | String | Yes | A local file path readable by the Android application. | | putArgs.name | String | Yes | The upload file name. PutArgs initially uses the supplied path; replace it with the original file name when appropriate. | | putArgs.cuase | String | No | An application defined upload reason. The spelling follows the Android SDK PutArgs declaration. | File file = new File localPath ; PutArgs args = new PutArgs file.getAbsolutePath ; args.name = file.getName ; args.cuase = \"user avatar\"; OpenIMClient.getInstance .uploadFile new OnBase @Override public void onSuccess String result finishUploadRequest result ; @Override public void onError int code, String error showUploadError code, error ; , new OnPutFileListener @Override public void uploadComplete long fileSize, long uploadedSize, long storageSize updateUploadProgress uploadTaskID, uploadedSize, fileSize ; @Override public void complete long size, String url, long type completeUpload uploadTaskID, size, url, type ; , args ; Each call receives its own OnPutFileListener , so no global upload listener is required. For parallel uploads, generate a stable task ID and capture it in the callbacks. Do not use a file name or list position as the unique identifier. See Track file upload progress /sdk/android/file uploads/track file upload progress for callback responsibilities. The URL returned by complete can be used later to update an avatar, store an attachment address, or create a URL based media message. Upload success only means that the resource was written remotely; profile updates, message creation, and message sending remain separate API calls." + "content": "uploadFile uploads a standalone file for uses such as a user avatar, group avatar, profile attachment, or other application resource. The upload does not belong to a message and does not automatically create a message or update a profile. Parameters | Parameter | Type | Required | Description | | | | | | | base | OnBase | Yes | Receives the final success or failure result for the upload request. | | listener | OnPutFileListener | Yes | Receives file, part, hash, and completion information for this task. | | putArgs.filepath | String | Yes | A local file path readable by the Android application. | | putArgs.name | String | Yes | The upload file name. PutArgs initially uses the supplied path; replace it with the original file name when appropriate. | | putArgs.cuase | String | No | An application defined upload reason. The spelling follows the Android SDK PutArgs declaration. | File file = new File localPath ; PutArgs args = new PutArgs file.getAbsolutePath ; args.name = file.getName ; args.cuase = \"user avatar\"; OpenIMClient.getInstance .uploadFile new OnBase @Override public void onSuccess String result finishUploadRequest result ; @Override public void onError int code, String error showUploadError code, error ; , new OnPutFileListener @Override public void open long size initializeUpload uploadTaskID, size ; @Override public void uploadID String id bindSdkUploadID uploadTaskID, id ; @Override public void uploadComplete long fileSize, long streamSize, long storageSize recordUploadSizes uploadTaskID, fileSize, streamSize, storageSize ; @Override public void complete long size, String url, long type completeUpload uploadTaskID, size, url, type ; , args ; Callbacks OnPutFileListener provides the following callbacks and parameters: | Callback | Parameters | Description | | | | | | open | size | Opens a file of the given size; use it to initialize the task. | | partSize | partSize , num | The size of each part and the total number of parts. | | hashPartProgress | index , size , partHash | The part index, size, and hash after a part is hashed. | | hashPartComplete | partsHash , fileHash | The combined part hash and final file hash after all parts are hashed. | | uploadID | uploadID | The upload identifier generated by the SDK. | | uploadPartComplete | index , partSize , partHash | The part index, size, and hash when a part upload completes. | | uploadComplete | fileSize , streamSize , storageSize | File size, stream size, and storage size for the completed file upload stage. | | complete | size , url , type | The final file size, remote URL, and resource type after the upload completes. | The URL returned by complete can be used later to update an avatar, store an attachment address, or create a URL based media message. Upload success only means that the resource was written remotely; profile updates, message creation, and message sending remain separate API calls." }, { "path": "/sdk/android/calling/overview-calling", From c0c42ce9982d3542db79a1aea32220c18b4de1cb Mon Sep 17 00:00:00 2001 From: chan <1499188352@qq.com> Date: Tue, 18 Aug 2026 19:03:01 +0800 Subject: [PATCH 05/12] docs(android): publish Android SDK group documentation --- .../sdk/android/group/change-group-mute.mdx | 4 +- .../chat/sdk/android/group/create-group.mdx | 6 +- .../chat/sdk/android/group/dismiss-group.mdx | 6 +- .../accept-group-application.mdx | 6 +- .../delete-group-requests.mdx | 29 + ...et-group-application-list-as-applicant.mdx | 4 +- ...et-group-application-list-as-recipient.mdx | 6 +- .../overview-group-applications.mdx | 16 - .../refuse-group-application.mdx | 4 +- .../chat/sdk/android/group/join-group.mdx | 6 +- .../change-group-member-mute.mdx | 6 +- .../invite-user-to-group.mdx | 6 +- .../kick-group-member.mdx | 6 +- .../set-group-member-avatar.mdx | 4 +- .../set-group-member-extension.mdx | 6 +- .../set-group-member-nickname.mdx | 4 +- .../set-group-member-role-level.mdx | 6 +- .../transfer-group-owner.mdx | 6 +- .../chat/sdk/android/group/overview-group.mdx | 101 +- .../chat/sdk/android/group/quit-group.mdx | 4 +- .../get-group-member-list.mdx | 4 +- .../get-group-member-owner-and-admin.mdx | 4 +- .../get-specified-group-members-info.mdx | 4 +- .../get-users-in-group.mdx | 2 +- .../overview-retrieving-group-members.mdx | 16 - .../get-joined-group-list-page.mdx | 6 +- .../get-specified-groups-info.mdx | 8 +- .../group/retrieving-groups/is-join-group.mdx | 4 +- .../group/retrieving-groups/search-groups.mdx | 2 +- .../android/group/set-group-announcement.mdx | 6 +- .../sdk/android/group/set-group-extension.mdx | 6 +- .../set-group-member-friend-permission.mdx | 4 +- .../android/group/update-group-profile.mdx | 6 +- .../sdk/android/group/change-group-mute.mdx | 4 +- .../chat/sdk/android/group/create-group.mdx | 4 +- .../chat/sdk/android/group/dismiss-group.mdx | 4 +- .../accept-group-application.mdx | 4 +- .../delete-group-requests.mdx | 22 + ...et-group-application-list-as-applicant.mdx | 2 +- ...et-group-application-list-as-recipient.mdx | 4 +- .../overview-group-applications.mdx | 9 - .../refuse-group-application.mdx | 2 +- .../chat/sdk/android/group/join-group.mdx | 4 +- .../change-group-member-mute.mdx | 4 +- .../invite-user-to-group.mdx | 4 +- .../kick-group-member.mdx | 4 +- .../set-group-member-avatar.mdx | 2 +- .../set-group-member-extension.mdx | 4 +- .../set-group-member-nickname.mdx | 2 +- .../set-group-member-role-level.mdx | 4 +- .../transfer-group-owner.mdx | 4 +- .../chat/sdk/android/group/overview-group.mdx | 103 +- .../chat/sdk/android/group/quit-group.mdx | 2 +- .../get-group-member-list.mdx | 2 - .../get-group-member-owner-and-admin.mdx | 2 +- .../get-specified-group-members-info.mdx | 2 - .../get-users-in-group.mdx | 2 +- .../overview-retrieving-group-members.mdx | 9 - .../get-joined-group-list-page.mdx | 4 +- .../get-specified-groups-info.mdx | 6 +- .../group/retrieving-groups/is-join-group.mdx | 4 +- .../group/retrieving-groups/search-groups.mdx | 2 +- .../android/group/set-group-announcement.mdx | 4 +- .../sdk/android/group/set-group-extension.mdx | 4 +- .../set-group-member-friend-permission.mdx | 2 - .../android/group/update-group-profile.mdx | 4 +- data/structure/android-content-audit.json | 90 +- data/structure/android-navigation-labels.json | 6 +- data/structure/android-sidebar.json | 12 +- data/structure/chat-pages.json | 16 +- scripts/sync-client-sdk-route-skeletons.mjs | 3 - src/generated/android-sdk-zh-content.json | 102 +- src/generated/navigation.json | 220 +- src/generated/routes.json | 2090 ++++++++--------- src/generated/search-index-zh.json | 80 +- src/generated/search-index.json | 78 +- 76 files changed, 1656 insertions(+), 1588 deletions(-) create mode 100644 content/docs/chat/sdk/android/group/group-applications/delete-group-requests.mdx delete mode 100644 content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx delete mode 100644 content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx create mode 100644 content/zh/docs/chat/sdk/android/group/group-applications/delete-group-requests.mdx delete mode 100644 content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx delete mode 100644 content/zh/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx diff --git a/content/docs/chat/sdk/android/group/change-group-mute.mdx b/content/docs/chat/sdk/android/group/change-group-mute.mdx index 3e2048532f..5d8824dba4 100644 --- a/content/docs/chat/sdk/android/group/change-group-mute.mdx +++ b/content/docs/chat/sdk/android/group/change-group-mute.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/change-group-mute' @@ -19,5 +19,3 @@ OpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() { @Override public void onError(int code, String error) { showGroupMuteError(error); } }, groupID, true); ``` - -The effective speaking permissions for the owner and administrators, as well as server-side permission checks, depend on the deployment policy. diff --git a/content/docs/chat/sdk/android/group/create-group.mdx b/content/docs/chat/sdk/android/group/create-group.mdx index 464e171ce8..f5bc920b48 100644 --- a/content/docs/chat/sdk/android/group/create-group.mdx +++ b/content/docs/chat/sdk/android/group/create-group.mdx @@ -5,13 +5,13 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/create-group' --- -Use `createGroup()` to create a group. Set the group profile in `GroupInfo`, and pass the initial regular members, administrators, and owner as separate parameters. The success callback returns the complete `GroupInfo` created by the server. Store the server-assigned `groupID`. +Use `createGroup()` to create a group. Set the group profile in `GroupInfo`, and pass the initial regular members, administrators, and owner as separate parameters. The success callback returns the complete `GroupInfo`, including the new group's `groupID`. ```java GroupInfo info = new GroupInfo(); @@ -26,5 +26,3 @@ OpenIMClient.getInstance().groupManager.createGroup( } ); ``` - -Select the owner and administrators according to your application's permission rules. Do not infer the owner from a local user list. diff --git a/content/docs/chat/sdk/android/group/dismiss-group.mdx b/content/docs/chat/sdk/android/group/dismiss-group.mdx index cab2a028c0..7f7184b82d 100644 --- a/content/docs/chat/sdk/android/group/dismiss-group.mdx +++ b/content/docs/chat/sdk/android/group/dismiss-group.mdx @@ -5,13 +5,13 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/dismiss-group' --- -`dismissGroup()` dismisses the specified group and is normally available only to its owner. Ask for explicit confirmation before calling it so that leaving a group is not accidentally implemented as dismissing it. +`dismissGroup()` dismisses the specified group and is available only to its owner. ```java OpenIMClient.getInstance().groupManager.dismissGroup(new OnBase() { @@ -20,4 +20,4 @@ OpenIMClient.getInstance().groupManager.dismissGroup(new OnBase() { }, groupID); ``` -Merge the final state from `onGroupDismissed`. After receiving the event, remove cached group profile, member, and conversation-related data. +Use `onGroupDismissed` to receive the group dismissal notification. diff --git a/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx b/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx index ee851a9f89..feedd62dc2 100644 --- a/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx @@ -5,13 +5,13 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/group-applications/accept-group-application' --- -Pass the application's `groupID`, the applicant's `userID`, and a handling message. The server checks whether the current user has permission to approve the application. +Pass the application's `groupID`, the applicant's `userID`, and a handling message. The current user must have permission to approve the application. ```java OpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() { @@ -20,4 +20,4 @@ OpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() { + @Override public void onSuccess(String data) { showDeleteSuccess(); } + @Override public void onError(int code, String error) { showDeleteError(error); } +}, request); +``` + +Deleting an application record is not the same as rejecting an application. To reject an application, use `refuseGroupApplication()`. diff --git a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx index 0a1acdbd6e..c991e9846e 100644 --- a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-applicant' @@ -22,4 +22,4 @@ OpenIMClient.getInstance().groupManager.getSendGroupApplicationList( }, request); ``` -After an application is accepted, use `onJoinedGroupAdded` as the source of truth for the joined-group list. +After an application is accepted, receive the group-joined notification through `onJoinedGroupAdded`. diff --git a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx index 1cfaefc554..aee97e2124 100644 --- a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx @@ -5,13 +5,13 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-recipient' --- -Use the non-deprecated overload with `GetGroupApplicationListAsRecipientReq`. The request can filter by `offset`, `count`, `groupIDs`, and `handleResults`. +Pass `GetGroupApplicationListAsRecipientReq` to set pagination and filters. You can set `offset`, `count`, `groupIDs`, and `handleResults`. ```java GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq(0, 20); @@ -21,5 +21,3 @@ OpenIMClient.getInstance().groupManager.getRecvGroupApplicationList( @Override public void onError(int code, String error) { showApplicationError(error); } }, request); ``` - -Merge application events by their `groupID` and `userID`. Do not use a list index as an application identifier. diff --git a/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx b/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx deleted file mode 100644 index 48e09a40af..0000000000 --- a/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: 'Group applications overview' -description: 'Understand received and sent group applications, handling results, and state events in the Android SDK.' -product: 'sdk' -context: 'chat/sdk/android' -template: 'guide' -status: 'published' -lastUpdated: '2026-08-10' -version: 'v4' -platform: 'android' -sourcePath: '/sdk/android/group/group-applications/overview-group-applications' ---- - -Group applications are represented by `GroupApplicationInfo`. Received applications are intended for group administrators, while sent applications belong to the current user. Use `handleResult`, `reqMsg`, `handledMsg`, and the handling time to display application state. - -The Android SDK provides paginated queries for received and sent applications, as well as accept and reject operations. It does not provide the pending-application count API found in the Flutter menu. Merge application-added, accepted, rejected, and deleted events through the shared listener described in [Group overview](/sdk/android/group/overview-group). diff --git a/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx b/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx index 40f3ddd672..18f06a1f0b 100644 --- a/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/group-applications/refuse-group-application' @@ -20,4 +20,4 @@ OpenIMClient.getInstance().groupManager.refuseGroupApplication(new OnBase() { @@ -20,4 +20,4 @@ OpenIMClient.getInstance().groupManager.joinGroup(new OnBase() { }, groupID, "I would like to join the project discussion", 3, "{\"from\":\"search\"}"); ``` -The verification mode determines whether the user joins immediately. Update local state later through `onJoinedGroupAdded` or the relevant group application event. +[The verification mode](/sdk/android/group/set-group-join-verification) determines whether the user joins immediately or submits an application first. When approval is required, a successful callback means only that the application was submitted; `onJoinedGroupAdded` arrives after the user joins. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx b/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx index 5f09604e8b..1dc44d25a0 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx @@ -5,13 +5,13 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/change-group-member-mute' --- -`seconds` is the mute duration in seconds. Pass `0` to unmute the member. Member-level mute state is independent from the group's mute-all setting. +`seconds` is the mute duration in seconds. Pass `0` to unmute the member. Member-level mute state is independent from the [group mute-all setting](/sdk/android/group/change-group-mute). ```java OpenIMClient.getInstance().groupManager.changeGroupMemberMute(new OnBase() { @@ -19,5 +19,3 @@ OpenIMClient.getInstance().groupManager.changeGroupMemberMute(new OnBase @Override public void onError(int code, String error) { showMemberMuteError(error); } }, groupID, userID, 3600L); ``` - -Read `muteEndTime` from `onGroupMemberInfoChanged` to update the member state. Do not keep deriving the final mute state from local time and the submitted duration. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx b/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx index 68c8355266..527bbf6f88 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx @@ -5,13 +5,13 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/invite-user-to-group' --- -Pass the group ID, the list of invited user IDs, and an invitation message. The server determines whether the users join immediately according to the group settings and the current user's permissions. +Pass the group ID, the list of invited user IDs, and an invitation message. A successful call means that the invitation request was submitted; after a user joins, receive the notification through `onGroupMemberAdded`. ```java OpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() { @@ -19,5 +19,3 @@ OpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() { @Override public void onError(int code, String error) { showInviteError(error); } }, groupID, inviteeUserIDs, "Join the project discussion"); ``` - -Merge users into the member list only after `onGroupMemberAdded` confirms that they joined. A successful submission alone does not mean that they are already members. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx b/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx index 461fae5b14..ec005b603b 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx @@ -5,13 +5,13 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/kick-group-member' --- -`kickGroupMember()` accepts a list of member IDs and a removal message. Prevent the current user from accidentally selecting themselves and respect the permission boundaries between owners and administrators. +`kickGroupMember()` accepts a list of member IDs and a removal message. ```java OpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() { @@ -20,4 +20,4 @@ OpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() { }, groupID, memberUserIDs, "No longer participating in this project"); ``` -Remove targets from the member cache after receiving `onGroupMemberDeleted`. +After the removal succeeds, receive the member removal notification through `onGroupMemberDeleted`. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx index a741d1aa65..eff6e0ae52 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/managing-group-members/set-group-member-avatar' @@ -25,4 +25,4 @@ OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { @@ -20,4 +20,4 @@ OpenIMClient.getInstance().groupManager.transferGroupOwner(new OnBase() }, groupID, newOwnerUserID); ``` -`onGroupMemberInfoChanged` and group profile changes can arrive asynchronously. Do not assume that local roles have already been updated inside the success callback. +After the transfer succeeds, you can call [Get group owners and admins](/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin) again to retrieve the latest profiles. diff --git a/content/docs/chat/sdk/android/group/overview-group.mdx b/content/docs/chat/sdk/android/group/overview-group.mdx index 0931a93b3f..a91af52aa7 100644 --- a/content/docs/chat/sdk/android/group/overview-group.mdx +++ b/content/docs/chat/sdk/android/group/overview-group.mdx @@ -1,33 +1,27 @@ --- title: 'Group overview' -description: 'Learn how group profiles, members, applications, and group events are organized in the Android SDK.' +description: 'Understand group concepts, core data types, and main capabilities in the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/overview-group' --- -A group is represented by `GroupInfo`. Its `groupID` is the unique target identifier for profile, member, application, and permission operations. `GroupMembersInfo` represents a member's group-specific nickname, role, mute expiration time, and extra data. One-to-one relationships and conversation unread counts do not belong to the group APIs. +OpenIMSDK uses groups to hold shared profiles, memberships, and permissions for multi-user chats. `groupID` is the stable group identifier used to send group messages, retrieve group profiles, manage members, and handle join applications. A group conversation in the current user's chat list is still managed by `conversationID`; do not interchange these identifiers. -`GroupManager` delivers group profile changes, member changes, application handling, and joined-group changes through one `OnGroupListener`. Set the listener once in a shared state layer and merge events by `groupID` or `userID`. +## Core data types -```java -OpenIMClient.getInstance().groupManager.setOnGroupListener(new OnGroupListener() { - @Override public void onGroupInfoChanged(GroupInfo group) { - groupStore.put(group.getGroupID(), group); - } - - @Override public void onGroupMemberInfoChanged(GroupMembersInfo member) { - memberStore.put(member.getGroupID() + member.getUserID(), member); - } -}); -``` +| Type | Purpose | +| --- | --- | +| `GroupInfo` | Group name, avatar, announcement, owner, verification settings, member count, and extension data. | +| `GroupMembersInfo` | A user's nickname, role, mute state, and join information in a specified group. | +| `GroupApplicationInfo` | A group application and its handling state. | -A successful callback from a group profile or member operation only means that the request completed. Use the corresponding group event or a fresh query as the source of truth. +Group member roles use `GroupRole`: `MEMBER` is a regular member, `ADMIN` is an administrator, and `OWNER` is the group owner. ## Main capabilities @@ -35,6 +29,77 @@ A successful callback from a group profile or member operation only means that t - [Group permissions](/sdk/android/group/set-group-join-verification) - [Joining and leaving groups](/sdk/android/group/join-group) - [Retrieving groups](/sdk/android/group/retrieving-groups/get-specified-groups-info) -- [Group applications](/sdk/android/group/group-applications/overview-group-applications) -- [Retrieving group members](/sdk/android/group/retrieving-group-members/overview-retrieving-group-members) +- [Group applications](/sdk/android/group/group-applications/get-group-application-list-as-recipient) +- [Retrieving group members](/sdk/android/group/retrieving-group-members/get-group-member-list) - [Managing group members](/sdk/android/group/managing-group-members/invite-user-to-group) + +## State updates + +Call `setOnGroupListener()` before login to register an `OnGroupListener` for group profile, membership, and group application changes. The following example shows where the application can refresh the relevant screen for each callback: + +```java +private final OnGroupListener groupListener = new OnGroupListener() { + @Override + public void onJoinedGroupAdded(GroupInfo group) { + // Refresh the joined-group list. + } + + @Override + public void onJoinedGroupDeleted(GroupInfo group) { + // Refresh the joined-group list. + } + + @Override + public void onGroupInfoChanged(GroupInfo group) { + // Refresh the group profile for group.getGroupID(). + } + + @Override + public void onGroupDismissed(GroupInfo group) { + // Close the dismissed group chat for group.getGroupID(). + } + + @Override + public void onGroupMemberAdded(GroupMembersInfo member) { + // Refresh the member list for member.getGroupID(). + } + + @Override + public void onGroupMemberDeleted(GroupMembersInfo member) { + // Refresh the member list for member.getGroupID(). + } + + @Override + public void onGroupMemberInfoChanged(GroupMembersInfo member) { + // Refresh the member list for member.getGroupID(). + } + + @Override + public void onGroupApplicationAdded(GroupApplicationInfo application) { + // Refresh the group application list. + } + + @Override + public void onGroupApplicationAccepted(GroupApplicationInfo application) { + // Refresh the group application list. + } + + @Override + public void onGroupApplicationRejected(GroupApplicationInfo application) { + // Refresh the group application list. + } + + @Override + public void onGroupApplicationDeleted(GroupApplicationInfo application) { + // Refresh the group application list. + } +}; + +public void registerGroupListener() { + OpenIMClient.getInstance().groupManager.setOnGroupListener(groupListener); +} +``` + +Use `onJoinedGroupAdded` and `onJoinedGroupDeleted` to update the current user's joined-group list. Use `onGroupInfoChanged` and `onGroupDismissed` to update a group profile or close a dismissed group chat. Handle membership changes with `onGroupMemberAdded`, `onGroupMemberDeleted`, and `onGroupMemberInfoChanged`, and handle group application changes with the four `onGroupApplication...` callbacks. + +A group API success callback indicates that the call completed. When group profiles, members, or group application lists need updating, refresh the screen or query the data again based on the corresponding listener callback. diff --git a/content/docs/chat/sdk/android/group/quit-group.mdx b/content/docs/chat/sdk/android/group/quit-group.mdx index cb62fc3059..461fa8a360 100644 --- a/content/docs/chat/sdk/android/group/quit-group.mdx +++ b/content/docs/chat/sdk/android/group/quit-group.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/quit-group' @@ -20,4 +20,4 @@ OpenIMClient.getInstance().groupManager.quitGroup(new OnBase() { }, groupID); ``` -Even after the request succeeds, handle `onJoinedGroupDeleted` and clear application caches for the group's member list, conversation entry, and related data. +After the request succeeds, continue handling the `onJoinedGroupDeleted` callback. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx index 957432832e..81a926a794 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-list' @@ -20,5 +20,3 @@ OpenIMClient.getInstance().groupManager.getGroupMemberList( @Override public void onError(int code, String error) { showMemberQueryError(error); } }, groupID, 0, offset, 50); ``` - -Continue accepting member events while paging. Use the combination of `groupID` and `userID` as the merge key. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx index 966aeb38c7..63d0ca3ead 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin' @@ -21,4 +21,4 @@ OpenIMClient.getInstance().groupManager.getGroupMemberOwnerAndAdmin( }, groupID); ``` -The owner, administrator, and regular-member `roleLevel` constants are defined in `GroupRole`. The server still determines whether a particular operation is permitted. +The owner, administrator, and regular-member `roleLevel` constants are defined in `GroupRole`. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx index 48353fdec3..ad28bc7de7 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-group-members/get-specified-group-members-info' @@ -20,5 +20,3 @@ OpenIMClient.getInstance().groupManager.getGroupMembersInfo( @Override public void onError(int code, String error) { showMemberQueryError(error); } }, groupID, userIDs); ``` - -An empty list can mean that the targets are not in the group or that the current user cannot read their profiles. Handle the result according to your product requirements. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx index 9a97cecd0e..f59730ae5f 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-group-members/get-users-in-group' diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx deleted file mode 100644 index e287f72d45..0000000000 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: 'Group member queries overview' -description: 'Understand group member lists, specified member profiles, and membership queries in the Android SDK.' -product: 'sdk' -context: 'chat/sdk/android' -template: 'guide' -status: 'published' -lastUpdated: '2026-08-10' -version: 'v4' -platform: 'android' -sourcePath: '/sdk/android/group/retrieving-group-members/overview-retrieving-group-members' ---- - -Group member queries are scoped by `groupID` and return either `GroupMembersInfo` objects or user ID lists. The member list supports role filtering and offset pagination. Separate APIs retrieve specified member profiles, check membership, retrieve owners and administrators, and search by keyword. - -Merge member additions, removals, and profile changes through the `OnGroupListener` owned by [Group overview](/sdk/android/group/overview-group). A query provides a snapshot and does not replace event handling. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx index 25c1aba8ff..28e23fe8e6 100644 --- a/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx @@ -5,13 +5,13 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/retrieving-groups/get-joined-group-list-page' --- -The Android SDK provides the paginated API. Start `offset` at `0`, then advance it by the number of items successfully merged from each page. Stop loading when the returned list is empty. +Start `offset` at `0`, then advance it by the number of items returned in the previous page. Stop loading when the returned list is empty. ```java OpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() { @@ -20,4 +20,4 @@ OpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() { - @Override public void onSuccess(List groups) { mergeGroups(groups); } + @Override public void onSuccess(List groups) { showGroups(groups); } @Override public void onError(int code, String error) { showGroupQueryError(error); } }, groupIDs); ``` - -Remove empty and duplicate IDs before making the request. Treat groups that do not exist or cannot be accessed as missing results. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx index 4e8903d73e..ff95dcb46f 100644 --- a/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/group/retrieving-groups/is-join-group' --- -`isJoinGroup()` only checks the membership relationship between the current signed-in user and the specified `groupID`. +`isJoinGroup()` checks whether the current signed-in user has joined the target group. Its parameter is `groupID`. ```java OpenIMClient.getInstance().groupManager.isJoinGroup(groupID, new OnBase() { @@ -19,5 +19,3 @@ OpenIMClient.getInstance().groupManager.isJoinGroup(groupID, new OnBase @Override public void onError(int code, String error) { showMembershipError(error); } }); ``` - -This result does not replace a group profile query and cannot determine whether another user is in the group. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx index da44d05239..ea6279af9d 100644 --- a/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx @@ -20,4 +20,4 @@ OpenIMClient.getInstance().groupManager.searchGroups(new OnBase> }, Collections.singletonList(keyword), true, true); ``` -A search result does not prove membership. Before opening the group, call [Check group membership](/sdk/android/group/retrieving-groups/is-join-group) when the current state matters. +The current user is not necessarily a member of a group returned by `searchGroups()`. Use [`isJoinGroup()`](/sdk/android/group/retrieving-groups/is-join-group) to determine whether they are a member. diff --git a/content/docs/chat/sdk/android/group/set-group-announcement.mdx b/content/docs/chat/sdk/android/group/set-group-announcement.mdx index d7f1e14f75..b72fda2dd1 100644 --- a/content/docs/chat/sdk/android/group/set-group-announcement.mdx +++ b/content/docs/chat/sdk/android/group/set-group-announcement.mdx @@ -5,13 +5,13 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/set-group-announcement' --- -The Android SDK does not provide a separate announcement method. Create a `GroupInfo` containing the `groupID` and `notification`, then call `setGroupInfo()`. +Create a `GroupInfo` containing the `groupID` and `notification`, then call `setGroupInfo()`. ```java GroupInfo update = new GroupInfo(); @@ -24,4 +24,4 @@ OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase( }); ``` -The returned `GroupInfo` exposes the update time and author through `notificationUpdateTime` and `notificationUserID`. The server validates whether the current user has permission to publish the announcement. +The update time and author are stored in the `GroupInfo` fields `notificationUpdateTime` and `notificationUserID`. Query the group profile when you need to read them. diff --git a/content/docs/chat/sdk/android/group/set-group-extension.mdx b/content/docs/chat/sdk/android/group/set-group-extension.mdx index fe2d81c83d..4b5406e509 100644 --- a/content/docs/chat/sdk/android/group/set-group-extension.mdx +++ b/content/docs/chat/sdk/android/group/set-group-extension.mdx @@ -5,13 +5,13 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/set-group-extension' --- -`GroupInfo.ex` is a complete string; the SDK does not merge JSON values. If several application modules share the field, read the existing value and preserve the other namespaces when merging your changes. +`GroupInfo.ex` is a complete string; the SDK does not merge JSON values. Submitting a new value replaces the previous content. ```java GroupInfo update = new GroupInfo(); @@ -23,5 +23,3 @@ OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase( @Override public void onError(int code, String error) { showExtensionError(error); } }); ``` - -Do not store access tokens, secrets, or device-only UI state in group extra data. diff --git a/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx b/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx index 81326ef42c..2360080843 100644 --- a/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx +++ b/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/set-group-member-friend-permission' @@ -23,5 +23,3 @@ OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase( @Override public void onError(int code, String error) { showPermissionError(error); } }); ``` - -After the update, use `onGroupInfoChanged` or a newly retrieved `GroupInfo` as the source of truth. diff --git a/content/docs/chat/sdk/android/group/update-group-profile.mdx b/content/docs/chat/sdk/android/group/update-group-profile.mdx index 794b40d4c4..409fe08188 100644 --- a/content/docs/chat/sdk/android/group/update-group-profile.mdx +++ b/content/docs/chat/sdk/android/group/update-group-profile.mdx @@ -5,13 +5,13 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/group/update-group-profile' --- -Use `setGroupInfo()` to update a group profile. The request object should contain at least the `groupID` and the fields being changed. Do not use an incomplete local cache to overwrite fields that are not part of the current edit. +Use `setGroupInfo()` to update a group profile. The request object contains the `groupID` and the fields being changed. Submit only the fields for the current update. ```java GroupInfo update = new GroupInfo(); @@ -25,4 +25,4 @@ OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase( }); ``` -Merge the latest profile from `onGroupInfoChanged`. Group announcements and extra data use the same API and are covered on their respective pages. +Group announcements and extra data use the same API and are covered on their respective pages. diff --git a/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx b/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx index 157837178b..50ce81070c 100644 --- a/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx +++ b/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx @@ -4,7 +4,7 @@ description: '使用 changeGroupMute 开启或关闭群组全员禁言。' sourcePath: '/sdk/android/group/change-group-mute' --- -使用 `changeGroupMute()` 切换全员禁言。`true` 开启,`false` 关闭;成员级禁言见“禁言或解除禁言群成员”。 +使用 `changeGroupMute()` 切换全员禁言。`true` 开启,`false` 关闭;成员级禁言见[禁言或解除禁言群成员](/sdk/android/group/managing-group-members/change-group-member-mute)。 ```java OpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() { @@ -12,5 +12,3 @@ OpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() { @Override public void onError(int code, String error) { showGroupMuteError(error); } }, groupID, true); ``` - -群主和管理员的实际发言权限以及服务端权限校验以部署策略为准。 diff --git a/content/zh/docs/chat/sdk/android/group/create-group.mdx b/content/zh/docs/chat/sdk/android/group/create-group.mdx index f233608aec..1c1433f268 100644 --- a/content/zh/docs/chat/sdk/android/group/create-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/create-group.mdx @@ -4,7 +4,7 @@ description: '使用 createGroup 创建群资料并指定初始成员、管理 sourcePath: '/sdk/android/group/create-group' --- -使用 `createGroup()` 创建群组。`GroupInfo` 填写群资料;初始普通成员、管理员和群主分别通过独立参数传入。成功回调返回创建后的完整 `GroupInfo`,应保存服务端确定的 `groupID`。 +使用 `createGroup()` 创建群组。`GroupInfo` 填写群资料;初始普通成员、管理员和群主分别通过独立参数传入。成功回调返回创建后的完整 `GroupInfo`,其中包含新群组的 `groupID`。 ```java GroupInfo info = new GroupInfo(); @@ -19,5 +19,3 @@ OpenIMClient.getInstance().groupManager.createGroup( } ); ``` - -群主和管理员必须由业务侧按权限选择。不要在客户端根据本地用户列表推导群主身份。 diff --git a/content/zh/docs/chat/sdk/android/group/dismiss-group.mdx b/content/zh/docs/chat/sdk/android/group/dismiss-group.mdx index 4224a10244..394c57f57b 100644 --- a/content/zh/docs/chat/sdk/android/group/dismiss-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/dismiss-group.mdx @@ -4,7 +4,7 @@ description: '使用 dismissGroup 解散当前用户有权限管理的群组。' sourcePath: '/sdk/android/group/dismiss-group' --- -`dismissGroup()` 解散指定群组,通常仅群主可执行。调用前应在产品层提供明确确认,避免将“退出群组”误实现为解散。 +`dismissGroup()` 解散指定群组,仅群主可执行。 ```java OpenIMClient.getInstance().groupManager.dismissGroup(new OnBase() { @@ -13,4 +13,4 @@ OpenIMClient.getInstance().groupManager.dismissGroup(new OnBase() { }, groupID); ``` -最终状态通过 `onGroupDismissed` 合并;收到事件后移除群资料、成员和群会话相关缓存。 +通过 `onGroupDismissed` 接收群组解散通知。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx index 8838f4dd75..9a9588e87f 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx @@ -4,7 +4,7 @@ description: '使用 acceptGroupApplication 同意指定用户的入群申请。 sourcePath: '/sdk/android/group/group-applications/accept-group-application' --- -调用时同时传入申请的 `groupID`、申请人 `userID` 和处理说明。服务端负责校验当前用户是否有审批权限。 +调用时同时传入申请的 `groupID`、申请人 `userID` 和处理说明。当前用户需要具有审批权限。 ```java OpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() { @@ -13,4 +13,4 @@ OpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() { + @Override public void onSuccess(String data) { showDeleteSuccess(); } + @Override public void onError(int code, String error) { showDeleteError(error); } +}, request); +``` + +删除申请记录不等于拒绝申请。需要拒绝申请时,使用 `refuseGroupApplication()`。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx index ed061725ee..06fdbc2d25 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx @@ -15,4 +15,4 @@ OpenIMClient.getInstance().groupManager.getSendGroupApplicationList( }, request); ``` -申请被同意后,群列表变化以 `onJoinedGroupAdded` 为准。 +申请被同意后,通过 `onJoinedGroupAdded` 接收加入群组通知。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx index 0f981e7d0f..8603f63c40 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx @@ -4,7 +4,7 @@ description: '使用 getRecvGroupApplicationList 分页读取当前用户可处 sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-recipient' --- -使用非废弃重载并传入 `GetGroupApplicationListAsRecipientReq`。可设置 `offset`、`count`、`groupIDs` 和 `handleResults` 筛选条件。 +传入 `GetGroupApplicationListAsRecipientReq` 设置分页和筛选条件。可设置 `offset`、`count`、`groupIDs` 和 `handleResults`。 ```java GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq(0, 20); @@ -14,5 +14,3 @@ OpenIMClient.getInstance().groupManager.getRecvGroupApplicationList( @Override public void onError(int code, String error) { showApplicationError(error); } }, request); ``` - -收到事件后按申请中的 `groupID` 和 `userID` 合并,不要把列表下标作为申请标识。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx deleted file mode 100644 index 2d8c85ba01..0000000000 --- a/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: '入群申请概览' -description: '说明 Android SDK 中收到和发出的群申请、处理结果及状态事件。' -sourcePath: '/sdk/android/group/group-applications/overview-group-applications' ---- - -群申请记录使用 `GroupApplicationInfo` 表示。收到的申请面向群管理者,发出的申请面向当前用户;`handleResult`、`reqMsg`、`handledMsg` 和处理时间用于展示申请状态。 - -Android SDK 提供收到与发出申请的分页查询,以及同意、拒绝操作;不提供 Flutter 菜单中的“待处理申请数量”接口。申请新增、同意、拒绝和删除事件由[群组概览](/sdk/android/group/overview-group)的统一 listener 负责合并。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx index fb4d329b32..ab05a581df 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx @@ -13,4 +13,4 @@ OpenIMClient.getInstance().groupManager.refuseGroupApplication(new OnBase() { @@ -13,4 +13,4 @@ OpenIMClient.getInstance().groupManager.joinGroup(new OnBase() { }, groupID, "希望加入项目讨论", 3, "{\"from\":\"search\"}"); ``` -验证方式决定请求是否立即加入。后续通过 `onJoinedGroupAdded` 或群申请事件更新本地状态。 +[入群验证方式](/sdk/android/group/set-group-join-verification)决定用户是直接加入还是先提交申请。需要审核时,成功回调只表示申请已提交;实际加入后通过 `onJoinedGroupAdded` 接收通知。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx index c7ad6aad04..63c2838a47 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx @@ -4,7 +4,7 @@ description: '使用 changeGroupMemberMute 设置指定成员的禁言时长。' sourcePath: '/sdk/android/group/managing-group-members/change-group-member-mute' --- -`seconds` 为禁言时长,单位为秒;传 `0` 解除成员禁言。该操作与全员禁言相互独立。 +`seconds` 为禁言时长,单位为秒;传 `0` 解除成员禁言。该操作与[全员禁言](/sdk/android/group/change-group-mute)相互独立。 ```java OpenIMClient.getInstance().groupManager.changeGroupMemberMute(new OnBase() { @@ -12,5 +12,3 @@ OpenIMClient.getInstance().groupManager.changeGroupMemberMute(new OnBase @Override public void onError(int code, String error) { showMemberMuteError(error); } }, groupID, userID, 3600L); ``` - -在 `onGroupMemberInfoChanged` 中读取 `muteEndTime` 更新成员状态;不要用本机时间和请求时长长期推算最终禁言状态。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx index 0943cf2601..b8b83eb574 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx @@ -4,7 +4,7 @@ description: '使用 inviteUserToGroup 邀请一组用户加入指定群组。' sourcePath: '/sdk/android/group/managing-group-members/invite-user-to-group' --- -传入群 ID、待邀请用户 ID 列表和邀请说明。服务端根据群设置和当前用户权限决定是否立即加入。 +传入群 ID、待邀请用户 ID 列表和邀请说明。调用成功表示邀请请求已提交;用户实际加入后通过 `onGroupMemberAdded` 接收通知。 ```java OpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() { @@ -12,5 +12,3 @@ OpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() { @Override public void onError(int code, String error) { showInviteError(error); } }, groupID, inviteeUserIDs, "邀请加入项目讨论"); ``` - -成员实际加入后以 `onGroupMemberAdded` 合并,不能仅以提交成功显示为已加入。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx index 2c0746b445..c176e8fe13 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx @@ -4,7 +4,7 @@ description: '使用 kickGroupMember 将指定成员移出群组。' sourcePath: '/sdk/android/group/managing-group-members/kick-group-member' --- -`kickGroupMember()` 接收成员 ID 列表和移除说明。产品层应先防止当前用户误移除自身,并遵守群主、管理员权限边界。 +`kickGroupMember()` 接收成员 ID 列表和移除说明。 ```java OpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() { @@ -13,4 +13,4 @@ OpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() { }, groupID, memberUserIDs, "已不再参与该项目"); ``` -收到 `onGroupMemberDeleted` 后再从成员缓存中移除目标成员。 +移除成功后,通过 `onGroupMemberDeleted` 接收成员移除通知。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx index 989825ed52..34100d95e2 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx @@ -18,4 +18,4 @@ OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { @@ -13,4 +13,4 @@ OpenIMClient.getInstance().groupManager.transferGroupOwner(new OnBase() }, groupID, newOwnerUserID); ``` -`onGroupMemberInfoChanged` 和群资料变化可能异步到达;不要在成功 callback 中假定本地角色已完成更新。 +转让成功后,可以重新调用[获取群主和管理员](/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin)获取最新资料。 diff --git a/content/zh/docs/chat/sdk/android/group/overview-group.mdx b/content/zh/docs/chat/sdk/android/group/overview-group.mdx index 55b60c0f40..744a7f8ac8 100644 --- a/content/zh/docs/chat/sdk/android/group/overview-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/overview-group.mdx @@ -1,33 +1,98 @@ --- title: '群组概览' -description: '了解 Android SDK 中群资料、成员、申请和群组事件的职责。' +description: '了解 Android SDK 中的群组概念、核心数据类型和主要能力。' sourcePath: '/sdk/android/group/overview-group' --- -群组由 `GroupInfo` 表示,`groupID` 是群资料、成员、申请和权限设置的唯一目标标识。`GroupMembersInfo` 表示成员在某个群内的昵称、角色、禁言结束时间和扩展字段;单聊关系和会话未读数不属于群组 API。 +OpenIMSDK 的多人聊天使用群组承载共享资料、成员关系和权限。`groupID` 是群组稳定标识,发送群消息、读取群资料、管理成员和处理入群申请都使用它。当前用户聊天列表中的群会话仍由 `conversationID` 管理,两者不能混用。 -`GroupManager` 将群资料变化、成员增删改、入群申请处理和加入群组变化统一发送到一个 `OnGroupListener`。在共享状态层设置一次 listener,并按 `groupID` 或 `userID` 合并事件。 +## 核心数据类型 -```java -OpenIMClient.getInstance().groupManager.setOnGroupListener(new OnGroupListener() { - @Override public void onGroupInfoChanged(GroupInfo group) { - groupStore.put(group.getGroupID(), group); - } - - @Override public void onGroupMemberInfoChanged(GroupMembersInfo member) { - memberStore.put(member.getGroupID() + member.getUserID(), member); - } -}); -``` +| 类型 | 用途 | +| --- | --- | +| `GroupInfo` | 群名称、头像、公告、群主、验证配置、成员数和扩展字段。 | +| `GroupMembersInfo` | 用户在指定群内的昵称、角色、禁言和入群信息。 | +| `GroupApplicationInfo` | 入群申请及处理状态。 | -群资料或成员操作的成功 callback 只表示该请求完成;状态以对应群组事件或重新查询结果为准。 +群成员角色使用 `GroupRole`:`MEMBER` 表示普通成员,`ADMIN` 表示管理员,`OWNER` 表示群主。 ## 主要能力 - [群资料与设置](/sdk/android/group/create-group) -- [群权限](/sdk/android/group/set-group-join-verification) -- [加入与退出群组](/sdk/android/group/join-group) +- [群权限与管理](/sdk/android/group/set-group-join-verification) +- [加入、退出与解散群组](/sdk/android/group/join-group) - [查询群组](/sdk/android/group/retrieving-groups/get-specified-groups-info) -- [群申请](/sdk/android/group/group-applications/overview-group-applications) -- [查询群成员](/sdk/android/group/retrieving-group-members/overview-retrieving-group-members) +- [入群申请](/sdk/android/group/group-applications/get-group-application-list-as-recipient) +- [查询群成员](/sdk/android/group/retrieving-group-members/get-group-member-list) - [管理群成员](/sdk/android/group/managing-group-members/invite-user-to-group) + +## 状态更新 + +在登录前调用 `setOnGroupListener()` 注册 `OnGroupListener`,接收群资料、成员和入群申请的变化。下面示例根据回调刷新相应的群组、成员或申请界面: + +```java +private final OnGroupListener groupListener = new OnGroupListener() { + @Override + public void onJoinedGroupAdded(GroupInfo group) { + // 刷新已加入群组列表 + } + + @Override + public void onJoinedGroupDeleted(GroupInfo group) { + // 刷新已加入群组列表 + } + + @Override + public void onGroupInfoChanged(GroupInfo group) { + // 根据 group.getGroupID() 刷新群资料 + } + + @Override + public void onGroupDismissed(GroupInfo group) { + // 根据 group.getGroupID() 关闭已解散的群聊 + } + + @Override + public void onGroupMemberAdded(GroupMembersInfo member) { + // 根据 member.getGroupID() 刷新群成员列表 + } + + @Override + public void onGroupMemberDeleted(GroupMembersInfo member) { + // 根据 member.getGroupID() 刷新群成员列表 + } + + @Override + public void onGroupMemberInfoChanged(GroupMembersInfo member) { + // 根据 member.getGroupID() 刷新群成员列表 + } + + @Override + public void onGroupApplicationAdded(GroupApplicationInfo application) { + // 刷新入群申请列表 + } + + @Override + public void onGroupApplicationAccepted(GroupApplicationInfo application) { + // 刷新入群申请列表 + } + + @Override + public void onGroupApplicationRejected(GroupApplicationInfo application) { + // 刷新入群申请列表 + } + + @Override + public void onGroupApplicationDeleted(GroupApplicationInfo application) { + // 刷新入群申请列表 + } +}; + +public void registerGroupListener() { + OpenIMClient.getInstance().groupManager.setOnGroupListener(groupListener); +} +``` + +`onJoinedGroupAdded` 和 `onJoinedGroupDeleted` 用于更新当前用户已加入的群组列表;`onGroupInfoChanged` 和 `onGroupDismissed` 用于更新群资料或关闭已解散的群聊。成员变化通过 `onGroupMemberAdded`、`onGroupMemberDeleted` 和 `onGroupMemberInfoChanged` 处理;入群申请变化通过四个 `onGroupApplication...` 回调处理。 + +群组 API 的成功回调表示本次调用已完成。群资料、成员和申请列表需要更新时,再根据对应的 listener 回调刷新界面或重新查询数据。 diff --git a/content/zh/docs/chat/sdk/android/group/quit-group.mdx b/content/zh/docs/chat/sdk/android/group/quit-group.mdx index be4a35e7ce..c741ffd6ee 100644 --- a/content/zh/docs/chat/sdk/android/group/quit-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/quit-group.mdx @@ -13,4 +13,4 @@ OpenIMClient.getInstance().groupManager.quitGroup(new OnBase() { }, groupID); ``` -请求成功后仍应处理 `onJoinedGroupDeleted`,并清理该群的成员列表、群会话入口等应用缓存。 +请求成功后,继续处理 `onJoinedGroupDeleted` 回调。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx index 4da60e1a14..bc060fbaae 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx @@ -13,5 +13,3 @@ OpenIMClient.getInstance().groupManager.getGroupMemberList( @Override public void onError(int code, String error) { showMemberQueryError(error); } }, groupID, 0, offset, 50); ``` - -分页期间仍应接受成员事件,合并键使用 `groupID` 与 `userID`。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx index 688906b0b2..04615b225b 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx @@ -14,4 +14,4 @@ OpenIMClient.getInstance().groupManager.getGroupMemberOwnerAndAdmin( }, groupID); ``` -`roleLevel` 的群主、管理员和普通成员常量见 `GroupRole`;实际操作权限仍由服务端决定。 +`roleLevel` 的群主、管理员和普通成员常量见 `GroupRole`。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx index c15b5f4ce6..aa57030034 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx @@ -13,5 +13,3 @@ OpenIMClient.getInstance().groupManager.getGroupMembersInfo( @Override public void onError(int code, String error) { showMemberQueryError(error); } }, groupID, userIDs); ``` - -返回空列表可能表示目标未在群内或无读取权限,应按业务需求处理。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx index 17e80ec6f1..35c1c08851 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx @@ -13,4 +13,4 @@ OpenIMClient.getInstance().groupManager.getUsersInGroup(new OnBase> }, groupID, candidateUserIDs); ``` -需要昵称、角色或禁言状态时,再调用“获取群成员资料”。 +需要昵称、角色或禁言状态时,再调用[查询指定群成员资料](/sdk/android/group/retrieving-group-members/get-specified-group-members-info)。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx deleted file mode 100644 index 77b68f84ea..0000000000 --- a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: '群成员查询概览' -description: '说明 Android SDK 中群成员列表、指定成员资料和成员状态查询。' -sourcePath: '/sdk/android/group/retrieving-group-members/overview-retrieving-group-members' ---- - -成员查询使用 `groupID` 限定范围,结果为 `GroupMembersInfo` 或用户 ID 列表。成员列表提供角色过滤和 offset 分页;指定成员资料、在群检查、群主管理员和关键词搜索各有独立接口。 - -成员增删和资料变化由[群组概览](/sdk/android/group/overview-group)归属的 `OnGroupListener` 统一合并。查询只建立快照,不能替代事件处理。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx index b5dce64676..4d7ced64f3 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx @@ -4,7 +4,7 @@ description: '使用 getJoinedGroupListPage 分页读取当前账号已加入的 sourcePath: '/sdk/android/group/retrieving-groups/get-joined-group-list-page' --- -Android SDK 仅提供分页版本。`offset` 从 `0` 开始,后续页按已经成功合并的条目数推进;返回为空时停止加载。 +`offset` 从 `0` 开始,后续页按上一页返回的条目数推进;返回为空时停止加载。 ```java OpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() { @@ -13,4 +13,4 @@ OpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() { - @Override public void onSuccess(List groups) { mergeGroups(groups); } + @Override public void onSuccess(List groups) { showGroups(groups); } @Override public void onError(int code, String error) { showGroupQueryError(error); } }, groupIDs); ``` - -先移除空值和重复 ID;权限不足或群组不存在的 ID 应按缺失结果处理。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx index 24ef248c64..3b8eeef047 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx @@ -4,7 +4,7 @@ description: '使用 isJoinGroup 查询当前登录用户是否已经加入指 sourcePath: '/sdk/android/group/retrieving-groups/is-join-group' --- -`isJoinGroup()` 仅检查当前登录用户与目标 `groupID` 的成员关系。 +`isJoinGroup()`检查当前登录用户是否加入目标群组,参数为 `groupID`。 ```java OpenIMClient.getInstance().groupManager.isJoinGroup(groupID, new OnBase() { @@ -12,5 +12,3 @@ OpenIMClient.getInstance().groupManager.isJoinGroup(groupID, new OnBase @Override public void onError(int code, String error) { showMembershipError(error); } }); ``` - -该结果不替代群资料查询,也不能用于判断其他用户是否在群内。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx index 6c3d3472d7..6387371460 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx @@ -13,4 +13,4 @@ OpenIMClient.getInstance().groupManager.searchGroups(new OnBase> }, Collections.singletonList(keyword), true, true); ``` -搜索结果不是成员资格证明。进入群组前可使用“检查是否加入群组”确认当前状态。 +用户不一定是 `searchGroups()` 搜索到的群组的群成员,是否为群成员通过 [`isJoinGroup()`](/sdk/android/group/retrieving-groups/is-join-group) 确定。 diff --git a/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx b/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx index b592ee761b..620b49f57e 100644 --- a/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx +++ b/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx @@ -4,7 +4,7 @@ description: '通过 GroupInfo.notification 发布或更新群公告。' sourcePath: '/sdk/android/group/set-group-announcement' --- -Android SDK 没有独立的公告方法。构造包含 `groupID` 与 `notification` 的 `GroupInfo`,再调用 `setGroupInfo()`。 +构造包含 `groupID` 与 `notification` 的 `GroupInfo`,再调用 `setGroupInfo()`。 ```java GroupInfo update = new GroupInfo(); @@ -17,4 +17,4 @@ OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase( }); ``` -公告的更新时间和更新人由返回的 `GroupInfo` 中 `notificationUpdateTime`、`notificationUserID` 表示。权限由服务端校验。 +公告的更新时间和更新人保存在 `GroupInfo` 的 `notificationUpdateTime`、`notificationUserID` 字段中;需要读取时查询群资料。 diff --git a/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx b/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx index 2b08a36203..24f6a878b1 100644 --- a/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx +++ b/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx @@ -4,7 +4,7 @@ description: '通过 GroupInfo.ex 保存应用定义的群组扩展数据。' sourcePath: '/sdk/android/group/set-group-extension' --- -`GroupInfo.ex` 是完整字符串,SDK 不会合并 JSON。多个业务模块共用该字段时,应由应用读取旧值、合并自己的命名空间后再提交。 +`GroupInfo.ex` 是完整字符串,SDK 不会合并 JSON;提交新值会替换原有内容。 ```java GroupInfo update = new GroupInfo(); @@ -16,5 +16,3 @@ OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase( @Override public void onError(int code, String error) { showExtensionError(error); } }); ``` - -不要将访问令牌、密钥或仅适合本机的 UI 状态写入群扩展字段。 diff --git a/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx b/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx index c923b533e5..48d8f0a688 100644 --- a/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx +++ b/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx @@ -16,5 +16,3 @@ OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase( @Override public void onError(int code, String error) { showPermissionError(error); } }); ``` - -更新后以 `onGroupInfoChanged` 或重新读取的 `GroupInfo` 为准。 diff --git a/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx b/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx index 1b64245029..0aee2f5a99 100644 --- a/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx +++ b/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx @@ -4,7 +4,7 @@ description: '使用 setGroupInfo 更新群名称、头像、简介和其他群 sourcePath: '/sdk/android/group/update-group-profile' --- -使用 `setGroupInfo()` 更新群资料。请求对象至少应包含 `groupID` 和需要修改的字段;不要用不完整的本地缓存覆盖未参与本次编辑的字段。 +使用 `setGroupInfo()` 更新群资料。请求对象包含 `groupID` 和需要修改的字段,只提交本次要更新的内容。 ```java GroupInfo update = new GroupInfo(); @@ -18,4 +18,4 @@ OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase( }); ``` -最新群资料通过 `onGroupInfoChanged` 合并。群公告和扩展字段使用相同接口,分别见相关页面。 +群公告和扩展字段使用相同接口,分别见相关页面。 diff --git a/data/structure/android-content-audit.json b/data/structure/android-content-audit.json index b88977ce5a..71ad274635 100644 --- a/data/structure/android-content-audit.json +++ b/data/structure/android-content-audit.json @@ -40,7 +40,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -52,7 +52,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -668,7 +668,7 @@ "currentPath": "/sdk/android/group/group-applications/overview-group-applications", "targetPath": "/sdk/android/group/group-applications/overview-group-applications", "sourceKind": "openim-specific", - "disposition": "adapt", + "disposition": "omit", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnGroupListener.java" ], @@ -676,27 +676,30 @@ "sdkEvents": [], "locales": { "zh": { - "reviewStatus": "published", + "reviewStatus": "structure-only", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "not-applicable", "evidence": [], - "reason": "概览页仅说明申请状态和页面职责。" + "reason": "概览页已删除,相关操作分别在具体 API 页面中说明。" } }, "en": { - "reviewStatus": "published", - "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, "exampleVerification": { - "status": "not-applicable", + "status": "pending", "evidence": [], - "reason": "This overview explains application state and page responsibilities without a code example." + "reason": null } } }, - "redirectTo": null + "redirectTo": null, + "notes": [ + "2026-08-18:概览页不包含独立 API,已删除;子菜单仅保留具体操作页面,不保留旧地址重定向。" + ] }, { "currentPath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", @@ -859,38 +862,81 @@ "redirectTo": null }, { - "currentPath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", - "targetPath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "currentPath": "/sdk/android/group/group-applications/delete-group-requests", + "targetPath": "/sdk/android/group/group-applications/delete-group-requests", "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" ], - "sdkMethods": [], + "sdkMethods": [ + "deleteGroupRequests" + ], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-18", "exampleVerification": { - "status": "not-applicable", - "evidence": [], - "reason": "概览页仅说明成员查询的标识与返回模型。" + "status": "verified", + "evidence": [ + "GroupManager.deleteGroupRequests" + ], + "reason": null } }, "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-18", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.deleteGroupRequests" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "targetPath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "sourceKind": "openim-specific", + "disposition": "omit", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "structure-only", + "reviewer": "Codex", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "not-applicable", "evidence": [], - "reason": "This overview explains query identifiers and returned models without a code example." + "reason": "概览页已删除,相关操作分别在具体 API 页面中说明。" + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { + "status": "pending", + "evidence": [], + "reason": null } } }, - "redirectTo": null + "redirectTo": null, + "notes": [ + "2026-08-18:概览页不包含独立 API,已删除;子菜单仅保留具体操作页面,不保留旧地址重定向。" + ] }, { "currentPath": "/sdk/android/group/retrieving-group-members/get-group-member-list", diff --git a/data/structure/android-navigation-labels.json b/data/structure/android-navigation-labels.json index ab448d4393..db5e9f396a 100644 --- a/data/structure/android-navigation-labels.json +++ b/data/structure/android-navigation-labels.json @@ -182,8 +182,6 @@ "search-groups": "搜索群组", "Group applications": "入群申请", "group-applications": "入群申请", - "Group applications overview": "入群申请概览", - "overview-group-applications": "入群申请概览", "Get received group applications": "获取收到的入群申请", "get-group-application-list-as-recipient": "获取收到的入群申请", "Get sent group applications": "获取发出的入群申请", @@ -192,10 +190,10 @@ "accept-group-application": "接受入群申请", "Reject a group application": "拒绝入群申请", "refuse-group-application": "拒绝入群申请", + "Delete group applications": "删除入群申请", + "delete-group-requests": "删除入群申请", "Retrieving group members": "查询群成员", "retrieving-group-members": "查询群成员", - "Group member queries overview": "群成员查询概览", - "overview-retrieving-group-members": "群成员查询概览", "Get group members": "分页查询群成员", "get-group-member-list": "分页查询群成员", "Get group member profiles": "查询指定群成员资料", diff --git a/data/structure/android-sidebar.json b/data/structure/android-sidebar.json index 544936e1d7..b8403a27df 100644 --- a/data/structure/android-sidebar.json +++ b/data/structure/android-sidebar.json @@ -307,10 +307,6 @@ "id": "group/group-applications", "title": "Group applications", "children": [ - { - "path": "/sdk/android/group/group-applications/overview-group-applications", - "navigationTitle": "Group applications overview" - }, { "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", "navigationTitle": "Get received group applications" @@ -326,6 +322,10 @@ { "path": "/sdk/android/group/group-applications/refuse-group-application", "navigationTitle": "Reject a group application" + }, + { + "path": "/sdk/android/group/group-applications/delete-group-requests", + "navigationTitle": "Delete group applications" } ] }, @@ -333,10 +333,6 @@ "id": "group/retrieving-group-members", "title": "Retrieving group members", "children": [ - { - "path": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", - "navigationTitle": "Group member queries overview" - }, { "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", "navigationTitle": "Get group members" diff --git a/data/structure/chat-pages.json b/data/structure/chat-pages.json index 4bf7db140d..0abc6a18de 100644 --- a/data/structure/chat-pages.json +++ b/data/structure/chat-pages.json @@ -2383,14 +2383,6 @@ "template": "guide", "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx" }, - { - "sourcePath": "/sdk/android/group/group-applications/overview-group-applications", - "openimPath": "/sdk/android/group/group-applications/overview-group-applications", - "title": "Group applications overview", - "context": "chat/sdk/android", - "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx" - }, { "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", "openimPath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", @@ -2424,12 +2416,12 @@ "contentFile": "content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx" }, { - "sourcePath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", - "openimPath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", - "title": "Group member queries overview", + "sourcePath": "/sdk/android/group/group-applications/delete-group-requests", + "openimPath": "/sdk/android/group/group-applications/delete-group-requests", + "title": "Delete group applications", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/delete-group-requests.mdx" }, { "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", diff --git a/scripts/sync-client-sdk-route-skeletons.mjs b/scripts/sync-client-sdk-route-skeletons.mjs index 397fb52bcc..6226b9a323 100644 --- a/scripts/sync-client-sdk-route-skeletons.mjs +++ b/scripts/sync-client-sdk-route-skeletons.mjs @@ -30,9 +30,6 @@ const androidRouteTitles = { 'user/online-status/subscribe-users-online-status': 'Subscribe to user online status', 'user/online-status/get-subscribe-online-users-status': 'Get subscribed user online status', 'user/online-status/unsubscribe-users-online-status': 'Unsubscribe from user status', - 'group/group-applications/overview-group-applications': 'Group applications overview', - 'group/retrieving-group-members/overview-retrieving-group-members': - 'Group member queries overview', 'message/sending-messages/set-msg-send-progress-listener': 'Track message sending progress', 'message/managing-messages/delete-saved-messages': 'Delete messages in a batch', 'message/creating-messages/create-image-message': 'Create an image message', diff --git a/src/generated/android-sdk-zh-content.json b/src/generated/android-sdk-zh-content.json index 9956fc6840..a10ef61c5d 100644 --- a/src/generated/android-sdk-zh-content.json +++ b/src/generated/android-sdk-zh-content.json @@ -1,8 +1,8 @@ { "sourceContext": "chat/sdk/android", "sourceRoot": "content/zh/docs/chat/sdk/android", - "pageCount": 145, - "manualPageCount": 145, + "pageCount": 144, + "manualPageCount": 144, "pendingPaths": [], "reviewStates": { "/sdk/android/overview": "published", @@ -66,12 +66,11 @@ "/sdk/android/group/retrieving-groups/get-joined-group-list-page": "published", "/sdk/android/group/retrieving-groups/is-join-group": "published", "/sdk/android/group/retrieving-groups/search-groups": "published", - "/sdk/android/group/group-applications/overview-group-applications": "published", "/sdk/android/group/group-applications/get-group-application-list-as-recipient": "published", "/sdk/android/group/group-applications/get-group-application-list-as-applicant": "published", "/sdk/android/group/group-applications/accept-group-application": "published", "/sdk/android/group/group-applications/refuse-group-application": "published", - "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members": "published", + "/sdk/android/group/group-applications/delete-group-requests": "published", "/sdk/android/group/retrieving-group-members/get-group-member-list": "published", "/sdk/android/group/retrieving-group-members/get-specified-group-members-info": "published", "/sdk/android/group/retrieving-group-members/get-users-in-group": "published", @@ -335,8 +334,6 @@ "search-groups": "搜索群组", "Group applications": "入群申请", "group-applications": "入群申请", - "Group applications overview": "入群申请概览", - "overview-group-applications": "入群申请概览", "Get received group applications": "获取收到的入群申请", "get-group-application-list-as-recipient": "获取收到的入群申请", "Get sent group applications": "获取发出的入群申请", @@ -345,10 +342,10 @@ "accept-group-application": "接受入群申请", "Reject a group application": "拒绝入群申请", "refuse-group-application": "拒绝入群申请", + "Delete group applications": "删除入群申请", + "delete-group-requests": "删除入群申请", "Retrieving group members": "查询群成员", "retrieving-group-members": "查询群成员", - "Group member queries overview": "群成员查询概览", - "overview-retrieving-group-members": "群成员查询概览", "Get group members": "分页查询群成员", "get-group-member-list": "分页查询群成员", "Get group member profiles": "查询指定群成员资料", @@ -1090,41 +1087,51 @@ "title": "清空会话消息" }, "/sdk/android/group/overview-group": { - "body": "群组由 `GroupInfo` 表示,`groupID` 是群资料、成员、申请和权限设置的唯一目标标识。`GroupMembersInfo` 表示成员在某个群内的昵称、角色、禁言结束时间和扩展字段;单聊关系和会话未读数不属于群组 API。\n\n`GroupManager` 将群资料变化、成员增删改、入群申请处理和加入群组变化统一发送到一个 `OnGroupListener`。在共享状态层设置一次 listener,并按 `groupID` 或 `userID` 合并事件。\n\n```java\nOpenIMClient.getInstance().groupManager.setOnGroupListener(new OnGroupListener() {\n @Override public void onGroupInfoChanged(GroupInfo group) {\n groupStore.put(group.getGroupID(), group);\n }\n\n @Override public void onGroupMemberInfoChanged(GroupMembersInfo member) {\n memberStore.put(member.getGroupID() + member.getUserID(), member);\n }\n});\n```\n\n群资料或成员操作的成功 callback 只表示该请求完成;状态以对应群组事件或重新查询结果为准。\n\n## 主要能力\n\n- [群资料与设置](/sdk/android/group/create-group)\n- [群权限](/sdk/android/group/set-group-join-verification)\n- [加入与退出群组](/sdk/android/group/join-group)\n- [查询群组](/sdk/android/group/retrieving-groups/get-specified-groups-info)\n- [群申请](/sdk/android/group/group-applications/overview-group-applications)\n- [查询群成员](/sdk/android/group/retrieving-group-members/overview-retrieving-group-members)\n- [管理群成员](/sdk/android/group/managing-group-members/invite-user-to-group)", - "description": "了解 Android SDK 中群资料、成员、申请和群组事件的职责。", + "body": "OpenIMSDK 的多人聊天使用群组承载共享资料、成员关系和权限。`groupID` 是群组稳定标识,发送群消息、读取群资料、管理成员和处理入群申请都使用它。当前用户聊天列表中的群会话仍由 `conversationID` 管理,两者不能混用。\n\n## 核心数据类型\n\n| 类型 | 用途 |\n| --- | --- |\n| `GroupInfo` | 群名称、头像、公告、群主、验证配置、成员数和扩展字段。 |\n| `GroupMembersInfo` | 用户在指定群内的昵称、角色、禁言和入群信息。 |\n| `GroupApplicationInfo` | 入群申请及处理状态。 |\n\n群成员角色使用 `GroupRole`:`MEMBER` 表示普通成员,`ADMIN` 表示管理员,`OWNER` 表示群主。\n\n## 主要能力\n\n- [群资料与设置](/sdk/android/group/create-group)\n- [群权限与管理](/sdk/android/group/set-group-join-verification)\n- [加入、退出与解散群组](/sdk/android/group/join-group)\n- [查询群组](/sdk/android/group/retrieving-groups/get-specified-groups-info)\n- [入群申请](/sdk/android/group/group-applications/get-group-application-list-as-recipient)\n- [查询群成员](/sdk/android/group/retrieving-group-members/get-group-member-list)\n- [管理群成员](/sdk/android/group/managing-group-members/invite-user-to-group)\n\n## 状态更新\n\n在登录前调用 `setOnGroupListener()` 注册 `OnGroupListener`,接收群资料、成员和入群申请的变化。下面示例根据回调刷新相应的群组、成员或申请界面:\n\n```java\nprivate final OnGroupListener groupListener = new OnGroupListener() {\n @Override\n public void onJoinedGroupAdded(GroupInfo group) {\n // 刷新已加入群组列表\n }\n\n @Override\n public void onJoinedGroupDeleted(GroupInfo group) {\n // 刷新已加入群组列表\n }\n\n @Override\n public void onGroupInfoChanged(GroupInfo group) {\n // 根据 group.getGroupID() 刷新群资料\n }\n\n @Override\n public void onGroupDismissed(GroupInfo group) {\n // 根据 group.getGroupID() 关闭已解散的群聊\n }\n\n @Override\n public void onGroupMemberAdded(GroupMembersInfo member) {\n // 根据 member.getGroupID() 刷新群成员列表\n }\n\n @Override\n public void onGroupMemberDeleted(GroupMembersInfo member) {\n // 根据 member.getGroupID() 刷新群成员列表\n }\n\n @Override\n public void onGroupMemberInfoChanged(GroupMembersInfo member) {\n // 根据 member.getGroupID() 刷新群成员列表\n }\n\n @Override\n public void onGroupApplicationAdded(GroupApplicationInfo application) {\n // 刷新入群申请列表\n }\n\n @Override\n public void onGroupApplicationAccepted(GroupApplicationInfo application) {\n // 刷新入群申请列表\n }\n\n @Override\n public void onGroupApplicationRejected(GroupApplicationInfo application) {\n // 刷新入群申请列表\n }\n\n @Override\n public void onGroupApplicationDeleted(GroupApplicationInfo application) {\n // 刷新入群申请列表\n }\n};\n\npublic void registerGroupListener() {\n OpenIMClient.getInstance().groupManager.setOnGroupListener(groupListener);\n}\n```\n\n`onJoinedGroupAdded` 和 `onJoinedGroupDeleted` 用于更新当前用户已加入的群组列表;`onGroupInfoChanged` 和 `onGroupDismissed` 用于更新群资料或关闭已解散的群聊。成员变化通过 `onGroupMemberAdded`、`onGroupMemberDeleted` 和 `onGroupMemberInfoChanged` 处理;入群申请变化通过四个 `onGroupApplication...` 回调处理。\n\n群组 API 的成功回调表示本次调用已完成。群资料、成员和申请列表需要更新时,再根据对应的 listener 回调刷新界面或重新查询数据。", + "description": "了解 Android SDK 中的群组概念、核心数据类型和主要能力。", "headings": [ + { + "depth": 2, + "title": "核心数据类型", + "url": "#核心数据类型" + }, { "depth": 2, "title": "主要能力", "url": "#主要能力" + }, + { + "depth": 2, + "title": "状态更新", + "url": "#状态更新" } ], "sourcePath": "/sdk/android/group/overview-group", "title": "群组概览" }, "/sdk/android/group/create-group": { - "body": "使用 `createGroup()` 创建群组。`GroupInfo` 填写群资料;初始普通成员、管理员和群主分别通过独立参数传入。成功回调返回创建后的完整 `GroupInfo`,应保存服务端确定的 `groupID`。\n\n```java\nGroupInfo info = new GroupInfo();\ninfo.setGroupName(\"项目讨论\");\ninfo.setIntroduction(\"仅限项目成员\");\n\nOpenIMClient.getInstance().groupManager.createGroup(\n memberUserIDs, adminUserIDs, info, ownerUserID,\n new OnBase() {\n @Override public void onSuccess(GroupInfo group) { openGroup(group.getGroupID()); }\n @Override public void onError(int code, String error) { showCreateError(error); }\n }\n);\n```\n\n群主和管理员必须由业务侧按权限选择。不要在客户端根据本地用户列表推导群主身份。", + "body": "使用 `createGroup()` 创建群组。`GroupInfo` 填写群资料;初始普通成员、管理员和群主分别通过独立参数传入。成功回调返回创建后的完整 `GroupInfo`,其中包含新群组的 `groupID`。\n\n```java\nGroupInfo info = new GroupInfo();\ninfo.setGroupName(\"项目讨论\");\ninfo.setIntroduction(\"仅限项目成员\");\n\nOpenIMClient.getInstance().groupManager.createGroup(\n memberUserIDs, adminUserIDs, info, ownerUserID,\n new OnBase() {\n @Override public void onSuccess(GroupInfo group) { openGroup(group.getGroupID()); }\n @Override public void onError(int code, String error) { showCreateError(error); }\n }\n);\n```", "description": "使用 createGroup 创建群资料并指定初始成员、管理员和群主。", "headings": [], "sourcePath": "/sdk/android/group/create-group", "title": "创建群组" }, "/sdk/android/group/update-group-profile": { - "body": "使用 `setGroupInfo()` 更新群资料。请求对象至少应包含 `groupID` 和需要修改的字段;不要用不完整的本地缓存覆盖未参与本次编辑的字段。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setGroupName(\"移动端项目组\");\nupdate.setIntroduction(\"Android 与 iOS 协作群\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markGroupUpdateSubmitted(groupID); }\n @Override public void onError(int code, String error) { showGroupUpdateError(error); }\n});\n```\n\n最新群资料通过 `onGroupInfoChanged` 合并。群公告和扩展字段使用相同接口,分别见相关页面。", + "body": "使用 `setGroupInfo()` 更新群资料。请求对象包含 `groupID` 和需要修改的字段,只提交本次要更新的内容。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setGroupName(\"移动端项目组\");\nupdate.setIntroduction(\"Android 与 iOS 协作群\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markGroupUpdateSubmitted(groupID); }\n @Override public void onError(int code, String error) { showGroupUpdateError(error); }\n});\n```\n\n群公告和扩展字段使用相同接口,分别见相关页面。", "description": "使用 setGroupInfo 更新群名称、头像、简介和其他群资料字段。", "headings": [], "sourcePath": "/sdk/android/group/update-group-profile", "title": "更新群名称、简介和头像" }, "/sdk/android/group/set-group-announcement": { - "body": "Android SDK 没有独立的公告方法。构造包含 `groupID` 与 `notification` 的 `GroupInfo`,再调用 `setGroupInfo()`。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setNotification(\"今晚 20:00 进行版本发布确认。\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { refreshAnnouncement(groupID); }\n @Override public void onError(int code, String error) { showAnnouncementError(error); }\n});\n```\n\n公告的更新时间和更新人由返回的 `GroupInfo` 中 `notificationUpdateTime`、`notificationUserID` 表示。权限由服务端校验。", + "body": "构造包含 `groupID` 与 `notification` 的 `GroupInfo`,再调用 `setGroupInfo()`。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setNotification(\"今晚 20:00 进行版本发布确认。\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { refreshAnnouncement(groupID); }\n @Override public void onError(int code, String error) { showAnnouncementError(error); }\n});\n```\n\n公告的更新时间和更新人保存在 `GroupInfo` 的 `notificationUpdateTime`、`notificationUserID` 字段中;需要读取时查询群资料。", "description": "通过 GroupInfo.notification 发布或更新群公告。", "headings": [], "sourcePath": "/sdk/android/group/set-group-announcement", "title": "发布或更新群公告" }, "/sdk/android/group/set-group-extension": { - "body": "`GroupInfo.ex` 是完整字符串,SDK 不会合并 JSON。多个业务模块共用该字段时,应由应用读取旧值、合并自己的命名空间后再提交。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setEx(\"{\\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false}\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markExtensionSubmitted(groupID); }\n @Override public void onError(int code, String error) { showExtensionError(error); }\n});\n```\n\n不要将访问令牌、密钥或仅适合本机的 UI 状态写入群扩展字段。", + "body": "`GroupInfo.ex` 是完整字符串,SDK 不会合并 JSON;提交新值会替换原有内容。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setEx(\"{\\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false}\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markExtensionSubmitted(groupID); }\n @Override public void onError(int code, String error) { showExtensionError(error); }\n});\n```", "description": "通过 GroupInfo.ex 保存应用定义的群组扩展数据。", "headings": [], "sourcePath": "/sdk/android/group/set-group-extension", @@ -1145,133 +1152,126 @@ "title": "设置成员资料查看权限" }, "/sdk/android/group/set-group-member-friend-permission": { - "body": "`applyMemberFriend` 使用整数开关:`0` 关闭,`1` 打开。该规则只影响从该群成员关系入口发起的好友申请。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setApplyMemberFriend(0);\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markFriendPermissionSubmitted(groupID); }\n @Override public void onError(int code, String error) { showPermissionError(error); }\n});\n```\n\n更新后以 `onGroupInfoChanged` 或重新读取的 `GroupInfo` 为准。", + "body": "`applyMemberFriend` 使用整数开关:`0` 关闭,`1` 打开。该规则只影响从该群成员关系入口发起的好友申请。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setApplyMemberFriend(0);\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markFriendPermissionSubmitted(groupID); }\n @Override public void onError(int code, String error) { showPermissionError(error); }\n});\n```", "description": "通过 GroupInfo.applyMemberFriend 设置是否允许从群成员发起好友申请。", "headings": [], "sourcePath": "/sdk/android/group/set-group-member-friend-permission", "title": "设置群内添加好友权限" }, "/sdk/android/group/change-group-mute": { - "body": "使用 `changeGroupMute()` 切换全员禁言。`true` 开启,`false` 关闭;成员级禁言见“禁言或解除禁言群成员”。\n\n```java\nOpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() {\n @Override public void onSuccess(String data) { markGroupMuteSubmitted(groupID, true); }\n @Override public void onError(int code, String error) { showGroupMuteError(error); }\n}, groupID, true);\n```\n\n群主和管理员的实际发言权限以及服务端权限校验以部署策略为准。", + "body": "使用 `changeGroupMute()` 切换全员禁言。`true` 开启,`false` 关闭;成员级禁言见[禁言或解除禁言群成员](/sdk/android/group/managing-group-members/change-group-member-mute)。\n\n```java\nOpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() {\n @Override public void onSuccess(String data) { markGroupMuteSubmitted(groupID, true); }\n @Override public void onError(int code, String error) { showGroupMuteError(error); }\n}, groupID, true);\n```", "description": "使用 changeGroupMute 开启或关闭群组全员禁言。", "headings": [], "sourcePath": "/sdk/android/group/change-group-mute", "title": "设置群组全员禁言" }, "/sdk/android/group/join-group": { - "body": "使用 `joinGroup()` 提交入群请求。`joinSource` 使用群组来源值,例如邀请、搜索或二维码;带扩展数据时使用五参数重载。\n\n```java\nOpenIMClient.getInstance().groupManager.joinGroup(new OnBase() {\n @Override public void onSuccess(String data) { markJoinSubmitted(groupID); }\n @Override public void onError(int code, String error) { showJoinError(error); }\n}, groupID, \"希望加入项目讨论\", 3, \"{\\\"from\\\":\\\"search\\\"}\");\n```\n\n验证方式决定请求是否立即加入。后续通过 `onJoinedGroupAdded` 或群申请事件更新本地状态。", + "body": "使用 `joinGroup()` 提交入群请求。`joinSource` 表示入群来源:`2` 表示邀请,`3` 表示搜索,`4` 表示二维码;带扩展数据时使用五参数重载。\n\n```java\nOpenIMClient.getInstance().groupManager.joinGroup(new OnBase() {\n @Override public void onSuccess(String data) { markJoinSubmitted(groupID); }\n @Override public void onError(int code, String error) { showJoinError(error); }\n}, groupID, \"希望加入项目讨论\", 3, \"{\\\"from\\\":\\\"search\\\"}\");\n```\n\n[入群验证方式](/sdk/android/group/set-group-join-verification)决定用户是直接加入还是先提交申请。需要审核时,成功回调只表示申请已提交;实际加入后通过 `onJoinedGroupAdded` 接收通知。", "description": "使用 joinGroup 提交入群申请或加入请求。", "headings": [], "sourcePath": "/sdk/android/group/join-group", "title": "申请加入群组" }, "/sdk/android/group/quit-group": { - "body": "`quitGroup()` 仅作用于当前登录用户,不会解散群组或移除其他成员。\n\n```java\nOpenIMClient.getInstance().groupManager.quitGroup(new OnBase() {\n @Override public void onSuccess(String data) { removeJoinedGroup(groupID); }\n @Override public void onError(int code, String error) { showQuitError(error); }\n}, groupID);\n```\n\n请求成功后仍应处理 `onJoinedGroupDeleted`,并清理该群的成员列表、群会话入口等应用缓存。", + "body": "`quitGroup()` 仅作用于当前登录用户,不会解散群组或移除其他成员。\n\n```java\nOpenIMClient.getInstance().groupManager.quitGroup(new OnBase() {\n @Override public void onSuccess(String data) { removeJoinedGroup(groupID); }\n @Override public void onError(int code, String error) { showQuitError(error); }\n}, groupID);\n```\n\n请求成功后,继续处理 `onJoinedGroupDeleted` 回调。", "description": "使用 quitGroup 让当前登录用户退出指定群组。", "headings": [], "sourcePath": "/sdk/android/group/quit-group", "title": "退出群组" }, "/sdk/android/group/dismiss-group": { - "body": "`dismissGroup()` 解散指定群组,通常仅群主可执行。调用前应在产品层提供明确确认,避免将“退出群组”误实现为解散。\n\n```java\nOpenIMClient.getInstance().groupManager.dismissGroup(new OnBase() {\n @Override public void onSuccess(String data) { markDismissSubmitted(groupID); }\n @Override public void onError(int code, String error) { showDismissError(error); }\n}, groupID);\n```\n\n最终状态通过 `onGroupDismissed` 合并;收到事件后移除群资料、成员和群会话相关缓存。", + "body": "`dismissGroup()` 解散指定群组,仅群主可执行。\n\n```java\nOpenIMClient.getInstance().groupManager.dismissGroup(new OnBase() {\n @Override public void onSuccess(String data) { markDismissSubmitted(groupID); }\n @Override public void onError(int code, String error) { showDismissError(error); }\n}, groupID);\n```\n\n通过 `onGroupDismissed` 接收群组解散通知。", "description": "使用 dismissGroup 解散当前用户有权限管理的群组。", "headings": [], "sourcePath": "/sdk/android/group/dismiss-group", "title": "解散群组" }, "/sdk/android/group/retrieving-groups/get-specified-groups-info": { - "body": "已持有一组 `groupID` 时,使用 `getGroupsInfo()` 查询群资料。结果是 `GroupInfo` 列表,不能依赖响应顺序与请求列表完全一致。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupsInfo(new OnBase>() {\n @Override public void onSuccess(List groups) { mergeGroups(groups); }\n @Override public void onError(int code, String error) { showGroupQueryError(error); }\n}, groupIDs);\n```\n\n先移除空值和重复 ID;权限不足或群组不存在的 ID 应按缺失结果处理。", + "body": "`getGroupsInfo()` 的 `groupIDs` 参数为要查询的群组 ID 列表,返回结果为 `GroupInfo` 列表。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupsInfo(new OnBase>() {\n @Override public void onSuccess(List groups) { showGroups(groups); }\n @Override public void onError(int code, String error) { showGroupQueryError(error); }\n}, groupIDs);\n```", "description": "使用 getGroupsInfo 批量查询指定群组的最新资料。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", "title": "查询指定群组资料" }, "/sdk/android/group/retrieving-groups/get-joined-group-list-page": { - "body": "Android SDK 仅提供分页版本。`offset` 从 `0` 开始,后续页按已经成功合并的条目数推进;返回为空时停止加载。\n\n```java\nOpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() {\n @Override public void onSuccess(List groups) { appendJoinedGroups(groups); }\n @Override public void onError(int code, String error) { showPageError(error); }\n}, offset, 20);\n```\n\n使用 `onJoinedGroupAdded` 与 `onJoinedGroupDeleted` 合并增量,不要仅依赖已加载分页作为完整群列表。", + "body": "`offset` 从 `0` 开始,后续页按上一页返回的条目数推进;返回为空时停止加载。\n\n```java\nOpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() {\n @Override public void onSuccess(List groups) { appendJoinedGroups(groups); }\n @Override public void onError(int code, String error) { showPageError(error); }\n}, offset, 20);\n```\n\n加入或退出群组时,通过 `onJoinedGroupAdded` 和 `onJoinedGroupDeleted` 接收通知。", "description": "使用 getJoinedGroupListPage 分页读取当前账号已加入的群组。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", "title": "分页获取已加入群组" }, "/sdk/android/group/retrieving-groups/is-join-group": { - "body": "`isJoinGroup()` 仅检查当前登录用户与目标 `groupID` 的成员关系。\n\n```java\nOpenIMClient.getInstance().groupManager.isJoinGroup(groupID, new OnBase() {\n @Override public void onSuccess(Boolean joined) { updateJoinAction(Boolean.TRUE.equals(joined)); }\n @Override public void onError(int code, String error) { showMembershipError(error); }\n});\n```\n\n该结果不替代群资料查询,也不能用于判断其他用户是否在群内。", + "body": "`isJoinGroup()`检查当前登录用户是否加入目标群组,参数为 `groupID`。\n\n```java\nOpenIMClient.getInstance().groupManager.isJoinGroup(groupID, new OnBase() {\n @Override public void onSuccess(Boolean joined) { updateJoinAction(Boolean.TRUE.equals(joined)); }\n @Override public void onError(int code, String error) { showMembershipError(error); }\n});\n```", "description": "使用 isJoinGroup 查询当前登录用户是否已经加入指定群组。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", "title": "检查是否已加入群组" }, "/sdk/android/group/retrieving-groups/search-groups": { - "body": "`searchGroups()` 接收关键词列表,并分别指定是否搜索群 ID、群名称。两个开关都关闭时没有有效搜索范围。\n\n```java\nOpenIMClient.getInstance().groupManager.searchGroups(new OnBase>() {\n @Override public void onSuccess(List groups) { showSearchResults(groups); }\n @Override public void onError(int code, String error) { showSearchError(error); }\n}, Collections.singletonList(keyword), true, true);\n```\n\n搜索结果不是成员资格证明。进入群组前可使用“检查是否加入群组”确认当前状态。", + "body": "`searchGroups()` 接收关键词列表,并分别指定是否搜索群 ID、群名称。两个开关都关闭时没有有效搜索范围。\n\n```java\nOpenIMClient.getInstance().groupManager.searchGroups(new OnBase>() {\n @Override public void onSuccess(List groups) { showSearchResults(groups); }\n @Override public void onError(int code, String error) { showSearchError(error); }\n}, Collections.singletonList(keyword), true, true);\n```\n\n用户不一定是 `searchGroups()` 搜索到的群组的群成员,是否为群成员通过 [`isJoinGroup()`](/sdk/android/group/retrieving-groups/is-join-group) 确定。", "description": "使用 searchGroups 按群 ID 或群名称搜索本地可查询的群组。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-groups/search-groups", "title": "搜索群组" }, - "/sdk/android/group/group-applications/overview-group-applications": { - "body": "群申请记录使用 `GroupApplicationInfo` 表示。收到的申请面向群管理者,发出的申请面向当前用户;`handleResult`、`reqMsg`、`handledMsg` 和处理时间用于展示申请状态。\n\nAndroid SDK 提供收到与发出申请的分页查询,以及同意、拒绝操作;不提供 Flutter 菜单中的“待处理申请数量”接口。申请新增、同意、拒绝和删除事件由[群组概览](/sdk/android/group/overview-group)的统一 listener 负责合并。", - "description": "说明 Android SDK 中收到和发出的群申请、处理结果及状态事件。", - "headings": [], - "sourcePath": "/sdk/android/group/group-applications/overview-group-applications", - "title": "入群申请概览" - }, "/sdk/android/group/group-applications/get-group-application-list-as-recipient": { - "body": "使用非废弃重载并传入 `GetGroupApplicationListAsRecipientReq`。可设置 `offset`、`count`、`groupIDs` 和 `handleResults` 筛选条件。\n\n```java\nGetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq(0, 20);\nOpenIMClient.getInstance().groupManager.getRecvGroupApplicationList(\n new OnBase>() {\n @Override public void onSuccess(List items) { mergeReceivedApplications(items); }\n @Override public void onError(int code, String error) { showApplicationError(error); }\n }, request);\n```\n\n收到事件后按申请中的 `groupID` 和 `userID` 合并,不要把列表下标作为申请标识。", + "body": "传入 `GetGroupApplicationListAsRecipientReq` 设置分页和筛选条件。可设置 `offset`、`count`、`groupIDs` 和 `handleResults`。\n\n```java\nGetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq(0, 20);\nOpenIMClient.getInstance().groupManager.getRecvGroupApplicationList(\n new OnBase>() {\n @Override public void onSuccess(List items) { mergeReceivedApplications(items); }\n @Override public void onError(int code, String error) { showApplicationError(error); }\n }, request);\n```", "description": "使用 getRecvGroupApplicationList 分页读取当前用户可处理的入群申请。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", "title": "获取收到的入群申请" }, "/sdk/android/group/group-applications/get-group-application-list-as-applicant": { - "body": "使用 `GetGroupApplicationListAsApplicantReq` 设置分页和筛选条件,再调用 `getSendGroupApplicationList()`。\n\n```java\nGetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq(0, 20);\nOpenIMClient.getInstance().groupManager.getSendGroupApplicationList(\n new OnBase>() {\n @Override public void onSuccess(List items) { mergeSentApplications(items); }\n @Override public void onError(int code, String error) { showApplicationError(error); }\n }, request);\n```\n\n申请被同意后,群列表变化以 `onJoinedGroupAdded` 为准。", + "body": "使用 `GetGroupApplicationListAsApplicantReq` 设置分页和筛选条件,再调用 `getSendGroupApplicationList()`。\n\n```java\nGetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq(0, 20);\nOpenIMClient.getInstance().groupManager.getSendGroupApplicationList(\n new OnBase>() {\n @Override public void onSuccess(List items) { mergeSentApplications(items); }\n @Override public void onError(int code, String error) { showApplicationError(error); }\n }, request);\n```\n\n申请被同意后,通过 `onJoinedGroupAdded` 接收加入群组通知。", "description": "使用 getSendGroupApplicationList 分页读取当前用户发出的入群申请。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", "title": "获取发出的入群申请" }, "/sdk/android/group/group-applications/accept-group-application": { - "body": "调用时同时传入申请的 `groupID`、申请人 `userID` 和处理说明。服务端负责校验当前用户是否有审批权限。\n\n```java\nOpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() {\n @Override public void onSuccess(String data) { markApplicationHandled(groupID, applicantUserID); }\n @Override public void onError(int code, String error) { showHandleError(error); }\n}, groupID, applicantUserID, \"欢迎加入\");\n```\n\n同意后通过群申请事件与 `onGroupMemberAdded` 更新申请列表和成员列表。", + "body": "调用时同时传入申请的 `groupID`、申请人 `userID` 和处理说明。当前用户需要具有审批权限。\n\n```java\nOpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() {\n @Override public void onSuccess(String data) { markApplicationHandled(groupID, applicantUserID); }\n @Override public void onError(int code, String error) { showHandleError(error); }\n}, groupID, applicantUserID, \"欢迎加入\");\n```\n\n同意后,通过[群组概览](/sdk/android/group/overview-group)中的相关事件接收申请状态和成员变化通知。", "description": "使用 acceptGroupApplication 同意指定用户的入群申请。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/accept-group-application", "title": "接受入群申请" }, "/sdk/android/group/group-applications/refuse-group-application": { - "body": "拒绝操作同样使用申请所属 `groupID`、申请人 `userID` 和处理说明。\n\n```java\nOpenIMClient.getInstance().groupManager.refuseGroupApplication(new OnBase() {\n @Override public void onSuccess(String data) { markApplicationRejected(groupID, applicantUserID); }\n @Override public void onError(int code, String error) { showHandleError(error); }\n}, groupID, applicantUserID, \"当前群组人数已满\");\n```\n\n成功 callback 后不要直接删除本地申请记录;以 `onGroupApplicationRejected` 或重新查询结果更新。", + "body": "拒绝操作同样使用申请所属 `groupID`、申请人 `userID` 和处理说明。\n\n```java\nOpenIMClient.getInstance().groupManager.refuseGroupApplication(new OnBase() {\n @Override public void onSuccess(String data) { markApplicationRejected(groupID, applicantUserID); }\n @Override public void onError(int code, String error) { showHandleError(error); }\n}, groupID, applicantUserID, \"当前群组人数已满\");\n```\n\n拒绝成功后,通过 `onGroupApplicationRejected` 接收通知,也可以重新调用查询 API 获取最新申请列表。", "description": "使用 refuseGroupApplication 拒绝指定用户的入群申请。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", "title": "拒绝入群申请" }, - "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members": { - "body": "成员查询使用 `groupID` 限定范围,结果为 `GroupMembersInfo` 或用户 ID 列表。成员列表提供角色过滤和 offset 分页;指定成员资料、在群检查、群主管理员和关键词搜索各有独立接口。\n\n成员增删和资料变化由[群组概览](/sdk/android/group/overview-group)归属的 `OnGroupListener` 统一合并。查询只建立快照,不能替代事件处理。", - "description": "说明 Android SDK 中群成员列表、指定成员资料和成员状态查询。", + "/sdk/android/group/group-applications/delete-group-requests": { + "body": "`deleteGroupRequests()` 接收 `DeleteGroupRequestsReq`,可传入多个 `SimpleGroupRequests` 批量删除申请记录。每个 `SimpleGroupRequests` 包含 `fromUserID` 和 `groupID`:`fromUserID` 为申请人的用户 ID,`groupID` 为申请加入的群组 ID。\n\n```java\nSimpleGroupRequests[] groupRequests = {\n new SimpleGroupRequests(firstApplicantUserID, firstGroupID),\n new SimpleGroupRequests(secondApplicantUserID, secondGroupID)\n};\nDeleteGroupRequestsReq request = new DeleteGroupRequestsReq(groupRequests);\n\nOpenIMClient.getInstance().groupManager.deleteGroupRequests(new OnBase() {\n @Override public void onSuccess(String data) { showDeleteSuccess(); }\n @Override public void onError(int code, String error) { showDeleteError(error); }\n}, request);\n```\n\n删除申请记录不等于拒绝申请。需要拒绝申请时,使用 `refuseGroupApplication()`。", + "description": "使用 deleteGroupRequests 批量删除指定的入群申请记录。", "headings": [], - "sourcePath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", - "title": "群成员查询概览" + "sourcePath": "/sdk/android/group/group-applications/delete-group-requests", + "title": "删除入群申请" }, "/sdk/android/group/retrieving-group-members/get-group-member-list": { - "body": "`filter` 传 `0` 查询全部成员,`1` 普通成员,`2` 群主,`3` 管理员。`offset` 与 `count` 控制分页。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMemberList(\n new OnBase>() {\n @Override public void onSuccess(List members) { appendMembers(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID, 0, offset, 50);\n```\n\n分页期间仍应接受成员事件,合并键使用 `groupID` 与 `userID`。", + "body": "`filter` 传 `0` 查询全部成员,`1` 普通成员,`2` 群主,`3` 管理员。`offset` 与 `count` 控制分页。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMemberList(\n new OnBase>() {\n @Override public void onSuccess(List members) { appendMembers(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID, 0, offset, 50);\n```", "description": "使用 getGroupMemberList 按角色和分页条件读取群成员。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", "title": "分页查询群成员" }, "/sdk/android/group/retrieving-group-members/get-specified-group-members-info": { - "body": "`getGroupMembersInfo()` 接收一个 `groupID` 和目标用户 ID 列表,返回这些用户在群内的 `GroupMembersInfo`。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMembersInfo(\n new OnBase>() {\n @Override public void onSuccess(List members) { mergeMembers(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID, userIDs);\n```\n\n返回空列表可能表示目标未在群内或无读取权限,应按业务需求处理。", + "body": "`getGroupMembersInfo()` 接收一个 `groupID` 和目标用户 ID 列表,返回这些用户在群内的 `GroupMembersInfo`。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMembersInfo(\n new OnBase>() {\n @Override public void onSuccess(List members) { mergeMembers(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID, userIDs);\n```", "description": "使用 getGroupMembersInfo 批量读取指定成员在群内的资料。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", "title": "查询指定群成员资料" }, "/sdk/android/group/retrieving-group-members/get-users-in-group": { - "body": "`getUsersInGroup()` 返回传入用户中已在指定群内的 ID 列表,不返回成员资料。\n\n```java\nOpenIMClient.getInstance().groupManager.getUsersInGroup(new OnBase>() {\n @Override public void onSuccess(List joinedUserIDs) { updateMembership(joinedUserIDs); }\n @Override public void onError(int code, String error) { showMembershipError(error); }\n}, groupID, candidateUserIDs);\n```\n\n需要昵称、角色或禁言状态时,再调用“获取群成员资料”。", + "body": "`getUsersInGroup()` 返回传入用户中已在指定群内的 ID 列表,不返回成员资料。\n\n```java\nOpenIMClient.getInstance().groupManager.getUsersInGroup(new OnBase>() {\n @Override public void onSuccess(List joinedUserIDs) { updateMembership(joinedUserIDs); }\n @Override public void onError(int code, String error) { showMembershipError(error); }\n}, groupID, candidateUserIDs);\n```\n\n需要昵称、角色或禁言状态时,再调用[查询指定群成员资料](/sdk/android/group/retrieving-group-members/get-specified-group-members-info)。", "description": "使用 getUsersInGroup 从候选用户中筛出当前在群内的用户 ID。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", "title": "查询用户入群状态" }, "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin": { - "body": "使用 `getGroupMemberOwnerAndAdmin()` 获取需要展示或校验管理身份的成员记录。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMemberOwnerAndAdmin(\n new OnBase>() {\n @Override public void onSuccess(List members) { showModerators(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID);\n```\n\n`roleLevel` 的群主、管理员和普通成员常量见 `GroupRole`;实际操作权限仍由服务端决定。", + "body": "使用 `getGroupMemberOwnerAndAdmin()` 获取需要展示或校验管理身份的成员记录。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMemberOwnerAndAdmin(\n new OnBase>() {\n @Override public void onSuccess(List members) { showModerators(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID);\n```\n\n`roleLevel` 的群主、管理员和普通成员常量见 `GroupRole`。", "description": "使用 getGroupMemberOwnerAndAdmin 查询群主和管理员成员资料。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", @@ -1285,56 +1285,56 @@ "title": "搜索群成员" }, "/sdk/android/group/managing-group-members/invite-user-to-group": { - "body": "传入群 ID、待邀请用户 ID 列表和邀请说明。服务端根据群设置和当前用户权限决定是否立即加入。\n\n```java\nOpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() {\n @Override public void onSuccess(String data) { markInviteSubmitted(groupID); }\n @Override public void onError(int code, String error) { showInviteError(error); }\n}, groupID, inviteeUserIDs, \"邀请加入项目讨论\");\n```\n\n成员实际加入后以 `onGroupMemberAdded` 合并,不能仅以提交成功显示为已加入。", + "body": "传入群 ID、待邀请用户 ID 列表和邀请说明。调用成功表示邀请请求已提交;用户实际加入后通过 `onGroupMemberAdded` 接收通知。\n\n```java\nOpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() {\n @Override public void onSuccess(String data) { markInviteSubmitted(groupID); }\n @Override public void onError(int code, String error) { showInviteError(error); }\n}, groupID, inviteeUserIDs, \"邀请加入项目讨论\");\n```", "description": "使用 inviteUserToGroup 邀请一组用户加入指定群组。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", "title": "邀请用户加入群组" }, "/sdk/android/group/managing-group-members/kick-group-member": { - "body": "`kickGroupMember()` 接收成员 ID 列表和移除说明。产品层应先防止当前用户误移除自身,并遵守群主、管理员权限边界。\n\n```java\nOpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() {\n @Override public void onSuccess(String data) { markRemovalSubmitted(groupID); }\n @Override public void onError(int code, String error) { showRemovalError(error); }\n}, groupID, memberUserIDs, \"已不再参与该项目\");\n```\n\n收到 `onGroupMemberDeleted` 后再从成员缓存中移除目标成员。", + "body": "`kickGroupMember()` 接收成员 ID 列表和移除说明。\n\n```java\nOpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() {\n @Override public void onSuccess(String data) { markRemovalSubmitted(groupID); }\n @Override public void onError(int code, String error) { showRemovalError(error); }\n}, groupID, memberUserIDs, \"已不再参与该项目\");\n```\n\n移除成功后,通过 `onGroupMemberDeleted` 接收成员移除通知。", "description": "使用 kickGroupMember 将指定成员移出群组。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/kick-group-member", "title": "移除群成员" }, "/sdk/android/group/managing-group-members/set-group-member-nickname": { - "body": "成员资料修改统一使用 `setGroupMemberInfo()`。请求中填写 `groupID`、`userID` 和 `nickname`。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setNickname(\"小林\");\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markNicknameSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberUpdateError(error); }\n});\n```\n\n以 `onGroupMemberInfoChanged` 返回的 `GroupMembersInfo.nickname` 更新显示。", + "body": "成员资料修改统一使用 `setGroupMemberInfo()`。请求中填写 `groupID`、`userID` 和 `nickname`。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setNickname(\"小林\");\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markNicknameSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberUpdateError(error); }\n});\n```\n\n修改成功后,通过[群组概览](/sdk/android/group/overview-group)中的 `onGroupMemberInfoChanged` 接收成员资料变化通知。", "description": "使用 SetGroupMemberInfo.nickname 更新成员在指定群中的显示昵称。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", "title": "修改群内昵称" }, "/sdk/android/group/managing-group-members/set-group-member-role-level": { - "body": "`roleLevel` 使用 `GroupRole` 常量:`OWNER`、`ADMIN` 和 `MEMBER`。群主转让使用独立接口,不应通过本接口推测转让流程。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setRoleLevel(GroupRole.ADMIN);\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markRoleSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showRoleError(error); }\n});\n```\n\n实际角色变更和权限由服务端校验,以成员资料变化事件为准。", + "body": "`roleLevel` 使用 `GroupRole` 常量:`OWNER`、`ADMIN` 和 `MEMBER`。转让群主请使用[转让群主](/sdk/android/group/managing-group-members/transfer-group-owner)。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setRoleLevel(GroupRole.ADMIN);\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markRoleSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showRoleError(error); }\n});\n```\n\n角色修改成功后,通过 `onGroupMemberInfoChanged` 接收成员资料变化通知。", "description": "使用 SetGroupMemberInfo.roleLevel 设置成员的群内角色。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", "title": "设置管理员" }, "/sdk/android/group/managing-group-members/set-group-member-avatar": { - "body": "群成员头像是群内资料字段,不修改用户全局头像。传入已可访问的头像 URL。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setFaceURL(avatarURL);\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markAvatarSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberUpdateError(error); }\n});\n```\n\n事件到达前保留原头像或使用本地乐观状态,并按最新成员资料校准。", + "body": "群成员头像是群内资料字段,不修改用户全局头像。传入已可访问的头像 URL。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setFaceURL(avatarURL);\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markAvatarSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberUpdateError(error); }\n});\n```\n\n修改成功后,通过 `onGroupMemberInfoChanged` 接收成员资料变化通知。", "description": "使用 SetGroupMemberInfo.faceURL 更新成员在群内展示的头像。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-avatar", "title": "更新群成员头像" }, "/sdk/android/group/managing-group-members/set-group-member-extension": { - "body": "`SetGroupMemberInfo.ex` 是完整字符串,不会自动合并 JSON。多个业务模块共享时应先读取、合并并保留其他命名空间。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setEx(\"{\\\"duty\\\":\\\"reviewer\\\"}\");\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markMemberExtensionSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberUpdateError(error); }\n});\n```\n\n不要将凭据、令牌或仅限本机的显示状态写入该字段。", + "body": "`SetGroupMemberInfo.ex` 字符串用于保存群成员扩展信息,可存储 JSON 字符串拓展群成员信息。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setEx(\"{\\\"duty\\\":\\\"reviewer\\\"}\");\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markMemberExtensionSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberUpdateError(error); }\n});\n```", "description": "使用 SetGroupMemberInfo.ex 保存应用定义的群成员扩展数据。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-extension", "title": "设置群成员扩展字段" }, "/sdk/android/group/managing-group-members/transfer-group-owner": { - "body": "目标用户必须是该群成员。转让前应在产品层要求明确确认,并在完成后重新查询群主和管理员资料。\n\n```java\nOpenIMClient.getInstance().groupManager.transferGroupOwner(new OnBase() {\n @Override public void onSuccess(String data) { markOwnershipTransferSubmitted(groupID); }\n @Override public void onError(int code, String error) { showTransferError(error); }\n}, groupID, newOwnerUserID);\n```\n\n`onGroupMemberInfoChanged` 和群资料变化可能异步到达;不要在成功 callback 中假定本地角色已完成更新。", + "body": "`transferGroupOwner()` 接收 `groupID` 和 `newOwnerUserID` 两个参数:`groupID` 为要转让群主的群组 ID,`newOwnerUserID` 为新群主的用户 ID,该用户必须是该群的成员。\n\n```java\nOpenIMClient.getInstance().groupManager.transferGroupOwner(new OnBase() {\n @Override public void onSuccess(String data) { markOwnershipTransferSubmitted(groupID); }\n @Override public void onError(int code, String error) { showTransferError(error); }\n}, groupID, newOwnerUserID);\n```\n\n转让成功后,可以重新调用[获取群主和管理员](/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin)获取最新资料。", "description": "使用 transferGroupOwner 将群主身份转让给指定群成员。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/transfer-group-owner", "title": "转让群主" }, "/sdk/android/group/managing-group-members/change-group-member-mute": { - "body": "`seconds` 为禁言时长,单位为秒;传 `0` 解除成员禁言。该操作与全员禁言相互独立。\n\n```java\nOpenIMClient.getInstance().groupManager.changeGroupMemberMute(new OnBase() {\n @Override public void onSuccess(String data) { markMemberMuteSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberMuteError(error); }\n}, groupID, userID, 3600L);\n```\n\n在 `onGroupMemberInfoChanged` 中读取 `muteEndTime` 更新成员状态;不要用本机时间和请求时长长期推算最终禁言状态。", + "body": "`seconds` 为禁言时长,单位为秒;传 `0` 解除成员禁言。该操作与[全员禁言](/sdk/android/group/change-group-mute)相互独立。\n\n```java\nOpenIMClient.getInstance().groupManager.changeGroupMemberMute(new OnBase() {\n @Override public void onSuccess(String data) { markMemberMuteSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberMuteError(error); }\n}, groupID, userID, 3600L);\n```", "description": "使用 changeGroupMemberMute 设置指定成员的禁言时长。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", diff --git a/src/generated/navigation.json b/src/generated/navigation.json index 56e74d7315..683065b3fe 100644 --- a/src/generated/navigation.json +++ b/src/generated/navigation.json @@ -5093,16 +5093,6 @@ "href": null, "type": "folder", "children": [ - { - "id": "group/group-applications/overview-group-applications", - "segment": "overview-group-applications", - "title": "Group applications overview", - "href": "/sdk/android/group/group-applications/overview-group-applications", - "type": "page", - "children": [], - "minIndex": 190, - "navigationTitle": "Group applications overview" - }, { "id": "group/group-applications/get-group-application-list-as-recipient", "segment": "get-group-application-list-as-recipient", @@ -5110,7 +5100,7 @@ "href": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", "type": "page", "children": [], - "minIndex": 191, + "minIndex": 190, "navigationTitle": "Get received group applications" }, { @@ -5120,7 +5110,7 @@ "href": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", "type": "page", "children": [], - "minIndex": 192, + "minIndex": 191, "navigationTitle": "Get sent group applications" }, { @@ -5130,7 +5120,7 @@ "href": "/sdk/android/group/group-applications/accept-group-application", "type": "page", "children": [], - "minIndex": 193, + "minIndex": 192, "navigationTitle": "Accept a group application" }, { @@ -5140,8 +5130,18 @@ "href": "/sdk/android/group/group-applications/refuse-group-application", "type": "page", "children": [], - "minIndex": 194, + "minIndex": 193, "navigationTitle": "Reject a group application" + }, + { + "id": "group/group-applications/delete-group-requests", + "segment": "delete-group-requests", + "title": "Delete group applications", + "href": "/sdk/android/group/group-applications/delete-group-requests", + "type": "page", + "children": [], + "minIndex": 194, + "navigationTitle": "Delete group applications" } ], "minIndex": 190 @@ -5153,16 +5153,6 @@ "href": null, "type": "folder", "children": [ - { - "id": "group/retrieving-group-members/overview-retrieving-group-members", - "segment": "overview-retrieving-group-members", - "title": "Group member queries overview", - "href": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", - "type": "page", - "children": [], - "minIndex": 195, - "navigationTitle": "Group member queries overview" - }, { "id": "group/retrieving-group-members/get-group-member-list", "segment": "get-group-member-list", @@ -5170,7 +5160,7 @@ "href": "/sdk/android/group/retrieving-group-members/get-group-member-list", "type": "page", "children": [], - "minIndex": 196, + "minIndex": 195, "navigationTitle": "Get group members" }, { @@ -5180,7 +5170,7 @@ "href": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", "type": "page", "children": [], - "minIndex": 197, + "minIndex": 196, "navigationTitle": "Get group member profiles" }, { @@ -5190,7 +5180,7 @@ "href": "/sdk/android/group/retrieving-group-members/get-users-in-group", "type": "page", "children": [], - "minIndex": 198, + "minIndex": 197, "navigationTitle": "Check users in a group" }, { @@ -5200,7 +5190,7 @@ "href": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", "type": "page", "children": [], - "minIndex": 199, + "minIndex": 198, "navigationTitle": "Get group owners and admins" }, { @@ -5210,7 +5200,7 @@ "href": "/sdk/android/group/retrieving-group-members/search-group-members", "type": "page", "children": [], - "minIndex": 200, + "minIndex": 199, "navigationTitle": "Search group members" } ], @@ -5230,7 +5220,7 @@ "href": "/sdk/android/group/managing-group-members/invite-user-to-group", "type": "page", "children": [], - "minIndex": 201, + "minIndex": 200, "navigationTitle": "Invite users to a group" }, { @@ -5240,7 +5230,7 @@ "href": "/sdk/android/group/managing-group-members/kick-group-member", "type": "page", "children": [], - "minIndex": 202, + "minIndex": 201, "navigationTitle": "Remove group members" }, { @@ -5250,7 +5240,7 @@ "href": "/sdk/android/group/managing-group-members/set-group-member-nickname", "type": "page", "children": [], - "minIndex": 203, + "minIndex": 202, "navigationTitle": "Update a group nickname" }, { @@ -5260,7 +5250,7 @@ "href": "/sdk/android/group/managing-group-members/set-group-member-role-level", "type": "page", "children": [], - "minIndex": 204, + "minIndex": 203, "navigationTitle": "Manage group administrators" }, { @@ -5270,7 +5260,7 @@ "href": "/sdk/android/group/managing-group-members/set-group-member-avatar", "type": "page", "children": [], - "minIndex": 205, + "minIndex": 204, "navigationTitle": "Update a group member avatar" }, { @@ -5280,7 +5270,7 @@ "href": "/sdk/android/group/managing-group-members/set-group-member-extension", "type": "page", "children": [], - "minIndex": 206, + "minIndex": 205, "navigationTitle": "Set group member extra data" }, { @@ -5290,7 +5280,7 @@ "href": "/sdk/android/group/managing-group-members/transfer-group-owner", "type": "page", "children": [], - "minIndex": 207, + "minIndex": 206, "navigationTitle": "Transfer group ownership" }, { @@ -5300,11 +5290,11 @@ "href": "/sdk/android/group/managing-group-members/change-group-member-mute", "type": "page", "children": [], - "minIndex": 208, + "minIndex": 207, "navigationTitle": "Mute or unmute a group member" } ], - "minIndex": 201 + "minIndex": 200 } ], "minIndex": 174 @@ -5323,7 +5313,7 @@ "href": "/sdk/android/message/overview-message", "type": "page", "children": [], - "minIndex": 209 + "minIndex": 208 }, { "id": "message/creating-messages", @@ -5339,7 +5329,7 @@ "href": "/sdk/android/message/creating-messages/create-text-message", "type": "page", "children": [], - "minIndex": 210 + "minIndex": 209 }, { "id": "message/creating-messages/create-text-at-message", @@ -5348,7 +5338,7 @@ "href": "/sdk/android/message/creating-messages/create-text-at-message", "type": "page", "children": [], - "minIndex": 211 + "minIndex": 210 }, { "id": "message/creating-messages/create-custom-message", @@ -5357,7 +5347,7 @@ "href": "/sdk/android/message/creating-messages/create-custom-message", "type": "page", "children": [], - "minIndex": 212 + "minIndex": 211 }, { "id": "message/creating-messages/create-image-message", @@ -5366,7 +5356,7 @@ "href": "/sdk/android/message/creating-messages/create-image-message", "type": "page", "children": [], - "minIndex": 213, + "minIndex": 212, "navigationTitle": "Create an image message" }, { @@ -5376,7 +5366,7 @@ "href": "/sdk/android/message/creating-messages/create-image-message-by-file", "type": "page", "children": [], - "minIndex": 214, + "minIndex": 213, "navigationTitle": "Create an image message from a path" }, { @@ -5386,7 +5376,7 @@ "href": "/sdk/android/message/creating-messages/create-image-message-by-url", "type": "page", "children": [], - "minIndex": 215 + "minIndex": 214 }, { "id": "message/creating-messages/create-sound-message", @@ -5395,7 +5385,7 @@ "href": "/sdk/android/message/creating-messages/create-sound-message", "type": "page", "children": [], - "minIndex": 216, + "minIndex": 215, "navigationTitle": "Create an audio message" }, { @@ -5405,7 +5395,7 @@ "href": "/sdk/android/message/creating-messages/create-sound-message-by-file", "type": "page", "children": [], - "minIndex": 217, + "minIndex": 216, "navigationTitle": "Create an audio message from a path" }, { @@ -5415,7 +5405,7 @@ "href": "/sdk/android/message/creating-messages/create-sound-message-by-url", "type": "page", "children": [], - "minIndex": 218 + "minIndex": 217 }, { "id": "message/creating-messages/create-video-message", @@ -5424,7 +5414,7 @@ "href": "/sdk/android/message/creating-messages/create-video-message", "type": "page", "children": [], - "minIndex": 219, + "minIndex": 218, "navigationTitle": "Create a video message" }, { @@ -5434,7 +5424,7 @@ "href": "/sdk/android/message/creating-messages/create-video-message-by-file", "type": "page", "children": [], - "minIndex": 220, + "minIndex": 219, "navigationTitle": "Create a video message from a path" }, { @@ -5444,7 +5434,7 @@ "href": "/sdk/android/message/creating-messages/create-video-message-by-url", "type": "page", "children": [], - "minIndex": 221 + "minIndex": 220 }, { "id": "message/creating-messages/create-file-message", @@ -5453,7 +5443,7 @@ "href": "/sdk/android/message/creating-messages/create-file-message", "type": "page", "children": [], - "minIndex": 222, + "minIndex": 221, "navigationTitle": "Create a file message" }, { @@ -5463,7 +5453,7 @@ "href": "/sdk/android/message/creating-messages/create-file-message-by-file", "type": "page", "children": [], - "minIndex": 223, + "minIndex": 222, "navigationTitle": "Create a file message from a path" }, { @@ -5473,7 +5463,7 @@ "href": "/sdk/android/message/creating-messages/create-file-message-by-url", "type": "page", "children": [], - "minIndex": 224 + "minIndex": 223 }, { "id": "message/creating-messages/create-card-message", @@ -5482,7 +5472,7 @@ "href": "/sdk/android/message/creating-messages/create-card-message", "type": "page", "children": [], - "minIndex": 225 + "minIndex": 224 }, { "id": "message/creating-messages/create-location-message", @@ -5491,7 +5481,7 @@ "href": "/sdk/android/message/creating-messages/create-location-message", "type": "page", "children": [], - "minIndex": 226 + "minIndex": 225 }, { "id": "message/creating-messages/create-face-message", @@ -5500,7 +5490,7 @@ "href": "/sdk/android/message/creating-messages/create-face-message", "type": "page", "children": [], - "minIndex": 227 + "minIndex": 226 }, { "id": "message/creating-messages/create-quote-message", @@ -5509,7 +5499,7 @@ "href": "/sdk/android/message/creating-messages/create-quote-message", "type": "page", "children": [], - "minIndex": 228 + "minIndex": 227 }, { "id": "message/creating-messages/create-advanced-text-message", @@ -5518,7 +5508,7 @@ "href": "/sdk/android/message/creating-messages/create-advanced-text-message", "type": "page", "children": [], - "minIndex": 229, + "minIndex": 228, "navigationTitle": "Create rich text" }, { @@ -5528,7 +5518,7 @@ "href": "/sdk/android/message/creating-messages/create-advanced-quote-message", "type": "page", "children": [], - "minIndex": 230, + "minIndex": 229, "navigationTitle": "Create a rich reply" }, { @@ -5538,7 +5528,7 @@ "href": "/sdk/android/message/creating-messages/create-forward-message", "type": "page", "children": [], - "minIndex": 231 + "minIndex": 230 }, { "id": "message/creating-messages/create-merger-message", @@ -5547,10 +5537,10 @@ "href": "/sdk/android/message/creating-messages/create-merger-message", "type": "page", "children": [], - "minIndex": 232 + "minIndex": 231 } ], - "minIndex": 210 + "minIndex": 209 }, { "id": "message/sending-messages", @@ -5566,7 +5556,7 @@ "href": "/sdk/android/message/sending-messages/send-message", "type": "page", "children": [], - "minIndex": 233 + "minIndex": 232 }, { "id": "message/sending-messages/send-message-not-oss", @@ -5575,7 +5565,7 @@ "href": "/sdk/android/message/sending-messages/send-message-not-oss", "type": "page", "children": [], - "minIndex": 234 + "minIndex": 233 }, { "id": "message/sending-messages/set-msg-send-progress-listener", @@ -5584,11 +5574,11 @@ "href": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", "type": "page", "children": [], - "minIndex": 235, + "minIndex": 234, "navigationTitle": "Track message sending progress" } ], - "minIndex": 233 + "minIndex": 232 }, { "id": "message/receiving-messages/receive-messages", @@ -5597,7 +5587,7 @@ "href": "/sdk/android/message/receiving-messages/receive-messages", "type": "page", "children": [], - "minIndex": 236 + "minIndex": 235 }, { "id": "message/receiving-messages/receive-custom-business-messages", @@ -5606,7 +5596,7 @@ "href": "/sdk/android/message/receiving-messages/receive-custom-business-messages", "type": "page", "children": [], - "minIndex": 237 + "minIndex": 236 }, { "id": "message/retrieving-messages", @@ -5622,7 +5612,7 @@ "href": "/sdk/android/message/retrieving-messages/load-older-messages", "type": "page", "children": [], - "minIndex": 238 + "minIndex": 237 }, { "id": "message/retrieving-messages/load-newer-messages", @@ -5631,7 +5621,7 @@ "href": "/sdk/android/message/retrieving-messages/load-newer-messages", "type": "page", "children": [], - "minIndex": 239 + "minIndex": 238 }, { "id": "message/retrieving-messages/find-messages-by-id", @@ -5640,7 +5630,7 @@ "href": "/sdk/android/message/retrieving-messages/find-messages-by-id", "type": "page", "children": [], - "minIndex": 240 + "minIndex": 239 }, { "id": "message/retrieving-messages/load-message-context", @@ -5649,7 +5639,7 @@ "href": "/sdk/android/message/retrieving-messages/load-message-context", "type": "page", "children": [], - "minIndex": 241, + "minIndex": 240, "navigationTitle": "Load message context" }, { @@ -5659,15 +5649,15 @@ "href": "/sdk/android/message/searching-messages/search-messages", "type": "page", "children": [], - "minIndex": 242 + "minIndex": 241 } ], - "minIndex": 238 + "minIndex": 237 }, { "id": "message/composing-messages", "segment": "composing-messages", - "title": "Composing messages", + "title": "Typing status", "href": null, "type": "folder", "children": [ @@ -5678,7 +5668,7 @@ "href": "/sdk/android/message/composing-messages/update-typing-status", "type": "page", "children": [], - "minIndex": 243, + "minIndex": 242, "navigationTitle": "Update typing status" }, { @@ -5688,11 +5678,11 @@ "href": "/sdk/android/message/composing-messages/get-typing-status", "type": "page", "children": [], - "minIndex": 244, + "minIndex": 243, "navigationTitle": "Get typing status" } ], - "minIndex": 243 + "minIndex": 242 }, { "id": "message/managing-messages", @@ -5708,7 +5698,7 @@ "href": "/sdk/android/message/managing-messages/delete-local-message", "type": "page", "children": [], - "minIndex": 245 + "minIndex": 244 }, { "id": "message/managing-messages/delete-saved-messages", @@ -5717,7 +5707,7 @@ "href": "/sdk/android/message/managing-messages/delete-saved-messages", "type": "page", "children": [], - "minIndex": 246, + "minIndex": 245, "navigationTitle": "Delete saved messages" }, { @@ -5727,7 +5717,7 @@ "href": "/sdk/android/message/managing-messages/delete-user-messages", "type": "page", "children": [], - "minIndex": 247, + "minIndex": 246, "navigationTitle": "Delete messages from a user" }, { @@ -5737,7 +5727,7 @@ "href": "/sdk/android/message/managing-messages/revoke-a-message", "type": "page", "children": [], - "minIndex": 248 + "minIndex": 247 }, { "id": "message/managing-messages/modify-a-message", @@ -5746,7 +5736,7 @@ "href": "/sdk/android/message/managing-messages/modify-a-message", "type": "page", "children": [], - "minIndex": 249 + "minIndex": 248 }, { "id": "message/managing-messages/get-pinned-messages", @@ -5755,7 +5745,7 @@ "href": "/sdk/android/message/managing-messages/get-pinned-messages", "type": "page", "children": [], - "minIndex": 250 + "minIndex": 249 }, { "id": "message/managing-messages/set-message-pinned", @@ -5764,7 +5754,7 @@ "href": "/sdk/android/message/managing-messages/set-message-pinned", "type": "page", "children": [], - "minIndex": 251 + "minIndex": 250 }, { "id": "message/managing-messages/insert-local-single-message", @@ -5773,7 +5763,7 @@ "href": "/sdk/android/message/managing-messages/insert-local-single-message", "type": "page", "children": [], - "minIndex": 252 + "minIndex": 251 }, { "id": "message/managing-messages/insert-local-group-message", @@ -5782,7 +5772,7 @@ "href": "/sdk/android/message/managing-messages/insert-local-group-message", "type": "page", "children": [], - "minIndex": 253 + "minIndex": 252 }, { "id": "message/managing-messages/clear-all-local-messages", @@ -5791,7 +5781,7 @@ "href": "/sdk/android/message/managing-messages/clear-all-local-messages", "type": "page", "children": [], - "minIndex": 254 + "minIndex": 253 }, { "id": "message/managing-messages/clear-all-messages", @@ -5800,7 +5790,7 @@ "href": "/sdk/android/message/managing-messages/clear-all-messages", "type": "page", "children": [], - "minIndex": 255 + "minIndex": 254 }, { "id": "message/managing-messages/set-message-local-ex", @@ -5809,10 +5799,10 @@ "href": "/sdk/android/message/managing-messages/set-message-local-ex", "type": "page", "children": [], - "minIndex": 256 + "minIndex": 255 } ], - "minIndex": 245 + "minIndex": 244 }, { "id": "message/group-message-read-status", @@ -5828,7 +5818,7 @@ "href": "/sdk/android/message/managing-read-status/send-group-read-receipts", "type": "page", "children": [], - "minIndex": 257, + "minIndex": 256, "navigationTitle": "Send group read receipts" }, { @@ -5838,14 +5828,14 @@ "href": "/sdk/android/message/managing-read-status/get-group-message-readers", "type": "page", "children": [], - "minIndex": 258, + "minIndex": 257, "navigationTitle": "View group message readers" } ], - "minIndex": 257 + "minIndex": 256 } ], - "minIndex": 209 + "minIndex": 208 }, { "id": "file-uploads/upload-file", @@ -5854,7 +5844,7 @@ "href": "/sdk/android/file-uploads/upload-file", "type": "page", "children": [], - "minIndex": 259, + "minIndex": 258, "navigationTitle": "Upload a file" }, { @@ -5871,7 +5861,7 @@ "href": "/sdk/android/calling/overview-calling", "type": "page", "children": [], - "minIndex": 260 + "minIndex": 259 }, { "id": "calling/managing-calls", @@ -5887,7 +5877,7 @@ "href": "/sdk/android/calling/managing-calls/start-single-call", "type": "page", "children": [], - "minIndex": 261, + "minIndex": 260, "navigationTitle": "Start a one-to-one call" }, { @@ -5897,7 +5887,7 @@ "href": "/sdk/android/calling/managing-calls/start-group-call", "type": "page", "children": [], - "minIndex": 262, + "minIndex": 261, "navigationTitle": "Start a group call" }, { @@ -5907,7 +5897,7 @@ "href": "/sdk/android/calling/managing-calls/accept-call", "type": "page", "children": [], - "minIndex": 263, + "minIndex": 262, "navigationTitle": "Accept a call" }, { @@ -5917,7 +5907,7 @@ "href": "/sdk/android/calling/managing-calls/reject-call", "type": "page", "children": [], - "minIndex": 264, + "minIndex": 263, "navigationTitle": "Reject a call" }, { @@ -5927,7 +5917,7 @@ "href": "/sdk/android/calling/managing-calls/cancel-call", "type": "page", "children": [], - "minIndex": 265, + "minIndex": 264, "navigationTitle": "Cancel a call invitation" }, { @@ -5937,7 +5927,7 @@ "href": "/sdk/android/calling/managing-calls/hang-up-call", "type": "page", "children": [], - "minIndex": 266, + "minIndex": 265, "navigationTitle": "Hang up a call" }, { @@ -5947,11 +5937,11 @@ "href": "/sdk/android/calling/managing-calls/handle-call-events", "type": "page", "children": [], - "minIndex": 267, + "minIndex": 266, "navigationTitle": "Handle call events" } ], - "minIndex": 261 + "minIndex": 260 }, { "id": "calling/retrieving-call-information", @@ -5967,7 +5957,7 @@ "href": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", "type": "page", "children": [], - "minIndex": 268, + "minIndex": 267, "navigationTitle": "Restore a pending invitation" }, { @@ -5977,7 +5967,7 @@ "href": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", "type": "page", "children": [], - "minIndex": 269, + "minIndex": 268, "navigationTitle": "Get a group call room" }, { @@ -5987,11 +5977,11 @@ "href": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", "type": "page", "children": [], - "minIndex": 270, + "minIndex": 269, "navigationTitle": "Get room credentials" } ], - "minIndex": 268 + "minIndex": 267 }, { "id": "calling/sending-custom-signals/send-a-custom-signal", @@ -6000,10 +5990,10 @@ "href": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", "type": "page", "children": [], - "minIndex": 271 + "minIndex": 270 } ], - "minIndex": 260 + "minIndex": 259 }, { "id": "events/overview-events", @@ -6012,7 +6002,7 @@ "href": "/sdk/android/events/overview-events", "type": "page", "children": [], - "minIndex": 272, + "minIndex": 271, "navigationTitle": "Events" }, { @@ -6022,10 +6012,10 @@ "href": "/sdk/android/logger", "type": "page", "children": [], - "minIndex": 273 + "minIndex": 272 } ], - "pageCount": 145, + "pageCount": 144, "sidebarExpansion": "active-path" }, { diff --git a/src/generated/routes.json b/src/generated/routes.json index cd3b625543..636f387ccc 100644 --- a/src/generated/routes.json +++ b/src/generated/routes.json @@ -1314,7 +1314,7 @@ "navOrder": 764.9 }, { - "id": 795, + "id": 1965, "path": "/sdk/ios/overview", "relativePath": "sdk/ios/overview", "sourcePath": "/sdk/ios/overview", @@ -1327,12 +1327,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "overview", "status": "published", - "sourceIndex": 2166, + "sourceIndex": 3335, "contentFile": "content/docs/chat/sdk/ios/overview.mdx", "navOrder": 1 }, { - "id": 796, + "id": 1966, "path": "/sdk/ios/getting-started/before-you-start", "relativePath": "sdk/ios/getting-started/before-you-start", "sourcePath": "/sdk/ios/getting-started/before-you-start", @@ -1345,12 +1345,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2167, + "sourceIndex": 3336, "contentFile": "content/docs/chat/sdk/ios/getting-started/before-you-start.mdx", "navOrder": 2 }, { - "id": 797, + "id": 1967, "path": "/sdk/ios/getting-started/environment-specific-implementation", "relativePath": "sdk/ios/getting-started/environment-specific-implementation", "sourcePath": "/sdk/ios/getting-started/environment-specific-implementation", @@ -1363,12 +1363,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2168, + "sourceIndex": 3337, "contentFile": "content/docs/chat/sdk/ios/getting-started/environment-specific-implementation.mdx", "navOrder": 3 }, { - "id": 798, + "id": 1968, "path": "/sdk/ios/getting-started/authenticate-and-manage-session", "relativePath": "sdk/ios/getting-started/authenticate-and-manage-session", "sourcePath": "/sdk/ios/getting-started/authenticate-and-manage-session", @@ -1381,12 +1381,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2169, + "sourceIndex": 3338, "contentFile": "content/docs/chat/sdk/ios/getting-started/authenticate-and-manage-session.mdx", "navOrder": 4 }, { - "id": 799, + "id": 1969, "path": "/sdk/ios/getting-started/send-first-message", "relativePath": "sdk/ios/getting-started/send-first-message", "sourcePath": "/sdk/ios/getting-started/send-first-message", @@ -1399,12 +1399,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2170, + "sourceIndex": 3339, "contentFile": "content/docs/chat/sdk/ios/getting-started/send-first-message.mdx", "navOrder": 5 }, { - "id": 800, + "id": 1970, "path": "/sdk/ios/user/overview-user", "relativePath": "sdk/ios/user/overview-user", "sourcePath": "/sdk/ios/user/overview-user", @@ -1417,12 +1417,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2171, + "sourceIndex": 3340, "contentFile": "content/docs/chat/sdk/ios/user/overview-user.mdx", "navOrder": 6 }, { - "id": 801, + "id": 1971, "path": "/sdk/ios/user/retrieving-users/retrieve-users", "relativePath": "sdk/ios/user/retrieving-users/retrieve-users", "sourcePath": "/sdk/ios/user/retrieving-users/retrieve-users", @@ -1435,12 +1435,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2172, + "sourceIndex": 3341, "contentFile": "content/docs/chat/sdk/ios/user/retrieving-users/retrieve-users.mdx", "navOrder": 7 }, { - "id": 1279, + "id": 1972, "path": "/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile", "relativePath": "sdk/ios/user/retrieving-and-updating-user-information/get-self-profile", "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile", @@ -1453,12 +1453,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2650, + "sourceIndex": 3342, "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile.mdx", "navOrder": 8 }, { - "id": 1280, + "id": 1973, "path": "/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile", "relativePath": "sdk/ios/user/retrieving-and-updating-user-information/update-self-profile", "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile", @@ -1471,12 +1471,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2651, + "sourceIndex": 3343, "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile.mdx", "navOrder": 9 }, { - "id": 1281, + "id": 1974, "path": "/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception", "relativePath": "sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception", "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception", @@ -1489,12 +1489,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2652, + "sourceIndex": 3344, "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception.mdx", "navOrder": 10 }, { - "id": 1282, + "id": 1975, "path": "/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status", "relativePath": "sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status", "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status", @@ -1507,12 +1507,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2653, + "sourceIndex": 3345, "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status.mdx", "navOrder": 11 }, { - "id": 1283, + "id": 1976, "path": "/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status", "relativePath": "sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status", "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status", @@ -1525,12 +1525,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2654, + "sourceIndex": 3346, "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status.mdx", "navOrder": 12 }, { - "id": 1284, + "id": 1977, "path": "/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status", "relativePath": "sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status", "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status", @@ -1543,12 +1543,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2655, + "sourceIndex": 3347, "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status.mdx", "navOrder": 13 }, { - "id": 981, + "id": 1978, "path": "/sdk/ios/user/friends/get-friend-list-page", "relativePath": "sdk/ios/user/friends/get-friend-list-page", "sourcePath": "/sdk/ios/user/friends/get-friend-list-page", @@ -1561,12 +1561,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2352, + "sourceIndex": 3348, "contentFile": "content/docs/chat/sdk/ios/user/friends/get-friend-list-page.mdx", "navOrder": 14 }, { - "id": 982, + "id": 1979, "path": "/sdk/ios/user/friends/search-friends", "relativePath": "sdk/ios/user/friends/search-friends", "sourcePath": "/sdk/ios/user/friends/search-friends", @@ -1579,12 +1579,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2353, + "sourceIndex": 3349, "contentFile": "content/docs/chat/sdk/ios/user/friends/search-friends.mdx", "navOrder": 15 }, { - "id": 983, + "id": 1980, "path": "/sdk/ios/user/friends/get-specified-friends-info", "relativePath": "sdk/ios/user/friends/get-specified-friends-info", "sourcePath": "/sdk/ios/user/friends/get-specified-friends-info", @@ -1597,12 +1597,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2354, + "sourceIndex": 3350, "contentFile": "content/docs/chat/sdk/ios/user/friends/get-specified-friends-info.mdx", "navOrder": 16 }, { - "id": 984, + "id": 1981, "path": "/sdk/ios/user/friends/check-friend", "relativePath": "sdk/ios/user/friends/check-friend", "sourcePath": "/sdk/ios/user/friends/check-friend", @@ -1615,12 +1615,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2355, + "sourceIndex": 3351, "contentFile": "content/docs/chat/sdk/ios/user/friends/check-friend.mdx", "navOrder": 17 }, { - "id": 985, + "id": 1982, "path": "/sdk/ios/user/friends/update-friends", "relativePath": "sdk/ios/user/friends/update-friends", "sourcePath": "/sdk/ios/user/friends/update-friends", @@ -1633,12 +1633,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2356, + "sourceIndex": 3352, "contentFile": "content/docs/chat/sdk/ios/user/friends/update-friends.mdx", "navOrder": 18 }, { - "id": 986, + "id": 1983, "path": "/sdk/ios/user/friends/delete-friend", "relativePath": "sdk/ios/user/friends/delete-friend", "sourcePath": "/sdk/ios/user/friends/delete-friend", @@ -1651,12 +1651,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2357, + "sourceIndex": 3353, "contentFile": "content/docs/chat/sdk/ios/user/friends/delete-friend.mdx", "navOrder": 19 }, { - "id": 988, + "id": 1984, "path": "/sdk/ios/user/friend-applications/add-friend", "relativePath": "sdk/ios/user/friend-applications/add-friend", "sourcePath": "/sdk/ios/user/friend-applications/add-friend", @@ -1669,12 +1669,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2359, + "sourceIndex": 3354, "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/add-friend.mdx", "navOrder": 20 }, { - "id": 989, + "id": 1985, "path": "/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient", "relativePath": "sdk/ios/user/friend-applications/get-friend-application-list-as-recipient", "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient", @@ -1687,12 +1687,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2360, + "sourceIndex": 3355, "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient.mdx", "navOrder": 21 }, { - "id": 990, + "id": 1986, "path": "/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant", "relativePath": "sdk/ios/user/friend-applications/get-friend-application-list-as-applicant", "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant", @@ -1705,12 +1705,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2361, + "sourceIndex": 3356, "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant.mdx", "navOrder": 22 }, { - "id": 991, + "id": 1987, "path": "/sdk/ios/user/friend-applications/get-friend-application-unhandled-count", "relativePath": "sdk/ios/user/friend-applications/get-friend-application-unhandled-count", "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-unhandled-count", @@ -1723,12 +1723,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2362, + "sourceIndex": 3357, "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-unhandled-count.mdx", "navOrder": 23 }, { - "id": 992, + "id": 1988, "path": "/sdk/ios/user/friend-applications/accept-friend-application", "relativePath": "sdk/ios/user/friend-applications/accept-friend-application", "sourcePath": "/sdk/ios/user/friend-applications/accept-friend-application", @@ -1741,12 +1741,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2363, + "sourceIndex": 3358, "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/accept-friend-application.mdx", "navOrder": 24 }, { - "id": 993, + "id": 1989, "path": "/sdk/ios/user/friend-applications/refuse-friend-application", "relativePath": "sdk/ios/user/friend-applications/refuse-friend-application", "sourcePath": "/sdk/ios/user/friend-applications/refuse-friend-application", @@ -1759,12 +1759,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2364, + "sourceIndex": 3359, "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/refuse-friend-application.mdx", "navOrder": 25 }, { - "id": 994, + "id": 1990, "path": "/sdk/ios/user/friend-applications/delete-friend-requests", "relativePath": "sdk/ios/user/friend-applications/delete-friend-requests", "sourcePath": "/sdk/ios/user/friend-applications/delete-friend-requests", @@ -1777,12 +1777,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2365, + "sourceIndex": 3360, "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/delete-friend-requests.mdx", "navOrder": 26 }, { - "id": 808, + "id": 1991, "path": "/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users", "relativePath": "sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users", "sourcePath": "/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users", @@ -1795,12 +1795,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2179, + "sourceIndex": 3361, "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx", "navOrder": 27 }, { - "id": 1285, + "id": 1992, "path": "/sdk/ios/user/moderating-a-user/block-user", "relativePath": "sdk/ios/user/moderating-a-user/block-user", "sourcePath": "/sdk/ios/user/moderating-a-user/block-user", @@ -1813,12 +1813,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2656, + "sourceIndex": 3362, "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/block-user.mdx", "navOrder": 28 }, { - "id": 1286, + "id": 1993, "path": "/sdk/ios/user/moderating-a-user/unblock-user", "relativePath": "sdk/ios/user/moderating-a-user/unblock-user", "sourcePath": "/sdk/ios/user/moderating-a-user/unblock-user", @@ -1831,12 +1831,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2657, + "sourceIndex": 3363, "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/unblock-user.mdx", "navOrder": 29 }, { - "id": 810, + "id": 1994, "path": "/sdk/ios/conversation/overview-conversation", "relativePath": "sdk/ios/conversation/overview-conversation", "sourcePath": "/sdk/ios/conversation/overview-conversation", @@ -1849,12 +1849,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2181, + "sourceIndex": 3364, "contentFile": "content/docs/chat/sdk/ios/conversation/overview-conversation.mdx", "navOrder": 30 }, { - "id": 1209, + "id": 1995, "path": "/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target", "relativePath": "sdk/ios/conversation/retrieving-conversations/get-conversation-by-target", "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target", @@ -1867,12 +1867,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2580, + "sourceIndex": 3365, "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target.mdx", "navOrder": 31 }, { - "id": 1210, + "id": 1996, "path": "/sdk/ios/conversation/retrieving-conversations/get-conversation-id", "relativePath": "sdk/ios/conversation/retrieving-conversations/get-conversation-id", "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-id", @@ -1885,12 +1885,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2581, + "sourceIndex": 3366, "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversation-id.mdx", "navOrder": 32 }, { - "id": 1211, + "id": 1997, "path": "/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id", "relativePath": "sdk/ios/conversation/retrieving-conversations/get-conversations-by-id", "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id", @@ -1903,12 +1903,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2582, + "sourceIndex": 3367, "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id.mdx", "navOrder": 33 }, { - "id": 812, + "id": 1998, "path": "/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list", "relativePath": "sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list", "sourcePath": "/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list", @@ -1921,12 +1921,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2183, + "sourceIndex": 3368, "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list.mdx", "navOrder": 34 }, { - "id": 1212, + "id": 1999, "path": "/sdk/ios/conversation/managing-conversations/pin-conversation", "relativePath": "sdk/ios/conversation/managing-conversations/pin-conversation", "sourcePath": "/sdk/ios/conversation/managing-conversations/pin-conversation", @@ -1939,12 +1939,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2583, + "sourceIndex": 3369, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/pin-conversation.mdx", "navOrder": 35 }, { - "id": 1216, + "id": 2000, "path": "/sdk/ios/conversation/managing-conversations/set-conversation-extension", "relativePath": "sdk/ios/conversation/managing-conversations/set-conversation-extension", "sourcePath": "/sdk/ios/conversation/managing-conversations/set-conversation-extension", @@ -1957,12 +1957,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2587, + "sourceIndex": 3370, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-conversation-extension.mdx", "navOrder": 36 }, { - "id": 814, + "id": 2001, "path": "/sdk/ios/conversation/managing-conversations/set-conversation-draft", "relativePath": "sdk/ios/conversation/managing-conversations/set-conversation-draft", "sourcePath": "/sdk/ios/conversation/managing-conversations/set-conversation-draft", @@ -1975,12 +1975,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2185, + "sourceIndex": 3371, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-conversation-draft.mdx", "navOrder": 37 }, { - "id": 1213, + "id": 2002, "path": "/sdk/ios/conversation/managing-conversations/set-message-receive-option", "relativePath": "sdk/ios/conversation/managing-conversations/set-message-receive-option", "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-receive-option", @@ -1993,12 +1993,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2584, + "sourceIndex": 3372, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-receive-option.mdx", "navOrder": 38 }, { - "id": 1221, + "id": 2003, "path": "/sdk/ios/conversation/managing-conversations/clear-group-mentions", "relativePath": "sdk/ios/conversation/managing-conversations/clear-group-mentions", "sourcePath": "/sdk/ios/conversation/managing-conversations/clear-group-mentions", @@ -2011,12 +2011,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2592, + "sourceIndex": 3373, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/clear-group-mentions.mdx", "navOrder": 39 }, { - "id": 1219, + "id": 2004, "path": "/sdk/ios/conversation/managing-conversations/mark-conversation-read", "relativePath": "sdk/ios/conversation/managing-conversations/mark-conversation-read", "sourcePath": "/sdk/ios/conversation/managing-conversations/mark-conversation-read", @@ -2029,12 +2029,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2590, + "sourceIndex": 3374, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/mark-conversation-read.mdx", "navOrder": 40 }, { - "id": 1220, + "id": 2005, "path": "/sdk/ios/conversation/managing-conversations/get-total-unread-count", "relativePath": "sdk/ios/conversation/managing-conversations/get-total-unread-count", "sourcePath": "/sdk/ios/conversation/managing-conversations/get-total-unread-count", @@ -2047,12 +2047,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2591, + "sourceIndex": 3375, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/get-total-unread-count.mdx", "navOrder": 41 }, { - "id": 1214, + "id": 2006, "path": "/sdk/ios/conversation/managing-conversations/set-private-chat", "relativePath": "sdk/ios/conversation/managing-conversations/set-private-chat", "sourcePath": "/sdk/ios/conversation/managing-conversations/set-private-chat", @@ -2065,12 +2065,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2585, + "sourceIndex": 3376, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-private-chat.mdx", "navOrder": 42 }, { - "id": 1215, + "id": 2007, "path": "/sdk/ios/conversation/managing-conversations/set-burn-duration", "relativePath": "sdk/ios/conversation/managing-conversations/set-burn-duration", "sourcePath": "/sdk/ios/conversation/managing-conversations/set-burn-duration", @@ -2083,12 +2083,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2586, + "sourceIndex": 3377, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-burn-duration.mdx", "navOrder": 43 }, { - "id": 1217, + "id": 2008, "path": "/sdk/ios/conversation/managing-conversations/set-message-destruct", "relativePath": "sdk/ios/conversation/managing-conversations/set-message-destruct", "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-destruct", @@ -2101,12 +2101,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2588, + "sourceIndex": 3378, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-destruct.mdx", "navOrder": 44 }, { - "id": 1218, + "id": 2009, "path": "/sdk/ios/conversation/managing-conversations/set-message-destruct-time", "relativePath": "sdk/ios/conversation/managing-conversations/set-message-destruct-time", "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-destruct-time", @@ -2119,12 +2119,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2589, + "sourceIndex": 3379, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-destruct-time.mdx", "navOrder": 45 }, { - "id": 816, + "id": 2010, "path": "/sdk/ios/conversation/managing-conversations/hide-a-conversation", "relativePath": "sdk/ios/conversation/managing-conversations/hide-a-conversation", "sourcePath": "/sdk/ios/conversation/managing-conversations/hide-a-conversation", @@ -2137,12 +2137,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2187, + "sourceIndex": 3380, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/hide-a-conversation.mdx", "navOrder": 46 }, { - "id": 1222, + "id": 2011, "path": "/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages", "relativePath": "sdk/ios/conversation/managing-conversations/delete-conversation-with-messages", "sourcePath": "/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages", @@ -2155,12 +2155,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2593, + "sourceIndex": 3381, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages.mdx", "navOrder": 47 }, { - "id": 1223, + "id": 2012, "path": "/sdk/ios/conversation/managing-conversations/clear-conversation-messages", "relativePath": "sdk/ios/conversation/managing-conversations/clear-conversation-messages", "sourcePath": "/sdk/ios/conversation/managing-conversations/clear-conversation-messages", @@ -2173,12 +2173,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2594, + "sourceIndex": 3382, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/clear-conversation-messages.mdx", "navOrder": 48 }, { - "id": 1224, + "id": 2013, "path": "/sdk/ios/conversation/managing-conversations/hide-all-conversations", "relativePath": "sdk/ios/conversation/managing-conversations/hide-all-conversations", "sourcePath": "/sdk/ios/conversation/managing-conversations/hide-all-conversations", @@ -2191,12 +2191,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2595, + "sourceIndex": 3383, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/hide-all-conversations.mdx", "navOrder": 49 }, { - "id": 818, + "id": 2014, "path": "/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups", "relativePath": "sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups", "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups", @@ -2209,12 +2209,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2189, + "sourceIndex": 3384, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups.mdx", "navOrder": 50 }, { - "id": 819, + "id": 2015, "path": "/sdk/ios/conversation/managing-conversation-groups/create-conversation-group", "relativePath": "sdk/ios/conversation/managing-conversation-groups/create-conversation-group", "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/create-conversation-group", @@ -2227,12 +2227,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2190, + "sourceIndex": 3385, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/create-conversation-group.mdx", "navOrder": 51 }, { - "id": 820, + "id": 2016, "path": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups", "relativePath": "sdk/ios/conversation/managing-conversation-groups/get-conversation-groups", "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups", @@ -2245,12 +2245,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2191, + "sourceIndex": 3386, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups.mdx", "navOrder": 52 }, { - "id": 821, + "id": 2017, "path": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", "relativePath": "sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", @@ -2263,12 +2263,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2192, + "sourceIndex": 3387, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx", "navOrder": 53 }, { - "id": 822, + "id": 2018, "path": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", "relativePath": "sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", @@ -2281,12 +2281,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2193, + "sourceIndex": 3388, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx", "navOrder": 54 }, { - "id": 823, + "id": 2019, "path": "/sdk/ios/conversation/managing-conversation-groups/update-conversation-group", "relativePath": "sdk/ios/conversation/managing-conversation-groups/update-conversation-group", "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/update-conversation-group", @@ -2299,12 +2299,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2194, + "sourceIndex": 3389, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/update-conversation-group.mdx", "navOrder": 55 }, { - "id": 824, + "id": 2020, "path": "/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order", "relativePath": "sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order", "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order", @@ -2317,12 +2317,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2195, + "sourceIndex": 3390, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order.mdx", "navOrder": 56 }, { - "id": 825, + "id": 2021, "path": "/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups", "relativePath": "sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups", "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups", @@ -2335,12 +2335,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2196, + "sourceIndex": 3391, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups.mdx", "navOrder": 57 }, { - "id": 826, + "id": 2022, "path": "/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups", "relativePath": "sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups", "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups", @@ -2353,12 +2353,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2197, + "sourceIndex": 3392, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx", "navOrder": 58 }, { - "id": 827, + "id": 2023, "path": "/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group", "relativePath": "sdk/ios/conversation/managing-conversation-groups/delete-conversation-group", "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group", @@ -2371,12 +2371,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2198, + "sourceIndex": 3393, "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group.mdx", "navOrder": 59 }, { - "id": 828, + "id": 2024, "path": "/sdk/ios/group/overview-group", "relativePath": "sdk/ios/group/overview-group", "sourcePath": "/sdk/ios/group/overview-group", @@ -2389,12 +2389,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2199, + "sourceIndex": 3394, "contentFile": "content/docs/chat/sdk/ios/group/overview-group.mdx", "navOrder": 60 }, { - "id": 995, + "id": 2025, "path": "/sdk/ios/group/create-group", "relativePath": "sdk/ios/group/create-group", "sourcePath": "/sdk/ios/group/create-group", @@ -2407,12 +2407,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2366, + "sourceIndex": 3395, "contentFile": "content/docs/chat/sdk/ios/group/create-group.mdx", "navOrder": 61 }, { - "id": 1325, + "id": 2026, "path": "/sdk/ios/group/update-group-profile", "relativePath": "sdk/ios/group/update-group-profile", "sourcePath": "/sdk/ios/group/update-group-profile", @@ -2425,12 +2425,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2696, + "sourceIndex": 3396, "contentFile": "content/docs/chat/sdk/ios/group/update-group-profile.mdx", "navOrder": 62 }, { - "id": 1326, + "id": 2027, "path": "/sdk/ios/group/set-group-announcement", "relativePath": "sdk/ios/group/set-group-announcement", "sourcePath": "/sdk/ios/group/set-group-announcement", @@ -2443,12 +2443,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2697, + "sourceIndex": 3397, "contentFile": "content/docs/chat/sdk/ios/group/set-group-announcement.mdx", "navOrder": 63 }, { - "id": 1330, + "id": 2028, "path": "/sdk/ios/group/set-group-extension", "relativePath": "sdk/ios/group/set-group-extension", "sourcePath": "/sdk/ios/group/set-group-extension", @@ -2461,12 +2461,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2701, + "sourceIndex": 3398, "contentFile": "content/docs/chat/sdk/ios/group/set-group-extension.mdx", "navOrder": 64 }, { - "id": 1327, + "id": 2029, "path": "/sdk/ios/group/set-group-join-verification", "relativePath": "sdk/ios/group/set-group-join-verification", "sourcePath": "/sdk/ios/group/set-group-join-verification", @@ -2479,12 +2479,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2698, + "sourceIndex": 3399, "contentFile": "content/docs/chat/sdk/ios/group/set-group-join-verification.mdx", "navOrder": 65 }, { - "id": 1328, + "id": 2030, "path": "/sdk/ios/group/set-group-member-profile-access", "relativePath": "sdk/ios/group/set-group-member-profile-access", "sourcePath": "/sdk/ios/group/set-group-member-profile-access", @@ -2497,12 +2497,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2699, + "sourceIndex": 3400, "contentFile": "content/docs/chat/sdk/ios/group/set-group-member-profile-access.mdx", "navOrder": 66 }, { - "id": 1329, + "id": 2031, "path": "/sdk/ios/group/set-group-member-friend-permission", "relativePath": "sdk/ios/group/set-group-member-friend-permission", "sourcePath": "/sdk/ios/group/set-group-member-friend-permission", @@ -2515,12 +2515,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2700, + "sourceIndex": 3401, "contentFile": "content/docs/chat/sdk/ios/group/set-group-member-friend-permission.mdx", "navOrder": 67 }, { - "id": 1001, + "id": 2032, "path": "/sdk/ios/group/change-group-mute", "relativePath": "sdk/ios/group/change-group-mute", "sourcePath": "/sdk/ios/group/change-group-mute", @@ -2533,12 +2533,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2372, + "sourceIndex": 3402, "contentFile": "content/docs/chat/sdk/ios/group/change-group-mute.mdx", "navOrder": 68 }, { - "id": 998, + "id": 2033, "path": "/sdk/ios/group/join-group", "relativePath": "sdk/ios/group/join-group", "sourcePath": "/sdk/ios/group/join-group", @@ -2551,12 +2551,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2369, + "sourceIndex": 3403, "contentFile": "content/docs/chat/sdk/ios/group/join-group.mdx", "navOrder": 69 }, { - "id": 999, + "id": 2034, "path": "/sdk/ios/group/quit-group", "relativePath": "sdk/ios/group/quit-group", "sourcePath": "/sdk/ios/group/quit-group", @@ -2569,12 +2569,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2370, + "sourceIndex": 3404, "contentFile": "content/docs/chat/sdk/ios/group/quit-group.mdx", "navOrder": 70 }, { - "id": 1000, + "id": 2035, "path": "/sdk/ios/group/dismiss-group", "relativePath": "sdk/ios/group/dismiss-group", "sourcePath": "/sdk/ios/group/dismiss-group", @@ -2587,12 +2587,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2371, + "sourceIndex": 3405, "contentFile": "content/docs/chat/sdk/ios/group/dismiss-group.mdx", "navOrder": 71 }, { - "id": 1003, + "id": 2036, "path": "/sdk/ios/group/retrieving-groups/get-specified-groups-info", "relativePath": "sdk/ios/group/retrieving-groups/get-specified-groups-info", "sourcePath": "/sdk/ios/group/retrieving-groups/get-specified-groups-info", @@ -2605,12 +2605,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2374, + "sourceIndex": 3406, "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-specified-groups-info.mdx", "navOrder": 72 }, { - "id": 1004, + "id": 2037, "path": "/sdk/ios/group/retrieving-groups/get-joined-group-list", "relativePath": "sdk/ios/group/retrieving-groups/get-joined-group-list", "sourcePath": "/sdk/ios/group/retrieving-groups/get-joined-group-list", @@ -2623,12 +2623,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2375, + "sourceIndex": 3407, "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-joined-group-list.mdx", "navOrder": 73 }, { - "id": 1005, + "id": 2038, "path": "/sdk/ios/group/retrieving-groups/get-joined-group-list-page", "relativePath": "sdk/ios/group/retrieving-groups/get-joined-group-list-page", "sourcePath": "/sdk/ios/group/retrieving-groups/get-joined-group-list-page", @@ -2641,12 +2641,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2376, + "sourceIndex": 3408, "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-joined-group-list-page.mdx", "navOrder": 74 }, { - "id": 1006, + "id": 2039, "path": "/sdk/ios/group/retrieving-groups/is-join-group", "relativePath": "sdk/ios/group/retrieving-groups/is-join-group", "sourcePath": "/sdk/ios/group/retrieving-groups/is-join-group", @@ -2659,12 +2659,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2377, + "sourceIndex": 3409, "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/is-join-group.mdx", "navOrder": 75 }, { - "id": 1007, + "id": 2040, "path": "/sdk/ios/group/retrieving-groups/search-groups", "relativePath": "sdk/ios/group/retrieving-groups/search-groups", "sourcePath": "/sdk/ios/group/retrieving-groups/search-groups", @@ -2677,12 +2677,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2378, + "sourceIndex": 3410, "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/search-groups.mdx", "navOrder": 76 }, { - "id": 1008, + "id": 2041, "path": "/sdk/ios/group/group-applications/overview-group-applications", "relativePath": "sdk/ios/group/group-applications/overview-group-applications", "sourcePath": "/sdk/ios/group/group-applications/overview-group-applications", @@ -2695,12 +2695,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2379, + "sourceIndex": 3411, "contentFile": "content/docs/chat/sdk/ios/group/group-applications/overview-group-applications.mdx", "navOrder": 77 }, { - "id": 1009, + "id": 2042, "path": "/sdk/ios/group/group-applications/get-group-application-list-as-recipient", "relativePath": "sdk/ios/group/group-applications/get-group-application-list-as-recipient", "sourcePath": "/sdk/ios/group/group-applications/get-group-application-list-as-recipient", @@ -2713,12 +2713,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2380, + "sourceIndex": 3412, "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-list-as-recipient.mdx", "navOrder": 78 }, { - "id": 1010, + "id": 2043, "path": "/sdk/ios/group/group-applications/get-group-application-list-as-applicant", "relativePath": "sdk/ios/group/group-applications/get-group-application-list-as-applicant", "sourcePath": "/sdk/ios/group/group-applications/get-group-application-list-as-applicant", @@ -2731,12 +2731,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2381, + "sourceIndex": 3413, "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-list-as-applicant.mdx", "navOrder": 79 }, { - "id": 1011, + "id": 2044, "path": "/sdk/ios/group/group-applications/get-group-application-unhandled-count", "relativePath": "sdk/ios/group/group-applications/get-group-application-unhandled-count", "sourcePath": "/sdk/ios/group/group-applications/get-group-application-unhandled-count", @@ -2749,12 +2749,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2382, + "sourceIndex": 3414, "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-unhandled-count.mdx", "navOrder": 80 }, { - "id": 1012, + "id": 2045, "path": "/sdk/ios/group/group-applications/accept-group-application", "relativePath": "sdk/ios/group/group-applications/accept-group-application", "sourcePath": "/sdk/ios/group/group-applications/accept-group-application", @@ -2767,12 +2767,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2383, + "sourceIndex": 3415, "contentFile": "content/docs/chat/sdk/ios/group/group-applications/accept-group-application.mdx", "navOrder": 81 }, { - "id": 1013, + "id": 2046, "path": "/sdk/ios/group/group-applications/refuse-group-application", "relativePath": "sdk/ios/group/group-applications/refuse-group-application", "sourcePath": "/sdk/ios/group/group-applications/refuse-group-application", @@ -2785,12 +2785,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2384, + "sourceIndex": 3416, "contentFile": "content/docs/chat/sdk/ios/group/group-applications/refuse-group-application.mdx", "navOrder": 82 }, { - "id": 1014, + "id": 2047, "path": "/sdk/ios/group/group-applications/delete-group-requests", "relativePath": "sdk/ios/group/group-applications/delete-group-requests", "sourcePath": "/sdk/ios/group/group-applications/delete-group-requests", @@ -2803,12 +2803,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2385, + "sourceIndex": 3417, "contentFile": "content/docs/chat/sdk/ios/group/group-applications/delete-group-requests.mdx", "navOrder": 83 }, { - "id": 1015, + "id": 2048, "path": "/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members", "relativePath": "sdk/ios/group/retrieving-group-members/overview-retrieving-group-members", "sourcePath": "/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members", @@ -2821,12 +2821,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2386, + "sourceIndex": 3418, "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members.mdx", "navOrder": 84 }, { - "id": 1016, + "id": 2049, "path": "/sdk/ios/group/retrieving-group-members/get-group-member-list", "relativePath": "sdk/ios/group/retrieving-group-members/get-group-member-list", "sourcePath": "/sdk/ios/group/retrieving-group-members/get-group-member-list", @@ -2839,12 +2839,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2387, + "sourceIndex": 3419, "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-group-member-list.mdx", "navOrder": 85 }, { - "id": 1017, + "id": 2050, "path": "/sdk/ios/group/retrieving-group-members/get-specified-group-members-info", "relativePath": "sdk/ios/group/retrieving-group-members/get-specified-group-members-info", "sourcePath": "/sdk/ios/group/retrieving-group-members/get-specified-group-members-info", @@ -2857,12 +2857,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2388, + "sourceIndex": 3420, "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-specified-group-members-info.mdx", "navOrder": 86 }, { - "id": 1018, + "id": 2051, "path": "/sdk/ios/group/retrieving-group-members/get-users-in-group", "relativePath": "sdk/ios/group/retrieving-group-members/get-users-in-group", "sourcePath": "/sdk/ios/group/retrieving-group-members/get-users-in-group", @@ -2875,12 +2875,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2389, + "sourceIndex": 3421, "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-users-in-group.mdx", "navOrder": 87 }, { - "id": 1019, + "id": 2052, "path": "/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin", "relativePath": "sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin", "sourcePath": "/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin", @@ -2893,12 +2893,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2390, + "sourceIndex": 3422, "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin.mdx", "navOrder": 88 }, { - "id": 1020, + "id": 2053, "path": "/sdk/ios/group/retrieving-group-members/search-group-members", "relativePath": "sdk/ios/group/retrieving-group-members/search-group-members", "sourcePath": "/sdk/ios/group/retrieving-group-members/search-group-members", @@ -2911,12 +2911,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2391, + "sourceIndex": 3423, "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/search-group-members.mdx", "navOrder": 89 }, { - "id": 1022, + "id": 2054, "path": "/sdk/ios/group/managing-group-members/invite-user-to-group", "relativePath": "sdk/ios/group/managing-group-members/invite-user-to-group", "sourcePath": "/sdk/ios/group/managing-group-members/invite-user-to-group", @@ -2929,12 +2929,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2393, + "sourceIndex": 3424, "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/invite-user-to-group.mdx", "navOrder": 90 }, { - "id": 1023, + "id": 2055, "path": "/sdk/ios/group/managing-group-members/kick-group-member", "relativePath": "sdk/ios/group/managing-group-members/kick-group-member", "sourcePath": "/sdk/ios/group/managing-group-members/kick-group-member", @@ -2947,12 +2947,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2394, + "sourceIndex": 3425, "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/kick-group-member.mdx", "navOrder": 91 }, { - "id": 1024, + "id": 2056, "path": "/sdk/ios/group/managing-group-members/set-group-member-nickname", "relativePath": "sdk/ios/group/managing-group-members/set-group-member-nickname", "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-nickname", @@ -2965,12 +2965,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2395, + "sourceIndex": 3426, "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-nickname.mdx", "navOrder": 92 }, { - "id": 1025, + "id": 2057, "path": "/sdk/ios/group/managing-group-members/set-group-member-role-level", "relativePath": "sdk/ios/group/managing-group-members/set-group-member-role-level", "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-role-level", @@ -2983,12 +2983,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2396, + "sourceIndex": 3427, "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-role-level.mdx", "navOrder": 93 }, { - "id": 1331, + "id": 2058, "path": "/sdk/ios/group/managing-group-members/set-group-member-avatar", "relativePath": "sdk/ios/group/managing-group-members/set-group-member-avatar", "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-avatar", @@ -3001,12 +3001,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2702, + "sourceIndex": 3428, "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-avatar.mdx", "navOrder": 94 }, { - "id": 1332, + "id": 2059, "path": "/sdk/ios/group/managing-group-members/set-group-member-extension", "relativePath": "sdk/ios/group/managing-group-members/set-group-member-extension", "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-extension", @@ -3019,12 +3019,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2703, + "sourceIndex": 3429, "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-extension.mdx", "navOrder": 95 }, { - "id": 836, + "id": 2060, "path": "/sdk/ios/group/managing-group-members/transfer-group-owner", "relativePath": "sdk/ios/group/managing-group-members/transfer-group-owner", "sourcePath": "/sdk/ios/group/managing-group-members/transfer-group-owner", @@ -3037,12 +3037,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2207, + "sourceIndex": 3430, "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/transfer-group-owner.mdx", "navOrder": 96 }, { - "id": 1027, + "id": 2061, "path": "/sdk/ios/group/managing-group-members/change-group-member-mute", "relativePath": "sdk/ios/group/managing-group-members/change-group-member-mute", "sourcePath": "/sdk/ios/group/managing-group-members/change-group-member-mute", @@ -3055,12 +3055,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2398, + "sourceIndex": 3431, "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/change-group-member-mute.mdx", "navOrder": 97 }, { - "id": 838, + "id": 2062, "path": "/sdk/ios/message/overview-message", "relativePath": "sdk/ios/message/overview-message", "sourcePath": "/sdk/ios/message/overview-message", @@ -3073,12 +3073,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2209, + "sourceIndex": 3432, "contentFile": "content/docs/chat/sdk/ios/message/overview-message.mdx", "navOrder": 98 }, { - "id": 1116, + "id": 2063, "path": "/sdk/ios/message/creating-messages/create-text-message", "relativePath": "sdk/ios/message/creating-messages/create-text-message", "sourcePath": "/sdk/ios/message/creating-messages/create-text-message", @@ -3091,12 +3091,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2487, + "sourceIndex": 3433, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-message.mdx", "navOrder": 99 }, { - "id": 1117, + "id": 2064, "path": "/sdk/ios/message/creating-messages/create-text-at-message", "relativePath": "sdk/ios/message/creating-messages/create-text-at-message", "sourcePath": "/sdk/ios/message/creating-messages/create-text-at-message", @@ -3109,12 +3109,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2488, + "sourceIndex": 3434, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-at-message.mdx", "navOrder": 100 }, { - "id": 1118, + "id": 2065, "path": "/sdk/ios/message/creating-messages/create-text-at-all-message", "relativePath": "sdk/ios/message/creating-messages/create-text-at-all-message", "sourcePath": "/sdk/ios/message/creating-messages/create-text-at-all-message", @@ -3127,12 +3127,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2489, + "sourceIndex": 3435, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-at-all-message.mdx", "navOrder": 101 }, { - "id": 1119, + "id": 2066, "path": "/sdk/ios/message/creating-messages/create-at-all-flag", "relativePath": "sdk/ios/message/creating-messages/create-at-all-flag", "sourcePath": "/sdk/ios/message/creating-messages/create-at-all-flag", @@ -3145,12 +3145,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2490, + "sourceIndex": 3436, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-at-all-flag.mdx", "navOrder": 102 }, { - "id": 1120, + "id": 2067, "path": "/sdk/ios/message/creating-messages/get-at-all-tag", "relativePath": "sdk/ios/message/creating-messages/get-at-all-tag", "sourcePath": "/sdk/ios/message/creating-messages/get-at-all-tag", @@ -3163,12 +3163,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2491, + "sourceIndex": 3437, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/get-at-all-tag.mdx", "navOrder": 103 }, { - "id": 1121, + "id": 2068, "path": "/sdk/ios/message/creating-messages/create-custom-message", "relativePath": "sdk/ios/message/creating-messages/create-custom-message", "sourcePath": "/sdk/ios/message/creating-messages/create-custom-message", @@ -3181,12 +3181,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2492, + "sourceIndex": 3438, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-custom-message.mdx", "navOrder": 104 }, { - "id": 1122, + "id": 2069, "path": "/sdk/ios/message/creating-messages/create-image-message-from-full-path", "relativePath": "sdk/ios/message/creating-messages/create-image-message-from-full-path", "sourcePath": "/sdk/ios/message/creating-messages/create-image-message-from-full-path", @@ -3199,12 +3199,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2493, + "sourceIndex": 3439, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-image-message-from-full-path.mdx", "navOrder": 105 }, { - "id": 1123, + "id": 2070, "path": "/sdk/ios/message/creating-messages/create-image-message-by-url", "relativePath": "sdk/ios/message/creating-messages/create-image-message-by-url", "sourcePath": "/sdk/ios/message/creating-messages/create-image-message-by-url", @@ -3217,12 +3217,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2494, + "sourceIndex": 3440, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-image-message-by-url.mdx", "navOrder": 106 }, { - "id": 1124, + "id": 2071, "path": "/sdk/ios/message/creating-messages/create-sound-message-from-full-path", "relativePath": "sdk/ios/message/creating-messages/create-sound-message-from-full-path", "sourcePath": "/sdk/ios/message/creating-messages/create-sound-message-from-full-path", @@ -3235,12 +3235,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2495, + "sourceIndex": 3441, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-sound-message-from-full-path.mdx", "navOrder": 107 }, { - "id": 1125, + "id": 2072, "path": "/sdk/ios/message/creating-messages/create-sound-message-by-url", "relativePath": "sdk/ios/message/creating-messages/create-sound-message-by-url", "sourcePath": "/sdk/ios/message/creating-messages/create-sound-message-by-url", @@ -3253,12 +3253,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2496, + "sourceIndex": 3442, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-sound-message-by-url.mdx", "navOrder": 108 }, { - "id": 1126, + "id": 2073, "path": "/sdk/ios/message/creating-messages/create-video-message-from-full-path", "relativePath": "sdk/ios/message/creating-messages/create-video-message-from-full-path", "sourcePath": "/sdk/ios/message/creating-messages/create-video-message-from-full-path", @@ -3271,12 +3271,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2497, + "sourceIndex": 3443, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-video-message-from-full-path.mdx", "navOrder": 109 }, { - "id": 1127, + "id": 2074, "path": "/sdk/ios/message/creating-messages/create-video-message-by-url", "relativePath": "sdk/ios/message/creating-messages/create-video-message-by-url", "sourcePath": "/sdk/ios/message/creating-messages/create-video-message-by-url", @@ -3289,12 +3289,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2498, + "sourceIndex": 3444, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-video-message-by-url.mdx", "navOrder": 110 }, { - "id": 1128, + "id": 2075, "path": "/sdk/ios/message/creating-messages/create-file-message-from-full-path", "relativePath": "sdk/ios/message/creating-messages/create-file-message-from-full-path", "sourcePath": "/sdk/ios/message/creating-messages/create-file-message-from-full-path", @@ -3307,12 +3307,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2499, + "sourceIndex": 3445, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-file-message-from-full-path.mdx", "navOrder": 111 }, { - "id": 1129, + "id": 2076, "path": "/sdk/ios/message/creating-messages/create-file-message-by-url", "relativePath": "sdk/ios/message/creating-messages/create-file-message-by-url", "sourcePath": "/sdk/ios/message/creating-messages/create-file-message-by-url", @@ -3325,12 +3325,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2500, + "sourceIndex": 3446, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-file-message-by-url.mdx", "navOrder": 112 }, { - "id": 1130, + "id": 2077, "path": "/sdk/ios/message/creating-messages/create-card-message", "relativePath": "sdk/ios/message/creating-messages/create-card-message", "sourcePath": "/sdk/ios/message/creating-messages/create-card-message", @@ -3343,12 +3343,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2501, + "sourceIndex": 3447, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-card-message.mdx", "navOrder": 113 }, { - "id": 1131, + "id": 2078, "path": "/sdk/ios/message/creating-messages/create-location-message", "relativePath": "sdk/ios/message/creating-messages/create-location-message", "sourcePath": "/sdk/ios/message/creating-messages/create-location-message", @@ -3361,12 +3361,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2502, + "sourceIndex": 3448, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-location-message.mdx", "navOrder": 114 }, { - "id": 1132, + "id": 2079, "path": "/sdk/ios/message/creating-messages/create-face-message", "relativePath": "sdk/ios/message/creating-messages/create-face-message", "sourcePath": "/sdk/ios/message/creating-messages/create-face-message", @@ -3379,12 +3379,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2503, + "sourceIndex": 3449, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-face-message.mdx", "navOrder": 115 }, { - "id": 1133, + "id": 2080, "path": "/sdk/ios/message/creating-messages/create-quote-message", "relativePath": "sdk/ios/message/creating-messages/create-quote-message", "sourcePath": "/sdk/ios/message/creating-messages/create-quote-message", @@ -3397,12 +3397,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2504, + "sourceIndex": 3450, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-quote-message.mdx", "navOrder": 116 }, { - "id": 1134, + "id": 2081, "path": "/sdk/ios/message/creating-messages/create-advanced-text-message", "relativePath": "sdk/ios/message/creating-messages/create-advanced-text-message", "sourcePath": "/sdk/ios/message/creating-messages/create-advanced-text-message", @@ -3415,12 +3415,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2505, + "sourceIndex": 3451, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-advanced-text-message.mdx", "navOrder": 117 }, { - "id": 1135, + "id": 2082, "path": "/sdk/ios/message/creating-messages/create-markdown-message", "relativePath": "sdk/ios/message/creating-messages/create-markdown-message", "sourcePath": "/sdk/ios/message/creating-messages/create-markdown-message", @@ -3433,12 +3433,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2506, + "sourceIndex": 3452, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-markdown-message.mdx", "navOrder": 118 }, { - "id": 1136, + "id": 2083, "path": "/sdk/ios/message/creating-messages/create-forward-message", "relativePath": "sdk/ios/message/creating-messages/create-forward-message", "sourcePath": "/sdk/ios/message/creating-messages/create-forward-message", @@ -3451,12 +3451,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2507, + "sourceIndex": 3453, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-forward-message.mdx", "navOrder": 119 }, { - "id": 1137, + "id": 2084, "path": "/sdk/ios/message/creating-messages/create-merge-message", "relativePath": "sdk/ios/message/creating-messages/create-merge-message", "sourcePath": "/sdk/ios/message/creating-messages/create-merge-message", @@ -3469,12 +3469,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2508, + "sourceIndex": 3454, "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-merge-message.mdx", "navOrder": 120 }, { - "id": 1138, + "id": 2085, "path": "/sdk/ios/message/sending-messages/send-message", "relativePath": "sdk/ios/message/sending-messages/send-message", "sourcePath": "/sdk/ios/message/sending-messages/send-message", @@ -3487,12 +3487,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2509, + "sourceIndex": 3455, "contentFile": "content/docs/chat/sdk/ios/message/sending-messages/send-message.mdx", "navOrder": 121 }, { - "id": 1139, + "id": 2086, "path": "/sdk/ios/message/sending-messages/send-message-not-oss", "relativePath": "sdk/ios/message/sending-messages/send-message-not-oss", "sourcePath": "/sdk/ios/message/sending-messages/send-message-not-oss", @@ -3505,12 +3505,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2510, + "sourceIndex": 3456, "contentFile": "content/docs/chat/sdk/ios/message/sending-messages/send-message-not-oss.mdx", "navOrder": 122 }, { - "id": 842, + "id": 2087, "path": "/sdk/ios/message/receiving-messages/receive-messages", "relativePath": "sdk/ios/message/receiving-messages/receive-messages", "sourcePath": "/sdk/ios/message/receiving-messages/receive-messages", @@ -3523,12 +3523,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2213, + "sourceIndex": 3457, "contentFile": "content/docs/chat/sdk/ios/message/receiving-messages/receive-messages.mdx", "navOrder": 123 }, { - "id": 1140, + "id": 2088, "path": "/sdk/ios/message/receiving-messages/custom-business-listener", "relativePath": "sdk/ios/message/receiving-messages/custom-business-listener", "sourcePath": "/sdk/ios/message/receiving-messages/custom-business-listener", @@ -3541,12 +3541,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2511, + "sourceIndex": 3458, "contentFile": "content/docs/chat/sdk/ios/message/receiving-messages/custom-business-listener.mdx", "navOrder": 124 }, { - "id": 1237, + "id": 2089, "path": "/sdk/ios/message/retrieving-messages/load-older-messages", "relativePath": "sdk/ios/message/retrieving-messages/load-older-messages", "sourcePath": "/sdk/ios/message/retrieving-messages/load-older-messages", @@ -3559,12 +3559,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2608, + "sourceIndex": 3459, "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-older-messages.mdx", "navOrder": 125 }, { - "id": 1238, + "id": 2090, "path": "/sdk/ios/message/retrieving-messages/load-newer-messages", "relativePath": "sdk/ios/message/retrieving-messages/load-newer-messages", "sourcePath": "/sdk/ios/message/retrieving-messages/load-newer-messages", @@ -3577,12 +3577,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2609, + "sourceIndex": 3460, "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-newer-messages.mdx", "navOrder": 126 }, { - "id": 1239, + "id": 2091, "path": "/sdk/ios/message/retrieving-messages/find-messages-by-id", "relativePath": "sdk/ios/message/retrieving-messages/find-messages-by-id", "sourcePath": "/sdk/ios/message/retrieving-messages/find-messages-by-id", @@ -3595,12 +3595,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2610, + "sourceIndex": 3461, "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/find-messages-by-id.mdx", "navOrder": 127 }, { - "id": 1240, + "id": 2092, "path": "/sdk/ios/message/retrieving-messages/load-message-context", "relativePath": "sdk/ios/message/retrieving-messages/load-message-context", "sourcePath": "/sdk/ios/message/retrieving-messages/load-message-context", @@ -3613,12 +3613,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2611, + "sourceIndex": 3462, "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-message-context.mdx", "navOrder": 128 }, { - "id": 845, + "id": 2093, "path": "/sdk/ios/message/searching-messages/search-messages", "relativePath": "sdk/ios/message/searching-messages/search-messages", "sourcePath": "/sdk/ios/message/searching-messages/search-messages", @@ -3631,12 +3631,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2216, + "sourceIndex": 3463, "contentFile": "content/docs/chat/sdk/ios/message/searching-messages/search-messages.mdx", "navOrder": 129 }, { - "id": 1245, + "id": 2094, "path": "/sdk/ios/message/composing-messages/update-typing-status", "relativePath": "sdk/ios/message/composing-messages/update-typing-status", "sourcePath": "/sdk/ios/message/composing-messages/update-typing-status", @@ -3649,12 +3649,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2616, + "sourceIndex": 3464, "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/update-typing-status.mdx", "navOrder": 130 }, { - "id": 1246, + "id": 2095, "path": "/sdk/ios/message/composing-messages/get-typing-status", "relativePath": "sdk/ios/message/composing-messages/get-typing-status", "sourcePath": "/sdk/ios/message/composing-messages/get-typing-status", @@ -3667,12 +3667,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2617, + "sourceIndex": 3465, "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/get-typing-status.mdx", "navOrder": 131 }, { - "id": 1269, + "id": 2096, "path": "/sdk/ios/message/composing-messages/check-speech-to-text", "relativePath": "sdk/ios/message/composing-messages/check-speech-to-text", "sourcePath": "/sdk/ios/message/composing-messages/check-speech-to-text", @@ -3685,12 +3685,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2640, + "sourceIndex": 3466, "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/check-speech-to-text.mdx", "navOrder": 132 }, { - "id": 849, + "id": 2097, "path": "/sdk/ios/message/composing-messages/transcribe-audio", "relativePath": "sdk/ios/message/composing-messages/transcribe-audio", "sourcePath": "/sdk/ios/message/composing-messages/transcribe-audio", @@ -3703,12 +3703,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2220, + "sourceIndex": 3467, "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/transcribe-audio.mdx", "navOrder": 133 }, { - "id": 1270, + "id": 2098, "path": "/sdk/ios/message/composing-messages/save-local-transcript", "relativePath": "sdk/ios/message/composing-messages/save-local-transcript", "sourcePath": "/sdk/ios/message/composing-messages/save-local-transcript", @@ -3721,12 +3721,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2641, + "sourceIndex": 3468, "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/save-local-transcript.mdx", "navOrder": 134 }, { - "id": 1287, + "id": 2099, "path": "/sdk/ios/message/managing-messages/delete-local-message", "relativePath": "sdk/ios/message/managing-messages/delete-local-message", "sourcePath": "/sdk/ios/message/managing-messages/delete-local-message", @@ -3739,12 +3739,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2658, + "sourceIndex": 3469, "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-local-message.mdx", "navOrder": 135 }, { - "id": 1288, + "id": 2100, "path": "/sdk/ios/message/managing-messages/delete-saved-message", "relativePath": "sdk/ios/message/managing-messages/delete-saved-message", "sourcePath": "/sdk/ios/message/managing-messages/delete-saved-message", @@ -3757,12 +3757,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2659, + "sourceIndex": 3470, "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-saved-message.mdx", "navOrder": 136 }, { - "id": 1289, + "id": 2101, "path": "/sdk/ios/message/managing-messages/delete-saved-messages", "relativePath": "sdk/ios/message/managing-messages/delete-saved-messages", "sourcePath": "/sdk/ios/message/managing-messages/delete-saved-messages", @@ -3775,12 +3775,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2660, + "sourceIndex": 3471, "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-saved-messages.mdx", "navOrder": 137 }, { - "id": 1290, + "id": 2102, "path": "/sdk/ios/message/managing-messages/delete-user-messages", "relativePath": "sdk/ios/message/managing-messages/delete-user-messages", "sourcePath": "/sdk/ios/message/managing-messages/delete-user-messages", @@ -3793,12 +3793,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2661, + "sourceIndex": 3472, "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-user-messages.mdx", "navOrder": 138 }, { - "id": 852, + "id": 2103, "path": "/sdk/ios/message/managing-messages/revoke-a-message", "relativePath": "sdk/ios/message/managing-messages/revoke-a-message", "sourcePath": "/sdk/ios/message/managing-messages/revoke-a-message", @@ -3811,12 +3811,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2223, + "sourceIndex": 3473, "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/revoke-a-message.mdx", "navOrder": 139 }, { - "id": 853, + "id": 2104, "path": "/sdk/ios/message/managing-messages/modify-a-message", "relativePath": "sdk/ios/message/managing-messages/modify-a-message", "sourcePath": "/sdk/ios/message/managing-messages/modify-a-message", @@ -3829,12 +3829,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2224, + "sourceIndex": 3474, "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/modify-a-message.mdx", "navOrder": 140 }, { - "id": 1255, + "id": 2105, "path": "/sdk/ios/message/managing-messages/get-pinned-messages", "relativePath": "sdk/ios/message/managing-messages/get-pinned-messages", "sourcePath": "/sdk/ios/message/managing-messages/get-pinned-messages", @@ -3847,12 +3847,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2626, + "sourceIndex": 3475, "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/get-pinned-messages.mdx", "navOrder": 141 }, { - "id": 1256, + "id": 2106, "path": "/sdk/ios/message/managing-messages/set-message-pinned", "relativePath": "sdk/ios/message/managing-messages/set-message-pinned", "sourcePath": "/sdk/ios/message/managing-messages/set-message-pinned", @@ -3865,12 +3865,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2627, + "sourceIndex": 3476, "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/set-message-pinned.mdx", "navOrder": 142 }, { - "id": 1257, + "id": 2107, "path": "/sdk/ios/message/managing-messages/insert-local-single-message", "relativePath": "sdk/ios/message/managing-messages/insert-local-single-message", "sourcePath": "/sdk/ios/message/managing-messages/insert-local-single-message", @@ -3883,12 +3883,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2628, + "sourceIndex": 3477, "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/insert-local-single-message.mdx", "navOrder": 143 }, { - "id": 1258, + "id": 2108, "path": "/sdk/ios/message/managing-messages/insert-local-group-message", "relativePath": "sdk/ios/message/managing-messages/insert-local-group-message", "sourcePath": "/sdk/ios/message/managing-messages/insert-local-group-message", @@ -3901,12 +3901,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2629, + "sourceIndex": 3478, "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/insert-local-group-message.mdx", "navOrder": 144 }, { - "id": 1259, + "id": 2109, "path": "/sdk/ios/message/managing-messages/clear-all-local-messages", "relativePath": "sdk/ios/message/managing-messages/clear-all-local-messages", "sourcePath": "/sdk/ios/message/managing-messages/clear-all-local-messages", @@ -3919,12 +3919,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2630, + "sourceIndex": 3479, "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/clear-all-local-messages.mdx", "navOrder": 145 }, { - "id": 1260, + "id": 2110, "path": "/sdk/ios/message/managing-messages/clear-all-messages", "relativePath": "sdk/ios/message/managing-messages/clear-all-messages", "sourcePath": "/sdk/ios/message/managing-messages/clear-all-messages", @@ -3937,12 +3937,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2631, + "sourceIndex": 3480, "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/clear-all-messages.mdx", "navOrder": 146 }, { - "id": 1141, + "id": 2111, "path": "/sdk/ios/message/managing-messages/set-message-local-ex", "relativePath": "sdk/ios/message/managing-messages/set-message-local-ex", "sourcePath": "/sdk/ios/message/managing-messages/set-message-local-ex", @@ -3955,17 +3955,17 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2512, + "sourceIndex": 3481, "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/set-message-local-ex.mdx", "navOrder": 147 }, { - "id": 1291, - "path": "/sdk/ios/message/managing-read-status/get-group-message-readers", - "relativePath": "sdk/ios/message/managing-read-status/get-group-message-readers", - "sourcePath": "/sdk/ios/message/managing-read-status/get-group-message-readers", - "title": "Retrieve group-message readers", - "description": "Retrieve members who have or have not read a group message by page with OpenIM iOS SDK.", + "id": 2112, + "path": "/sdk/ios/message/managing-read-status/send-group-read-receipts", + "relativePath": "sdk/ios/message/managing-read-status/send-group-read-receipts", + "sourcePath": "/sdk/ios/message/managing-read-status/send-group-read-receipts", + "title": "Report group-message read status", + "description": "Report group-message read receipts with OpenIM iOS SDK.", "product": "sdk", "version": "v4", "platform": "ios", @@ -3973,17 +3973,17 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2662, - "contentFile": "content/docs/chat/sdk/ios/message/managing-read-status/get-group-message-readers.mdx", - "navOrder": 149 + "sourceIndex": 3482, + "contentFile": "content/docs/chat/sdk/ios/message/managing-read-status/send-group-read-receipts.mdx", + "navOrder": 148 }, { - "id": 1292, - "path": "/sdk/ios/message/managing-read-status/send-group-read-receipts", - "relativePath": "sdk/ios/message/managing-read-status/send-group-read-receipts", - "sourcePath": "/sdk/ios/message/managing-read-status/send-group-read-receipts", - "title": "Report group-message read status", - "description": "Report group-message read receipts with OpenIM iOS SDK.", + "id": 2113, + "path": "/sdk/ios/message/managing-read-status/get-group-message-readers", + "relativePath": "sdk/ios/message/managing-read-status/get-group-message-readers", + "sourcePath": "/sdk/ios/message/managing-read-status/get-group-message-readers", + "title": "Retrieve group-message readers", + "description": "Retrieve members who have or have not read a group message by page with OpenIM iOS SDK.", "product": "sdk", "version": "v4", "platform": "ios", @@ -3991,12 +3991,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2663, - "contentFile": "content/docs/chat/sdk/ios/message/managing-read-status/send-group-read-receipts.mdx", - "navOrder": 148 + "sourceIndex": 3483, + "contentFile": "content/docs/chat/sdk/ios/message/managing-read-status/get-group-message-readers.mdx", + "navOrder": 149 }, { - "id": 1086, + "id": 2114, "path": "/sdk/ios/file-uploads/upload-file", "relativePath": "sdk/ios/file-uploads/upload-file", "sourcePath": "/sdk/ios/file-uploads/upload-file", @@ -4009,12 +4009,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2457, + "sourceIndex": 3484, "contentFile": "content/docs/chat/sdk/ios/file-uploads/upload-file.mdx", "navOrder": 150 }, { - "id": 858, + "id": 2115, "path": "/sdk/ios/calling/overview-calling", "relativePath": "sdk/ios/calling/overview-calling", "sourcePath": "/sdk/ios/calling/overview-calling", @@ -4027,12 +4027,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2229, + "sourceIndex": 3485, "contentFile": "content/docs/chat/sdk/ios/calling/overview-calling.mdx", "navOrder": 151 }, { - "id": 1180, + "id": 2116, "path": "/sdk/ios/calling/managing-calls/start-single-call", "relativePath": "sdk/ios/calling/managing-calls/start-single-call", "sourcePath": "/sdk/ios/calling/managing-calls/start-single-call", @@ -4045,12 +4045,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2551, + "sourceIndex": 3486, "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/start-single-call.mdx", "navOrder": 152 }, { - "id": 1181, + "id": 2117, "path": "/sdk/ios/calling/managing-calls/start-group-call", "relativePath": "sdk/ios/calling/managing-calls/start-group-call", "sourcePath": "/sdk/ios/calling/managing-calls/start-group-call", @@ -4063,12 +4063,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2552, + "sourceIndex": 3487, "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/start-group-call.mdx", "navOrder": 153 }, { - "id": 1182, + "id": 2118, "path": "/sdk/ios/calling/managing-calls/accept-call", "relativePath": "sdk/ios/calling/managing-calls/accept-call", "sourcePath": "/sdk/ios/calling/managing-calls/accept-call", @@ -4081,12 +4081,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2553, + "sourceIndex": 3488, "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/accept-call.mdx", "navOrder": 154 }, { - "id": 1183, + "id": 2119, "path": "/sdk/ios/calling/managing-calls/reject-call", "relativePath": "sdk/ios/calling/managing-calls/reject-call", "sourcePath": "/sdk/ios/calling/managing-calls/reject-call", @@ -4099,12 +4099,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2554, + "sourceIndex": 3489, "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/reject-call.mdx", "navOrder": 155 }, { - "id": 1184, + "id": 2120, "path": "/sdk/ios/calling/managing-calls/cancel-call", "relativePath": "sdk/ios/calling/managing-calls/cancel-call", "sourcePath": "/sdk/ios/calling/managing-calls/cancel-call", @@ -4117,12 +4117,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2555, + "sourceIndex": 3490, "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/cancel-call.mdx", "navOrder": 156 }, { - "id": 1185, + "id": 2121, "path": "/sdk/ios/calling/managing-calls/hang-up-call", "relativePath": "sdk/ios/calling/managing-calls/hang-up-call", "sourcePath": "/sdk/ios/calling/managing-calls/hang-up-call", @@ -4135,12 +4135,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2556, + "sourceIndex": 3491, "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/hang-up-call.mdx", "navOrder": 157 }, { - "id": 1186, + "id": 2122, "path": "/sdk/ios/calling/managing-calls/handle-call-events", "relativePath": "sdk/ios/calling/managing-calls/handle-call-events", "sourcePath": "/sdk/ios/calling/managing-calls/handle-call-events", @@ -4153,12 +4153,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2557, + "sourceIndex": 3492, "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/handle-call-events.mdx", "navOrder": 158 }, { - "id": 1187, + "id": 2123, "path": "/sdk/ios/calling/retrieving-call-information/restore-pending-invitation", "relativePath": "sdk/ios/calling/retrieving-call-information/restore-pending-invitation", "sourcePath": "/sdk/ios/calling/retrieving-call-information/restore-pending-invitation", @@ -4171,12 +4171,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2558, + "sourceIndex": 3493, "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/restore-pending-invitation.mdx", "navOrder": 159 }, { - "id": 1188, + "id": 2124, "path": "/sdk/ios/calling/retrieving-call-information/get-room-by-group-id", "relativePath": "sdk/ios/calling/retrieving-call-information/get-room-by-group-id", "sourcePath": "/sdk/ios/calling/retrieving-call-information/get-room-by-group-id", @@ -4189,12 +4189,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2559, + "sourceIndex": 3494, "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/get-room-by-group-id.mdx", "navOrder": 160 }, { - "id": 1189, + "id": 2125, "path": "/sdk/ios/calling/retrieving-call-information/get-token-by-room-id", "relativePath": "sdk/ios/calling/retrieving-call-information/get-token-by-room-id", "sourcePath": "/sdk/ios/calling/retrieving-call-information/get-token-by-room-id", @@ -4207,12 +4207,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2560, + "sourceIndex": 3495, "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/get-token-by-room-id.mdx", "navOrder": 161 }, { - "id": 861, + "id": 2126, "path": "/sdk/ios/calling/sending-custom-signals/send-a-custom-signal", "relativePath": "sdk/ios/calling/sending-custom-signals/send-a-custom-signal", "sourcePath": "/sdk/ios/calling/sending-custom-signals/send-a-custom-signal", @@ -4225,12 +4225,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2232, + "sourceIndex": 3496, "contentFile": "content/docs/chat/sdk/ios/calling/sending-custom-signals/send-a-custom-signal.mdx", "navOrder": 162 }, { - "id": 862, + "id": 2127, "path": "/sdk/ios/events/overview-events", "relativePath": "sdk/ios/events/overview-events", "sourcePath": "/sdk/ios/events/overview-events", @@ -4243,12 +4243,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2233, + "sourceIndex": 3497, "contentFile": "content/docs/chat/sdk/ios/events/overview-events.mdx", "navOrder": 163 }, { - "id": 863, + "id": 2128, "path": "/sdk/ios/logger", "relativePath": "sdk/ios/logger", "sourcePath": "/sdk/ios/logger", @@ -4261,12 +4261,12 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2234, + "sourceIndex": 3498, "contentFile": "content/docs/chat/sdk/ios/logger.mdx", "navOrder": 164 }, { - "id": 1352, + "id": 1821, "path": "/sdk/android/overview", "relativePath": "sdk/android/overview", "sourcePath": "/sdk/android/overview", @@ -4279,12 +4279,12 @@ "contextTitle": "SDKs · Android · v4", "template": "overview", "status": "published", - "sourceIndex": 2722, + "sourceIndex": 3191, "contentFile": "content/docs/chat/sdk/android/overview.mdx", "navOrder": 129 }, { - "id": 1353, + "id": 1822, "path": "/sdk/android/getting-started/before-you-start", "relativePath": "sdk/android/getting-started/before-you-start", "sourcePath": "/sdk/android/getting-started/before-you-start", @@ -4297,12 +4297,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2723, + "sourceIndex": 3192, "contentFile": "content/docs/chat/sdk/android/getting-started/before-you-start.mdx", "navOrder": 130 }, { - "id": 1354, + "id": 1823, "path": "/sdk/android/getting-started/environment-specific-implementation", "relativePath": "sdk/android/getting-started/environment-specific-implementation", "sourcePath": "/sdk/android/getting-started/environment-specific-implementation", @@ -4315,12 +4315,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2724, + "sourceIndex": 3193, "contentFile": "content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx", "navOrder": 131 }, { - "id": 1355, + "id": 1824, "path": "/sdk/android/getting-started/authenticate-and-manage-session", "relativePath": "sdk/android/getting-started/authenticate-and-manage-session", "sourcePath": "/sdk/android/getting-started/authenticate-and-manage-session", @@ -4333,12 +4333,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2725, + "sourceIndex": 3194, "contentFile": "content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx", "navOrder": 132 }, { - "id": 1356, + "id": 1825, "path": "/sdk/android/getting-started/send-first-message", "relativePath": "sdk/android/getting-started/send-first-message", "sourcePath": "/sdk/android/getting-started/send-first-message", @@ -4351,12 +4351,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2726, + "sourceIndex": 3195, "contentFile": "content/docs/chat/sdk/android/getting-started/send-first-message.mdx", "navOrder": 133 }, { - "id": 1357, + "id": 1826, "path": "/sdk/android/user/overview-user", "relativePath": "sdk/android/user/overview-user", "sourcePath": "/sdk/android/user/overview-user", @@ -4369,12 +4369,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2727, + "sourceIndex": 3196, "contentFile": "content/docs/chat/sdk/android/user/overview-user.mdx", "navOrder": 134 }, { - "id": 1358, + "id": 1827, "path": "/sdk/android/user/user-profile/get-users-info", "relativePath": "sdk/android/user/user-profile/get-users-info", "sourcePath": "/sdk/android/user/user-profile/get-users-info", @@ -4387,12 +4387,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2728, + "sourceIndex": 3197, "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx", "navOrder": 135 }, { - "id": 1359, + "id": 1828, "path": "/sdk/android/user/user-profile/get-self-local-user-info", "relativePath": "sdk/android/user/user-profile/get-self-local-user-info", "sourcePath": "/sdk/android/user/user-profile/get-self-local-user-info", @@ -4405,12 +4405,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2729, + "sourceIndex": 3198, "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx", "navOrder": 136 }, { - "id": 1360, + "id": 1829, "path": "/sdk/android/user/user-profile/set-self-info", "relativePath": "sdk/android/user/user-profile/set-self-info", "sourcePath": "/sdk/android/user/user-profile/set-self-info", @@ -4423,12 +4423,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2730, + "sourceIndex": 3199, "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx", "navOrder": 137 }, { - "id": 1361, + "id": 1830, "path": "/sdk/android/user/user-profile/set-global-message-reception", "relativePath": "sdk/android/user/user-profile/set-global-message-reception", "sourcePath": "/sdk/android/user/user-profile/set-global-message-reception", @@ -4441,12 +4441,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2731, + "sourceIndex": 3200, "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx", "navOrder": 138 }, { - "id": 1362, + "id": 1831, "path": "/sdk/android/user/online-status/subscribe-users-online-status", "relativePath": "sdk/android/user/online-status/subscribe-users-online-status", "sourcePath": "/sdk/android/user/online-status/subscribe-users-online-status", @@ -4459,12 +4459,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2732, + "sourceIndex": 3201, "contentFile": "content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx", "navOrder": 139 }, { - "id": 1363, + "id": 1832, "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", "relativePath": "sdk/android/user/online-status/get-subscribe-online-users-status", "sourcePath": "/sdk/android/user/online-status/get-subscribe-online-users-status", @@ -4477,12 +4477,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2733, + "sourceIndex": 3202, "contentFile": "content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx", "navOrder": 140 }, { - "id": 1364, + "id": 1833, "path": "/sdk/android/user/online-status/unsubscribe-users-online-status", "relativePath": "sdk/android/user/online-status/unsubscribe-users-online-status", "sourcePath": "/sdk/android/user/online-status/unsubscribe-users-online-status", @@ -4495,12 +4495,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2734, + "sourceIndex": 3203, "contentFile": "content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx", "navOrder": 141 }, { - "id": 1365, + "id": 1834, "path": "/sdk/android/user/friends/get-friend-list-page", "relativePath": "sdk/android/user/friends/get-friend-list-page", "sourcePath": "/sdk/android/user/friends/get-friend-list-page", @@ -4513,12 +4513,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2735, + "sourceIndex": 3204, "contentFile": "content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx", "navOrder": 142 }, { - "id": 1366, + "id": 1835, "path": "/sdk/android/user/friends/search-friends", "relativePath": "sdk/android/user/friends/search-friends", "sourcePath": "/sdk/android/user/friends/search-friends", @@ -4531,12 +4531,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2736, + "sourceIndex": 3205, "contentFile": "content/docs/chat/sdk/android/user/friends/search-friends.mdx", "navOrder": 143 }, { - "id": 1367, + "id": 1836, "path": "/sdk/android/user/friends/get-friends-info", "relativePath": "sdk/android/user/friends/get-friends-info", "sourcePath": "/sdk/android/user/friends/get-friends-info", @@ -4549,12 +4549,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2737, + "sourceIndex": 3206, "contentFile": "content/docs/chat/sdk/android/user/friends/get-friends-info.mdx", "navOrder": 144 }, { - "id": 1368, + "id": 1837, "path": "/sdk/android/user/friends/check-friend", "relativePath": "sdk/android/user/friends/check-friend", "sourcePath": "/sdk/android/user/friends/check-friend", @@ -4567,12 +4567,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2738, + "sourceIndex": 3207, "contentFile": "content/docs/chat/sdk/android/user/friends/check-friend.mdx", "navOrder": 145 }, { - "id": 1369, + "id": 1838, "path": "/sdk/android/user/friends/update-friends", "relativePath": "sdk/android/user/friends/update-friends", "sourcePath": "/sdk/android/user/friends/update-friends", @@ -4585,12 +4585,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2739, + "sourceIndex": 3208, "contentFile": "content/docs/chat/sdk/android/user/friends/update-friends.mdx", "navOrder": 146 }, { - "id": 1370, + "id": 1839, "path": "/sdk/android/user/friends/delete-friend", "relativePath": "sdk/android/user/friends/delete-friend", "sourcePath": "/sdk/android/user/friends/delete-friend", @@ -4603,12 +4603,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2740, + "sourceIndex": 3209, "contentFile": "content/docs/chat/sdk/android/user/friends/delete-friend.mdx", "navOrder": 147 }, { - "id": 1371, + "id": 1840, "path": "/sdk/android/user/friend-applications/add-friend", "relativePath": "sdk/android/user/friend-applications/add-friend", "sourcePath": "/sdk/android/user/friend-applications/add-friend", @@ -4621,12 +4621,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2741, + "sourceIndex": 3210, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx", "navOrder": 148 }, { - "id": 1372, + "id": 1841, "path": "/sdk/android/user/friend-applications/get-recv-friend-application-list", "relativePath": "sdk/android/user/friend-applications/get-recv-friend-application-list", "sourcePath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", @@ -4639,12 +4639,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2742, + "sourceIndex": 3211, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx", "navOrder": 149 }, { - "id": 1373, + "id": 1842, "path": "/sdk/android/user/friend-applications/get-send-friend-application-list", "relativePath": "sdk/android/user/friend-applications/get-send-friend-application-list", "sourcePath": "/sdk/android/user/friend-applications/get-send-friend-application-list", @@ -4657,12 +4657,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2743, + "sourceIndex": 3212, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx", "navOrder": 150 }, { - "id": 1374, + "id": 1843, "path": "/sdk/android/user/friend-applications/accept-friend-application", "relativePath": "sdk/android/user/friend-applications/accept-friend-application", "sourcePath": "/sdk/android/user/friend-applications/accept-friend-application", @@ -4675,12 +4675,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2744, + "sourceIndex": 3213, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx", "navOrder": 151 }, { - "id": 1375, + "id": 1844, "path": "/sdk/android/user/friend-applications/refuse-friend-application", "relativePath": "sdk/android/user/friend-applications/refuse-friend-application", "sourcePath": "/sdk/android/user/friend-applications/refuse-friend-application", @@ -4693,12 +4693,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2745, + "sourceIndex": 3214, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx", "navOrder": 152 }, { - "id": 1376, + "id": 1845, "path": "/sdk/android/user/blacklist/get-blacklist", "relativePath": "sdk/android/user/blacklist/get-blacklist", "sourcePath": "/sdk/android/user/blacklist/get-blacklist", @@ -4711,12 +4711,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2746, + "sourceIndex": 3215, "contentFile": "content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx", "navOrder": 153 }, { - "id": 1377, + "id": 1846, "path": "/sdk/android/user/blacklist/add-blacklist", "relativePath": "sdk/android/user/blacklist/add-blacklist", "sourcePath": "/sdk/android/user/blacklist/add-blacklist", @@ -4729,12 +4729,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2747, + "sourceIndex": 3216, "contentFile": "content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx", "navOrder": 154 }, { - "id": 1378, + "id": 1847, "path": "/sdk/android/user/blacklist/remove-blacklist", "relativePath": "sdk/android/user/blacklist/remove-blacklist", "sourcePath": "/sdk/android/user/blacklist/remove-blacklist", @@ -4747,12 +4747,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2748, + "sourceIndex": 3217, "contentFile": "content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx", "navOrder": 155 }, { - "id": 1379, + "id": 1848, "path": "/sdk/android/conversation/overview-conversation", "relativePath": "sdk/android/conversation/overview-conversation", "sourcePath": "/sdk/android/conversation/overview-conversation", @@ -4765,12 +4765,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2749, + "sourceIndex": 3218, "contentFile": "content/docs/chat/sdk/android/conversation/overview-conversation.mdx", "navOrder": 156 }, { - "id": 1380, + "id": 1849, "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", "relativePath": "sdk/android/conversation/retrieving-conversations/get-conversation-by-target", "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", @@ -4783,12 +4783,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2750, + "sourceIndex": 3219, "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx", "navOrder": 157 }, { - "id": 1381, + "id": 1850, "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", "relativePath": "sdk/android/conversation/retrieving-conversations/get-conversation-id", "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", @@ -4801,12 +4801,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2751, + "sourceIndex": 3220, "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx", "navOrder": 158 }, { - "id": 1382, + "id": 1851, "path": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", "relativePath": "sdk/android/conversation/retrieving-conversations/get-conversations-by-id", "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", @@ -4819,12 +4819,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2752, + "sourceIndex": 3221, "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx", "navOrder": 159 }, { - "id": 1383, + "id": 1852, "path": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", "relativePath": "sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", "sourcePath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", @@ -4837,12 +4837,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2753, + "sourceIndex": 3222, "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx", "navOrder": 160 }, { - "id": 1384, + "id": 1853, "path": "/sdk/android/conversation/managing-conversations/pin-conversation", "relativePath": "sdk/android/conversation/managing-conversations/pin-conversation", "sourcePath": "/sdk/android/conversation/managing-conversations/pin-conversation", @@ -4855,12 +4855,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2754, + "sourceIndex": 3223, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx", "navOrder": 161 }, { - "id": 1385, + "id": 1854, "path": "/sdk/android/conversation/managing-conversations/set-conversation-extension", "relativePath": "sdk/android/conversation/managing-conversations/set-conversation-extension", "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", @@ -4873,12 +4873,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2755, + "sourceIndex": 3224, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx", "navOrder": 162 }, { - "id": 1386, + "id": 1855, "path": "/sdk/android/conversation/managing-conversations/set-conversation-draft", "relativePath": "sdk/android/conversation/managing-conversations/set-conversation-draft", "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", @@ -4891,12 +4891,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2756, + "sourceIndex": 3225, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx", "navOrder": 163 }, { - "id": 1387, + "id": 1856, "path": "/sdk/android/conversation/managing-conversations/set-message-receive-option", "relativePath": "sdk/android/conversation/managing-conversations/set-message-receive-option", "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", @@ -4909,12 +4909,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2757, + "sourceIndex": 3226, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx", "navOrder": 164 }, { - "id": 1388, + "id": 1857, "path": "/sdk/android/conversation/managing-conversations/clear-group-mentions", "relativePath": "sdk/android/conversation/managing-conversations/clear-group-mentions", "sourcePath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", @@ -4927,12 +4927,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2758, + "sourceIndex": 3227, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx", "navOrder": 165 }, { - "id": 1389, + "id": 1858, "path": "/sdk/android/conversation/managing-conversations/mark-conversation-read", "relativePath": "sdk/android/conversation/managing-conversations/mark-conversation-read", "sourcePath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", @@ -4945,12 +4945,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2759, + "sourceIndex": 3228, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx", "navOrder": 166 }, { - "id": 1390, + "id": 1859, "path": "/sdk/android/conversation/managing-conversations/get-total-unread-count", "relativePath": "sdk/android/conversation/managing-conversations/get-total-unread-count", "sourcePath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", @@ -4963,12 +4963,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2760, + "sourceIndex": 3229, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx", "navOrder": 167 }, { - "id": 1391, + "id": 1860, "path": "/sdk/android/conversation/managing-conversations/set-private-chat", "relativePath": "sdk/android/conversation/managing-conversations/set-private-chat", "sourcePath": "/sdk/android/conversation/managing-conversations/set-private-chat", @@ -4981,12 +4981,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2761, + "sourceIndex": 3230, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx", "navOrder": 168 }, { - "id": 1392, + "id": 1861, "path": "/sdk/android/conversation/managing-conversations/set-burn-duration", "relativePath": "sdk/android/conversation/managing-conversations/set-burn-duration", "sourcePath": "/sdk/android/conversation/managing-conversations/set-burn-duration", @@ -4999,12 +4999,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2762, + "sourceIndex": 3231, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx", "navOrder": 169 }, { - "id": 1393, + "id": 1862, "path": "/sdk/android/conversation/managing-conversations/set-message-destruct", "relativePath": "sdk/android/conversation/managing-conversations/set-message-destruct", "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-destruct", @@ -5017,12 +5017,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2763, + "sourceIndex": 3232, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx", "navOrder": 170 }, { - "id": 1394, + "id": 1863, "path": "/sdk/android/conversation/managing-conversations/hide-a-conversation", "relativePath": "sdk/android/conversation/managing-conversations/hide-a-conversation", "sourcePath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", @@ -5035,12 +5035,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2764, + "sourceIndex": 3233, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx", "navOrder": 171 }, { - "id": 1395, + "id": 1864, "path": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", "relativePath": "sdk/android/conversation/managing-conversations/delete-conversation-with-messages", "sourcePath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", @@ -5053,12 +5053,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2765, + "sourceIndex": 3234, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx", "navOrder": 172 }, { - "id": 1396, + "id": 1865, "path": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", "relativePath": "sdk/android/conversation/managing-conversations/clear-conversation-messages", "sourcePath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", @@ -5071,12 +5071,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2766, + "sourceIndex": 3235, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx", "navOrder": 173 }, { - "id": 1397, + "id": 1866, "path": "/sdk/android/group/overview-group", "relativePath": "sdk/android/group/overview-group", "sourcePath": "/sdk/android/group/overview-group", @@ -5089,12 +5089,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2767, + "sourceIndex": 3236, "contentFile": "content/docs/chat/sdk/android/group/overview-group.mdx", "navOrder": 174 }, { - "id": 1398, + "id": 1867, "path": "/sdk/android/group/create-group", "relativePath": "sdk/android/group/create-group", "sourcePath": "/sdk/android/group/create-group", @@ -5107,12 +5107,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2768, + "sourceIndex": 3237, "contentFile": "content/docs/chat/sdk/android/group/create-group.mdx", "navOrder": 175 }, { - "id": 1399, + "id": 1868, "path": "/sdk/android/group/update-group-profile", "relativePath": "sdk/android/group/update-group-profile", "sourcePath": "/sdk/android/group/update-group-profile", @@ -5125,12 +5125,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2769, + "sourceIndex": 3238, "contentFile": "content/docs/chat/sdk/android/group/update-group-profile.mdx", "navOrder": 176 }, { - "id": 1400, + "id": 1869, "path": "/sdk/android/group/set-group-announcement", "relativePath": "sdk/android/group/set-group-announcement", "sourcePath": "/sdk/android/group/set-group-announcement", @@ -5143,12 +5143,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2770, + "sourceIndex": 3239, "contentFile": "content/docs/chat/sdk/android/group/set-group-announcement.mdx", "navOrder": 177 }, { - "id": 1401, + "id": 1870, "path": "/sdk/android/group/set-group-extension", "relativePath": "sdk/android/group/set-group-extension", "sourcePath": "/sdk/android/group/set-group-extension", @@ -5161,12 +5161,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2771, + "sourceIndex": 3240, "contentFile": "content/docs/chat/sdk/android/group/set-group-extension.mdx", "navOrder": 178 }, { - "id": 1402, + "id": 1871, "path": "/sdk/android/group/set-group-join-verification", "relativePath": "sdk/android/group/set-group-join-verification", "sourcePath": "/sdk/android/group/set-group-join-verification", @@ -5179,12 +5179,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2772, + "sourceIndex": 3241, "contentFile": "content/docs/chat/sdk/android/group/set-group-join-verification.mdx", "navOrder": 179 }, { - "id": 1403, + "id": 1872, "path": "/sdk/android/group/set-group-member-profile-access", "relativePath": "sdk/android/group/set-group-member-profile-access", "sourcePath": "/sdk/android/group/set-group-member-profile-access", @@ -5197,12 +5197,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2773, + "sourceIndex": 3242, "contentFile": "content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx", "navOrder": 180 }, { - "id": 1404, + "id": 1873, "path": "/sdk/android/group/set-group-member-friend-permission", "relativePath": "sdk/android/group/set-group-member-friend-permission", "sourcePath": "/sdk/android/group/set-group-member-friend-permission", @@ -5215,12 +5215,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2774, + "sourceIndex": 3243, "contentFile": "content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx", "navOrder": 181 }, { - "id": 1405, + "id": 1874, "path": "/sdk/android/group/change-group-mute", "relativePath": "sdk/android/group/change-group-mute", "sourcePath": "/sdk/android/group/change-group-mute", @@ -5233,12 +5233,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2775, + "sourceIndex": 3244, "contentFile": "content/docs/chat/sdk/android/group/change-group-mute.mdx", "navOrder": 182 }, { - "id": 1406, + "id": 1875, "path": "/sdk/android/group/join-group", "relativePath": "sdk/android/group/join-group", "sourcePath": "/sdk/android/group/join-group", @@ -5251,12 +5251,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2776, + "sourceIndex": 3245, "contentFile": "content/docs/chat/sdk/android/group/join-group.mdx", "navOrder": 183 }, { - "id": 1407, + "id": 1876, "path": "/sdk/android/group/quit-group", "relativePath": "sdk/android/group/quit-group", "sourcePath": "/sdk/android/group/quit-group", @@ -5269,12 +5269,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2777, + "sourceIndex": 3246, "contentFile": "content/docs/chat/sdk/android/group/quit-group.mdx", "navOrder": 184 }, { - "id": 1408, + "id": 1877, "path": "/sdk/android/group/dismiss-group", "relativePath": "sdk/android/group/dismiss-group", "sourcePath": "/sdk/android/group/dismiss-group", @@ -5287,12 +5287,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2778, + "sourceIndex": 3247, "contentFile": "content/docs/chat/sdk/android/group/dismiss-group.mdx", "navOrder": 185 }, { - "id": 1409, + "id": 1878, "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", "relativePath": "sdk/android/group/retrieving-groups/get-specified-groups-info", "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", @@ -5305,12 +5305,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2779, + "sourceIndex": 3248, "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx", "navOrder": 186 }, { - "id": 1410, + "id": 1879, "path": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", "relativePath": "sdk/android/group/retrieving-groups/get-joined-group-list-page", "sourcePath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", @@ -5323,12 +5323,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2780, + "sourceIndex": 3249, "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx", "navOrder": 187 }, { - "id": 1411, + "id": 1880, "path": "/sdk/android/group/retrieving-groups/is-join-group", "relativePath": "sdk/android/group/retrieving-groups/is-join-group", "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", @@ -5341,12 +5341,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2781, + "sourceIndex": 3250, "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx", "navOrder": 188 }, { - "id": 1412, + "id": 1881, "path": "/sdk/android/group/retrieving-groups/search-groups", "relativePath": "sdk/android/group/retrieving-groups/search-groups", "sourcePath": "/sdk/android/group/retrieving-groups/search-groups", @@ -5359,30 +5359,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2782, + "sourceIndex": 3251, "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx", "navOrder": 189 }, { - "id": 1413, - "path": "/sdk/android/group/group-applications/overview-group-applications", - "relativePath": "sdk/android/group/group-applications/overview-group-applications", - "sourcePath": "/sdk/android/group/group-applications/overview-group-applications", - "title": "Group applications overview", - "description": "Understand received and sent group applications, handling results, and state events in the Android SDK.", - "product": "sdk", - "version": "v4", - "platform": "android", - "contextKey": "chat/sdk/android", - "contextTitle": "SDKs · Android · v4", - "template": "guide", - "status": "published", - "sourceIndex": 2783, - "contentFile": "content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx", - "navOrder": 190 - }, - { - "id": 1414, + "id": 1882, "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", "relativePath": "sdk/android/group/group-applications/get-group-application-list-as-recipient", "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", @@ -5395,12 +5377,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2784, + "sourceIndex": 3252, "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx", - "navOrder": 191 + "navOrder": 190 }, { - "id": 1415, + "id": 1883, "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", "relativePath": "sdk/android/group/group-applications/get-group-application-list-as-applicant", "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", @@ -5413,12 +5395,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2785, + "sourceIndex": 3253, "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx", - "navOrder": 192 + "navOrder": 191 }, { - "id": 1416, + "id": 1884, "path": "/sdk/android/group/group-applications/accept-group-application", "relativePath": "sdk/android/group/group-applications/accept-group-application", "sourcePath": "/sdk/android/group/group-applications/accept-group-application", @@ -5431,12 +5413,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2786, + "sourceIndex": 3254, "contentFile": "content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx", - "navOrder": 193 + "navOrder": 192 }, { - "id": 1417, + "id": 1885, "path": "/sdk/android/group/group-applications/refuse-group-application", "relativePath": "sdk/android/group/group-applications/refuse-group-application", "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", @@ -5449,17 +5431,17 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2787, + "sourceIndex": 3255, "contentFile": "content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx", - "navOrder": 194 + "navOrder": 193 }, { - "id": 1418, - "path": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", - "relativePath": "sdk/android/group/retrieving-group-members/overview-retrieving-group-members", - "sourcePath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", - "title": "Group member queries overview", - "description": "Understand group member lists, specified member profiles, and membership queries in the Android SDK.", + "id": 1886, + "path": "/sdk/android/group/group-applications/delete-group-requests", + "relativePath": "sdk/android/group/group-applications/delete-group-requests", + "sourcePath": "/sdk/android/group/group-applications/delete-group-requests", + "title": "Delete group applications", + "description": "Use deleteGroupRequests to delete specified group application records in a batch.", "product": "sdk", "version": "v4", "platform": "android", @@ -5467,12 +5449,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2788, - "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx", - "navOrder": 195 + "sourceIndex": 3256, + "contentFile": "content/docs/chat/sdk/android/group/group-applications/delete-group-requests.mdx", + "navOrder": 194 }, { - "id": 1419, + "id": 1887, "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", "relativePath": "sdk/android/group/retrieving-group-members/get-group-member-list", "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", @@ -5485,12 +5467,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2789, + "sourceIndex": 3257, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx", - "navOrder": 196 + "navOrder": 195 }, { - "id": 1420, + "id": 1888, "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", "relativePath": "sdk/android/group/retrieving-group-members/get-specified-group-members-info", "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", @@ -5503,12 +5485,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2790, + "sourceIndex": 3258, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx", - "navOrder": 197 + "navOrder": 196 }, { - "id": 1421, + "id": 1889, "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", "relativePath": "sdk/android/group/retrieving-group-members/get-users-in-group", "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", @@ -5521,12 +5503,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2791, + "sourceIndex": 3259, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx", - "navOrder": 198 + "navOrder": 197 }, { - "id": 1422, + "id": 1890, "path": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", "relativePath": "sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", @@ -5539,12 +5521,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2792, + "sourceIndex": 3260, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx", - "navOrder": 199 + "navOrder": 198 }, { - "id": 1423, + "id": 1891, "path": "/sdk/android/group/retrieving-group-members/search-group-members", "relativePath": "sdk/android/group/retrieving-group-members/search-group-members", "sourcePath": "/sdk/android/group/retrieving-group-members/search-group-members", @@ -5557,12 +5539,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2793, + "sourceIndex": 3261, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx", - "navOrder": 200 + "navOrder": 199 }, { - "id": 1424, + "id": 1892, "path": "/sdk/android/group/managing-group-members/invite-user-to-group", "relativePath": "sdk/android/group/managing-group-members/invite-user-to-group", "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", @@ -5575,12 +5557,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2794, + "sourceIndex": 3262, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx", - "navOrder": 201 + "navOrder": 200 }, { - "id": 1425, + "id": 1893, "path": "/sdk/android/group/managing-group-members/kick-group-member", "relativePath": "sdk/android/group/managing-group-members/kick-group-member", "sourcePath": "/sdk/android/group/managing-group-members/kick-group-member", @@ -5593,12 +5575,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2795, + "sourceIndex": 3263, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx", - "navOrder": 202 + "navOrder": 201 }, { - "id": 1426, + "id": 1894, "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", "relativePath": "sdk/android/group/managing-group-members/set-group-member-nickname", "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", @@ -5611,12 +5593,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2796, + "sourceIndex": 3264, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx", - "navOrder": 203 + "navOrder": 202 }, { - "id": 1427, + "id": 1895, "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", "relativePath": "sdk/android/group/managing-group-members/set-group-member-role-level", "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", @@ -5629,12 +5611,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2797, + "sourceIndex": 3265, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx", - "navOrder": 204 + "navOrder": 203 }, { - "id": 1428, + "id": 1896, "path": "/sdk/android/group/managing-group-members/set-group-member-avatar", "relativePath": "sdk/android/group/managing-group-members/set-group-member-avatar", "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-avatar", @@ -5647,12 +5629,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2798, + "sourceIndex": 3266, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx", - "navOrder": 205 + "navOrder": 204 }, { - "id": 1429, + "id": 1897, "path": "/sdk/android/group/managing-group-members/set-group-member-extension", "relativePath": "sdk/android/group/managing-group-members/set-group-member-extension", "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-extension", @@ -5665,12 +5647,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2799, + "sourceIndex": 3267, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx", - "navOrder": 206 + "navOrder": 205 }, { - "id": 1430, + "id": 1898, "path": "/sdk/android/group/managing-group-members/transfer-group-owner", "relativePath": "sdk/android/group/managing-group-members/transfer-group-owner", "sourcePath": "/sdk/android/group/managing-group-members/transfer-group-owner", @@ -5683,12 +5665,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2800, + "sourceIndex": 3268, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx", - "navOrder": 207 + "navOrder": 206 }, { - "id": 1431, + "id": 1899, "path": "/sdk/android/group/managing-group-members/change-group-member-mute", "relativePath": "sdk/android/group/managing-group-members/change-group-member-mute", "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", @@ -5701,12 +5683,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2801, + "sourceIndex": 3269, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx", - "navOrder": 208 + "navOrder": 207 }, { - "id": 1432, + "id": 1900, "path": "/sdk/android/message/overview-message", "relativePath": "sdk/android/message/overview-message", "sourcePath": "/sdk/android/message/overview-message", @@ -5719,12 +5701,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2802, + "sourceIndex": 3270, "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx", - "navOrder": 209 + "navOrder": 208 }, { - "id": 1433, + "id": 1901, "path": "/sdk/android/message/creating-messages/create-text-message", "relativePath": "sdk/android/message/creating-messages/create-text-message", "sourcePath": "/sdk/android/message/creating-messages/create-text-message", @@ -5737,12 +5719,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2803, + "sourceIndex": 3271, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx", - "navOrder": 210 + "navOrder": 209 }, { - "id": 1434, + "id": 1902, "path": "/sdk/android/message/creating-messages/create-text-at-message", "relativePath": "sdk/android/message/creating-messages/create-text-at-message", "sourcePath": "/sdk/android/message/creating-messages/create-text-at-message", @@ -5755,12 +5737,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2804, + "sourceIndex": 3272, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx", - "navOrder": 211 + "navOrder": 210 }, { - "id": 1435, + "id": 1903, "path": "/sdk/android/message/creating-messages/create-custom-message", "relativePath": "sdk/android/message/creating-messages/create-custom-message", "sourcePath": "/sdk/android/message/creating-messages/create-custom-message", @@ -5773,12 +5755,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2805, + "sourceIndex": 3273, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx", - "navOrder": 212 + "navOrder": 211 }, { - "id": 1436, + "id": 1904, "path": "/sdk/android/message/creating-messages/create-image-message", "relativePath": "sdk/android/message/creating-messages/create-image-message", "sourcePath": "/sdk/android/message/creating-messages/create-image-message", @@ -5791,12 +5773,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2806, + "sourceIndex": 3274, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx", - "navOrder": 213 + "navOrder": 212 }, { - "id": 1437, + "id": 1905, "path": "/sdk/android/message/creating-messages/create-image-message-by-file", "relativePath": "sdk/android/message/creating-messages/create-image-message-by-file", "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-file", @@ -5809,12 +5791,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2807, + "sourceIndex": 3275, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx", - "navOrder": 214 + "navOrder": 213 }, { - "id": 1438, + "id": 1906, "path": "/sdk/android/message/creating-messages/create-image-message-by-url", "relativePath": "sdk/android/message/creating-messages/create-image-message-by-url", "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-url", @@ -5827,12 +5809,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2808, + "sourceIndex": 3276, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx", - "navOrder": 215 + "navOrder": 214 }, { - "id": 1439, + "id": 1907, "path": "/sdk/android/message/creating-messages/create-sound-message", "relativePath": "sdk/android/message/creating-messages/create-sound-message", "sourcePath": "/sdk/android/message/creating-messages/create-sound-message", @@ -5845,12 +5827,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2809, + "sourceIndex": 3277, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx", - "navOrder": 216 + "navOrder": 215 }, { - "id": 1440, + "id": 1908, "path": "/sdk/android/message/creating-messages/create-sound-message-by-file", "relativePath": "sdk/android/message/creating-messages/create-sound-message-by-file", "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-file", @@ -5863,12 +5845,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2810, + "sourceIndex": 3278, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx", - "navOrder": 217 + "navOrder": 216 }, { - "id": 1441, + "id": 1909, "path": "/sdk/android/message/creating-messages/create-sound-message-by-url", "relativePath": "sdk/android/message/creating-messages/create-sound-message-by-url", "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-url", @@ -5881,12 +5863,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2811, + "sourceIndex": 3279, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx", - "navOrder": 218 + "navOrder": 217 }, { - "id": 1442, + "id": 1910, "path": "/sdk/android/message/creating-messages/create-video-message", "relativePath": "sdk/android/message/creating-messages/create-video-message", "sourcePath": "/sdk/android/message/creating-messages/create-video-message", @@ -5899,12 +5881,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2812, + "sourceIndex": 3280, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx", - "navOrder": 219 + "navOrder": 218 }, { - "id": 1443, + "id": 1911, "path": "/sdk/android/message/creating-messages/create-video-message-by-file", "relativePath": "sdk/android/message/creating-messages/create-video-message-by-file", "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-file", @@ -5917,12 +5899,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2813, + "sourceIndex": 3281, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx", - "navOrder": 220 + "navOrder": 219 }, { - "id": 1444, + "id": 1912, "path": "/sdk/android/message/creating-messages/create-video-message-by-url", "relativePath": "sdk/android/message/creating-messages/create-video-message-by-url", "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-url", @@ -5935,12 +5917,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2814, + "sourceIndex": 3282, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx", - "navOrder": 221 + "navOrder": 220 }, { - "id": 1445, + "id": 1913, "path": "/sdk/android/message/creating-messages/create-file-message", "relativePath": "sdk/android/message/creating-messages/create-file-message", "sourcePath": "/sdk/android/message/creating-messages/create-file-message", @@ -5953,12 +5935,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2815, + "sourceIndex": 3283, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx", - "navOrder": 222 + "navOrder": 221 }, { - "id": 1446, + "id": 1914, "path": "/sdk/android/message/creating-messages/create-file-message-by-file", "relativePath": "sdk/android/message/creating-messages/create-file-message-by-file", "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-file", @@ -5971,12 +5953,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2816, + "sourceIndex": 3284, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx", - "navOrder": 223 + "navOrder": 222 }, { - "id": 1447, + "id": 1915, "path": "/sdk/android/message/creating-messages/create-file-message-by-url", "relativePath": "sdk/android/message/creating-messages/create-file-message-by-url", "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-url", @@ -5989,12 +5971,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2817, + "sourceIndex": 3285, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx", - "navOrder": 224 + "navOrder": 223 }, { - "id": 1448, + "id": 1916, "path": "/sdk/android/message/creating-messages/create-card-message", "relativePath": "sdk/android/message/creating-messages/create-card-message", "sourcePath": "/sdk/android/message/creating-messages/create-card-message", @@ -6007,12 +5989,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2818, + "sourceIndex": 3286, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx", - "navOrder": 225 + "navOrder": 224 }, { - "id": 1449, + "id": 1917, "path": "/sdk/android/message/creating-messages/create-location-message", "relativePath": "sdk/android/message/creating-messages/create-location-message", "sourcePath": "/sdk/android/message/creating-messages/create-location-message", @@ -6025,12 +6007,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2819, + "sourceIndex": 3287, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx", - "navOrder": 226 + "navOrder": 225 }, { - "id": 1450, + "id": 1918, "path": "/sdk/android/message/creating-messages/create-face-message", "relativePath": "sdk/android/message/creating-messages/create-face-message", "sourcePath": "/sdk/android/message/creating-messages/create-face-message", @@ -6043,12 +6025,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2820, + "sourceIndex": 3288, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx", - "navOrder": 227 + "navOrder": 226 }, { - "id": 1451, + "id": 1919, "path": "/sdk/android/message/creating-messages/create-quote-message", "relativePath": "sdk/android/message/creating-messages/create-quote-message", "sourcePath": "/sdk/android/message/creating-messages/create-quote-message", @@ -6061,12 +6043,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2821, + "sourceIndex": 3289, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx", - "navOrder": 228 + "navOrder": 227 }, { - "id": 1452, + "id": 1920, "path": "/sdk/android/message/creating-messages/create-advanced-text-message", "relativePath": "sdk/android/message/creating-messages/create-advanced-text-message", "sourcePath": "/sdk/android/message/creating-messages/create-advanced-text-message", @@ -6079,12 +6061,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2822, + "sourceIndex": 3290, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx", - "navOrder": 229 + "navOrder": 228 }, { - "id": 1453, + "id": 1921, "path": "/sdk/android/message/creating-messages/create-advanced-quote-message", "relativePath": "sdk/android/message/creating-messages/create-advanced-quote-message", "sourcePath": "/sdk/android/message/creating-messages/create-advanced-quote-message", @@ -6097,12 +6079,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2823, + "sourceIndex": 3291, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx", - "navOrder": 230 + "navOrder": 229 }, { - "id": 1454, + "id": 1922, "path": "/sdk/android/message/creating-messages/create-forward-message", "relativePath": "sdk/android/message/creating-messages/create-forward-message", "sourcePath": "/sdk/android/message/creating-messages/create-forward-message", @@ -6115,12 +6097,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2824, + "sourceIndex": 3292, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx", - "navOrder": 231 + "navOrder": 230 }, { - "id": 1455, + "id": 1923, "path": "/sdk/android/message/creating-messages/create-merger-message", "relativePath": "sdk/android/message/creating-messages/create-merger-message", "sourcePath": "/sdk/android/message/creating-messages/create-merger-message", @@ -6133,12 +6115,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2825, + "sourceIndex": 3293, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx", - "navOrder": 232 + "navOrder": 231 }, { - "id": 1456, + "id": 1924, "path": "/sdk/android/message/sending-messages/send-message", "relativePath": "sdk/android/message/sending-messages/send-message", "sourcePath": "/sdk/android/message/sending-messages/send-message", @@ -6151,12 +6133,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2826, + "sourceIndex": 3294, "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message.mdx", - "navOrder": 233 + "navOrder": 232 }, { - "id": 1457, + "id": 1925, "path": "/sdk/android/message/sending-messages/send-message-not-oss", "relativePath": "sdk/android/message/sending-messages/send-message-not-oss", "sourcePath": "/sdk/android/message/sending-messages/send-message-not-oss", @@ -6169,12 +6151,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2827, + "sourceIndex": 3295, "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx", - "navOrder": 234 + "navOrder": 233 }, { - "id": 1458, + "id": 1926, "path": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", "relativePath": "sdk/android/message/sending-messages/set-msg-send-progress-listener", "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", @@ -6187,12 +6169,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2828, + "sourceIndex": 3296, "contentFile": "content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx", - "navOrder": 235 + "navOrder": 234 }, { - "id": 1459, + "id": 1927, "path": "/sdk/android/message/receiving-messages/receive-messages", "relativePath": "sdk/android/message/receiving-messages/receive-messages", "sourcePath": "/sdk/android/message/receiving-messages/receive-messages", @@ -6205,12 +6187,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2829, + "sourceIndex": 3297, "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx", - "navOrder": 236 + "navOrder": 235 }, { - "id": 1460, + "id": 1928, "path": "/sdk/android/message/receiving-messages/receive-custom-business-messages", "relativePath": "sdk/android/message/receiving-messages/receive-custom-business-messages", "sourcePath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", @@ -6223,12 +6205,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2830, + "sourceIndex": 3298, "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx", - "navOrder": 237 + "navOrder": 236 }, { - "id": 1461, + "id": 1929, "path": "/sdk/android/message/retrieving-messages/load-older-messages", "relativePath": "sdk/android/message/retrieving-messages/load-older-messages", "sourcePath": "/sdk/android/message/retrieving-messages/load-older-messages", @@ -6241,12 +6223,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2831, + "sourceIndex": 3299, "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx", - "navOrder": 238 + "navOrder": 237 }, { - "id": 1462, + "id": 1930, "path": "/sdk/android/message/retrieving-messages/load-newer-messages", "relativePath": "sdk/android/message/retrieving-messages/load-newer-messages", "sourcePath": "/sdk/android/message/retrieving-messages/load-newer-messages", @@ -6259,12 +6241,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2832, + "sourceIndex": 3300, "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx", - "navOrder": 239 + "navOrder": 238 }, { - "id": 1463, + "id": 1931, "path": "/sdk/android/message/retrieving-messages/find-messages-by-id", "relativePath": "sdk/android/message/retrieving-messages/find-messages-by-id", "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", @@ -6277,12 +6259,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2833, + "sourceIndex": 3301, "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx", - "navOrder": 240 + "navOrder": 239 }, { - "id": 1464, + "id": 1932, "path": "/sdk/android/message/retrieving-messages/load-message-context", "relativePath": "sdk/android/message/retrieving-messages/load-message-context", "sourcePath": "/sdk/android/message/retrieving-messages/load-message-context", @@ -6295,12 +6277,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2834, + "sourceIndex": 3302, "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx", - "navOrder": 241 + "navOrder": 240 }, { - "id": 1465, + "id": 1933, "path": "/sdk/android/message/searching-messages/search-messages", "relativePath": "sdk/android/message/searching-messages/search-messages", "sourcePath": "/sdk/android/message/searching-messages/search-messages", @@ -6313,12 +6295,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2835, + "sourceIndex": 3303, "contentFile": "content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx", - "navOrder": 242 + "navOrder": 241 }, { - "id": 1466, + "id": 1934, "path": "/sdk/android/message/composing-messages/update-typing-status", "relativePath": "sdk/android/message/composing-messages/update-typing-status", "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", @@ -6331,12 +6313,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2836, + "sourceIndex": 3304, "contentFile": "content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx", - "navOrder": 243 + "navOrder": 242 }, { - "id": 1467, + "id": 1935, "path": "/sdk/android/message/composing-messages/get-typing-status", "relativePath": "sdk/android/message/composing-messages/get-typing-status", "sourcePath": "/sdk/android/message/composing-messages/get-typing-status", @@ -6349,12 +6331,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2837, + "sourceIndex": 3305, "contentFile": "content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx", - "navOrder": 244 + "navOrder": 243 }, { - "id": 1468, + "id": 1936, "path": "/sdk/android/message/managing-messages/delete-local-message", "relativePath": "sdk/android/message/managing-messages/delete-local-message", "sourcePath": "/sdk/android/message/managing-messages/delete-local-message", @@ -6367,12 +6349,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2838, + "sourceIndex": 3306, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx", - "navOrder": 245 + "navOrder": 244 }, { - "id": 1469, + "id": 1937, "path": "/sdk/android/message/managing-messages/delete-saved-messages", "relativePath": "sdk/android/message/managing-messages/delete-saved-messages", "sourcePath": "/sdk/android/message/managing-messages/delete-saved-messages", @@ -6385,12 +6367,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2839, + "sourceIndex": 3307, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx", - "navOrder": 246 + "navOrder": 245 }, { - "id": 1470, + "id": 1938, "path": "/sdk/android/message/managing-messages/delete-user-messages", "relativePath": "sdk/android/message/managing-messages/delete-user-messages", "sourcePath": "/sdk/android/message/managing-messages/delete-user-messages", @@ -6403,12 +6385,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2840, + "sourceIndex": 3308, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx", - "navOrder": 247 + "navOrder": 246 }, { - "id": 1471, + "id": 1939, "path": "/sdk/android/message/managing-messages/revoke-a-message", "relativePath": "sdk/android/message/managing-messages/revoke-a-message", "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", @@ -6421,12 +6403,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2841, + "sourceIndex": 3309, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx", - "navOrder": 248 + "navOrder": 247 }, { - "id": 1472, + "id": 1940, "path": "/sdk/android/message/managing-messages/modify-a-message", "relativePath": "sdk/android/message/managing-messages/modify-a-message", "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", @@ -6439,12 +6421,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2842, + "sourceIndex": 3310, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx", - "navOrder": 249 + "navOrder": 248 }, { - "id": 1473, + "id": 1941, "path": "/sdk/android/message/managing-messages/get-pinned-messages", "relativePath": "sdk/android/message/managing-messages/get-pinned-messages", "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", @@ -6457,12 +6439,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2843, + "sourceIndex": 3311, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx", - "navOrder": 250 + "navOrder": 249 }, { - "id": 1474, + "id": 1942, "path": "/sdk/android/message/managing-messages/set-message-pinned", "relativePath": "sdk/android/message/managing-messages/set-message-pinned", "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", @@ -6475,12 +6457,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2844, + "sourceIndex": 3312, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx", - "navOrder": 251 + "navOrder": 250 }, { - "id": 1475, + "id": 1943, "path": "/sdk/android/message/managing-messages/insert-local-single-message", "relativePath": "sdk/android/message/managing-messages/insert-local-single-message", "sourcePath": "/sdk/android/message/managing-messages/insert-local-single-message", @@ -6493,12 +6475,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2845, + "sourceIndex": 3313, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx", - "navOrder": 252 + "navOrder": 251 }, { - "id": 1476, + "id": 1944, "path": "/sdk/android/message/managing-messages/insert-local-group-message", "relativePath": "sdk/android/message/managing-messages/insert-local-group-message", "sourcePath": "/sdk/android/message/managing-messages/insert-local-group-message", @@ -6511,12 +6493,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2846, + "sourceIndex": 3314, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx", - "navOrder": 253 + "navOrder": 252 }, { - "id": 1477, + "id": 1945, "path": "/sdk/android/message/managing-messages/clear-all-local-messages", "relativePath": "sdk/android/message/managing-messages/clear-all-local-messages", "sourcePath": "/sdk/android/message/managing-messages/clear-all-local-messages", @@ -6529,12 +6511,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2847, + "sourceIndex": 3315, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx", - "navOrder": 254 + "navOrder": 253 }, { - "id": 1478, + "id": 1946, "path": "/sdk/android/message/managing-messages/clear-all-messages", "relativePath": "sdk/android/message/managing-messages/clear-all-messages", "sourcePath": "/sdk/android/message/managing-messages/clear-all-messages", @@ -6547,12 +6529,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2848, + "sourceIndex": 3316, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx", - "navOrder": 255 + "navOrder": 254 }, { - "id": 1479, + "id": 1947, "path": "/sdk/android/message/managing-messages/set-message-local-ex", "relativePath": "sdk/android/message/managing-messages/set-message-local-ex", "sourcePath": "/sdk/android/message/managing-messages/set-message-local-ex", @@ -6565,12 +6547,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2849, + "sourceIndex": 3317, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx", - "navOrder": 256 + "navOrder": 255 }, { - "id": 1480, + "id": 1948, "path": "/sdk/android/message/managing-read-status/send-group-read-receipts", "relativePath": "sdk/android/message/managing-read-status/send-group-read-receipts", "sourcePath": "/sdk/android/message/managing-read-status/send-group-read-receipts", @@ -6583,12 +6565,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2850, + "sourceIndex": 3318, "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx", - "navOrder": 257 + "navOrder": 256 }, { - "id": 1481, + "id": 1949, "path": "/sdk/android/message/managing-read-status/get-group-message-readers", "relativePath": "sdk/android/message/managing-read-status/get-group-message-readers", "sourcePath": "/sdk/android/message/managing-read-status/get-group-message-readers", @@ -6601,12 +6583,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2851, + "sourceIndex": 3319, "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx", - "navOrder": 258 + "navOrder": 257 }, { - "id": 1483, + "id": 1950, "path": "/sdk/android/file-uploads/upload-file", "relativePath": "sdk/android/file-uploads/upload-file", "sourcePath": "/sdk/android/file-uploads/upload-file", @@ -6619,12 +6601,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2853, + "sourceIndex": 3320, "contentFile": "content/docs/chat/sdk/android/file-uploads/upload-file.mdx", - "navOrder": 260 + "navOrder": 258 }, { - "id": 1484, + "id": 1951, "path": "/sdk/android/calling/overview-calling", "relativePath": "sdk/android/calling/overview-calling", "sourcePath": "/sdk/android/calling/overview-calling", @@ -6637,12 +6619,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2854, + "sourceIndex": 3321, "contentFile": "content/docs/chat/sdk/android/calling/overview-calling.mdx", - "navOrder": 261 + "navOrder": 259 }, { - "id": 1485, + "id": 1952, "path": "/sdk/android/calling/managing-calls/start-single-call", "relativePath": "sdk/android/calling/managing-calls/start-single-call", "sourcePath": "/sdk/android/calling/managing-calls/start-single-call", @@ -6655,12 +6637,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2855, + "sourceIndex": 3322, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx", - "navOrder": 262 + "navOrder": 260 }, { - "id": 1486, + "id": 1953, "path": "/sdk/android/calling/managing-calls/start-group-call", "relativePath": "sdk/android/calling/managing-calls/start-group-call", "sourcePath": "/sdk/android/calling/managing-calls/start-group-call", @@ -6673,12 +6655,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2856, + "sourceIndex": 3323, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx", - "navOrder": 263 + "navOrder": 261 }, { - "id": 1487, + "id": 1954, "path": "/sdk/android/calling/managing-calls/accept-call", "relativePath": "sdk/android/calling/managing-calls/accept-call", "sourcePath": "/sdk/android/calling/managing-calls/accept-call", @@ -6691,12 +6673,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2857, + "sourceIndex": 3324, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx", - "navOrder": 264 + "navOrder": 262 }, { - "id": 1488, + "id": 1955, "path": "/sdk/android/calling/managing-calls/reject-call", "relativePath": "sdk/android/calling/managing-calls/reject-call", "sourcePath": "/sdk/android/calling/managing-calls/reject-call", @@ -6709,12 +6691,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2858, + "sourceIndex": 3325, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx", - "navOrder": 265 + "navOrder": 263 }, { - "id": 1489, + "id": 1956, "path": "/sdk/android/calling/managing-calls/cancel-call", "relativePath": "sdk/android/calling/managing-calls/cancel-call", "sourcePath": "/sdk/android/calling/managing-calls/cancel-call", @@ -6727,12 +6709,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2859, + "sourceIndex": 3326, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx", - "navOrder": 266 + "navOrder": 264 }, { - "id": 1490, + "id": 1957, "path": "/sdk/android/calling/managing-calls/hang-up-call", "relativePath": "sdk/android/calling/managing-calls/hang-up-call", "sourcePath": "/sdk/android/calling/managing-calls/hang-up-call", @@ -6745,12 +6727,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2860, + "sourceIndex": 3327, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx", - "navOrder": 267 + "navOrder": 265 }, { - "id": 1491, + "id": 1958, "path": "/sdk/android/calling/managing-calls/handle-call-events", "relativePath": "sdk/android/calling/managing-calls/handle-call-events", "sourcePath": "/sdk/android/calling/managing-calls/handle-call-events", @@ -6763,12 +6745,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2861, + "sourceIndex": 3328, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx", - "navOrder": 268 + "navOrder": 266 }, { - "id": 1492, + "id": 1959, "path": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", "relativePath": "sdk/android/calling/retrieving-call-information/restore-pending-invitation", "sourcePath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", @@ -6781,12 +6763,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2862, + "sourceIndex": 3329, "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx", - "navOrder": 269 + "navOrder": 267 }, { - "id": 1493, + "id": 1960, "path": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", "relativePath": "sdk/android/calling/retrieving-call-information/get-room-by-group-id", "sourcePath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", @@ -6799,12 +6781,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2863, + "sourceIndex": 3330, "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx", - "navOrder": 270 + "navOrder": 268 }, { - "id": 1494, + "id": 1961, "path": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", "relativePath": "sdk/android/calling/retrieving-call-information/get-token-by-room-id", "sourcePath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", @@ -6817,12 +6799,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2864, + "sourceIndex": 3331, "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx", - "navOrder": 271 + "navOrder": 269 }, { - "id": 1495, + "id": 1962, "path": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", "relativePath": "sdk/android/calling/sending-custom-signals/send-a-custom-signal", "sourcePath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", @@ -6835,12 +6817,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2865, + "sourceIndex": 3332, "contentFile": "content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx", - "navOrder": 272 + "navOrder": 270 }, { - "id": 1496, + "id": 1963, "path": "/sdk/android/events/overview-events", "relativePath": "sdk/android/events/overview-events", "sourcePath": "/sdk/android/events/overview-events", @@ -6853,17 +6835,17 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2866, + "sourceIndex": 3333, "contentFile": "content/docs/chat/sdk/android/events/overview-events.mdx", - "navOrder": 273 + "navOrder": 271 }, { - "id": 1497, + "id": 1964, "path": "/sdk/android/logger", "relativePath": "sdk/android/logger", "sourcePath": "/sdk/android/logger", "title": "Logging", - "description": "Configure Android SDK logging, write application diagnostics, and upload logs.", + "description": "Configure Android SDK logging, write application logs, and upload logs.", "product": "sdk", "version": "v4", "platform": "android", @@ -6871,12 +6853,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 2867, + "sourceIndex": 3334, "contentFile": "content/docs/chat/sdk/android/logger.mdx", - "navOrder": 274 + "navOrder": 272 }, { - "id": 864, + "id": 2129, "path": "/sdk/flutter/overview", "relativePath": "sdk/flutter/overview", "sourcePath": "/sdk/flutter/overview", @@ -6889,12 +6871,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "overview", "status": "published", - "sourceIndex": 2235, + "sourceIndex": 3499, "contentFile": "content/docs/chat/sdk/flutter/overview.mdx", "navOrder": 260 }, { - "id": 865, + "id": 2130, "path": "/sdk/flutter/getting-started/before-you-start", "relativePath": "sdk/flutter/getting-started/before-you-start", "sourcePath": "/sdk/flutter/getting-started/before-you-start", @@ -6907,12 +6889,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2236, + "sourceIndex": 3500, "contentFile": "content/docs/chat/sdk/flutter/getting-started/before-you-start.mdx", "navOrder": 261 }, { - "id": 866, + "id": 2131, "path": "/sdk/flutter/getting-started/environment-specific-implementation", "relativePath": "sdk/flutter/getting-started/environment-specific-implementation", "sourcePath": "/sdk/flutter/getting-started/environment-specific-implementation", @@ -6925,12 +6907,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2237, + "sourceIndex": 3501, "contentFile": "content/docs/chat/sdk/flutter/getting-started/environment-specific-implementation.mdx", "navOrder": 262 }, { - "id": 867, + "id": 2132, "path": "/sdk/flutter/getting-started/authenticate-and-manage-session", "relativePath": "sdk/flutter/getting-started/authenticate-and-manage-session", "sourcePath": "/sdk/flutter/getting-started/authenticate-and-manage-session", @@ -6943,12 +6925,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2238, + "sourceIndex": 3502, "contentFile": "content/docs/chat/sdk/flutter/getting-started/authenticate-and-manage-session.mdx", "navOrder": 263 }, { - "id": 868, + "id": 2133, "path": "/sdk/flutter/getting-started/send-first-message", "relativePath": "sdk/flutter/getting-started/send-first-message", "sourcePath": "/sdk/flutter/getting-started/send-first-message", @@ -6961,12 +6943,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2239, + "sourceIndex": 3503, "contentFile": "content/docs/chat/sdk/flutter/getting-started/send-first-message.mdx", "navOrder": 264 }, { - "id": 869, + "id": 2134, "path": "/sdk/flutter/user/overview-user", "relativePath": "sdk/flutter/user/overview-user", "sourcePath": "/sdk/flutter/user/overview-user", @@ -6979,12 +6961,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2240, + "sourceIndex": 3504, "contentFile": "content/docs/chat/sdk/flutter/user/overview-user.mdx", "navOrder": 265 }, { - "id": 870, + "id": 2135, "path": "/sdk/flutter/user/retrieving-users/retrieve-users", "relativePath": "sdk/flutter/user/retrieving-users/retrieve-users", "sourcePath": "/sdk/flutter/user/retrieving-users/retrieve-users", @@ -6997,12 +6979,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2241, + "sourceIndex": 3505, "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-users/retrieve-users.mdx", "navOrder": 266 }, { - "id": 1294, + "id": 2136, "path": "/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile", "relativePath": "sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile", "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile", @@ -7015,12 +6997,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2665, + "sourceIndex": 3506, "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile.mdx", "navOrder": 267 }, { - "id": 1295, + "id": 2137, "path": "/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile", "relativePath": "sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile", "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile", @@ -7033,12 +7015,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2666, + "sourceIndex": 3507, "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile.mdx", "navOrder": 268 }, { - "id": 1333, + "id": 2138, "path": "/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception", "relativePath": "sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception", "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception", @@ -7051,12 +7033,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2704, + "sourceIndex": 3508, "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception.mdx", "navOrder": 269 }, { - "id": 1296, + "id": 2139, "path": "/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status", "relativePath": "sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status", "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status", @@ -7069,12 +7051,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2667, + "sourceIndex": 3509, "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status.mdx", "navOrder": 270 }, { - "id": 1297, + "id": 2140, "path": "/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status", "relativePath": "sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status", "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status", @@ -7087,12 +7069,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2668, + "sourceIndex": 3510, "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status.mdx", "navOrder": 271 }, { - "id": 1298, + "id": 2141, "path": "/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status", "relativePath": "sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status", "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status", @@ -7105,12 +7087,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2669, + "sourceIndex": 3511, "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status.mdx", "navOrder": 272 }, { - "id": 1029, + "id": 2142, "path": "/sdk/flutter/user/friends/get-friend-list-page", "relativePath": "sdk/flutter/user/friends/get-friend-list-page", "sourcePath": "/sdk/flutter/user/friends/get-friend-list-page", @@ -7123,12 +7105,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2400, + "sourceIndex": 3512, "contentFile": "content/docs/chat/sdk/flutter/user/friends/get-friend-list-page.mdx", "navOrder": 273 }, { - "id": 1030, + "id": 2143, "path": "/sdk/flutter/user/friends/search-friends", "relativePath": "sdk/flutter/user/friends/search-friends", "sourcePath": "/sdk/flutter/user/friends/search-friends", @@ -7141,12 +7123,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2401, + "sourceIndex": 3513, "contentFile": "content/docs/chat/sdk/flutter/user/friends/search-friends.mdx", "navOrder": 274 }, { - "id": 1031, + "id": 2144, "path": "/sdk/flutter/user/friends/get-friends-info", "relativePath": "sdk/flutter/user/friends/get-friends-info", "sourcePath": "/sdk/flutter/user/friends/get-friends-info", @@ -7159,12 +7141,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2402, + "sourceIndex": 3514, "contentFile": "content/docs/chat/sdk/flutter/user/friends/get-friends-info.mdx", "navOrder": 275 }, { - "id": 1032, + "id": 2145, "path": "/sdk/flutter/user/friends/check-friend", "relativePath": "sdk/flutter/user/friends/check-friend", "sourcePath": "/sdk/flutter/user/friends/check-friend", @@ -7177,12 +7159,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2403, + "sourceIndex": 3515, "contentFile": "content/docs/chat/sdk/flutter/user/friends/check-friend.mdx", "navOrder": 276 }, { - "id": 1033, + "id": 2146, "path": "/sdk/flutter/user/friends/update-friends", "relativePath": "sdk/flutter/user/friends/update-friends", "sourcePath": "/sdk/flutter/user/friends/update-friends", @@ -7195,12 +7177,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2404, + "sourceIndex": 3516, "contentFile": "content/docs/chat/sdk/flutter/user/friends/update-friends.mdx", "navOrder": 277 }, { - "id": 1034, + "id": 2147, "path": "/sdk/flutter/user/friends/delete-friend", "relativePath": "sdk/flutter/user/friends/delete-friend", "sourcePath": "/sdk/flutter/user/friends/delete-friend", @@ -7213,12 +7195,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2405, + "sourceIndex": 3517, "contentFile": "content/docs/chat/sdk/flutter/user/friends/delete-friend.mdx", "navOrder": 278 }, { - "id": 1036, + "id": 2148, "path": "/sdk/flutter/user/friend-applications/add-friend", "relativePath": "sdk/flutter/user/friend-applications/add-friend", "sourcePath": "/sdk/flutter/user/friend-applications/add-friend", @@ -7231,12 +7213,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2407, + "sourceIndex": 3518, "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/add-friend.mdx", "navOrder": 279 }, { - "id": 1037, + "id": 2149, "path": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient", "relativePath": "sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient", "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient", @@ -7249,12 +7231,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2408, + "sourceIndex": 3519, "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient.mdx", "navOrder": 280 }, { - "id": 1038, + "id": 2150, "path": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant", "relativePath": "sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant", "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant", @@ -7267,12 +7249,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2409, + "sourceIndex": 3520, "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant.mdx", "navOrder": 281 }, { - "id": 1039, + "id": 2151, "path": "/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count", "relativePath": "sdk/flutter/user/friend-applications/get-friend-application-unhandled-count", "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count", @@ -7285,12 +7267,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2410, + "sourceIndex": 3521, "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count.mdx", "navOrder": 282 }, { - "id": 1040, + "id": 2152, "path": "/sdk/flutter/user/friend-applications/accept-friend-application", "relativePath": "sdk/flutter/user/friend-applications/accept-friend-application", "sourcePath": "/sdk/flutter/user/friend-applications/accept-friend-application", @@ -7303,12 +7285,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2411, + "sourceIndex": 3522, "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/accept-friend-application.mdx", "navOrder": 283 }, { - "id": 1041, + "id": 2153, "path": "/sdk/flutter/user/friend-applications/refuse-friend-application", "relativePath": "sdk/flutter/user/friend-applications/refuse-friend-application", "sourcePath": "/sdk/flutter/user/friend-applications/refuse-friend-application", @@ -7321,12 +7303,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2412, + "sourceIndex": 3523, "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/refuse-friend-application.mdx", "navOrder": 284 }, { - "id": 877, + "id": 2154, "path": "/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users", "relativePath": "sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users", "sourcePath": "/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users", @@ -7339,12 +7321,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2248, + "sourceIndex": 3524, "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx", "navOrder": 285 }, { - "id": 1299, + "id": 2155, "path": "/sdk/flutter/user/moderating-a-user/block-user", "relativePath": "sdk/flutter/user/moderating-a-user/block-user", "sourcePath": "/sdk/flutter/user/moderating-a-user/block-user", @@ -7357,12 +7339,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2670, + "sourceIndex": 3525, "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/block-user.mdx", "navOrder": 286 }, { - "id": 1300, + "id": 2156, "path": "/sdk/flutter/user/moderating-a-user/unblock-user", "relativePath": "sdk/flutter/user/moderating-a-user/unblock-user", "sourcePath": "/sdk/flutter/user/moderating-a-user/unblock-user", @@ -7375,12 +7357,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2671, + "sourceIndex": 3526, "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/unblock-user.mdx", "navOrder": 287 }, { - "id": 879, + "id": 2157, "path": "/sdk/flutter/conversation/overview-conversation", "relativePath": "sdk/flutter/conversation/overview-conversation", "sourcePath": "/sdk/flutter/conversation/overview-conversation", @@ -7393,12 +7375,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2250, + "sourceIndex": 3527, "contentFile": "content/docs/chat/sdk/flutter/conversation/overview-conversation.mdx", "navOrder": 288 }, { - "id": 1225, + "id": 2158, "path": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target", "relativePath": "sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target", "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target", @@ -7411,12 +7393,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2596, + "sourceIndex": 3528, "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target.mdx", "navOrder": 289 }, { - "id": 1226, + "id": 2159, "path": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-id", "relativePath": "sdk/flutter/conversation/retrieving-conversations/get-conversation-id", "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-id", @@ -7429,12 +7411,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2597, + "sourceIndex": 3529, "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversation-id.mdx", "navOrder": 290 }, { - "id": 1227, + "id": 2160, "path": "/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id", "relativePath": "sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id", "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id", @@ -7447,12 +7429,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2598, + "sourceIndex": 3530, "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id.mdx", "navOrder": 291 }, { - "id": 881, + "id": 2161, "path": "/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list", "relativePath": "sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list", "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list", @@ -7465,12 +7447,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2252, + "sourceIndex": 3531, "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list.mdx", "navOrder": 292 }, { - "id": 1334, + "id": 2162, "path": "/sdk/flutter/conversation/managing-conversations/pin-conversation", "relativePath": "sdk/flutter/conversation/managing-conversations/pin-conversation", "sourcePath": "/sdk/flutter/conversation/managing-conversations/pin-conversation", @@ -7483,12 +7465,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2705, + "sourceIndex": 3532, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/pin-conversation.mdx", "navOrder": 293 }, { - "id": 1340, + "id": 2163, "path": "/sdk/flutter/conversation/managing-conversations/set-conversation-extension", "relativePath": "sdk/flutter/conversation/managing-conversations/set-conversation-extension", "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-conversation-extension", @@ -7501,12 +7483,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2711, + "sourceIndex": 3533, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-conversation-extension.mdx", "navOrder": 294 }, { - "id": 883, + "id": 2164, "path": "/sdk/flutter/conversation/managing-conversations/set-conversation-draft", "relativePath": "sdk/flutter/conversation/managing-conversations/set-conversation-draft", "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-conversation-draft", @@ -7519,12 +7501,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2254, + "sourceIndex": 3534, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-conversation-draft.mdx", "navOrder": 295 }, { - "id": 1335, + "id": 2165, "path": "/sdk/flutter/conversation/managing-conversations/set-message-receive-option", "relativePath": "sdk/flutter/conversation/managing-conversations/set-message-receive-option", "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-message-receive-option", @@ -7537,12 +7519,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2706, + "sourceIndex": 3535, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-message-receive-option.mdx", "navOrder": 296 }, { - "id": 1339, + "id": 2166, "path": "/sdk/flutter/conversation/managing-conversations/clear-group-mentions", "relativePath": "sdk/flutter/conversation/managing-conversations/clear-group-mentions", "sourcePath": "/sdk/flutter/conversation/managing-conversations/clear-group-mentions", @@ -7555,12 +7537,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2710, + "sourceIndex": 3536, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/clear-group-mentions.mdx", "navOrder": 297 }, { - "id": 1228, + "id": 2167, "path": "/sdk/flutter/conversation/managing-conversations/mark-conversation-read", "relativePath": "sdk/flutter/conversation/managing-conversations/mark-conversation-read", "sourcePath": "/sdk/flutter/conversation/managing-conversations/mark-conversation-read", @@ -7573,12 +7555,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2599, + "sourceIndex": 3537, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/mark-conversation-read.mdx", "navOrder": 298 }, { - "id": 1229, + "id": 2168, "path": "/sdk/flutter/conversation/managing-conversations/get-total-unread-count", "relativePath": "sdk/flutter/conversation/managing-conversations/get-total-unread-count", "sourcePath": "/sdk/flutter/conversation/managing-conversations/get-total-unread-count", @@ -7591,12 +7573,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2600, + "sourceIndex": 3538, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/get-total-unread-count.mdx", "navOrder": 299 }, { - "id": 1336, + "id": 2169, "path": "/sdk/flutter/conversation/managing-conversations/set-private-chat", "relativePath": "sdk/flutter/conversation/managing-conversations/set-private-chat", "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-private-chat", @@ -7609,12 +7591,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2707, + "sourceIndex": 3539, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-private-chat.mdx", "navOrder": 300 }, { - "id": 1337, + "id": 2170, "path": "/sdk/flutter/conversation/managing-conversations/set-burn-duration", "relativePath": "sdk/flutter/conversation/managing-conversations/set-burn-duration", "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-burn-duration", @@ -7627,12 +7609,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2708, + "sourceIndex": 3540, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-burn-duration.mdx", "navOrder": 301 }, { - "id": 1338, + "id": 2171, "path": "/sdk/flutter/conversation/managing-conversations/set-message-destruct", "relativePath": "sdk/flutter/conversation/managing-conversations/set-message-destruct", "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-message-destruct", @@ -7645,12 +7627,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2709, + "sourceIndex": 3541, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-message-destruct.mdx", "navOrder": 302 }, { - "id": 885, + "id": 2172, "path": "/sdk/flutter/conversation/managing-conversations/hide-a-conversation", "relativePath": "sdk/flutter/conversation/managing-conversations/hide-a-conversation", "sourcePath": "/sdk/flutter/conversation/managing-conversations/hide-a-conversation", @@ -7663,12 +7645,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2256, + "sourceIndex": 3542, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/hide-a-conversation.mdx", "navOrder": 303 }, { - "id": 1230, + "id": 2173, "path": "/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages", "relativePath": "sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages", "sourcePath": "/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages", @@ -7681,12 +7663,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2601, + "sourceIndex": 3543, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages.mdx", "navOrder": 304 }, { - "id": 1231, + "id": 2174, "path": "/sdk/flutter/conversation/managing-conversations/clear-conversation-messages", "relativePath": "sdk/flutter/conversation/managing-conversations/clear-conversation-messages", "sourcePath": "/sdk/flutter/conversation/managing-conversations/clear-conversation-messages", @@ -7699,12 +7681,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2602, + "sourceIndex": 3544, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/clear-conversation-messages.mdx", "navOrder": 305 }, { - "id": 887, + "id": 2175, "path": "/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups", "relativePath": "sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups", "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups", @@ -7717,12 +7699,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2258, + "sourceIndex": 3545, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups.mdx", "navOrder": 306 }, { - "id": 888, + "id": 2176, "path": "/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group", "relativePath": "sdk/flutter/conversation/managing-conversation-groups/create-conversation-group", "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group", @@ -7735,12 +7717,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2259, + "sourceIndex": 3546, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group.mdx", "navOrder": 307 }, { - "id": 889, + "id": 2177, "path": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups", "relativePath": "sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups", "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups", @@ -7753,12 +7735,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2260, + "sourceIndex": 3547, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups.mdx", "navOrder": 308 }, { - "id": 890, + "id": 2178, "path": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", "relativePath": "sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", @@ -7771,12 +7753,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2261, + "sourceIndex": 3548, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx", "navOrder": 309 }, { - "id": 891, + "id": 2179, "path": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", "relativePath": "sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", @@ -7789,12 +7771,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2262, + "sourceIndex": 3549, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx", "navOrder": 310 }, { - "id": 892, + "id": 2180, "path": "/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group", "relativePath": "sdk/flutter/conversation/managing-conversation-groups/update-conversation-group", "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group", @@ -7807,12 +7789,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2263, + "sourceIndex": 3550, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group.mdx", "navOrder": 311 }, { - "id": 893, + "id": 2181, "path": "/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order", "relativePath": "sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order", "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order", @@ -7825,12 +7807,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2264, + "sourceIndex": 3551, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order.mdx", "navOrder": 312 }, { - "id": 894, + "id": 2182, "path": "/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups", "relativePath": "sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups", "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups", @@ -7843,12 +7825,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2265, + "sourceIndex": 3552, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups.mdx", "navOrder": 313 }, { - "id": 895, + "id": 2183, "path": "/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups", "relativePath": "sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups", "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups", @@ -7861,12 +7843,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2266, + "sourceIndex": 3553, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx", "navOrder": 314 }, { - "id": 896, + "id": 2184, "path": "/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group", "relativePath": "sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group", "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group", @@ -7879,12 +7861,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2267, + "sourceIndex": 3554, "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group.mdx", "navOrder": 315 }, { - "id": 897, + "id": 2185, "path": "/sdk/flutter/group/overview-group", "relativePath": "sdk/flutter/group/overview-group", "sourcePath": "/sdk/flutter/group/overview-group", @@ -7897,12 +7879,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2268, + "sourceIndex": 3555, "contentFile": "content/docs/chat/sdk/flutter/group/overview-group.mdx", "navOrder": 316 }, { - "id": 1042, + "id": 2186, "path": "/sdk/flutter/group/create-group", "relativePath": "sdk/flutter/group/create-group", "sourcePath": "/sdk/flutter/group/create-group", @@ -7915,12 +7897,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2413, + "sourceIndex": 3556, "contentFile": "content/docs/chat/sdk/flutter/group/create-group.mdx", "navOrder": 317 }, { - "id": 1341, + "id": 2187, "path": "/sdk/flutter/group/update-group-profile", "relativePath": "sdk/flutter/group/update-group-profile", "sourcePath": "/sdk/flutter/group/update-group-profile", @@ -7933,12 +7915,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2712, + "sourceIndex": 3557, "contentFile": "content/docs/chat/sdk/flutter/group/update-group-profile.mdx", "navOrder": 318 }, { - "id": 1342, + "id": 2188, "path": "/sdk/flutter/group/set-group-announcement", "relativePath": "sdk/flutter/group/set-group-announcement", "sourcePath": "/sdk/flutter/group/set-group-announcement", @@ -7951,12 +7933,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2713, + "sourceIndex": 3558, "contentFile": "content/docs/chat/sdk/flutter/group/set-group-announcement.mdx", "navOrder": 319 }, { - "id": 1346, + "id": 2189, "path": "/sdk/flutter/group/set-group-extension", "relativePath": "sdk/flutter/group/set-group-extension", "sourcePath": "/sdk/flutter/group/set-group-extension", @@ -7969,12 +7951,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2717, + "sourceIndex": 3559, "contentFile": "content/docs/chat/sdk/flutter/group/set-group-extension.mdx", "navOrder": 320 }, { - "id": 1343, + "id": 2190, "path": "/sdk/flutter/group/set-group-join-verification", "relativePath": "sdk/flutter/group/set-group-join-verification", "sourcePath": "/sdk/flutter/group/set-group-join-verification", @@ -7987,12 +7969,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2714, + "sourceIndex": 3560, "contentFile": "content/docs/chat/sdk/flutter/group/set-group-join-verification.mdx", "navOrder": 321 }, { - "id": 1344, + "id": 2191, "path": "/sdk/flutter/group/set-group-member-profile-access", "relativePath": "sdk/flutter/group/set-group-member-profile-access", "sourcePath": "/sdk/flutter/group/set-group-member-profile-access", @@ -8005,12 +7987,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2715, + "sourceIndex": 3561, "contentFile": "content/docs/chat/sdk/flutter/group/set-group-member-profile-access.mdx", "navOrder": 322 }, { - "id": 1345, + "id": 2192, "path": "/sdk/flutter/group/set-group-member-friend-permission", "relativePath": "sdk/flutter/group/set-group-member-friend-permission", "sourcePath": "/sdk/flutter/group/set-group-member-friend-permission", @@ -8023,12 +8005,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2716, + "sourceIndex": 3562, "contentFile": "content/docs/chat/sdk/flutter/group/set-group-member-friend-permission.mdx", "navOrder": 323 }, { - "id": 1047, + "id": 2193, "path": "/sdk/flutter/group/change-group-mute", "relativePath": "sdk/flutter/group/change-group-mute", "sourcePath": "/sdk/flutter/group/change-group-mute", @@ -8041,12 +8023,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2418, + "sourceIndex": 3563, "contentFile": "content/docs/chat/sdk/flutter/group/change-group-mute.mdx", "navOrder": 324 }, { - "id": 1044, + "id": 2194, "path": "/sdk/flutter/group/join-group", "relativePath": "sdk/flutter/group/join-group", "sourcePath": "/sdk/flutter/group/join-group", @@ -8059,12 +8041,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2415, + "sourceIndex": 3564, "contentFile": "content/docs/chat/sdk/flutter/group/join-group.mdx", "navOrder": 325 }, { - "id": 1045, + "id": 2195, "path": "/sdk/flutter/group/quit-group", "relativePath": "sdk/flutter/group/quit-group", "sourcePath": "/sdk/flutter/group/quit-group", @@ -8077,12 +8059,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2416, + "sourceIndex": 3565, "contentFile": "content/docs/chat/sdk/flutter/group/quit-group.mdx", "navOrder": 326 }, { - "id": 1046, + "id": 2196, "path": "/sdk/flutter/group/dismiss-group", "relativePath": "sdk/flutter/group/dismiss-group", "sourcePath": "/sdk/flutter/group/dismiss-group", @@ -8095,12 +8077,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2417, + "sourceIndex": 3566, "contentFile": "content/docs/chat/sdk/flutter/group/dismiss-group.mdx", "navOrder": 327 }, { - "id": 1049, + "id": 2197, "path": "/sdk/flutter/group/retrieving-groups/get-specified-groups-info", "relativePath": "sdk/flutter/group/retrieving-groups/get-specified-groups-info", "sourcePath": "/sdk/flutter/group/retrieving-groups/get-specified-groups-info", @@ -8113,12 +8095,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2420, + "sourceIndex": 3567, "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-specified-groups-info.mdx", "navOrder": 328 }, { - "id": 1050, + "id": 2198, "path": "/sdk/flutter/group/retrieving-groups/get-joined-group-list", "relativePath": "sdk/flutter/group/retrieving-groups/get-joined-group-list", "sourcePath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list", @@ -8131,12 +8113,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2421, + "sourceIndex": 3568, "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-joined-group-list.mdx", "navOrder": 329 }, { - "id": 1051, + "id": 2199, "path": "/sdk/flutter/group/retrieving-groups/get-joined-group-list-page", "relativePath": "sdk/flutter/group/retrieving-groups/get-joined-group-list-page", "sourcePath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list-page", @@ -8149,12 +8131,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2422, + "sourceIndex": 3569, "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-joined-group-list-page.mdx", "navOrder": 330 }, { - "id": 1052, + "id": 2200, "path": "/sdk/flutter/group/retrieving-groups/is-join-group", "relativePath": "sdk/flutter/group/retrieving-groups/is-join-group", "sourcePath": "/sdk/flutter/group/retrieving-groups/is-join-group", @@ -8167,12 +8149,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2423, + "sourceIndex": 3570, "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/is-join-group.mdx", "navOrder": 331 }, { - "id": 1053, + "id": 2201, "path": "/sdk/flutter/group/retrieving-groups/search-groups", "relativePath": "sdk/flutter/group/retrieving-groups/search-groups", "sourcePath": "/sdk/flutter/group/retrieving-groups/search-groups", @@ -8185,12 +8167,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2424, + "sourceIndex": 3571, "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/search-groups.mdx", "navOrder": 332 }, { - "id": 1054, + "id": 2202, "path": "/sdk/flutter/group/group-applications/overview-group-applications", "relativePath": "sdk/flutter/group/group-applications/overview-group-applications", "sourcePath": "/sdk/flutter/group/group-applications/overview-group-applications", @@ -8203,12 +8185,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2425, + "sourceIndex": 3572, "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/overview-group-applications.mdx", "navOrder": 333 }, { - "id": 1055, + "id": 2203, "path": "/sdk/flutter/group/group-applications/get-group-application-list-as-recipient", "relativePath": "sdk/flutter/group/group-applications/get-group-application-list-as-recipient", "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-list-as-recipient", @@ -8221,12 +8203,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2426, + "sourceIndex": 3573, "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-list-as-recipient.mdx", "navOrder": 334 }, { - "id": 1056, + "id": 2204, "path": "/sdk/flutter/group/group-applications/get-group-application-list-as-applicant", "relativePath": "sdk/flutter/group/group-applications/get-group-application-list-as-applicant", "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-list-as-applicant", @@ -8239,12 +8221,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2427, + "sourceIndex": 3574, "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-list-as-applicant.mdx", "navOrder": 335 }, { - "id": 1057, + "id": 2205, "path": "/sdk/flutter/group/group-applications/get-group-application-unhandled-count", "relativePath": "sdk/flutter/group/group-applications/get-group-application-unhandled-count", "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-unhandled-count", @@ -8257,12 +8239,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2428, + "sourceIndex": 3575, "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-unhandled-count.mdx", "navOrder": 336 }, { - "id": 1058, + "id": 2206, "path": "/sdk/flutter/group/group-applications/accept-group-application", "relativePath": "sdk/flutter/group/group-applications/accept-group-application", "sourcePath": "/sdk/flutter/group/group-applications/accept-group-application", @@ -8275,12 +8257,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2429, + "sourceIndex": 3576, "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/accept-group-application.mdx", "navOrder": 337 }, { - "id": 1059, + "id": 2207, "path": "/sdk/flutter/group/group-applications/refuse-group-application", "relativePath": "sdk/flutter/group/group-applications/refuse-group-application", "sourcePath": "/sdk/flutter/group/group-applications/refuse-group-application", @@ -8293,12 +8275,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2430, + "sourceIndex": 3577, "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/refuse-group-application.mdx", "navOrder": 338 }, { - "id": 1060, + "id": 2208, "path": "/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members", "relativePath": "sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members", "sourcePath": "/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members", @@ -8311,12 +8293,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2431, + "sourceIndex": 3578, "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members.mdx", "navOrder": 339 }, { - "id": 1061, + "id": 2209, "path": "/sdk/flutter/group/retrieving-group-members/get-group-member-list", "relativePath": "sdk/flutter/group/retrieving-group-members/get-group-member-list", "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-member-list", @@ -8329,12 +8311,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2432, + "sourceIndex": 3579, "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-member-list.mdx", "navOrder": 340 }, { - "id": 1062, + "id": 2210, "path": "/sdk/flutter/group/retrieving-group-members/get-group-members-info", "relativePath": "sdk/flutter/group/retrieving-group-members/get-group-members-info", "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-members-info", @@ -8347,12 +8329,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2433, + "sourceIndex": 3580, "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-members-info.mdx", "navOrder": 341 }, { - "id": 1063, + "id": 2211, "path": "/sdk/flutter/group/retrieving-group-members/get-users-in-group", "relativePath": "sdk/flutter/group/retrieving-group-members/get-users-in-group", "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-users-in-group", @@ -8365,12 +8347,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2434, + "sourceIndex": 3581, "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-users-in-group.mdx", "navOrder": 342 }, { - "id": 1064, + "id": 2212, "path": "/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin", "relativePath": "sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin", "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin", @@ -8383,12 +8365,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2435, + "sourceIndex": 3582, "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin.mdx", "navOrder": 343 }, { - "id": 1065, + "id": 2213, "path": "/sdk/flutter/group/retrieving-group-members/search-group-members", "relativePath": "sdk/flutter/group/retrieving-group-members/search-group-members", "sourcePath": "/sdk/flutter/group/retrieving-group-members/search-group-members", @@ -8401,12 +8383,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2436, + "sourceIndex": 3583, "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/search-group-members.mdx", "navOrder": 344 }, { - "id": 1067, + "id": 2214, "path": "/sdk/flutter/group/managing-group-members/invite-user-to-group", "relativePath": "sdk/flutter/group/managing-group-members/invite-user-to-group", "sourcePath": "/sdk/flutter/group/managing-group-members/invite-user-to-group", @@ -8419,12 +8401,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2438, + "sourceIndex": 3584, "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/invite-user-to-group.mdx", "navOrder": 345 }, { - "id": 1068, + "id": 2215, "path": "/sdk/flutter/group/managing-group-members/kick-group-member", "relativePath": "sdk/flutter/group/managing-group-members/kick-group-member", "sourcePath": "/sdk/flutter/group/managing-group-members/kick-group-member", @@ -8437,12 +8419,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2439, + "sourceIndex": 3585, "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/kick-group-member.mdx", "navOrder": 346 }, { - "id": 1347, + "id": 2216, "path": "/sdk/flutter/group/managing-group-members/set-group-member-nickname", "relativePath": "sdk/flutter/group/managing-group-members/set-group-member-nickname", "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-nickname", @@ -8455,12 +8437,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2718, + "sourceIndex": 3586, "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-nickname.mdx", "navOrder": 347 }, { - "id": 1348, + "id": 2217, "path": "/sdk/flutter/group/managing-group-members/set-group-member-role-level", "relativePath": "sdk/flutter/group/managing-group-members/set-group-member-role-level", "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-role-level", @@ -8473,12 +8455,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2719, + "sourceIndex": 3587, "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-role-level.mdx", "navOrder": 348 }, { - "id": 1349, + "id": 2218, "path": "/sdk/flutter/group/managing-group-members/set-group-member-avatar", "relativePath": "sdk/flutter/group/managing-group-members/set-group-member-avatar", "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-avatar", @@ -8491,12 +8473,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2720, + "sourceIndex": 3588, "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-avatar.mdx", "navOrder": 349 }, { - "id": 1350, + "id": 2219, "path": "/sdk/flutter/group/managing-group-members/set-group-member-extension", "relativePath": "sdk/flutter/group/managing-group-members/set-group-member-extension", "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-extension", @@ -8509,12 +8491,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2721, + "sourceIndex": 3589, "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-extension.mdx", "navOrder": 350 }, { - "id": 905, + "id": 2220, "path": "/sdk/flutter/group/managing-group-members/transfer-group-owner", "relativePath": "sdk/flutter/group/managing-group-members/transfer-group-owner", "sourcePath": "/sdk/flutter/group/managing-group-members/transfer-group-owner", @@ -8527,12 +8509,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2276, + "sourceIndex": 3590, "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/transfer-group-owner.mdx", "navOrder": 351 }, { - "id": 1070, + "id": 2221, "path": "/sdk/flutter/group/managing-group-members/change-group-member-mute", "relativePath": "sdk/flutter/group/managing-group-members/change-group-member-mute", "sourcePath": "/sdk/flutter/group/managing-group-members/change-group-member-mute", @@ -8545,12 +8527,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2441, + "sourceIndex": 3591, "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/change-group-member-mute.mdx", "navOrder": 352 }, { - "id": 907, + "id": 2222, "path": "/sdk/flutter/message/overview-message", "relativePath": "sdk/flutter/message/overview-message", "sourcePath": "/sdk/flutter/message/overview-message", @@ -8563,12 +8545,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2278, + "sourceIndex": 3592, "contentFile": "content/docs/chat/sdk/flutter/message/overview-message.mdx", "navOrder": 353 }, { - "id": 1143, + "id": 2223, "path": "/sdk/flutter/message/creating-messages/create-text-message", "relativePath": "sdk/flutter/message/creating-messages/create-text-message", "sourcePath": "/sdk/flutter/message/creating-messages/create-text-message", @@ -8581,12 +8563,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2514, + "sourceIndex": 3593, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-text-message.mdx", "navOrder": 354 }, { - "id": 1144, + "id": 2224, "path": "/sdk/flutter/message/creating-messages/create-text-at-message", "relativePath": "sdk/flutter/message/creating-messages/create-text-at-message", "sourcePath": "/sdk/flutter/message/creating-messages/create-text-at-message", @@ -8599,12 +8581,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2515, + "sourceIndex": 3594, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-text-at-message.mdx", "navOrder": 355 }, { - "id": 1145, + "id": 2225, "path": "/sdk/flutter/message/creating-messages/create-custom-message", "relativePath": "sdk/flutter/message/creating-messages/create-custom-message", "sourcePath": "/sdk/flutter/message/creating-messages/create-custom-message", @@ -8617,12 +8599,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2516, + "sourceIndex": 3595, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-custom-message.mdx", "navOrder": 356 }, { - "id": 1146, + "id": 2226, "path": "/sdk/flutter/message/creating-messages/create-image-message", "relativePath": "sdk/flutter/message/creating-messages/create-image-message", "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message", @@ -8635,12 +8617,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2517, + "sourceIndex": 3596, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message.mdx", "navOrder": 357 }, { - "id": 1147, + "id": 2227, "path": "/sdk/flutter/message/creating-messages/create-image-message-from-full-path", "relativePath": "sdk/flutter/message/creating-messages/create-image-message-from-full-path", "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message-from-full-path", @@ -8653,12 +8635,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2518, + "sourceIndex": 3597, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message-from-full-path.mdx", "navOrder": 358 }, { - "id": 1148, + "id": 2228, "path": "/sdk/flutter/message/creating-messages/create-image-message-by-url", "relativePath": "sdk/flutter/message/creating-messages/create-image-message-by-url", "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message-by-url", @@ -8671,12 +8653,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2519, + "sourceIndex": 3598, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message-by-url.mdx", "navOrder": 359 }, { - "id": 1149, + "id": 2229, "path": "/sdk/flutter/message/creating-messages/create-sound-message", "relativePath": "sdk/flutter/message/creating-messages/create-sound-message", "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message", @@ -8689,12 +8671,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2520, + "sourceIndex": 3599, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message.mdx", "navOrder": 360 }, { - "id": 1150, + "id": 2230, "path": "/sdk/flutter/message/creating-messages/create-sound-message-from-full-path", "relativePath": "sdk/flutter/message/creating-messages/create-sound-message-from-full-path", "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message-from-full-path", @@ -8707,12 +8689,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2521, + "sourceIndex": 3600, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message-from-full-path.mdx", "navOrder": 361 }, { - "id": 1151, + "id": 2231, "path": "/sdk/flutter/message/creating-messages/create-sound-message-by-url", "relativePath": "sdk/flutter/message/creating-messages/create-sound-message-by-url", "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message-by-url", @@ -8725,12 +8707,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2522, + "sourceIndex": 3601, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message-by-url.mdx", "navOrder": 362 }, { - "id": 1152, + "id": 2232, "path": "/sdk/flutter/message/creating-messages/create-video-message", "relativePath": "sdk/flutter/message/creating-messages/create-video-message", "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message", @@ -8743,12 +8725,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2523, + "sourceIndex": 3602, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message.mdx", "navOrder": 363 }, { - "id": 1153, + "id": 2233, "path": "/sdk/flutter/message/creating-messages/create-video-message-from-full-path", "relativePath": "sdk/flutter/message/creating-messages/create-video-message-from-full-path", "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message-from-full-path", @@ -8761,12 +8743,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2524, + "sourceIndex": 3603, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message-from-full-path.mdx", "navOrder": 364 }, { - "id": 1154, + "id": 2234, "path": "/sdk/flutter/message/creating-messages/create-video-message-by-url", "relativePath": "sdk/flutter/message/creating-messages/create-video-message-by-url", "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message-by-url", @@ -8779,12 +8761,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2525, + "sourceIndex": 3604, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message-by-url.mdx", "navOrder": 365 }, { - "id": 1155, + "id": 2235, "path": "/sdk/flutter/message/creating-messages/create-file-message", "relativePath": "sdk/flutter/message/creating-messages/create-file-message", "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message", @@ -8797,12 +8779,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2526, + "sourceIndex": 3605, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message.mdx", "navOrder": 366 }, { - "id": 1156, + "id": 2236, "path": "/sdk/flutter/message/creating-messages/create-file-message-from-full-path", "relativePath": "sdk/flutter/message/creating-messages/create-file-message-from-full-path", "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message-from-full-path", @@ -8815,12 +8797,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2527, + "sourceIndex": 3606, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message-from-full-path.mdx", "navOrder": 367 }, { - "id": 1157, + "id": 2237, "path": "/sdk/flutter/message/creating-messages/create-file-message-by-url", "relativePath": "sdk/flutter/message/creating-messages/create-file-message-by-url", "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message-by-url", @@ -8833,12 +8815,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2528, + "sourceIndex": 3607, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message-by-url.mdx", "navOrder": 368 }, { - "id": 1158, + "id": 2238, "path": "/sdk/flutter/message/creating-messages/create-location-message", "relativePath": "sdk/flutter/message/creating-messages/create-location-message", "sourcePath": "/sdk/flutter/message/creating-messages/create-location-message", @@ -8851,12 +8833,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2529, + "sourceIndex": 3608, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-location-message.mdx", "navOrder": 369 }, { - "id": 1159, + "id": 2239, "path": "/sdk/flutter/message/creating-messages/create-card-message", "relativePath": "sdk/flutter/message/creating-messages/create-card-message", "sourcePath": "/sdk/flutter/message/creating-messages/create-card-message", @@ -8869,12 +8851,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2530, + "sourceIndex": 3609, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-card-message.mdx", "navOrder": 370 }, { - "id": 1160, + "id": 2240, "path": "/sdk/flutter/message/creating-messages/create-face-message", "relativePath": "sdk/flutter/message/creating-messages/create-face-message", "sourcePath": "/sdk/flutter/message/creating-messages/create-face-message", @@ -8887,12 +8869,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2531, + "sourceIndex": 3610, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-face-message.mdx", "navOrder": 371 }, { - "id": 1161, + "id": 2241, "path": "/sdk/flutter/message/creating-messages/create-quote-message", "relativePath": "sdk/flutter/message/creating-messages/create-quote-message", "sourcePath": "/sdk/flutter/message/creating-messages/create-quote-message", @@ -8905,12 +8887,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2532, + "sourceIndex": 3611, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-quote-message.mdx", "navOrder": 372 }, { - "id": 1162, + "id": 2242, "path": "/sdk/flutter/message/creating-messages/create-advanced-text-message", "relativePath": "sdk/flutter/message/creating-messages/create-advanced-text-message", "sourcePath": "/sdk/flutter/message/creating-messages/create-advanced-text-message", @@ -8923,12 +8905,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2533, + "sourceIndex": 3612, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-advanced-text-message.mdx", "navOrder": 373 }, { - "id": 1163, + "id": 2243, "path": "/sdk/flutter/message/creating-messages/create-advanced-quote-message", "relativePath": "sdk/flutter/message/creating-messages/create-advanced-quote-message", "sourcePath": "/sdk/flutter/message/creating-messages/create-advanced-quote-message", @@ -8941,12 +8923,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2534, + "sourceIndex": 3613, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-advanced-quote-message.mdx", "navOrder": 374 }, { - "id": 1164, + "id": 2244, "path": "/sdk/flutter/message/creating-messages/create-forward-message", "relativePath": "sdk/flutter/message/creating-messages/create-forward-message", "sourcePath": "/sdk/flutter/message/creating-messages/create-forward-message", @@ -8959,12 +8941,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2535, + "sourceIndex": 3614, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-forward-message.mdx", "navOrder": 375 }, { - "id": 1165, + "id": 2245, "path": "/sdk/flutter/message/creating-messages/create-merger-message", "relativePath": "sdk/flutter/message/creating-messages/create-merger-message", "sourcePath": "/sdk/flutter/message/creating-messages/create-merger-message", @@ -8977,12 +8959,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2536, + "sourceIndex": 3615, "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-merger-message.mdx", "navOrder": 376 }, { - "id": 1166, + "id": 2246, "path": "/sdk/flutter/message/sending-messages/send-message", "relativePath": "sdk/flutter/message/sending-messages/send-message", "sourcePath": "/sdk/flutter/message/sending-messages/send-message", @@ -8995,12 +8977,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2537, + "sourceIndex": 3616, "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/send-message.mdx", "navOrder": 377 }, { - "id": 1167, + "id": 2247, "path": "/sdk/flutter/message/sending-messages/send-message-not-oss", "relativePath": "sdk/flutter/message/sending-messages/send-message-not-oss", "sourcePath": "/sdk/flutter/message/sending-messages/send-message-not-oss", @@ -9013,12 +8995,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2538, + "sourceIndex": 3617, "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/send-message-not-oss.mdx", "navOrder": 378 }, { - "id": 1087, + "id": 2248, "path": "/sdk/flutter/message/sending-messages/set-msg-send-progress-listener", "relativePath": "sdk/flutter/message/sending-messages/set-msg-send-progress-listener", "sourcePath": "/sdk/flutter/message/sending-messages/set-msg-send-progress-listener", @@ -9031,12 +9013,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2458, + "sourceIndex": 3618, "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/set-msg-send-progress-listener.mdx", "navOrder": 379 }, { - "id": 911, + "id": 2249, "path": "/sdk/flutter/message/receiving-messages/receive-messages", "relativePath": "sdk/flutter/message/receiving-messages/receive-messages", "sourcePath": "/sdk/flutter/message/receiving-messages/receive-messages", @@ -9049,12 +9031,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2282, + "sourceIndex": 3619, "contentFile": "content/docs/chat/sdk/flutter/message/receiving-messages/receive-messages.mdx", "navOrder": 380 }, { - "id": 1168, + "id": 2250, "path": "/sdk/flutter/message/receiving-messages/custom-business-listener", "relativePath": "sdk/flutter/message/receiving-messages/custom-business-listener", "sourcePath": "/sdk/flutter/message/receiving-messages/custom-business-listener", @@ -9067,12 +9049,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2539, + "sourceIndex": 3620, "contentFile": "content/docs/chat/sdk/flutter/message/receiving-messages/custom-business-listener.mdx", "navOrder": 381 }, { - "id": 1241, + "id": 2251, "path": "/sdk/flutter/message/retrieving-messages/load-older-messages", "relativePath": "sdk/flutter/message/retrieving-messages/load-older-messages", "sourcePath": "/sdk/flutter/message/retrieving-messages/load-older-messages", @@ -9085,12 +9067,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2612, + "sourceIndex": 3621, "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/load-older-messages.mdx", "navOrder": 382 }, { - "id": 1242, + "id": 2252, "path": "/sdk/flutter/message/retrieving-messages/load-newer-messages", "relativePath": "sdk/flutter/message/retrieving-messages/load-newer-messages", "sourcePath": "/sdk/flutter/message/retrieving-messages/load-newer-messages", @@ -9103,12 +9085,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2613, + "sourceIndex": 3622, "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/load-newer-messages.mdx", "navOrder": 383 }, { - "id": 913, + "id": 2253, "path": "/sdk/flutter/message/retrieving-messages/locate-messages-by-id", "relativePath": "sdk/flutter/message/retrieving-messages/locate-messages-by-id", "sourcePath": "/sdk/flutter/message/retrieving-messages/locate-messages-by-id", @@ -9121,12 +9103,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2284, + "sourceIndex": 3623, "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/locate-messages-by-id.mdx", "navOrder": 384 }, { - "id": 914, + "id": 2254, "path": "/sdk/flutter/message/searching-messages/search-messages", "relativePath": "sdk/flutter/message/searching-messages/search-messages", "sourcePath": "/sdk/flutter/message/searching-messages/search-messages", @@ -9139,12 +9121,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2285, + "sourceIndex": 3624, "contentFile": "content/docs/chat/sdk/flutter/message/searching-messages/search-messages.mdx", "navOrder": 385 }, { - "id": 1247, + "id": 2255, "path": "/sdk/flutter/message/composing-messages/update-typing-status", "relativePath": "sdk/flutter/message/composing-messages/update-typing-status", "sourcePath": "/sdk/flutter/message/composing-messages/update-typing-status", @@ -9157,12 +9139,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2618, + "sourceIndex": 3625, "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/update-typing-status.mdx", "navOrder": 386 }, { - "id": 1248, + "id": 2256, "path": "/sdk/flutter/message/composing-messages/get-typing-status", "relativePath": "sdk/flutter/message/composing-messages/get-typing-status", "sourcePath": "/sdk/flutter/message/composing-messages/get-typing-status", @@ -9175,12 +9157,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2619, + "sourceIndex": 3626, "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/get-typing-status.mdx", "navOrder": 387 }, { - "id": 1271, + "id": 2257, "path": "/sdk/flutter/message/composing-messages/check-speech-to-text", "relativePath": "sdk/flutter/message/composing-messages/check-speech-to-text", "sourcePath": "/sdk/flutter/message/composing-messages/check-speech-to-text", @@ -9193,12 +9175,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2642, + "sourceIndex": 3627, "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/check-speech-to-text.mdx", "navOrder": 388 }, { - "id": 918, + "id": 2258, "path": "/sdk/flutter/message/composing-messages/transcribe-audio", "relativePath": "sdk/flutter/message/composing-messages/transcribe-audio", "sourcePath": "/sdk/flutter/message/composing-messages/transcribe-audio", @@ -9211,12 +9193,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2289, + "sourceIndex": 3628, "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/transcribe-audio.mdx", "navOrder": 389 }, { - "id": 1272, + "id": 2259, "path": "/sdk/flutter/message/composing-messages/save-local-transcript", "relativePath": "sdk/flutter/message/composing-messages/save-local-transcript", "sourcePath": "/sdk/flutter/message/composing-messages/save-local-transcript", @@ -9229,12 +9211,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2643, + "sourceIndex": 3629, "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/save-local-transcript.mdx", "navOrder": 390 }, { - "id": 1301, + "id": 2260, "path": "/sdk/flutter/message/managing-messages/delete-local-message", "relativePath": "sdk/flutter/message/managing-messages/delete-local-message", "sourcePath": "/sdk/flutter/message/managing-messages/delete-local-message", @@ -9247,12 +9229,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2672, + "sourceIndex": 3630, "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/delete-local-message.mdx", "navOrder": 391 }, { - "id": 1302, + "id": 2261, "path": "/sdk/flutter/message/managing-messages/delete-saved-message", "relativePath": "sdk/flutter/message/managing-messages/delete-saved-message", "sourcePath": "/sdk/flutter/message/managing-messages/delete-saved-message", @@ -9265,12 +9247,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2673, + "sourceIndex": 3631, "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/delete-saved-message.mdx", "navOrder": 392 }, { - "id": 921, + "id": 2262, "path": "/sdk/flutter/message/managing-messages/revoke-a-message", "relativePath": "sdk/flutter/message/managing-messages/revoke-a-message", "sourcePath": "/sdk/flutter/message/managing-messages/revoke-a-message", @@ -9283,12 +9265,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2292, + "sourceIndex": 3632, "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/revoke-a-message.mdx", "navOrder": 393 }, { - "id": 922, + "id": 2263, "path": "/sdk/flutter/message/managing-messages/modify-a-message", "relativePath": "sdk/flutter/message/managing-messages/modify-a-message", "sourcePath": "/sdk/flutter/message/managing-messages/modify-a-message", @@ -9301,12 +9283,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2293, + "sourceIndex": 3633, "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/modify-a-message.mdx", "navOrder": 394 }, { - "id": 1261, + "id": 2264, "path": "/sdk/flutter/message/managing-messages/get-pinned-messages", "relativePath": "sdk/flutter/message/managing-messages/get-pinned-messages", "sourcePath": "/sdk/flutter/message/managing-messages/get-pinned-messages", @@ -9319,12 +9301,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2632, + "sourceIndex": 3634, "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/get-pinned-messages.mdx", "navOrder": 395 }, { - "id": 1262, + "id": 2265, "path": "/sdk/flutter/message/managing-messages/set-message-pinned", "relativePath": "sdk/flutter/message/managing-messages/set-message-pinned", "sourcePath": "/sdk/flutter/message/managing-messages/set-message-pinned", @@ -9337,12 +9319,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2633, + "sourceIndex": 3635, "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/set-message-pinned.mdx", "navOrder": 396 }, { - "id": 1263, + "id": 2266, "path": "/sdk/flutter/message/managing-messages/insert-local-single-message", "relativePath": "sdk/flutter/message/managing-messages/insert-local-single-message", "sourcePath": "/sdk/flutter/message/managing-messages/insert-local-single-message", @@ -9355,12 +9337,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2634, + "sourceIndex": 3636, "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/insert-local-single-message.mdx", "navOrder": 397 }, { - "id": 1264, + "id": 2267, "path": "/sdk/flutter/message/managing-messages/insert-local-group-message", "relativePath": "sdk/flutter/message/managing-messages/insert-local-group-message", "sourcePath": "/sdk/flutter/message/managing-messages/insert-local-group-message", @@ -9373,12 +9355,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2635, + "sourceIndex": 3637, "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/insert-local-group-message.mdx", "navOrder": 398 }, { - "id": 1265, + "id": 2268, "path": "/sdk/flutter/message/managing-messages/clear-all-local-messages", "relativePath": "sdk/flutter/message/managing-messages/clear-all-local-messages", "sourcePath": "/sdk/flutter/message/managing-messages/clear-all-local-messages", @@ -9391,12 +9373,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2636, + "sourceIndex": 3638, "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/clear-all-local-messages.mdx", "navOrder": 399 }, { - "id": 1266, + "id": 2269, "path": "/sdk/flutter/message/managing-messages/clear-all-messages", "relativePath": "sdk/flutter/message/managing-messages/clear-all-messages", "sourcePath": "/sdk/flutter/message/managing-messages/clear-all-messages", @@ -9409,12 +9391,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2637, + "sourceIndex": 3639, "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/clear-all-messages.mdx", "navOrder": 400 }, { - "id": 1169, + "id": 2270, "path": "/sdk/flutter/message/managing-messages/set-message-local-ex", "relativePath": "sdk/flutter/message/managing-messages/set-message-local-ex", "sourcePath": "/sdk/flutter/message/managing-messages/set-message-local-ex", @@ -9427,12 +9409,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2540, + "sourceIndex": 3640, "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/set-message-local-ex.mdx", "navOrder": 401 }, { - "id": 1089, + "id": 2271, "path": "/sdk/flutter/file-uploads/set-upload-file-listener", "relativePath": "sdk/flutter/file-uploads/set-upload-file-listener", "sourcePath": "/sdk/flutter/file-uploads/set-upload-file-listener", @@ -9445,12 +9427,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2460, + "sourceIndex": 3641, "contentFile": "content/docs/chat/sdk/flutter/file-uploads/set-upload-file-listener.mdx", "navOrder": 402 }, { - "id": 1090, + "id": 2272, "path": "/sdk/flutter/file-uploads/upload-file", "relativePath": "sdk/flutter/file-uploads/upload-file", "sourcePath": "/sdk/flutter/file-uploads/upload-file", @@ -9463,12 +9445,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2461, + "sourceIndex": 3642, "contentFile": "content/docs/chat/sdk/flutter/file-uploads/upload-file.mdx", "navOrder": 403 }, { - "id": 927, + "id": 2273, "path": "/sdk/flutter/calling/overview-calling", "relativePath": "sdk/flutter/calling/overview-calling", "sourcePath": "/sdk/flutter/calling/overview-calling", @@ -9481,12 +9463,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2298, + "sourceIndex": 3643, "contentFile": "content/docs/chat/sdk/flutter/calling/overview-calling.mdx", "navOrder": 404 }, { - "id": 1190, + "id": 2274, "path": "/sdk/flutter/calling/managing-calls/start-single-call", "relativePath": "sdk/flutter/calling/managing-calls/start-single-call", "sourcePath": "/sdk/flutter/calling/managing-calls/start-single-call", @@ -9499,12 +9481,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2561, + "sourceIndex": 3644, "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/start-single-call.mdx", "navOrder": 405 }, { - "id": 1191, + "id": 2275, "path": "/sdk/flutter/calling/managing-calls/start-group-call", "relativePath": "sdk/flutter/calling/managing-calls/start-group-call", "sourcePath": "/sdk/flutter/calling/managing-calls/start-group-call", @@ -9517,12 +9499,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2562, + "sourceIndex": 3645, "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/start-group-call.mdx", "navOrder": 406 }, { - "id": 1192, + "id": 2276, "path": "/sdk/flutter/calling/managing-calls/accept-call", "relativePath": "sdk/flutter/calling/managing-calls/accept-call", "sourcePath": "/sdk/flutter/calling/managing-calls/accept-call", @@ -9535,12 +9517,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2563, + "sourceIndex": 3646, "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/accept-call.mdx", "navOrder": 407 }, { - "id": 1193, + "id": 2277, "path": "/sdk/flutter/calling/managing-calls/reject-call", "relativePath": "sdk/flutter/calling/managing-calls/reject-call", "sourcePath": "/sdk/flutter/calling/managing-calls/reject-call", @@ -9553,12 +9535,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2564, + "sourceIndex": 3647, "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/reject-call.mdx", "navOrder": 408 }, { - "id": 1194, + "id": 2278, "path": "/sdk/flutter/calling/managing-calls/cancel-call", "relativePath": "sdk/flutter/calling/managing-calls/cancel-call", "sourcePath": "/sdk/flutter/calling/managing-calls/cancel-call", @@ -9571,12 +9553,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2565, + "sourceIndex": 3648, "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/cancel-call.mdx", "navOrder": 409 }, { - "id": 1195, + "id": 2279, "path": "/sdk/flutter/calling/managing-calls/hang-up-call", "relativePath": "sdk/flutter/calling/managing-calls/hang-up-call", "sourcePath": "/sdk/flutter/calling/managing-calls/hang-up-call", @@ -9589,12 +9571,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2566, + "sourceIndex": 3649, "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/hang-up-call.mdx", "navOrder": 410 }, { - "id": 1196, + "id": 2280, "path": "/sdk/flutter/calling/managing-calls/handle-call-events", "relativePath": "sdk/flutter/calling/managing-calls/handle-call-events", "sourcePath": "/sdk/flutter/calling/managing-calls/handle-call-events", @@ -9607,12 +9589,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2567, + "sourceIndex": 3650, "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/handle-call-events.mdx", "navOrder": 411 }, { - "id": 1197, + "id": 2281, "path": "/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation", "relativePath": "sdk/flutter/calling/retrieving-call-information/restore-pending-invitation", "sourcePath": "/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation", @@ -9625,12 +9607,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2568, + "sourceIndex": 3651, "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation.mdx", "navOrder": 412 }, { - "id": 1198, + "id": 2282, "path": "/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id", "relativePath": "sdk/flutter/calling/retrieving-call-information/get-room-by-group-id", "sourcePath": "/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id", @@ -9643,12 +9625,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2569, + "sourceIndex": 3652, "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id.mdx", "navOrder": 413 }, { - "id": 1199, + "id": 2283, "path": "/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id", "relativePath": "sdk/flutter/calling/retrieving-call-information/get-token-by-room-id", "sourcePath": "/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id", @@ -9661,12 +9643,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2570, + "sourceIndex": 3653, "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id.mdx", "navOrder": 414 }, { - "id": 930, + "id": 2284, "path": "/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal", "relativePath": "sdk/flutter/calling/sending-custom-signals/send-a-custom-signal", "sourcePath": "/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal", @@ -9679,12 +9661,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2301, + "sourceIndex": 3654, "contentFile": "content/docs/chat/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal.mdx", "navOrder": 415 }, { - "id": 931, + "id": 2285, "path": "/sdk/flutter/events/overview-events", "relativePath": "sdk/flutter/events/overview-events", "sourcePath": "/sdk/flutter/events/overview-events", @@ -9697,12 +9679,12 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2302, + "sourceIndex": 3655, "contentFile": "content/docs/chat/sdk/flutter/events/overview-events.mdx", "navOrder": 416 }, { - "id": 932, + "id": 2286, "path": "/sdk/flutter/logger", "relativePath": "sdk/flutter/logger", "sourcePath": "/sdk/flutter/logger", @@ -9715,7 +9697,7 @@ "contextTitle": "SDKs · Flutter · v4", "template": "guide", "status": "published", - "sourceIndex": 2303, + "sourceIndex": 3656, "contentFile": "content/docs/chat/sdk/flutter/logger.mdx", "navOrder": 417 }, diff --git a/src/generated/search-index-zh.json b/src/generated/search-index-zh.json index 82236ed584..f2018177e6 100644 --- a/src/generated/search-index-zh.json +++ b/src/generated/search-index-zh.json @@ -2258,10 +2258,10 @@ { "path": "/sdk/android/group/overview-group", "title": "群组概览", - "description": "了解 Android SDK 中群资料、成员、申请和群组事件的职责。", + "description": "了解 Android SDK 中的群组概念、核心数据类型和主要能力。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group overview-group", - "content": "群组由 GroupInfo 表示, groupID 是群资料、成员、申请和权限设置的唯一目标标识。 GroupMembersInfo 表示成员在某个群内的昵称、角色、禁言结束时间和扩展字段;单聊关系和会话未读数不属于群组 API。 GroupManager 将群资料变化、成员增删改、入群申请处理和加入群组变化统一发送到一个 OnGroupListener 。在共享状态层设置一次 listener,并按 groupID 或 userID 合并事件。 OpenIMClient.getInstance .groupManager.setOnGroupListener new OnGroupListener @Override public void onGroupInfoChanged GroupInfo group groupStore.put group.getGroupID , group ; @Override public void onGroupMemberInfoChanged GroupMembersInfo member memberStore.put member.getGroupID + member.getUserID , member ; ; 群资料或成员操作的成功 callback 只表示该请求完成;状态以对应群组事件或重新查询结果为准。 主要能力 群资料与设置 /sdk/android/group/create group 群权限 /sdk/android/group/set group join verification 加入与退出群组 /sdk/android/group/join group 查询群组 /sdk/android/group/retrieving groups/get specified groups info 群申请 /sdk/android/group/group applications/overview group applications 查询群成员 /sdk/android/group/retrieving group members/overview retrieving group members 管理群成员 /sdk/android/group/managing group members/invite user to group" + "content": "OpenIMSDK 的多人聊天使用群组承载共享资料、成员关系和权限。 groupID 是群组稳定标识,发送群消息、读取群资料、管理成员和处理入群申请都使用它。当前用户聊天列表中的群会话仍由 conversationID 管理,两者不能混用。 核心数据类型 | 类型 | 用途 | | | | | GroupInfo | 群名称、头像、公告、群主、验证配置、成员数和扩展字段。 | | GroupMembersInfo | 用户在指定群内的昵称、角色、禁言和入群信息。 | | GroupApplicationInfo | 入群申请及处理状态。 | 群成员角色使用 GroupRole : MEMBER 表示普通成员, ADMIN 表示管理员, OWNER 表示群主。 主要能力 群资料与设置 /sdk/android/group/create group 群权限与管理 /sdk/android/group/set group join verification 加入、退出与解散群组 /sdk/android/group/join group 查询群组 /sdk/android/group/retrieving groups/get specified groups info 入群申请 /sdk/android/group/group applications/get group application list as recipient 查询群成员 /sdk/android/group/retrieving group members/get group member list 管理群成员 /sdk/android/group/managing group members/invite user to group 状态更新 在登录前调用 setOnGroupListener 注册 OnGroupListener ,接收群资料、成员和入群申请的变化。下面示例根据回调刷新相应的群组、成员或申请界面: private final OnGroupListener groupListener = new OnGroupListener @Override public void onJoinedGroupAdded GroupInfo group // 刷新已加入群组列表 @Override public void onJoinedGroupDeleted GroupInfo group // 刷新已加入群组列表 @Override public void onGroupInfoChanged GroupInfo group // 根据 group.getGroupID 刷新群资料 @Override public void onGroupDismissed GroupInfo group // 根据 group.getGroupID 关闭已解散的群聊 @Override public void onGroupMemberAdded GroupMembersInfo member // 根据 member.getGroupID 刷新群成员列表 @Override public void onGroupMemberDeleted GroupMembersInfo member // 根据 member.getGroupID 刷新群成员列表 @Override public void onGroupMemberInfoChanged GroupMembersInfo member // 根据 member.getGroupID 刷新群成员列表 @Override public void onGroupApplicationAdded GroupApplicationInfo application // 刷新入群申请列表 @Override public void onGroupApplicationAccepted GroupApplicationInfo application // 刷新入群申请列表 @Override public void onGroupApplicationRejected GroupApplicationInfo application // 刷新入群申请列表 @Override public void onGroupApplicationDeleted GroupApplicationInfo application // 刷新入群申请列表 ; public void registerGroupListener OpenIMClient.getInstance .groupManager.setOnGroupListener groupListener ; onJoinedGroupAdded 和 onJoinedGroupDeleted 用于更新当前用户已加入的群组列表; onGroupInfoChanged 和 onGroupDismissed 用于更新群资料或关闭已解散的群聊。成员变化通过 onGroupMemberAdded 、 onGroupMemberDeleted 和 onGroupMemberInfoChanged 处理;入群申请变化通过四个 onGroupApplication... 回调处理。 群组 API 的成功回调表示本次调用已完成。群资料、成员和申请列表需要更新时,再根据对应的 listener 回调刷新界面或重新查询数据。" }, { "path": "/sdk/android/group/create-group", @@ -2269,7 +2269,7 @@ "description": "使用 createGroup 创建群资料并指定初始成员、管理员和群主。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group create-group", - "content": "使用 createGroup 创建群组。 GroupInfo 填写群资料;初始普通成员、管理员和群主分别通过独立参数传入。成功回调返回创建后的完整 GroupInfo ,应保存服务端确定的 groupID 。 GroupInfo info = new GroupInfo ; info.setGroupName \"项目讨论\" ; info.setIntroduction \"仅限项目成员\" ; OpenIMClient.getInstance .groupManager.createGroup memberUserIDs, adminUserIDs, info, ownerUserID, new OnBase @Override public void onSuccess GroupInfo group openGroup group.getGroupID ; @Override public void onError int code, String error showCreateError error ; ; 群主和管理员必须由业务侧按权限选择。不要在客户端根据本地用户列表推导群主身份。" + "content": "使用 createGroup 创建群组。 GroupInfo 填写群资料;初始普通成员、管理员和群主分别通过独立参数传入。成功回调返回创建后的完整 GroupInfo ,其中包含新群组的 groupID 。 GroupInfo info = new GroupInfo ; info.setGroupName \"项目讨论\" ; info.setIntroduction \"仅限项目成员\" ; OpenIMClient.getInstance .groupManager.createGroup memberUserIDs, adminUserIDs, info, ownerUserID, new OnBase @Override public void onSuccess GroupInfo group openGroup group.getGroupID ; @Override public void onError int code, String error showCreateError error ; ;" }, { "path": "/sdk/android/group/update-group-profile", @@ -2277,7 +2277,7 @@ "description": "使用 setGroupInfo 更新群名称、头像、简介和其他群资料字段。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group update-group-profile", - "content": "使用 setGroupInfo 更新群资料。请求对象至少应包含 groupID 和需要修改的字段;不要用不完整的本地缓存覆盖未参与本次编辑的字段。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setGroupName \"移动端项目组\" ; update.setIntroduction \"Android 与 iOS 协作群\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markGroupUpdateSubmitted groupID ; @Override public void onError int code, String error showGroupUpdateError error ; ; 最新群资料通过 onGroupInfoChanged 合并。群公告和扩展字段使用相同接口,分别见相关页面。" + "content": "使用 setGroupInfo 更新群资料。请求对象包含 groupID 和需要修改的字段,只提交本次要更新的内容。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setGroupName \"移动端项目组\" ; update.setIntroduction \"Android 与 iOS 协作群\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markGroupUpdateSubmitted groupID ; @Override public void onError int code, String error showGroupUpdateError error ; ; 群公告和扩展字段使用相同接口,分别见相关页面。" }, { "path": "/sdk/android/group/set-group-announcement", @@ -2285,7 +2285,7 @@ "description": "通过 GroupInfo.notification 发布或更新群公告。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-announcement", - "content": "Android SDK 没有独立的公告方法。构造包含 groupID 与 notification 的 GroupInfo ,再调用 setGroupInfo 。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNotification \"今晚 20:00 进行版本发布确认。\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data refreshAnnouncement groupID ; @Override public void onError int code, String error showAnnouncementError error ; ; 公告的更新时间和更新人由返回的 GroupInfo 中 notificationUpdateTime 、 notificationUserID 表示。权限由服务端校验。" + "content": "构造包含 groupID 与 notification 的 GroupInfo ,再调用 setGroupInfo 。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNotification \"今晚 20:00 进行版本发布确认。\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data refreshAnnouncement groupID ; @Override public void onError int code, String error showAnnouncementError error ; ; 公告的更新时间和更新人保存在 GroupInfo 的 notificationUpdateTime 、 notificationUserID 字段中;需要读取时查询群资料。" }, { "path": "/sdk/android/group/set-group-extension", @@ -2293,7 +2293,7 @@ "description": "通过 GroupInfo.ex 保存应用定义的群组扩展数据。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-extension", - "content": "GroupInfo.ex 是完整字符串,SDK 不会合并 JSON。多个业务模块共用该字段时,应由应用读取旧值、合并自己的命名空间后再提交。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setEx \" \\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false \" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markExtensionSubmitted groupID ; @Override public void onError int code, String error showExtensionError error ; ; 不要将访问令牌、密钥或仅适合本机的 UI 状态写入群扩展字段。" + "content": "GroupInfo.ex 是完整字符串,SDK 不会合并 JSON;提交新值会替换原有内容。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setEx \" \\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false \" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markExtensionSubmitted groupID ; @Override public void onError int code, String error showExtensionError error ; ;" }, { "path": "/sdk/android/group/set-group-join-verification", @@ -2317,7 +2317,7 @@ "description": "通过 GroupInfo.applyMemberFriend 设置是否允许从群成员发起好友申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-member-friend-permission", - "content": "applyMemberFriend 使用整数开关: 0 关闭, 1 打开。该规则只影响从该群成员关系入口发起的好友申请。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setApplyMemberFriend 0 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markFriendPermissionSubmitted groupID ; @Override public void onError int code, String error showPermissionError error ; ; 更新后以 onGroupInfoChanged 或重新读取的 GroupInfo 为准。" + "content": "applyMemberFriend 使用整数开关: 0 关闭, 1 打开。该规则只影响从该群成员关系入口发起的好友申请。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setApplyMemberFriend 0 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markFriendPermissionSubmitted groupID ; @Override public void onError int code, String error showPermissionError error ; ;" }, { "path": "/sdk/android/group/change-group-mute", @@ -2325,7 +2325,7 @@ "description": "使用 changeGroupMute 开启或关闭群组全员禁言。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group change-group-mute", - "content": "使用 changeGroupMute 切换全员禁言。 true 开启, false 关闭;成员级禁言见“禁言或解除禁言群成员”。 OpenIMClient.getInstance .groupManager.changeGroupMute new OnBase @Override public void onSuccess String data markGroupMuteSubmitted groupID, true ; @Override public void onError int code, String error showGroupMuteError error ; , groupID, true ; 群主和管理员的实际发言权限以及服务端权限校验以部署策略为准。" + "content": "使用 changeGroupMute 切换全员禁言。 true 开启, false 关闭;成员级禁言见 禁言或解除禁言群成员 /sdk/android/group/managing group members/change group member mute 。 OpenIMClient.getInstance .groupManager.changeGroupMute new OnBase @Override public void onSuccess String data markGroupMuteSubmitted groupID, true ; @Override public void onError int code, String error showGroupMuteError error ; , groupID, true ;" }, { "path": "/sdk/android/group/join-group", @@ -2333,7 +2333,7 @@ "description": "使用 joinGroup 提交入群申请或加入请求。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group join-group", - "content": "使用 joinGroup 提交入群请求。 joinSource 使用群组来源值,例如邀请、搜索或二维码;带扩展数据时使用五参数重载。 OpenIMClient.getInstance .groupManager.joinGroup new OnBase @Override public void onSuccess String data markJoinSubmitted groupID ; @Override public void onError int code, String error showJoinError error ; , groupID, \"希望加入项目讨论\", 3, \" \\\"from\\\":\\\"search\\\" \" ; 验证方式决定请求是否立即加入。后续通过 onJoinedGroupAdded 或群申请事件更新本地状态。" + "content": "使用 joinGroup 提交入群请求。 joinSource 表示入群来源: 2 表示邀请, 3 表示搜索, 4 表示二维码;带扩展数据时使用五参数重载。 OpenIMClient.getInstance .groupManager.joinGroup new OnBase @Override public void onSuccess String data markJoinSubmitted groupID ; @Override public void onError int code, String error showJoinError error ; , groupID, \"希望加入项目讨论\", 3, \" \\\"from\\\":\\\"search\\\" \" ; 入群验证方式 /sdk/android/group/set group join verification 决定用户是直接加入还是先提交申请。需要审核时,成功回调只表示申请已提交;实际加入后通过 onJoinedGroupAdded 接收通知。" }, { "path": "/sdk/android/group/quit-group", @@ -2341,7 +2341,7 @@ "description": "使用 quitGroup 让当前登录用户退出指定群组。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group quit-group", - "content": "quitGroup 仅作用于当前登录用户,不会解散群组或移除其他成员。 OpenIMClient.getInstance .groupManager.quitGroup new OnBase @Override public void onSuccess String data removeJoinedGroup groupID ; @Override public void onError int code, String error showQuitError error ; , groupID ; 请求成功后仍应处理 onJoinedGroupDeleted ,并清理该群的成员列表、群会话入口等应用缓存。" + "content": "quitGroup 仅作用于当前登录用户,不会解散群组或移除其他成员。 OpenIMClient.getInstance .groupManager.quitGroup new OnBase @Override public void onSuccess String data removeJoinedGroup groupID ; @Override public void onError int code, String error showQuitError error ; , groupID ; 请求成功后,继续处理 onJoinedGroupDeleted 回调。" }, { "path": "/sdk/android/group/dismiss-group", @@ -2349,7 +2349,7 @@ "description": "使用 dismissGroup 解散当前用户有权限管理的群组。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group dismiss-group", - "content": "dismissGroup 解散指定群组,通常仅群主可执行。调用前应在产品层提供明确确认,避免将“退出群组”误实现为解散。 OpenIMClient.getInstance .groupManager.dismissGroup new OnBase @Override public void onSuccess String data markDismissSubmitted groupID ; @Override public void onError int code, String error showDismissError error ; , groupID ; 最终状态通过 onGroupDismissed 合并;收到事件后移除群资料、成员和群会话相关缓存。" + "content": "dismissGroup 解散指定群组,仅群主可执行。 OpenIMClient.getInstance .groupManager.dismissGroup new OnBase @Override public void onSuccess String data markDismissSubmitted groupID ; @Override public void onError int code, String error showDismissError error ; , groupID ; 通过 onGroupDismissed 接收群组解散通知。" }, { "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", @@ -2357,7 +2357,7 @@ "description": "使用 getGroupsInfo 批量查询指定群组的最新资料。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups get-specified-groups-info", - "content": "已持有一组 groupID 时,使用 getGroupsInfo 查询群资料。结果是 GroupInfo 列表,不能依赖响应顺序与请求列表完全一致。 OpenIMClient.getInstance .groupManager.getGroupsInfo new OnBase @Override public void onSuccess List groups mergeGroups groups ; @Override public void onError int code, String error showGroupQueryError error ; , groupIDs ; 先移除空值和重复 ID;权限不足或群组不存在的 ID 应按缺失结果处理。" + "content": "getGroupsInfo 的 groupIDs 参数为要查询的群组 ID 列表,返回结果为 GroupInfo 列表。 OpenIMClient.getInstance .groupManager.getGroupsInfo new OnBase @Override public void onSuccess List groups showGroups groups ; @Override public void onError int code, String error showGroupQueryError error ; , groupIDs ;" }, { "path": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", @@ -2365,7 +2365,7 @@ "description": "使用 getJoinedGroupListPage 分页读取当前账号已加入的群组。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups get-joined-group-list-page", - "content": "Android SDK 仅提供分页版本。 offset 从 0 开始,后续页按已经成功合并的条目数推进;返回为空时停止加载。 OpenIMClient.getInstance .groupManager.getJoinedGroupListPage new OnBase @Override public void onSuccess List groups appendJoinedGroups groups ; @Override public void onError int code, String error showPageError error ; , offset, 20 ; 使用 onJoinedGroupAdded 与 onJoinedGroupDeleted 合并增量,不要仅依赖已加载分页作为完整群列表。" + "content": "offset 从 0 开始,后续页按上一页返回的条目数推进;返回为空时停止加载。 OpenIMClient.getInstance .groupManager.getJoinedGroupListPage new OnBase @Override public void onSuccess List groups appendJoinedGroups groups ; @Override public void onError int code, String error showPageError error ; , offset, 20 ; 加入或退出群组时,通过 onJoinedGroupAdded 和 onJoinedGroupDeleted 接收通知。" }, { "path": "/sdk/android/group/retrieving-groups/is-join-group", @@ -2373,7 +2373,7 @@ "description": "使用 isJoinGroup 查询当前登录用户是否已经加入指定群组。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups is-join-group", - "content": "isJoinGroup 仅检查当前登录用户与目标 groupID 的成员关系。 OpenIMClient.getInstance .groupManager.isJoinGroup groupID, new OnBase @Override public void onSuccess Boolean joined updateJoinAction Boolean.TRUE.equals joined ; @Override public void onError int code, String error showMembershipError error ; ; 该结果不替代群资料查询,也不能用于判断其他用户是否在群内。" + "content": "isJoinGroup 检查当前登录用户是否加入目标群组,参数为 groupID 。 OpenIMClient.getInstance .groupManager.isJoinGroup groupID, new OnBase @Override public void onSuccess Boolean joined updateJoinAction Boolean.TRUE.equals joined ; @Override public void onError int code, String error showMembershipError error ; ;" }, { "path": "/sdk/android/group/retrieving-groups/search-groups", @@ -2381,15 +2381,7 @@ "description": "使用 searchGroups 按群 ID 或群名称搜索本地可查询的群组。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups search-groups", - "content": "searchGroups 接收关键词列表,并分别指定是否搜索群 ID、群名称。两个开关都关闭时没有有效搜索范围。 OpenIMClient.getInstance .groupManager.searchGroups new OnBase @Override public void onSuccess List groups showSearchResults groups ; @Override public void onError int code, String error showSearchError error ; , Collections.singletonList keyword , true, true ; 搜索结果不是成员资格证明。进入群组前可使用“检查是否加入群组”确认当前状态。" - }, - { - "path": "/sdk/android/group/group-applications/overview-group-applications", - "title": "入群申请概览", - "description": "说明 Android SDK 中收到和发出的群申请、处理结果及状态事件。", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android group group-applications overview-group-applications", - "content": "群申请记录使用 GroupApplicationInfo 表示。收到的申请面向群管理者,发出的申请面向当前用户; handleResult 、 reqMsg 、 handledMsg 和处理时间用于展示申请状态。 Android SDK 提供收到与发出申请的分页查询,以及同意、拒绝操作;不提供 Flutter 菜单中的“待处理申请数量”接口。申请新增、同意、拒绝和删除事件由 群组概览 /sdk/android/group/overview group 的统一 listener 负责合并。" + "content": "searchGroups 接收关键词列表,并分别指定是否搜索群 ID、群名称。两个开关都关闭时没有有效搜索范围。 OpenIMClient.getInstance .groupManager.searchGroups new OnBase @Override public void onSuccess List groups showSearchResults groups ; @Override public void onError int code, String error showSearchError error ; , Collections.singletonList keyword , true, true ; 用户不一定是 searchGroups 搜索到的群组的群成员,是否为群成员通过 isJoinGroup /sdk/android/group/retrieving groups/is join group 确定。" }, { "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", @@ -2397,7 +2389,7 @@ "description": "使用 getRecvGroupApplicationList 分页读取当前用户可处理的入群申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-recipient", - "content": "使用非废弃重载并传入 GetGroupApplicationListAsRecipientReq 。可设置 offset 、 count 、 groupIDs 和 handleResults 筛选条件。 GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .groupManager.getRecvGroupApplicationList new OnBase @Override public void onSuccess List items mergeReceivedApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ; 收到事件后按申请中的 groupID 和 userID 合并,不要把列表下标作为申请标识。" + "content": "传入 GetGroupApplicationListAsRecipientReq 设置分页和筛选条件。可设置 offset 、 count 、 groupIDs 和 handleResults 。 GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .groupManager.getRecvGroupApplicationList new OnBase @Override public void onSuccess List items mergeReceivedApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ;" }, { "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", @@ -2405,7 +2397,7 @@ "description": "使用 getSendGroupApplicationList 分页读取当前用户发出的入群申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-applicant", - "content": "使用 GetGroupApplicationListAsApplicantReq 设置分页和筛选条件,再调用 getSendGroupApplicationList 。 GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .groupManager.getSendGroupApplicationList new OnBase @Override public void onSuccess List items mergeSentApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ; 申请被同意后,群列表变化以 onJoinedGroupAdded 为准。" + "content": "使用 GetGroupApplicationListAsApplicantReq 设置分页和筛选条件,再调用 getSendGroupApplicationList 。 GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .groupManager.getSendGroupApplicationList new OnBase @Override public void onSuccess List items mergeSentApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ; 申请被同意后,通过 onJoinedGroupAdded 接收加入群组通知。" }, { "path": "/sdk/android/group/group-applications/accept-group-application", @@ -2413,7 +2405,7 @@ "description": "使用 acceptGroupApplication 同意指定用户的入群申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications accept-group-application", - "content": "调用时同时传入申请的 groupID 、申请人 userID 和处理说明。服务端负责校验当前用户是否有审批权限。 OpenIMClient.getInstance .groupManager.acceptGroupApplication new OnBase @Override public void onSuccess String data markApplicationHandled groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"欢迎加入\" ; 同意后通过群申请事件与 onGroupMemberAdded 更新申请列表和成员列表。" + "content": "调用时同时传入申请的 groupID 、申请人 userID 和处理说明。当前用户需要具有审批权限。 OpenIMClient.getInstance .groupManager.acceptGroupApplication new OnBase @Override public void onSuccess String data markApplicationHandled groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"欢迎加入\" ; 同意后,通过 群组概览 /sdk/android/group/overview group 中的相关事件接收申请状态和成员变化通知。" }, { "path": "/sdk/android/group/group-applications/refuse-group-application", @@ -2421,15 +2413,15 @@ "description": "使用 refuseGroupApplication 拒绝指定用户的入群申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications refuse-group-application", - "content": "拒绝操作同样使用申请所属 groupID 、申请人 userID 和处理说明。 OpenIMClient.getInstance .groupManager.refuseGroupApplication new OnBase @Override public void onSuccess String data markApplicationRejected groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"当前群组人数已满\" ; 成功 callback 后不要直接删除本地申请记录;以 onGroupApplicationRejected 或重新查询结果更新。" + "content": "拒绝操作同样使用申请所属 groupID 、申请人 userID 和处理说明。 OpenIMClient.getInstance .groupManager.refuseGroupApplication new OnBase @Override public void onSuccess String data markApplicationRejected groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"当前群组人数已满\" ; 拒绝成功后,通过 onGroupApplicationRejected 接收通知,也可以重新调用查询 API 获取最新申请列表。" }, { - "path": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", - "title": "群成员查询概览", - "description": "说明 Android SDK 中群成员列表、指定成员资料和成员状态查询。", + "path": "/sdk/android/group/group-applications/delete-group-requests", + "title": "删除入群申请", + "description": "使用 deleteGroupRequests 批量删除指定的入群申请记录。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android group retrieving-group-members overview-retrieving-group-members", - "content": "成员查询使用 groupID 限定范围,结果为 GroupMembersInfo 或用户 ID 列表。成员列表提供角色过滤和 offset 分页;指定成员资料、在群检查、群主管理员和关键词搜索各有独立接口。 成员增删和资料变化由 群组概览 /sdk/android/group/overview group 归属的 OnGroupListener 统一合并。查询只建立快照,不能替代事件处理。" + "keywords": "sdk android v4 sdk android group group-applications delete-group-requests", + "content": "deleteGroupRequests 接收 DeleteGroupRequestsReq ,可传入多个 SimpleGroupRequests 批量删除申请记录。每个 SimpleGroupRequests 包含 fromUserID 和 groupID : fromUserID 为申请人的用户 ID, groupID 为申请加入的群组 ID。 SimpleGroupRequests groupRequests = new SimpleGroupRequests firstApplicantUserID, firstGroupID , new SimpleGroupRequests secondApplicantUserID, secondGroupID ; DeleteGroupRequestsReq request = new DeleteGroupRequestsReq groupRequests ; OpenIMClient.getInstance .groupManager.deleteGroupRequests new OnBase @Override public void onSuccess String data showDeleteSuccess ; @Override public void onError int code, String error showDeleteError error ; , request ; 删除申请记录不等于拒绝申请。需要拒绝申请时,使用 refuseGroupApplication 。" }, { "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", @@ -2437,7 +2429,7 @@ "description": "使用 getGroupMemberList 按角色和分页条件读取群成员。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-group-member-list", - "content": "filter 传 0 查询全部成员, 1 普通成员, 2 群主, 3 管理员。 offset 与 count 控制分页。 OpenIMClient.getInstance .groupManager.getGroupMemberList new OnBase @Override public void onSuccess List members appendMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, 0, offset, 50 ; 分页期间仍应接受成员事件,合并键使用 groupID 与 userID 。" + "content": "filter 传 0 查询全部成员, 1 普通成员, 2 群主, 3 管理员。 offset 与 count 控制分页。 OpenIMClient.getInstance .groupManager.getGroupMemberList new OnBase @Override public void onSuccess List members appendMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, 0, offset, 50 ;" }, { "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", @@ -2445,7 +2437,7 @@ "description": "使用 getGroupMembersInfo 批量读取指定成员在群内的资料。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-specified-group-members-info", - "content": "getGroupMembersInfo 接收一个 groupID 和目标用户 ID 列表,返回这些用户在群内的 GroupMembersInfo 。 OpenIMClient.getInstance .groupManager.getGroupMembersInfo new OnBase @Override public void onSuccess List members mergeMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, userIDs ; 返回空列表可能表示目标未在群内或无读取权限,应按业务需求处理。" + "content": "getGroupMembersInfo 接收一个 groupID 和目标用户 ID 列表,返回这些用户在群内的 GroupMembersInfo 。 OpenIMClient.getInstance .groupManager.getGroupMembersInfo new OnBase @Override public void onSuccess List members mergeMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, userIDs ;" }, { "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", @@ -2453,7 +2445,7 @@ "description": "使用 getUsersInGroup 从候选用户中筛出当前在群内的用户 ID。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-users-in-group", - "content": "getUsersInGroup 返回传入用户中已在指定群内的 ID 列表,不返回成员资料。 OpenIMClient.getInstance .groupManager.getUsersInGroup new OnBase @Override public void onSuccess List joinedUserIDs updateMembership joinedUserIDs ; @Override public void onError int code, String error showMembershipError error ; , groupID, candidateUserIDs ; 需要昵称、角色或禁言状态时,再调用“获取群成员资料”。" + "content": "getUsersInGroup 返回传入用户中已在指定群内的 ID 列表,不返回成员资料。 OpenIMClient.getInstance .groupManager.getUsersInGroup new OnBase @Override public void onSuccess List joinedUserIDs updateMembership joinedUserIDs ; @Override public void onError int code, String error showMembershipError error ; , groupID, candidateUserIDs ; 需要昵称、角色或禁言状态时,再调用 查询指定群成员资料 /sdk/android/group/retrieving group members/get specified group members info 。" }, { "path": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", @@ -2461,7 +2453,7 @@ "description": "使用 getGroupMemberOwnerAndAdmin 查询群主和管理员成员资料。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-group-member-owner-and-admin", - "content": "使用 getGroupMemberOwnerAndAdmin 获取需要展示或校验管理身份的成员记录。 OpenIMClient.getInstance .groupManager.getGroupMemberOwnerAndAdmin new OnBase @Override public void onSuccess List members showModerators members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID ; roleLevel 的群主、管理员和普通成员常量见 GroupRole ;实际操作权限仍由服务端决定。" + "content": "使用 getGroupMemberOwnerAndAdmin 获取需要展示或校验管理身份的成员记录。 OpenIMClient.getInstance .groupManager.getGroupMemberOwnerAndAdmin new OnBase @Override public void onSuccess List members showModerators members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID ; roleLevel 的群主、管理员和普通成员常量见 GroupRole 。" }, { "path": "/sdk/android/group/retrieving-group-members/search-group-members", @@ -2477,7 +2469,7 @@ "description": "使用 inviteUserToGroup 邀请一组用户加入指定群组。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members invite-user-to-group", - "content": "传入群 ID、待邀请用户 ID 列表和邀请说明。服务端根据群设置和当前用户权限决定是否立即加入。 OpenIMClient.getInstance .groupManager.inviteUserToGroup new OnBase @Override public void onSuccess String data markInviteSubmitted groupID ; @Override public void onError int code, String error showInviteError error ; , groupID, inviteeUserIDs, \"邀请加入项目讨论\" ; 成员实际加入后以 onGroupMemberAdded 合并,不能仅以提交成功显示为已加入。" + "content": "传入群 ID、待邀请用户 ID 列表和邀请说明。调用成功表示邀请请求已提交;用户实际加入后通过 onGroupMemberAdded 接收通知。 OpenIMClient.getInstance .groupManager.inviteUserToGroup new OnBase @Override public void onSuccess String data markInviteSubmitted groupID ; @Override public void onError int code, String error showInviteError error ; , groupID, inviteeUserIDs, \"邀请加入项目讨论\" ;" }, { "path": "/sdk/android/group/managing-group-members/kick-group-member", @@ -2485,7 +2477,7 @@ "description": "使用 kickGroupMember 将指定成员移出群组。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members kick-group-member", - "content": "kickGroupMember 接收成员 ID 列表和移除说明。产品层应先防止当前用户误移除自身,并遵守群主、管理员权限边界。 OpenIMClient.getInstance .groupManager.kickGroupMember new OnBase @Override public void onSuccess String data markRemovalSubmitted groupID ; @Override public void onError int code, String error showRemovalError error ; , groupID, memberUserIDs, \"已不再参与该项目\" ; 收到 onGroupMemberDeleted 后再从成员缓存中移除目标成员。" + "content": "kickGroupMember 接收成员 ID 列表和移除说明。 OpenIMClient.getInstance .groupManager.kickGroupMember new OnBase @Override public void onSuccess String data markRemovalSubmitted groupID ; @Override public void onError int code, String error showRemovalError error ; , groupID, memberUserIDs, \"已不再参与该项目\" ; 移除成功后,通过 onGroupMemberDeleted 接收成员移除通知。" }, { "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", @@ -2493,7 +2485,7 @@ "description": "使用 SetGroupMemberInfo.nickname 更新成员在指定群中的显示昵称。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-nickname", - "content": "成员资料修改统一使用 setGroupMemberInfo 。请求中填写 groupID 、 userID 和 nickname 。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setNickname \"小林\" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markNicknameSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; 以 onGroupMemberInfoChanged 返回的 GroupMembersInfo.nickname 更新显示。" + "content": "成员资料修改统一使用 setGroupMemberInfo 。请求中填写 groupID 、 userID 和 nickname 。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setNickname \"小林\" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markNicknameSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; 修改成功后,通过 群组概览 /sdk/android/group/overview group 中的 onGroupMemberInfoChanged 接收成员资料变化通知。" }, { "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", @@ -2501,7 +2493,7 @@ "description": "使用 SetGroupMemberInfo.roleLevel 设置成员的群内角色。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-role-level", - "content": "roleLevel 使用 GroupRole 常量: OWNER 、 ADMIN 和 MEMBER 。群主转让使用独立接口,不应通过本接口推测转让流程。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setRoleLevel GroupRole.ADMIN ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markRoleSubmitted groupID, userID ; @Override public void onError int code, String error showRoleError error ; ; 实际角色变更和权限由服务端校验,以成员资料变化事件为准。" + "content": "roleLevel 使用 GroupRole 常量: OWNER 、 ADMIN 和 MEMBER 。转让群主请使用 转让群主 /sdk/android/group/managing group members/transfer group owner 。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setRoleLevel GroupRole.ADMIN ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markRoleSubmitted groupID, userID ; @Override public void onError int code, String error showRoleError error ; ; 角色修改成功后,通过 onGroupMemberInfoChanged 接收成员资料变化通知。" }, { "path": "/sdk/android/group/managing-group-members/set-group-member-avatar", @@ -2509,7 +2501,7 @@ "description": "使用 SetGroupMemberInfo.faceURL 更新成员在群内展示的头像。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-avatar", - "content": "群成员头像是群内资料字段,不修改用户全局头像。传入已可访问的头像 URL。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setFaceURL avatarURL ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markAvatarSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; 事件到达前保留原头像或使用本地乐观状态,并按最新成员资料校准。" + "content": "群成员头像是群内资料字段,不修改用户全局头像。传入已可访问的头像 URL。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setFaceURL avatarURL ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markAvatarSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; 修改成功后,通过 onGroupMemberInfoChanged 接收成员资料变化通知。" }, { "path": "/sdk/android/group/managing-group-members/set-group-member-extension", @@ -2517,7 +2509,7 @@ "description": "使用 SetGroupMemberInfo.ex 保存应用定义的群成员扩展数据。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-extension", - "content": "SetGroupMemberInfo.ex 是完整字符串,不会自动合并 JSON。多个业务模块共享时应先读取、合并并保留其他命名空间。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setEx \" \\\"duty\\\":\\\"reviewer\\\" \" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markMemberExtensionSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; 不要将凭据、令牌或仅限本机的显示状态写入该字段。" + "content": "SetGroupMemberInfo.ex 字符串用于保存群成员扩展信息,可存储 JSON 字符串拓展群成员信息。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setEx \" \\\"duty\\\":\\\"reviewer\\\" \" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markMemberExtensionSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ;" }, { "path": "/sdk/android/group/managing-group-members/transfer-group-owner", @@ -2525,7 +2517,7 @@ "description": "使用 transferGroupOwner 将群主身份转让给指定群成员。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members transfer-group-owner", - "content": "目标用户必须是该群成员。转让前应在产品层要求明确确认,并在完成后重新查询群主和管理员资料。 OpenIMClient.getInstance .groupManager.transferGroupOwner new OnBase @Override public void onSuccess String data markOwnershipTransferSubmitted groupID ; @Override public void onError int code, String error showTransferError error ; , groupID, newOwnerUserID ; onGroupMemberInfoChanged 和群资料变化可能异步到达;不要在成功 callback 中假定本地角色已完成更新。" + "content": "transferGroupOwner 接收 groupID 和 newOwnerUserID 两个参数: groupID 为要转让群主的群组 ID, newOwnerUserID 为新群主的用户 ID,该用户必须是该群的成员。 OpenIMClient.getInstance .groupManager.transferGroupOwner new OnBase @Override public void onSuccess String data markOwnershipTransferSubmitted groupID ; @Override public void onError int code, String error showTransferError error ; , groupID, newOwnerUserID ; 转让成功后,可以重新调用 获取群主和管理员 /sdk/android/group/retrieving group members/get group member owner and admin 获取最新资料。" }, { "path": "/sdk/android/group/managing-group-members/change-group-member-mute", @@ -2533,7 +2525,7 @@ "description": "使用 changeGroupMemberMute 设置指定成员的禁言时长。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members change-group-member-mute", - "content": "seconds 为禁言时长,单位为秒;传 0 解除成员禁言。该操作与全员禁言相互独立。 OpenIMClient.getInstance .groupManager.changeGroupMemberMute new OnBase @Override public void onSuccess String data markMemberMuteSubmitted groupID, userID ; @Override public void onError int code, String error showMemberMuteError error ; , groupID, userID, 3600L ; 在 onGroupMemberInfoChanged 中读取 muteEndTime 更新成员状态;不要用本机时间和请求时长长期推算最终禁言状态。" + "content": "seconds 为禁言时长,单位为秒;传 0 解除成员禁言。该操作与 全员禁言 /sdk/android/group/change group mute 相互独立。 OpenIMClient.getInstance .groupManager.changeGroupMemberMute new OnBase @Override public void onSuccess String data markMemberMuteSubmitted groupID, userID ; @Override public void onError int code, String error showMemberMuteError error ; , groupID, userID, 3600L ;" }, { "path": "/sdk/android/message/overview-message", diff --git a/src/generated/search-index.json b/src/generated/search-index.json index 59a303c4fc..13ecd6c1ab 100644 --- a/src/generated/search-index.json +++ b/src/generated/search-index.json @@ -2258,10 +2258,10 @@ { "path": "/sdk/android/group/overview-group", "title": "Group overview", - "description": "Learn how group profiles, members, applications, and group events are organized in the Android SDK.", + "description": "Understand group concepts, core data types, and main capabilities in the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group overview-group", - "content": "A group is represented by GroupInfo . Its groupID is the unique target identifier for profile, member, application, and permission operations. GroupMembersInfo represents a member's group specific nickname, role, mute expiration time, and extra data. One to one relationships and conversation unread counts do not belong to the group APIs. GroupManager delivers group profile changes, member changes, application handling, and joined group changes through one OnGroupListener . Set the listener once in a shared state layer and merge events by groupID or userID . OpenIMClient.getInstance .groupManager.setOnGroupListener new OnGroupListener @Override public void onGroupInfoChanged GroupInfo group groupStore.put group.getGroupID , group ; @Override public void onGroupMemberInfoChanged GroupMembersInfo member memberStore.put member.getGroupID + member.getUserID , member ; ; A successful callback from a group profile or member operation only means that the request completed. Use the corresponding group event or a fresh query as the source of truth. Main capabilities Group profile and settings /sdk/android/group/create group Group permissions /sdk/android/group/set group join verification Joining and leaving groups /sdk/android/group/join group Retrieving groups /sdk/android/group/retrieving groups/get specified groups info Group applications /sdk/android/group/group applications/overview group applications Retrieving group members /sdk/android/group/retrieving group members/overview retrieving group members Managing group members /sdk/android/group/managing group members/invite user to group" + "content": "OpenIMSDK uses groups to hold shared profiles, memberships, and permissions for multi user chats. groupID is the stable group identifier used to send group messages, retrieve group profiles, manage members, and handle join applications. A group conversation in the current user's chat list is still managed by conversationID ; do not interchange these identifiers. Core data types | Type | Purpose | | | | | GroupInfo | Group name, avatar, announcement, owner, verification settings, member count, and extension data. | | GroupMembersInfo | A user's nickname, role, mute state, and join information in a specified group. | | GroupApplicationInfo | A group application and its handling state. | Group member roles use GroupRole : MEMBER is a regular member, ADMIN is an administrator, and OWNER is the group owner. Main capabilities Group profile and settings /sdk/android/group/create group Group permissions /sdk/android/group/set group join verification Joining and leaving groups /sdk/android/group/join group Retrieving groups /sdk/android/group/retrieving groups/get specified groups info Group applications /sdk/android/group/group applications/get group application list as recipient Retrieving group members /sdk/android/group/retrieving group members/get group member list Managing group members /sdk/android/group/managing group members/invite user to group State updates Call setOnGroupListener before login to register an OnGroupListener for group profile, membership, and group application changes. The following example shows where the application can refresh the relevant screen for each callback: private final OnGroupListener groupListener = new OnGroupListener @Override public void onJoinedGroupAdded GroupInfo group // Refresh the joined group list. @Override public void onJoinedGroupDeleted GroupInfo group // Refresh the joined group list. @Override public void onGroupInfoChanged GroupInfo group // Refresh the group profile for group.getGroupID . @Override public void onGroupDismissed GroupInfo group // Close the dismissed group chat for group.getGroupID . @Override public void onGroupMemberAdded GroupMembersInfo member // Refresh the member list for member.getGroupID . @Override public void onGroupMemberDeleted GroupMembersInfo member // Refresh the member list for member.getGroupID . @Override public void onGroupMemberInfoChanged GroupMembersInfo member // Refresh the member list for member.getGroupID . @Override public void onGroupApplicationAdded GroupApplicationInfo application // Refresh the group application list. @Override public void onGroupApplicationAccepted GroupApplicationInfo application // Refresh the group application list. @Override public void onGroupApplicationRejected GroupApplicationInfo application // Refresh the group application list. @Override public void onGroupApplicationDeleted GroupApplicationInfo application // Refresh the group application list. ; public void registerGroupListener OpenIMClient.getInstance .groupManager.setOnGroupListener groupListener ; Use onJoinedGroupAdded and onJoinedGroupDeleted to update the current user's joined group list. Use onGroupInfoChanged and onGroupDismissed to update a group profile or close a dismissed group chat. Handle membership changes with onGroupMemberAdded , onGroupMemberDeleted , and onGroupMemberInfoChanged , and handle group application changes with the four onGroupApplication... callbacks. A group API success callback indicates that the call completed. When group profiles, members, or group application lists need updating, refresh the screen or query the data again based on the corresponding listener callback." }, { "path": "/sdk/android/group/create-group", @@ -2269,7 +2269,7 @@ "description": "Use createGroup to create a group profile and specify its initial members, administrators, and owner.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group create-group", - "content": "Use createGroup to create a group. Set the group profile in GroupInfo , and pass the initial regular members, administrators, and owner as separate parameters. The success callback returns the complete GroupInfo created by the server. Store the server assigned groupID . GroupInfo info = new GroupInfo ; info.setGroupName \"Project discussion\" ; info.setIntroduction \"For project members only\" ; OpenIMClient.getInstance .groupManager.createGroup memberUserIDs, adminUserIDs, info, ownerUserID, new OnBase @Override public void onSuccess GroupInfo group openGroup group.getGroupID ; @Override public void onError int code, String error showCreateError error ; ; Select the owner and administrators according to your application's permission rules. Do not infer the owner from a local user list." + "content": "Use createGroup to create a group. Set the group profile in GroupInfo , and pass the initial regular members, administrators, and owner as separate parameters. The success callback returns the complete GroupInfo , including the new group's groupID . GroupInfo info = new GroupInfo ; info.setGroupName \"Project discussion\" ; info.setIntroduction \"For project members only\" ; OpenIMClient.getInstance .groupManager.createGroup memberUserIDs, adminUserIDs, info, ownerUserID, new OnBase @Override public void onSuccess GroupInfo group openGroup group.getGroupID ; @Override public void onError int code, String error showCreateError error ; ;" }, { "path": "/sdk/android/group/update-group-profile", @@ -2277,7 +2277,7 @@ "description": "Use setGroupInfo to update a group name, avatar, introduction, and other profile fields.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group update-group-profile", - "content": "Use setGroupInfo to update a group profile. The request object should contain at least the groupID and the fields being changed. Do not use an incomplete local cache to overwrite fields that are not part of the current edit. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setGroupName \"Mobile project team\" ; update.setIntroduction \"Android and iOS collaboration group\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markGroupUpdateSubmitted groupID ; @Override public void onError int code, String error showGroupUpdateError error ; ; Merge the latest profile from onGroupInfoChanged . Group announcements and extra data use the same API and are covered on their respective pages." + "content": "Use setGroupInfo to update a group profile. The request object contains the groupID and the fields being changed. Submit only the fields for the current update. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setGroupName \"Mobile project team\" ; update.setIntroduction \"Android and iOS collaboration group\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markGroupUpdateSubmitted groupID ; @Override public void onError int code, String error showGroupUpdateError error ; ; Group announcements and extra data use the same API and are covered on their respective pages." }, { "path": "/sdk/android/group/set-group-announcement", @@ -2285,7 +2285,7 @@ "description": "Publish or update a group announcement through GroupInfo.notification.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-announcement", - "content": "The Android SDK does not provide a separate announcement method. Create a GroupInfo containing the groupID and notification , then call setGroupInfo . GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNotification \"Release review starts at 20:00 tonight.\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data refreshAnnouncement groupID ; @Override public void onError int code, String error showAnnouncementError error ; ; The returned GroupInfo exposes the update time and author through notificationUpdateTime and notificationUserID . The server validates whether the current user has permission to publish the announcement." + "content": "Create a GroupInfo containing the groupID and notification , then call setGroupInfo . GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNotification \"Release review starts at 20:00 tonight.\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data refreshAnnouncement groupID ; @Override public void onError int code, String error showAnnouncementError error ; ; The update time and author are stored in the GroupInfo fields notificationUpdateTime and notificationUserID . Query the group profile when you need to read them." }, { "path": "/sdk/android/group/set-group-extension", @@ -2293,7 +2293,7 @@ "description": "Store application-defined group data in GroupInfo.ex.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-extension", - "content": "GroupInfo.ex is a complete string; the SDK does not merge JSON values. If several application modules share the field, read the existing value and preserve the other namespaces when merging your changes. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setEx \" \\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false \" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markExtensionSubmitted groupID ; @Override public void onError int code, String error showExtensionError error ; ; Do not store access tokens, secrets, or device only UI state in group extra data." + "content": "GroupInfo.ex is a complete string; the SDK does not merge JSON values. Submitting a new value replaces the previous content. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setEx \" \\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false \" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markExtensionSubmitted groupID ; @Override public void onError int code, String error showExtensionError error ; ;" }, { "path": "/sdk/android/group/set-group-join-verification", @@ -2317,7 +2317,7 @@ "description": "Use GroupInfo.applyMemberFriend to control whether users can send friend requests from the group member list.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-member-friend-permission", - "content": "applyMemberFriend is an integer switch: 0 disables friend requests and 1 enables them. This rule only affects requests initiated through the member relationship in this group. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setApplyMemberFriend 0 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markFriendPermissionSubmitted groupID ; @Override public void onError int code, String error showPermissionError error ; ; After the update, use onGroupInfoChanged or a newly retrieved GroupInfo as the source of truth." + "content": "applyMemberFriend is an integer switch: 0 disables friend requests and 1 enables them. This rule only affects requests initiated through the member relationship in this group. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setApplyMemberFriend 0 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markFriendPermissionSubmitted groupID ; @Override public void onError int code, String error showPermissionError error ; ;" }, { "path": "/sdk/android/group/change-group-mute", @@ -2325,7 +2325,7 @@ "description": "Use changeGroupMute to enable or disable mute-all mode for a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group change-group-mute", - "content": "Use changeGroupMute to toggle mute all mode. Pass true to enable it or false to disable it. To mute one member, see Mute or unmute a group member /sdk/android/group/managing group members/change group member mute . OpenIMClient.getInstance .groupManager.changeGroupMute new OnBase @Override public void onSuccess String data markGroupMuteSubmitted groupID, true ; @Override public void onError int code, String error showGroupMuteError error ; , groupID, true ; The effective speaking permissions for the owner and administrators, as well as server side permission checks, depend on the deployment policy." + "content": "Use changeGroupMute to toggle mute all mode. Pass true to enable it or false to disable it. To mute one member, see Mute or unmute a group member /sdk/android/group/managing group members/change group member mute . OpenIMClient.getInstance .groupManager.changeGroupMute new OnBase @Override public void onSuccess String data markGroupMuteSubmitted groupID, true ; @Override public void onError int code, String error showGroupMuteError error ; , groupID, true ;" }, { "path": "/sdk/android/group/join-group", @@ -2333,7 +2333,7 @@ "description": "Use joinGroup to submit a group application or join request.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group join-group", - "content": "Use joinGroup to submit a request to join a group. Set joinSource to the source of the request, such as an invitation, search result, or QR code. Use the five parameter overload when attaching extra data. OpenIMClient.getInstance .groupManager.joinGroup new OnBase @Override public void onSuccess String data markJoinSubmitted groupID ; @Override public void onError int code, String error showJoinError error ; , groupID, \"I would like to join the project discussion\", 3, \" \\\"from\\\":\\\"search\\\" \" ; The verification mode determines whether the user joins immediately. Update local state later through onJoinedGroupAdded or the relevant group application event." + "content": "Use joinGroup to submit a request to join a group. joinSource identifies how the user joined: 2 for an invitation, 3 for search, or 4 for a QR code. Use the five parameter overload when attaching extra data. OpenIMClient.getInstance .groupManager.joinGroup new OnBase @Override public void onSuccess String data markJoinSubmitted groupID ; @Override public void onError int code, String error showJoinError error ; , groupID, \"I would like to join the project discussion\", 3, \" \\\"from\\\":\\\"search\\\" \" ; The verification mode /sdk/android/group/set group join verification determines whether the user joins immediately or submits an application first. When approval is required, a successful callback means only that the application was submitted; onJoinedGroupAdded arrives after the user joins." }, { "path": "/sdk/android/group/quit-group", @@ -2341,7 +2341,7 @@ "description": "Use quitGroup to remove the current signed-in user from a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group quit-group", - "content": "quitGroup only removes the current signed in user. It does not dismiss the group or remove other members. OpenIMClient.getInstance .groupManager.quitGroup new OnBase @Override public void onSuccess String data removeJoinedGroup groupID ; @Override public void onError int code, String error showQuitError error ; , groupID ; Even after the request succeeds, handle onJoinedGroupDeleted and clear application caches for the group's member list, conversation entry, and related data." + "content": "quitGroup only removes the current signed in user. It does not dismiss the group or remove other members. OpenIMClient.getInstance .groupManager.quitGroup new OnBase @Override public void onSuccess String data removeJoinedGroup groupID ; @Override public void onError int code, String error showQuitError error ; , groupID ; After the request succeeds, continue handling the onJoinedGroupDeleted callback." }, { "path": "/sdk/android/group/dismiss-group", @@ -2349,7 +2349,7 @@ "description": "Use dismissGroup to dismiss a group that the current user is allowed to manage.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group dismiss-group", - "content": "dismissGroup dismisses the specified group and is normally available only to its owner. Ask for explicit confirmation before calling it so that leaving a group is not accidentally implemented as dismissing it. OpenIMClient.getInstance .groupManager.dismissGroup new OnBase @Override public void onSuccess String data markDismissSubmitted groupID ; @Override public void onError int code, String error showDismissError error ; , groupID ; Merge the final state from onGroupDismissed . After receiving the event, remove cached group profile, member, and conversation related data." + "content": "dismissGroup dismisses the specified group and is available only to its owner. OpenIMClient.getInstance .groupManager.dismissGroup new OnBase @Override public void onSuccess String data markDismissSubmitted groupID ; @Override public void onError int code, String error showDismissError error ; , groupID ; Use onGroupDismissed to receive the group dismissal notification." }, { "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", @@ -2357,7 +2357,7 @@ "description": "Use getGroupsInfo to retrieve the latest profiles for specified groups.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups get-specified-groups-info", - "content": "When you already have a set of groupID values, use getGroupsInfo to retrieve their profiles. The result is a list of GroupInfo objects. Do not assume that its order exactly matches the request list. OpenIMClient.getInstance .groupManager.getGroupsInfo new OnBase @Override public void onSuccess List groups mergeGroups groups ; @Override public void onError int code, String error showGroupQueryError error ; , groupIDs ; Remove empty and duplicate IDs before making the request. Treat groups that do not exist or cannot be accessed as missing results." + "content": "The groupIDs parameter of getGroupsInfo is the list of group IDs to query. The method returns a list of GroupInfo objects. OpenIMClient.getInstance .groupManager.getGroupsInfo new OnBase @Override public void onSuccess List groups showGroups groups ; @Override public void onError int code, String error showGroupQueryError error ; , groupIDs ;" }, { "path": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", @@ -2365,7 +2365,7 @@ "description": "Use getJoinedGroupListPage to retrieve the current account’s joined groups by page.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups get-joined-group-list-page", - "content": "The Android SDK provides the paginated API. Start offset at 0 , then advance it by the number of items successfully merged from each page. Stop loading when the returned list is empty. OpenIMClient.getInstance .groupManager.getJoinedGroupListPage new OnBase @Override public void onSuccess List groups appendJoinedGroups groups ; @Override public void onError int code, String error showPageError error ; , offset, 20 ; Merge incremental changes from onJoinedGroupAdded and onJoinedGroupDeleted . Do not treat the pages loaded so far as the complete joined group list." + "content": "Start offset at 0 , then advance it by the number of items returned in the previous page. Stop loading when the returned list is empty. OpenIMClient.getInstance .groupManager.getJoinedGroupListPage new OnBase @Override public void onSuccess List groups appendJoinedGroups groups ; @Override public void onError int code, String error showPageError error ; , offset, 20 ; When joining or leaving a group, receive notifications through onJoinedGroupAdded and onJoinedGroupDeleted ." }, { "path": "/sdk/android/group/retrieving-groups/is-join-group", @@ -2373,7 +2373,7 @@ "description": "Use isJoinGroup to determine whether the current signed-in user has joined a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups is-join-group", - "content": "isJoinGroup only checks the membership relationship between the current signed in user and the specified groupID . OpenIMClient.getInstance .groupManager.isJoinGroup groupID, new OnBase @Override public void onSuccess Boolean joined updateJoinAction Boolean.TRUE.equals joined ; @Override public void onError int code, String error showMembershipError error ; ; This result does not replace a group profile query and cannot determine whether another user is in the group." + "content": "isJoinGroup checks whether the current signed in user has joined the target group. Its parameter is groupID . OpenIMClient.getInstance .groupManager.isJoinGroup groupID, new OnBase @Override public void onSuccess Boolean joined updateJoinAction Boolean.TRUE.equals joined ; @Override public void onError int code, String error showMembershipError error ; ;" }, { "path": "/sdk/android/group/retrieving-groups/search-groups", @@ -2381,15 +2381,7 @@ "description": "Use searchGroups to search locally available groups by group ID or name.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups search-groups", - "content": "searchGroups accepts a keyword list and separate switches for searching group IDs and group names. If both switches are disabled, there is no valid search scope. OpenIMClient.getInstance .groupManager.searchGroups new OnBase @Override public void onSuccess List groups showSearchResults groups ; @Override public void onError int code, String error showSearchError error ; , Collections.singletonList keyword , true, true ; A search result does not prove membership. Before opening the group, call Check group membership /sdk/android/group/retrieving groups/is join group when the current state matters." - }, - { - "path": "/sdk/android/group/group-applications/overview-group-applications", - "title": "Group applications overview", - "description": "Understand received and sent group applications, handling results, and state events in the Android SDK.", - "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android group group-applications overview-group-applications", - "content": "Group applications are represented by GroupApplicationInfo . Received applications are intended for group administrators, while sent applications belong to the current user. Use handleResult , reqMsg , handledMsg , and the handling time to display application state. The Android SDK provides paginated queries for received and sent applications, as well as accept and reject operations. It does not provide the pending application count API found in the Flutter menu. Merge application added, accepted, rejected, and deleted events through the shared listener described in Group overview /sdk/android/group/overview group ." + "content": "searchGroups accepts a keyword list and separate switches for searching group IDs and group names. If both switches are disabled, there is no valid search scope. OpenIMClient.getInstance .groupManager.searchGroups new OnBase @Override public void onSuccess List groups showSearchResults groups ; @Override public void onError int code, String error showSearchError error ; , Collections.singletonList keyword , true, true ; The current user is not necessarily a member of a group returned by searchGroups . Use isJoinGroup /sdk/android/group/retrieving groups/is join group to determine whether they are a member." }, { "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", @@ -2397,7 +2389,7 @@ "description": "Use getRecvGroupApplicationList to retrieve group applications that the current user can handle.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-recipient", - "content": "Use the non deprecated overload with GetGroupApplicationListAsRecipientReq . The request can filter by offset , count , groupIDs , and handleResults . GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .groupManager.getRecvGroupApplicationList new OnBase @Override public void onSuccess List items mergeReceivedApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ; Merge application events by their groupID and userID . Do not use a list index as an application identifier." + "content": "Pass GetGroupApplicationListAsRecipientReq to set pagination and filters. You can set offset , count , groupIDs , and handleResults . GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .groupManager.getRecvGroupApplicationList new OnBase @Override public void onSuccess List items mergeReceivedApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ;" }, { "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", @@ -2405,7 +2397,7 @@ "description": "Use getSendGroupApplicationList to retrieve group applications sent by the current user.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-applicant", - "content": "Configure pagination and filters in GetGroupApplicationListAsApplicantReq , then call getSendGroupApplicationList . GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .groupManager.getSendGroupApplicationList new OnBase @Override public void onSuccess List items mergeSentApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ; After an application is accepted, use onJoinedGroupAdded as the source of truth for the joined group list." + "content": "Configure pagination and filters in GetGroupApplicationListAsApplicantReq , then call getSendGroupApplicationList . GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .groupManager.getSendGroupApplicationList new OnBase @Override public void onSuccess List items mergeSentApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ; After an application is accepted, receive the group joined notification through onJoinedGroupAdded ." }, { "path": "/sdk/android/group/group-applications/accept-group-application", @@ -2413,7 +2405,7 @@ "description": "Use acceptGroupApplication to accept a user’s application to join a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications accept-group-application", - "content": "Pass the application's groupID , the applicant's userID , and a handling message. The server checks whether the current user has permission to approve the application. OpenIMClient.getInstance .groupManager.acceptGroupApplication new OnBase @Override public void onSuccess String data markApplicationHandled groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"Welcome to the group\" ; After acceptance, update the application and member lists through the group application event and onGroupMemberAdded ." + "content": "Pass the application's groupID , the applicant's userID , and a handling message. The current user must have permission to approve the application. OpenIMClient.getInstance .groupManager.acceptGroupApplication new OnBase @Override public void onSuccess String data markApplicationHandled groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"Welcome to the group\" ; After acceptance, receive application status and member change notifications through the relevant events described in Group overview /sdk/android/group/overview group ." }, { "path": "/sdk/android/group/group-applications/refuse-group-application", @@ -2421,15 +2413,15 @@ "description": "Use refuseGroupApplication to reject a user’s application to join a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications refuse-group-application", - "content": "The reject operation also takes the application's groupID , the applicant's userID , and a handling message. OpenIMClient.getInstance .groupManager.refuseGroupApplication new OnBase @Override public void onSuccess String data markApplicationRejected groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"The group is currently full\" ; Do not delete the local record immediately after the success callback. Update it from onGroupApplicationRejected or a fresh query." + "content": "The reject operation also takes the application's groupID , the applicant's userID , and a handling message. OpenIMClient.getInstance .groupManager.refuseGroupApplication new OnBase @Override public void onSuccess String data markApplicationRejected groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"The group is currently full\" ; After the rejection succeeds, receive the notification through onGroupApplicationRejected or call the query API again to retrieve the latest application list." }, { - "path": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", - "title": "Group member queries overview", - "description": "Understand group member lists, specified member profiles, and membership queries in the Android SDK.", + "path": "/sdk/android/group/group-applications/delete-group-requests", + "title": "Delete group applications", + "description": "Use deleteGroupRequests to delete specified group application records in a batch.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android group retrieving-group-members overview-retrieving-group-members", - "content": "Group member queries are scoped by groupID and return either GroupMembersInfo objects or user ID lists. The member list supports role filtering and offset pagination. Separate APIs retrieve specified member profiles, check membership, retrieve owners and administrators, and search by keyword. Merge member additions, removals, and profile changes through the OnGroupListener owned by Group overview /sdk/android/group/overview group . A query provides a snapshot and does not replace event handling." + "keywords": "sdk android v4 sdk android group group-applications delete-group-requests", + "content": "deleteGroupRequests accepts DeleteGroupRequestsReq , which can contain multiple SimpleGroupRequests items to delete application records in a batch. Each item contains fromUserID , the applicant's user ID, and groupID , the ID of the group the user applied to join. SimpleGroupRequests groupRequests = new SimpleGroupRequests firstApplicantUserID, firstGroupID , new SimpleGroupRequests secondApplicantUserID, secondGroupID ; DeleteGroupRequestsReq request = new DeleteGroupRequestsReq groupRequests ; OpenIMClient.getInstance .groupManager.deleteGroupRequests new OnBase @Override public void onSuccess String data showDeleteSuccess ; @Override public void onError int code, String error showDeleteError error ; , request ; Deleting an application record is not the same as rejecting an application. To reject an application, use refuseGroupApplication ." }, { "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", @@ -2437,7 +2429,7 @@ "description": "Use getGroupMemberList to retrieve group members by role and page.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-group-member-list", - "content": "Set filter to 0 for all members, 1 for regular members, 2 for the owner, or 3 for administrators. Use offset and count for pagination. OpenIMClient.getInstance .groupManager.getGroupMemberList new OnBase @Override public void onSuccess List members appendMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, 0, offset, 50 ; Continue accepting member events while paging. Use the combination of groupID and userID as the merge key." + "content": "Set filter to 0 for all members, 1 for regular members, 2 for the owner, or 3 for administrators. Use offset and count for pagination. OpenIMClient.getInstance .groupManager.getGroupMemberList new OnBase @Override public void onSuccess List members appendMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, 0, offset, 50 ;" }, { "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", @@ -2445,7 +2437,7 @@ "description": "Use getGroupMembersInfo to retrieve specified users’ profiles within a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-specified-group-members-info", - "content": "getGroupMembersInfo accepts one groupID and a list of target user IDs. It returns the users' GroupMembersInfo profiles within that group. OpenIMClient.getInstance .groupManager.getGroupMembersInfo new OnBase @Override public void onSuccess List members mergeMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, userIDs ; An empty list can mean that the targets are not in the group or that the current user cannot read their profiles. Handle the result according to your product requirements." + "content": "getGroupMembersInfo accepts one groupID and a list of target user IDs. It returns the users' GroupMembersInfo profiles within that group. OpenIMClient.getInstance .groupManager.getGroupMembersInfo new OnBase @Override public void onSuccess List members mergeMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, userIDs ;" }, { "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", @@ -2461,7 +2453,7 @@ "description": "Use getGroupMemberOwnerAndAdmin to retrieve the group owner and administrator profiles.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-group-member-owner-and-admin", - "content": "Use getGroupMemberOwnerAndAdmin when you need to display or check members with management roles. OpenIMClient.getInstance .groupManager.getGroupMemberOwnerAndAdmin new OnBase @Override public void onSuccess List members showModerators members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID ; The owner, administrator, and regular member roleLevel constants are defined in GroupRole . The server still determines whether a particular operation is permitted." + "content": "Use getGroupMemberOwnerAndAdmin when you need to display or check members with management roles. OpenIMClient.getInstance .groupManager.getGroupMemberOwnerAndAdmin new OnBase @Override public void onSuccess List members showModerators members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID ; The owner, administrator, and regular member roleLevel constants are defined in GroupRole ." }, { "path": "/sdk/android/group/retrieving-group-members/search-group-members", @@ -2477,7 +2469,7 @@ "description": "Use inviteUserToGroup to invite a list of users to a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members invite-user-to-group", - "content": "Pass the group ID, the list of invited user IDs, and an invitation message. The server determines whether the users join immediately according to the group settings and the current user's permissions. OpenIMClient.getInstance .groupManager.inviteUserToGroup new OnBase @Override public void onSuccess String data markInviteSubmitted groupID ; @Override public void onError int code, String error showInviteError error ; , groupID, inviteeUserIDs, \"Join the project discussion\" ; Merge users into the member list only after onGroupMemberAdded confirms that they joined. A successful submission alone does not mean that they are already members." + "content": "Pass the group ID, the list of invited user IDs, and an invitation message. A successful call means that the invitation request was submitted; after a user joins, receive the notification through onGroupMemberAdded . OpenIMClient.getInstance .groupManager.inviteUserToGroup new OnBase @Override public void onSuccess String data markInviteSubmitted groupID ; @Override public void onError int code, String error showInviteError error ; , groupID, inviteeUserIDs, \"Join the project discussion\" ;" }, { "path": "/sdk/android/group/managing-group-members/kick-group-member", @@ -2485,7 +2477,7 @@ "description": "Use kickGroupMember to remove specified members from a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members kick-group-member", - "content": "kickGroupMember accepts a list of member IDs and a removal message. Prevent the current user from accidentally selecting themselves and respect the permission boundaries between owners and administrators. OpenIMClient.getInstance .groupManager.kickGroupMember new OnBase @Override public void onSuccess String data markRemovalSubmitted groupID ; @Override public void onError int code, String error showRemovalError error ; , groupID, memberUserIDs, \"No longer participating in this project\" ; Remove targets from the member cache after receiving onGroupMemberDeleted ." + "content": "kickGroupMember accepts a list of member IDs and a removal message. OpenIMClient.getInstance .groupManager.kickGroupMember new OnBase @Override public void onSuccess String data markRemovalSubmitted groupID ; @Override public void onError int code, String error showRemovalError error ; , groupID, memberUserIDs, \"No longer participating in this project\" ; After the removal succeeds, receive the member removal notification through onGroupMemberDeleted ." }, { "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", @@ -2493,7 +2485,7 @@ "description": "Use SetGroupMemberInfo.nickname to update a member’s display name in a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-nickname", - "content": "All group member profile changes use setGroupMemberInfo . Set the groupID , userID , and nickname in the request. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setNickname \"Lin\" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markNicknameSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; Update the displayed name from GroupMembersInfo.nickname received by onGroupMemberInfoChanged ." + "content": "All group member profile changes use setGroupMemberInfo . Set the groupID , userID , and nickname in the request. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setNickname \"Lin\" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markNicknameSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; After the update succeeds, receive the member profile change notification through onGroupMemberInfoChanged as described in Group overview /sdk/android/group/overview group ." }, { "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", @@ -2501,7 +2493,7 @@ "description": "Use SetGroupMemberInfo.roleLevel to change a member’s role in a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-role-level", - "content": "Set roleLevel with a GroupRole constant: OWNER , ADMIN , or MEMBER . Use the separate ownership transfer API when changing the group owner; do not infer an ownership transfer flow from this API. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setRoleLevel GroupRole.ADMIN ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markRoleSubmitted groupID, userID ; @Override public void onError int code, String error showRoleError error ; ; The server validates the role change and its permissions. Use the member profile change event as the source of truth." + "content": "Set roleLevel with a GroupRole constant: OWNER , ADMIN , or MEMBER . To transfer group ownership, use Transfer group ownership /sdk/android/group/managing group members/transfer group owner . SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setRoleLevel GroupRole.ADMIN ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markRoleSubmitted groupID, userID ; @Override public void onError int code, String error showRoleError error ; ; After the role update succeeds, receive the member profile change notification through onGroupMemberInfoChanged ." }, { "path": "/sdk/android/group/managing-group-members/set-group-member-avatar", @@ -2509,7 +2501,7 @@ "description": "Use SetGroupMemberInfo.faceURL to update the avatar displayed for a member in a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-avatar", - "content": "A group member avatar is a group specific profile field and does not change the user's global avatar. Pass an avatar URL that group members can access. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setFaceURL avatarURL ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markAvatarSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; Keep the previous avatar or an optimistic local state until the event arrives, then reconcile it with the latest member profile." + "content": "A group member avatar is a group specific profile field and does not change the user's global avatar. Pass an avatar URL that group members can access. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setFaceURL avatarURL ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markAvatarSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; After the update succeeds, receive the member profile change notification through onGroupMemberInfoChanged ." }, { "path": "/sdk/android/group/managing-group-members/set-group-member-extension", @@ -2517,7 +2509,7 @@ "description": "Store application-defined group member data in SetGroupMemberInfo.ex.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-extension", - "content": "SetGroupMemberInfo.ex is a complete string; the SDK does not merge JSON values. If several application modules share the field, read and merge the existing value while preserving the other namespaces. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setEx \" \\\"duty\\\":\\\"reviewer\\\" \" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markMemberExtensionSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; Do not store credentials, tokens, or device only display state in this field." + "content": "The SetGroupMemberInfo.ex string stores extra group member information and can contain a JSON string with additional member information. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setEx \" \\\"duty\\\":\\\"reviewer\\\" \" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markMemberExtensionSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ;" }, { "path": "/sdk/android/group/managing-group-members/transfer-group-owner", @@ -2525,7 +2517,7 @@ "description": "Use transferGroupOwner to transfer group ownership to a specified member.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members transfer-group-owner", - "content": "The target user must already be a group member. Require explicit confirmation before transferring ownership, then retrieve the owner and administrator profiles again after completion. OpenIMClient.getInstance .groupManager.transferGroupOwner new OnBase @Override public void onSuccess String data markOwnershipTransferSubmitted groupID ; @Override public void onError int code, String error showTransferError error ; , groupID, newOwnerUserID ; onGroupMemberInfoChanged and group profile changes can arrive asynchronously. Do not assume that local roles have already been updated inside the success callback." + "content": "transferGroupOwner accepts two parameters: groupID , the ID of the group whose ownership is being transferred, and newOwnerUserID , the ID of the new owner. The target user must already be a member of the group. OpenIMClient.getInstance .groupManager.transferGroupOwner new OnBase @Override public void onSuccess String data markOwnershipTransferSubmitted groupID ; @Override public void onError int code, String error showTransferError error ; , groupID, newOwnerUserID ; After the transfer succeeds, you can call Get group owners and admins /sdk/android/group/retrieving group members/get group member owner and admin again to retrieve the latest profiles." }, { "path": "/sdk/android/group/managing-group-members/change-group-member-mute", @@ -2533,7 +2525,7 @@ "description": "Use changeGroupMemberMute to set the mute duration for a specified group member.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members change-group-member-mute", - "content": "seconds is the mute duration in seconds. Pass 0 to unmute the member. Member level mute state is independent from the group's mute all setting. OpenIMClient.getInstance .groupManager.changeGroupMemberMute new OnBase @Override public void onSuccess String data markMemberMuteSubmitted groupID, userID ; @Override public void onError int code, String error showMemberMuteError error ; , groupID, userID, 3600L ; Read muteEndTime from onGroupMemberInfoChanged to update the member state. Do not keep deriving the final mute state from local time and the submitted duration." + "content": "seconds is the mute duration in seconds. Pass 0 to unmute the member. Member level mute state is independent from the group mute all setting /sdk/android/group/change group mute . OpenIMClient.getInstance .groupManager.changeGroupMemberMute new OnBase @Override public void onSuccess String data markMemberMuteSubmitted groupID, userID ; @Override public void onError int code, String error showMemberMuteError error ; , groupID, userID, 3600L ;" }, { "path": "/sdk/android/message/overview-message", From acb40deb9e8285f2c08b7d4e926e76883d8b431f Mon Sep 17 00:00:00 2001 From: chan <1499188352@qq.com> Date: Tue, 18 Aug 2026 19:37:04 +0800 Subject: [PATCH 06/12] docs(android): publish Android SDK relationship documentation --- .../android/user/blacklist/add-blacklist.mdx | 10 ++-- .../android/user/blacklist/get-blacklist.mdx | 16 ++--- .../user/blacklist/remove-blacklist.mdx | 10 ++-- .../accept-friend-application.mdx | 6 +- .../user/friend-applications/add-friend.mdx | 6 +- .../get-recv-friend-application-list.mdx | 23 ++++--- .../get-send-friend-application-list.mdx | 8 +-- .../refuse-friend-application.mdx | 6 +- .../sdk/android/user/friends/check-friend.mdx | 8 +-- .../android/user/friends/delete-friend.mdx | 6 +- .../user/friends/get-friend-list-page.mdx | 22 +++---- .../android/user/friends/get-friends-info.mdx | 10 ++-- .../android/user/friends/search-friends.mdx | 8 +-- .../android/user/friends/update-friends.mdx | 8 +-- .../chat/sdk/android/user/overview-user.mdx | 2 +- .../android/user/blacklist/add-blacklist.mdx | 10 ++-- .../android/user/blacklist/get-blacklist.mdx | 16 +++-- .../user/blacklist/remove-blacklist.mdx | 10 ++-- .../accept-friend-application.mdx | 6 +- .../user/friend-applications/add-friend.mdx | 6 +- .../get-recv-friend-application-list.mdx | 23 ++++--- .../get-send-friend-application-list.mdx | 8 +-- .../refuse-friend-application.mdx | 6 +- .../sdk/android/user/friends/check-friend.mdx | 8 +-- .../android/user/friends/delete-friend.mdx | 6 +- .../user/friends/get-friend-list-page.mdx | 22 +++---- .../android/user/friends/get-friends-info.mdx | 10 ++-- .../android/user/friends/search-friends.mdx | 8 +-- .../android/user/friends/update-friends.mdx | 8 +-- .../chat/sdk/android/user/overview-user.mdx | 2 +- data/structure/android-content-audit.json | 60 +++++++++---------- src/generated/android-sdk-zh-content.json | 30 +++++----- src/generated/search-index-zh.json | 30 +++++----- src/generated/search-index.json | 30 +++++----- 34 files changed, 216 insertions(+), 232 deletions(-) diff --git a/content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx b/content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx index 251fc09ca4..97e888f616 100644 --- a/content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx +++ b/content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx @@ -16,12 +16,12 @@ OpenIMClient.getInstance().friendshipManager.addBlacklist( new OnBase() { @Override public void onSuccess(String data) { - markBlacklistRequestSubmitted(targetUserID); + // User blocked successfully. } @Override public void onError(int code, String error) { - recordBlacklistAddFailure(code, error); + // Handle the error. } }, targetUserID, @@ -31,13 +31,13 @@ OpenIMClient.getInstance().friendshipManager.addBlacklist( The second argument is the target `userID`, and the third argument is optional extension data. Use the overload without `ex` when no extension data is needed. A successful callback means the block request completed, not that the event has arrived. -The blacklist is one-way: the blocked user cannot send messages to the current account. Whether the current account can continue to send messages is an application-level rule. `ex` is a complete string, so merge application-owned fields before updating it. +The blacklist is one-way: the blocked user cannot send messages to the current account. Whether the current account can continue to send messages is an application-level rule. `ex` stores blacklist extension data and can contain a JSON string. -This page owns `onBlacklistAdded`. Combine it into the application's single `OnFriendshipListener`: +Receive `onBlacklistAdded` through `OnFriendshipListener`: ```java @Override public void onBlacklistAdded(BlacklistInfo user) { - blacklistStore.put(user.getUserID(), user); + // Handle the added blacklist record. } ``` diff --git a/content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx b/content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx index 33ad0f2ff1..af0ef12bc4 100644 --- a/content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx +++ b/content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/user/blacklist/get-blacklist' --- -The blacklist records users blocked by the current account. Use it for a blacklist settings screen, relationship state on a profile card, or to limit a chat entry point. Blacklist management and group member management are separate capabilities; use Group APIs to mute, remove, or change the role of a group member. +The blacklist records users blocked by the current account. Use it for a blacklist settings screen, relationship state on a profile card, or to limit a chat entry point. ## Get the blacklist @@ -22,12 +22,12 @@ OpenIMClient.getInstance().friendshipManager.getBlacklist( new OnBase>() { @Override public void onSuccess(List users) { - blacklistStore.replace(users); + // Use users to update the blacklist. } @Override public void onError(int code, String error) { - recordBlacklistFailure(code, error); + // Handle the error. } } ); @@ -41,15 +41,15 @@ Common `BlacklistInfo` fields are: | Field | Description | | ---------------- | ------------------------------------------------------------------- | -| `userID` | Target user ID blocked by the current user and the stable list key. | -| `nickname` | Target user nickname snapshot. | -| `faceURL` | Target user avatar URL. | +| `userID` | Target user ID blocked by the current user. | +| `nickname` | Target user nickname. | +| `faceURL` | Target user avatar URL. | | `gender` | Target user gender value. | | `operatorUserID` | User ID that performed the block operation. | | `createTime` | Blacklist relationship creation time. | | `addSource` | Source that added the blacklist relationship. | | `ex` | Blacklist relationship extension string. | -When the screen also needs friend remarks or the latest public profile, separately merge `FriendInfo` or `PublicUserInfo` by `userID`. Do not treat blacklist fields as friend profile data. +When the screen also needs friend remarks or the latest public profile, query the corresponding friend or public profile data. -Merge blacklist state by `userID`. This query does not trigger blacklist added or deleted callbacks. Replace the local snapshot on initial load, after reconnecting, or after an explicit refresh; incremental changes are owned by the [Block a user](/sdk/android/user/blacklist/add-blacklist) and [Unblock a user](/sdk/android/user/blacklist/remove-blacklist) listener pages. +Receive blacklist changes through the listeners described in [Block a user](/sdk/android/user/blacklist/add-blacklist) and [Unblock a user](/sdk/android/user/blacklist/remove-blacklist). diff --git a/content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx b/content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx index fb9ed93480..3431e0543a 100644 --- a/content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx +++ b/content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx @@ -16,25 +16,25 @@ OpenIMClient.getInstance().friendshipManager.removeBlacklist( new OnBase() { @Override public void onSuccess(String data) { - markBlacklistRemovalSubmitted(targetUserID); + // User unblocked successfully. } @Override public void onError(int code, String error) { - recordBlacklistRemovalFailure(code, error); + // Handle the error. } }, targetUserID ); ``` -A successful callback means the remove request completed, not that the event has arrived. Remove the local entry after `onBlacklistDeleted`; if the event is missed, reconcile through [Get the blacklist](/sdk/android/user/blacklist/get-blacklist). +A successful callback means the unblock request completed. Receive blacklist changes through `onBlacklistDeleted`; to retrieve the list again, use [Get the blacklist](/sdk/android/user/blacklist/get-blacklist). -This page owns `onBlacklistDeleted`; remove the local entry by `userID`: +Receive `onBlacklistDeleted` through `OnFriendshipListener`: ```java @Override public void onBlacklistDeleted(BlacklistInfo user) { - blacklistStore.remove(user.getUserID()); + // Handle the removed blacklist record. } ``` diff --git a/content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx b/content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx index 39b0d1a0e1..ae27e28403 100644 --- a/content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx +++ b/content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx @@ -16,12 +16,12 @@ OpenIMClient.getInstance().friendshipManager.acceptFriendApplication( new OnBase() { @Override public void onSuccess(String data) { - markApplicationAccepted(applicantUserID); + // Friend request accepted successfully. } @Override public void onError(int code, String error) { - recordApplicationAcceptFailure(code, error); + // Handle the error. } }, applicantUserID, @@ -29,4 +29,4 @@ OpenIMClient.getInstance().friendshipManager.acceptFriendApplication( ); ``` -`applicantUserID` identifies the applicant, and the final argument is the handling message. A successful callback means the accept request completed. The request state and new friendship can arrive through separate callbacks and should be merged independently: `onFriendApplicationAccepted` updates the application and `onFriendAdded` updates the friendship. +`applicantUserID` identifies the applicant, and the final argument is the handling message. A successful callback means the accept-friend-request call completed. `onFriendApplicationAccepted` reports the application status, and `onFriendAdded` reports the new friendship. diff --git a/content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx b/content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx index a4e3ec4000..3c2bb621c7 100644 --- a/content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx +++ b/content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx @@ -16,12 +16,12 @@ OpenIMClient.getInstance().friendshipManager.addFriend( new OnBase() { @Override public void onSuccess(String data) { - markFriendApplicationSubmitted(); + // Friend request sent successfully. } @Override public void onError(int code, String error) { - recordFriendApplicationFailure(code, error); + // Handle the error. } }, "user_b", @@ -31,4 +31,4 @@ OpenIMClient.getInstance().friendshipManager.addFriend( The second argument is the recipient's `userID`, and the third argument is the request message. A successful callback means the server received the request, not that the recipient accepted it. The target ID cannot be empty. Let a trusted application backend handle lookup by nickname, phone number, or other private fields. -Merge friend request changes through `OnFriendshipListener`, as documented in [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list). +Receive friend request changes through `OnFriendshipListener`, as documented in [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list). diff --git a/content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx b/content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx index b50f4bd867..5db03cf6b1 100644 --- a/content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx +++ b/content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx @@ -19,12 +19,12 @@ OpenIMClient.getInstance().friendshipManager.getRecvFriendApplicationList( new OnBase>() { @Override public void onSuccess(List applications) { - replaceReceivedApplications(applications); + // Use applications to update the received-request list. } @Override public void onError(int code, String error) { - recordReceivedApplicationFailure(code, error); + // Handle the error. } }, request @@ -35,8 +35,8 @@ OpenIMClient.getInstance().friendshipManager.getRecvFriendApplicationList( | Field | Description | | --------------------------------------------- | ---------------------------------------------------------------- | -| `fromUserID` / `fromNickname` / `fromFaceURL` | Applicant ID, nickname, and avatar snapshot. | -| `toUserID` / `toNickname` / `toFaceURL` | Recipient ID, nickname, and avatar snapshot. | +| `fromUserID` / `fromNickname` / `fromFaceURL` | Applicant ID, nickname, and avatar. | +| `toUserID` / `toNickname` / `toFaceURL` | Recipient ID, nickname, and avatar. | | `reqMsg` | Friend request message. | | `handleResult` | Handling result: `0` pending, `1` accepted, `2` rejected. | | `handlerUserID` | User ID that handled the request; it can be empty while pending. | @@ -45,31 +45,28 @@ OpenIMClient.getInstance().friendshipManager.getRecvFriendApplicationList( | `createTime` | Request creation time. | | `ex` | Friend request extension string. | -Use `fromUserID:toUserID` as the stable request key. This page owns the friend request added, accepted, rejected, and deleted callbacks. Combine them into the application's single `OnFriendshipListener`: +Receive friend request added, accepted, rejected, and deleted callbacks through `OnFriendshipListener`: ```java @Override public void onFriendApplicationAdded(FriendApplicationInfo application) { - friendApplicationStore.merge(application); + // Handle a new or updated friend request. } @Override public void onFriendApplicationAccepted(FriendApplicationInfo application) { - friendApplicationStore.merge(application); + // Handle an accepted friend request. } @Override public void onFriendApplicationRejected(FriendApplicationInfo application) { - friendApplicationStore.merge(application); + // Handle a rejected friend request. } @Override public void onFriendApplicationDeleted(FriendApplicationInfo application) { - friendApplicationStore.remove( - application.getFromUserID(), - application.getToUserID() - ); + // Handle a deleted friend request. } ``` -Use whether `toUserID` equals the signed-in user ID to route a record to the received or sent list. After an application is accepted, `onFriendAdded`, owned by [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page), merges the new friendship. +Use whether `toUserID` equals the signed-in user ID to route a record to the received or sent list. After an application is accepted, receive the new friendship through `onFriendAdded`; see [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page). diff --git a/content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx b/content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx index 1a9e8ee929..83a79cd241 100644 --- a/content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx +++ b/content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx @@ -19,18 +19,18 @@ OpenIMClient.getInstance().friendshipManager.getSendFriendApplicationList( new OnBase>() { @Override public void onSuccess(List applications) { - replaceSentApplications(applications); + // Use applications to update the sent-request list. } @Override public void onError(int code, String error) { - recordSentApplicationFailure(code, error); + // Handle the error. } }, request ); ``` -`offset` starts at `0`, and `count` is the page size. The callback returns the current page as `List`. Merge items by `fromUserID:toUserID`. This query only establishes a snapshot and does not trigger friend request callbacks. +`offset` starts at `0`, and `count` is the page size. The callback returns the current page as `List`. -For sent requests, the signed-in user is normally `fromUserID`. The record fields and handling semantics are the same as [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list): the Android server contract uses `0` for pending, `1` for accepted, and `2` for rejected. +For sent requests, the signed-in user is normally `fromUserID`. The record fields and handling semantics are the same as [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list). diff --git a/content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx b/content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx index ae72e17d21..9e2f35456c 100644 --- a/content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx +++ b/content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx @@ -16,12 +16,12 @@ OpenIMClient.getInstance().friendshipManager.refuseFriendApplication( new OnBase() { @Override public void onSuccess(String data) { - markApplicationRejected(applicantUserID); + // Friend request rejected successfully. } @Override public void onError(int code, String error) { - recordApplicationRejectFailure(code, error); + // Handle the error. } }, applicantUserID, @@ -29,4 +29,4 @@ OpenIMClient.getInstance().friendshipManager.refuseFriendApplication( ); ``` -`applicantUserID` identifies the applicant, and the final argument is the handling message. A successful callback means the reject request completed. Merge request state through the shared friend request listener; the final rejected state is `handleResult == 2`. +`applicantUserID` identifies the applicant, and the final argument is the handling message. A successful callback means the reject-friend-request call completed. `OnFriendshipListener` reports the application status; `handleResult == 2` means rejected. diff --git a/content/docs/chat/sdk/android/user/friends/check-friend.mdx b/content/docs/chat/sdk/android/user/friends/check-friend.mdx index 100488a665..d60fc6b8b1 100644 --- a/content/docs/chat/sdk/android/user/friends/check-friend.mdx +++ b/content/docs/chat/sdk/android/user/friends/check-friend.mdx @@ -16,18 +16,18 @@ OpenIMClient.getInstance().friendshipManager.checkFriend( new OnBase>() { @Override public void onSuccess(List relations) { - showFriendshipStates(relations); + // Use relations to update the friendship display. } @Override public void onError(int code, String error) { - recordFriendshipCheckFailure(code, error); + // Handle the error. } }, Arrays.asList("user_a", "user_b") ); ``` -The callback returns `List`. Each item's `userID` identifies the target user. `result == 1` means the user is a friend and is not in the blacklist. Interpret other result values only through the server contract; do not create additional client-side states. +The callback returns `List`. Each item's `userID` is the target user ID. Call `friendshipInfo.getResult()` to get the relationship result; `1` means the user is a friend of the current user and is not in the blacklist. -This method only establishes a relationship snapshot and does not trigger friendship callbacks. Use [`getFriendsInfo()`](/sdk/android/user/friends/get-friends-info) when nickname, avatar, or friend remark data is required. +Use [`getFriendsInfo()`](/sdk/android/user/friends/get-friends-info) when nickname, avatar, or friend remark data is required. diff --git a/content/docs/chat/sdk/android/user/friends/delete-friend.mdx b/content/docs/chat/sdk/android/user/friends/delete-friend.mdx index 4cab7ed68e..64d3fe4ad9 100644 --- a/content/docs/chat/sdk/android/user/friends/delete-friend.mdx +++ b/content/docs/chat/sdk/android/user/friends/delete-friend.mdx @@ -16,16 +16,16 @@ OpenIMClient.getInstance().friendshipManager.deleteFriend( new OnBase() { @Override public void onSuccess(String data) { - markFriendDeletionSubmitted(friendUserID); + // Friend deletion succeeded. } @Override public void onError(int code, String error) { - recordFriendDeletionFailure(code, error); + // Handle the error. } }, friendUserID ); ``` -A successful callback means the delete request completed. Remove the local record by `userID` after `onFriendDeleted` arrives. Event handling is documented in [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page). +A successful callback means the delete-friend request completed. Receive relationship changes through `onFriendDeleted`; see [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page). diff --git a/content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx b/content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx index f06689e125..5a73ec7122 100644 --- a/content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx +++ b/content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx @@ -16,14 +16,12 @@ OpenIMClient.getInstance().friendshipManager.getFriendListPage( new OnBase>() { @Override public void onSuccess(List friends) { - for (UserInfo friend : friends) { - friendStore.put(friend.getUserID(), friend); - } + // Use friends to update the friend list. } @Override public void onError(int code, String error) { - recordFriendListFailure(code, error); + // Handle the error. } }, 0, @@ -34,15 +32,13 @@ OpenIMClient.getInstance().friendshipManager.getFriendListPage( The arguments after the callback are `offset`, `count`, and `filterBlack`. `offset` starts at `0`, `count` is the page size, and `filterBlack` removes blocked users when `true`. The callback returns the current page as `List`; call `getFriendInfo()` on each item for relationship details. Increase `offset` by the requested item count when loading another page; a page smaller than `count` normally marks the end. -Use the paged API instead of `getFriendList()`. Merge snapshots and increments by `userID`. - ## Friend profile fields -`UserInfo` is the Android wrapper object. `getFriendInfo()` returns `FriendInfo` for a friend list item. Common fields are: +`UserInfo.getFriendInfo()` returns `FriendInfo` for a friend list item. Common fields are: | Field | Description | | ---------------- | ------------------------------------------------- | -| `userID` | Friend user ID and the stable friend-list key. | +| `userID` | Friend user ID. | | `nickname` | Account nickname of the friend. | | `faceURL` | Account avatar URL of the friend. | | `remark` | Friend remark set by the current account. | @@ -51,23 +47,23 @@ Use the paged API instead of `getFriendList()`. Merge snapshots and increments b | `operatorUserID` | User ID that created or updated the relationship. | | `createTime` | Friendship creation time. | -`nickname` and `faceURL` are account data, while `remark` and `ex` belong to the friendship. `UpdateFriendsReq` can submit `isPinned`, but the current Android `FriendInfo` model has no corresponding read field, so pinned state needs application-owned storage. Do not use a friend object to overwrite a stranger's `PublicUserInfo`, or write a friend remark back to the account nickname. +`nickname` and `faceURL` are account data, while `remark` and `ex` belong to the friendship. `UpdateFriendsReq` can submit `isPinned`, but the current Android `FriendInfo` model has no corresponding read field. -This page owns the friend added, changed, and deleted callbacks. Combine them into the application's single `OnFriendshipListener`: +Receive friend added, changed, and deleted callbacks through `OnFriendshipListener`: ```java @Override public void onFriendAdded(FriendInfo friend) { - friendStore.put(friend.getUserID(), friend); + // Handle the added friend. } @Override public void onFriendInfoChanged(FriendInfo friend) { - friendStore.put(friend.getUserID(), friend); + // Handle the changed friend. } @Override public void onFriendDeleted(FriendInfo friend) { - friendStore.remove(friend.getUserID()); + // Handle the deleted friend. } ``` diff --git a/content/docs/chat/sdk/android/user/friends/get-friends-info.mdx b/content/docs/chat/sdk/android/user/friends/get-friends-info.mdx index cbd885d042..3749d3407d 100644 --- a/content/docs/chat/sdk/android/user/friends/get-friends-info.mdx +++ b/content/docs/chat/sdk/android/user/friends/get-friends-info.mdx @@ -17,13 +17,13 @@ OpenIMClient.getInstance().friendshipManager.getFriendsInfo( @Override public void onSuccess(List friends) { for (UserInfo friend : friends) { - friendStore.put(friend.getUserID(), friend); + // Use friends to update the friend profiles. } } @Override public void onError(int code, String error) { - recordFriendInfoFailure(code, error); + // Handle the error. } }, Arrays.asList("user_a", "user_b"), @@ -31,8 +31,8 @@ OpenIMClient.getInstance().friendshipManager.getFriendsInfo( ); ``` -The second argument is the target user ID list. `filterBlack` controls whether blocked users are removed. Remove empty and duplicate IDs before calling. The callback returns `List`; use `getFriendInfo()` for friend remarks and relationship fields, then merge by `userID`. +The second argument is the target user ID list. `filterBlack` controls whether blocked users are removed. Remove empty and duplicate IDs before calling. The callback returns `List`; use `getFriendInfo()` for friend remarks and relationship fields. -The result can omit a target that is not a friend or is excluded by `filterBlack == true`. When the UI also needs account-level public data, call [Get specified user profiles](/sdk/android/user/user-profile/get-users-info) and merge the two sources by `userID`. +The result can omit a target that is not a friend or is excluded by `filterBlack == true`. When the UI also needs account-level public data, call [Get specified user profiles](/sdk/android/user/user-profile/get-users-info). -This query does not trigger friendship callbacks. Use [`checkFriend()`](/sdk/android/user/friends/check-friend) when only the relationship state is needed. +Use [`checkFriend()`](/sdk/android/user/friends/check-friend) when only the relationship state is needed. diff --git a/content/docs/chat/sdk/android/user/friends/search-friends.mdx b/content/docs/chat/sdk/android/user/friends/search-friends.mdx index 10d52db56a..fe4900cb82 100644 --- a/content/docs/chat/sdk/android/user/friends/search-friends.mdx +++ b/content/docs/chat/sdk/android/user/friends/search-friends.mdx @@ -16,12 +16,12 @@ OpenIMClient.getInstance().friendshipManager.searchFriends( new OnBase>() { @Override public void onSuccess(List results) { - showFriendSearchResults(results); + // Use results to display the search results. } @Override public void onError(int code, String error) { - recordFriendSearchFailure(code, error); + // Handle the error. } }, Collections.singletonList(keyword.trim()), @@ -31,6 +31,6 @@ OpenIMClient.getInstance().friendshipManager.searchFriends( ); ``` -Pass one non-empty value in `keywordList`. The three Boolean arguments select matching by user ID, nickname, and friend remark. Enable at least one field. To search multiple fields, enable the corresponding flags; the API does not treat multiple keywords as independent search conditions. +Pass one non-empty value in `keywordList`. The three Boolean arguments select matching by user ID, nickname, and friend remark. Enable at least one field. To search multiple fields, enable the corresponding flags. -The callback returns `List`. Search results belong to the current search view and should not replace the full friend snapshot. This query does not trigger friendship callbacks. +The callback returns `List`, which can be used to display the search results. diff --git a/content/docs/chat/sdk/android/user/friends/update-friends.mdx b/content/docs/chat/sdk/android/user/friends/update-friends.mdx index 624e158896..95e464df36 100644 --- a/content/docs/chat/sdk/android/user/friends/update-friends.mdx +++ b/content/docs/chat/sdk/android/user/friends/update-friends.mdx @@ -20,12 +20,12 @@ OpenIMClient.getInstance().friendshipManager.updateFriendsReq( new OnBase() { @Override public void onSuccess(String data) { - markFriendUpdateSubmitted(); + // Friend profile update succeeded. } @Override public void onError(int code, String error) { - recordFriendUpdateFailure(code, error); + // Handle the error. } }, request @@ -39,6 +39,6 @@ OpenIMClient.getInstance().friendshipManager.updateFriendsReq( | `friendUserIDs` | Friend ID array to update. | | `remark` | Friend remark for the current account. | | `isPinned` | Whether to pin the friend. | -| `ex` | Friendship extension string, replaced as a complete value. | +| `ex` | Friendship extension string. | -A successful callback means the update request completed. Merge the friend increment through `onFriendInfoChanged`, as documented in [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page). +A successful callback means the update-friends request completed. Receive friend profile changes through `onFriendInfoChanged`, as documented in [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page). diff --git a/content/docs/chat/sdk/android/user/overview-user.mdx b/content/docs/chat/sdk/android/user/overview-user.mdx index 713b18a418..eeb5920e22 100644 --- a/content/docs/chat/sdk/android/user/overview-user.mdx +++ b/content/docs/chat/sdk/android/user/overview-user.mdx @@ -23,7 +23,7 @@ Android SDK returns different user objects for different scenarios: | ----------------------- | ---------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | | `LocalUser` | The current user's local profile, settings page, avatar, nickname, and account-level receive setting | `getSelfLocalUserInfo()`, `setSelfInfo()` | | `PublicUserInfo` | Application user lookup, friend candidates, and profiles for users who are not friends | `getUsersInfo()` | -| `UserInfo` | Combined Android wrapper object that can carry public, friend, or blacklist information | `getFriendListPage()`, `getFriendsInfo()`, `getBlacklist()` | +| `UserInfo` | User object returned by friend-list, friend-profile, or blocklist queries; it can include relationship data | `getFriendListPage()`, `getFriendsInfo()`, `getBlacklist()` | | `FriendInfo` | The current user's friend list, friend remarks, and relationship extension data | `searchFriends()`, `getFriendListPage()` | | `FriendApplicationInfo` | The parties, handling state, and message for a friend request | Friend request queries and callbacks | | `BlacklistInfo` | Users blocked by the current user and their blocklist relationship fields | `getBlacklist()`, `addBlacklist()`, `removeBlacklist()` | diff --git a/content/zh/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx b/content/zh/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx index ef8e11487b..0dd6271128 100644 --- a/content/zh/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx +++ b/content/zh/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx @@ -9,12 +9,12 @@ OpenIMClient.getInstance().friendshipManager.addBlacklist( new OnBase() { @Override public void onSuccess(String data) { - markBlacklistRequestSubmitted(targetUserID); + // 拉黑用户成功 } @Override public void onError(int code, String error) { - recordBlacklistAddFailure(code, error); + // 处理错误 } }, targetUserID, @@ -24,13 +24,13 @@ OpenIMClient.getInstance().friendshipManager.addBlacklist( 第二个参数是目标 `userID`,第三个参数是可选扩展字符串。无需扩展信息时可使用不带 `ex` 的重载。成功 callback 表示拉黑请求完成,不表示事件已经到达。 -黑名单是单向关系:被拉黑用户不能向当前用户发送消息,但当前用户是否允许继续向对方发送消息由业务层决定。`ex` 是完整字符串,更新前应合并业务自己的扩展字段。 +黑名单是单向关系:被拉黑用户不能向当前用户发送消息,但当前用户是否允许继续向对方发送消息由业务层决定。`ex` 是用于保存黑名单扩展信息的字符串,也可以存储 JSON 字符串。 -`onBlacklistAdded` 由本页归属,应组合进应用唯一的 `OnFriendshipListener`: +拉黑状态变化时,可通过 `OnFriendshipListener` 接收 `onBlacklistAdded`: ```java @Override public void onBlacklistAdded(BlacklistInfo user) { - blacklistStore.put(user.getUserID(), user); + // 处理新增的黑名单记录 } ``` diff --git a/content/zh/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx b/content/zh/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx index 19443fc3b4..52e3fcd1c9 100644 --- a/content/zh/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx +++ b/content/zh/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx @@ -4,7 +4,7 @@ description: '使用 getBlacklist() 获取当前用户的黑名单。' sourcePath: '/sdk/android/user/blacklist/get-blacklist' --- -黑名单记录当前用户主动拉黑的用户,可用于黑名单设置页、资料卡中的关系状态和聊天入口限制。黑名单与群成员管理是独立能力;禁言、移除群成员或调整群角色时,应使用群组 API。 +黑名单记录当前用户主动拉黑的用户,可用于黑名单设置页、资料卡中的关系状态和聊天入口限制。 ## 获取黑名单 @@ -15,12 +15,12 @@ OpenIMClient.getInstance().friendshipManager.getBlacklist( new OnBase>() { @Override public void onSuccess(List users) { - blacklistStore.replace(users); + // 使用 users 更新黑名单列表 } @Override public void onError(int code, String error) { - recordBlacklistFailure(code, error); + // 处理错误 } } ); @@ -34,8 +34,8 @@ OpenIMClient.getInstance().friendshipManager.getBlacklist( | 字段 | 说明 | | ---------------- | ------------------------------------------------- | -| `userID` | 被当前用户拉黑的目标用户 ID,也是列表的稳定 key。 | -| `nickname` | 目标用户昵称快照。 | +| `userID` | 被当前用户拉黑的目标用户 ID。 | +| `nickname` | 目标用户昵称。 | | `faceURL` | 目标用户头像地址。 | | `gender` | 目标用户性别值。 | | `operatorUserID` | 执行拉黑操作的用户 ID。 | @@ -43,8 +43,6 @@ OpenIMClient.getInstance().friendshipManager.getBlacklist( | `addSource` | 黑名单关系的添加来源。 | | `ex` | 黑名单关系扩展字符串。 | -如果页面还要展示好友备注或最新公开资料,应按 `userID` 额外合并 `FriendInfo` 或 `PublicUserInfo`,不能把黑名单字段当作好友资料。 +如果页面还要展示好友备注或最新公开资料,可额外查询好友资料或公开资料。 -黑名单状态统一按 `userID` 合并。查询本身不会触发黑名单新增或删除事件。 - -首次进入页面、重连或用户主动刷新时,使用返回的完整列表替换本地快照;增量变化由[拉黑用户](/sdk/android/user/blacklist/add-blacklist)和[取消拉黑用户](/sdk/android/user/blacklist/remove-blacklist)页面归属的 listener 处理。 +黑名单新增或删除时,可通过[拉黑用户](/sdk/android/user/blacklist/add-blacklist)和[取消拉黑用户](/sdk/android/user/blacklist/remove-blacklist)页面中的 listener 接收通知。 diff --git a/content/zh/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx b/content/zh/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx index f19628f9a3..af99abdf23 100644 --- a/content/zh/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx +++ b/content/zh/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx @@ -9,25 +9,25 @@ OpenIMClient.getInstance().friendshipManager.removeBlacklist( new OnBase() { @Override public void onSuccess(String data) { - markBlacklistRemovalSubmitted(targetUserID); + // 取消拉黑成功 } @Override public void onError(int code, String error) { - recordBlacklistRemovalFailure(code, error); + // 处理错误 } }, targetUserID ); ``` -成功 callback 表示移除请求完成,不表示事件已经到达。黑名单快照应在 `onBlacklistDeleted` 到达后按 `userID` 删除;如果事件丢失,可重新调用[获取黑名单列表](/sdk/android/user/blacklist/get-blacklist)校准。 +成功 callback 表示取消拉黑请求完成。黑名单发生变化时,通过 `onBlacklistDeleted` 接收通知;需要重新获取列表时,调用[获取黑名单列表](/sdk/android/user/blacklist/get-blacklist)。 -`onBlacklistDeleted` 由本页归属,应按 `userID` 删除本地记录: +取消拉黑时,可通过 `OnFriendshipListener` 接收 `onBlacklistDeleted`: ```java @Override public void onBlacklistDeleted(BlacklistInfo user) { - blacklistStore.remove(user.getUserID()); + // 处理已移除的黑名单记录 } ``` diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx index a4d9c88512..14c95f66a6 100644 --- a/content/zh/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx @@ -9,12 +9,12 @@ OpenIMClient.getInstance().friendshipManager.acceptFriendApplication( new OnBase() { @Override public void onSuccess(String data) { - markApplicationAccepted(applicantUserID); + // 接受好友申请成功 } @Override public void onError(int code, String error) { - recordApplicationAcceptFailure(code, error); + // 处理错误 } }, applicantUserID, @@ -22,4 +22,4 @@ OpenIMClient.getInstance().friendshipManager.acceptFriendApplication( ); ``` -`applicantUserID` 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示接受请求完成;好友申请状态和新增好友关系可能通过不同 callback 到达,应分别合并。申请状态由 `onFriendApplicationAccepted` 更新,新好友关系由 `onFriendAdded` 更新。 +`applicantUserID` 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示接受好友申请请求完成。申请状态通过 `onFriendApplicationAccepted` 通知,新好友关系通过 `onFriendAdded` 通知。 diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/add-friend.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/add-friend.mdx index e016f501dc..cac36cfec3 100644 --- a/content/zh/docs/chat/sdk/android/user/friend-applications/add-friend.mdx +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/add-friend.mdx @@ -9,12 +9,12 @@ OpenIMClient.getInstance().friendshipManager.addFriend( new OnBase() { @Override public void onSuccess(String data) { - markFriendApplicationSubmitted(); + // 好友申请发送成功 } @Override public void onError(int code, String error) { - recordFriendApplicationFailure(code, error); + // 处理错误 } }, "user_b", @@ -24,4 +24,4 @@ OpenIMClient.getInstance().friendshipManager.addFriend( 第二个参数是申请接收方的 `userID`,第三个参数是申请附言。成功 callback 表示服务端已收到申请,不表示对方已经同意。目标用户 ID 不能为空;按昵称、手机号等字段搜索目标用户应先由业务后端完成。 -好友申请状态变化通过 `OnFriendshipListener` 合并,见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。 +好友申请状态变化通过 `OnFriendshipListener` 接收,见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。 diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx index 788d2bfee8..bd7817ffa9 100644 --- a/content/zh/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx @@ -12,12 +12,12 @@ OpenIMClient.getInstance().friendshipManager.getRecvFriendApplicationList( new OnBase>() { @Override public void onSuccess(List applications) { - replaceReceivedApplications(applications); + // 使用 applications 更新收到的好友申请列表 } @Override public void onError(int code, String error) { - recordReceivedApplicationFailure(code, error); + // 处理错误 } }, request @@ -28,8 +28,8 @@ OpenIMClient.getInstance().friendshipManager.getRecvFriendApplicationList( | 字段 | 说明 | | --------------------------------------------- | ---------------------------------------------- | -| `fromUserID` / `fromNickname` / `fromFaceURL` | 申请发起人的 ID、昵称和头像快照。 | -| `toUserID` / `toNickname` / `toFaceURL` | 申请接收人的 ID、昵称和头像快照。 | +| `fromUserID` / `fromNickname` / `fromFaceURL` | 申请发起人的 ID、昵称和头像。 | +| `toUserID` / `toNickname` / `toFaceURL` | 申请接收人的 ID、昵称和头像。 | | `reqMsg` | 申请附言。 | | `handleResult` | 处理结果:`0` 待处理,`1` 已同意,`2` 已拒绝。 | | `handlerUserID` | 执行处理的用户 ID,待处理时可能为空。 | @@ -38,31 +38,28 @@ OpenIMClient.getInstance().friendshipManager.getRecvFriendApplicationList( | `createTime` | 申请记录创建时间。 | | `ex` | 申请记录扩展字符串。 | -好友申请使用 `fromUserID:toUserID` 作为稳定标识。本页归属好友申请新增、接受、拒绝和删除事件,以下 callback 应组合进应用唯一的 `OnFriendshipListener`: +好友申请新增、接受、拒绝和删除时,可通过 `OnFriendshipListener` 接收以下回调: ```java @Override public void onFriendApplicationAdded(FriendApplicationInfo application) { - friendApplicationStore.merge(application); + // 处理新增或更新的好友申请 } @Override public void onFriendApplicationAccepted(FriendApplicationInfo application) { - friendApplicationStore.merge(application); + // 处理已接受的好友申请 } @Override public void onFriendApplicationRejected(FriendApplicationInfo application) { - friendApplicationStore.merge(application); + // 处理已拒绝的好友申请 } @Override public void onFriendApplicationDeleted(FriendApplicationInfo application) { - friendApplicationStore.remove( - application.getFromUserID(), - application.getToUserID() - ); + // 处理已删除的好友申请 } ``` -按 `toUserID` 是否等于当前登录用户 ID,将记录分流到收到或发出的列表。申请被接受后,新好友关系由[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)归属的 `onFriendAdded` 合并。 +按 `toUserID` 是否等于当前登录用户 ID,将记录分流到收到或发出的列表。申请被接受后,通过 `onFriendAdded` 接收新好友关系通知,详见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。 diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx index 8379e69e7e..9fce165d8a 100644 --- a/content/zh/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx @@ -12,18 +12,18 @@ OpenIMClient.getInstance().friendshipManager.getSendFriendApplicationList( new OnBase>() { @Override public void onSuccess(List applications) { - replaceSentApplications(applications); + // 使用 applications 更新发出的好友申请列表 } @Override public void onError(int code, String error) { - recordSentApplicationFailure(code, error); + // 处理错误 } }, request ); ``` -`offset` 从 `0` 开始,`count` 是页大小。成功 callback 返回当前页 `List`;按 `fromUserID:toUserID` 合并。查询只建立快照,不触发好友申请事件。 +`offset` 从 `0` 开始,`count` 是页大小。成功 callback 返回当前页 `List`。 -发出的申请中,当前用户通常是 `fromUserID`。列表字段和处理结果含义与[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)相同;申请处理状态使用 Android 服务端约定的 `0`(待处理)、`1`(已同意)和 `2`(已拒绝)。 +发出的申请中,当前用户通常是 `fromUserID`。列表字段和处理结果含义与[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)相同。 diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx index 99dcfee3b4..1c2baefc6e 100644 --- a/content/zh/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx @@ -9,12 +9,12 @@ OpenIMClient.getInstance().friendshipManager.refuseFriendApplication( new OnBase() { @Override public void onSuccess(String data) { - markApplicationRejected(applicantUserID); + // 拒绝好友申请成功 } @Override public void onError(int code, String error) { - recordApplicationRejectFailure(code, error); + // 处理错误 } }, applicantUserID, @@ -22,4 +22,4 @@ OpenIMClient.getInstance().friendshipManager.refuseFriendApplication( ); ``` -`applicantUserID` 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示拒绝请求完成;申请状态通过统一好友申请 listener 合并,并最终以 `handleResult == 2` 表示已拒绝。 +`applicantUserID` 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示拒绝好友申请请求完成;申请状态通过 `OnFriendshipListener` 通知,`handleResult == 2` 表示已拒绝。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/check-friend.mdx b/content/zh/docs/chat/sdk/android/user/friends/check-friend.mdx index b9d5364cb8..81ca1c5198 100644 --- a/content/zh/docs/chat/sdk/android/user/friends/check-friend.mdx +++ b/content/zh/docs/chat/sdk/android/user/friends/check-friend.mdx @@ -9,18 +9,18 @@ OpenIMClient.getInstance().friendshipManager.checkFriend( new OnBase>() { @Override public void onSuccess(List relations) { - showFriendshipStates(relations); + // 使用 relations 更新好友关系显示 } @Override public void onError(int code, String error) { - recordFriendshipCheckFailure(code, error); + // 处理错误 } }, Arrays.asList("user_a", "user_b") ); ``` -成功 callback 返回 `List`。每项的 `userID` 标识目标用户,`result == 1` 表示目标是好友且不在黑名单中。`result` 以服务端返回值为准,不应在客户端扩展未声明的状态枚举。 +成功 callback 返回 `List`。每项的 `userID` 是目标用户 ID,调用 `friendshipInfo.getResult()` 获取关系结果;返回 `1` 表示该用户是当前用户的好友且不在黑名单中。 -该方法只建立关系快照,不触发好友 listener。需要昵称、头像或好友备注时使用 [`getFriendsInfo()`](/sdk/android/user/friends/get-friends-info)。 +需要昵称、头像或好友备注时,使用 [`getFriendsInfo()`](/sdk/android/user/friends/get-friends-info)。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/delete-friend.mdx b/content/zh/docs/chat/sdk/android/user/friends/delete-friend.mdx index f8325020e4..a0bc1951f4 100644 --- a/content/zh/docs/chat/sdk/android/user/friends/delete-friend.mdx +++ b/content/zh/docs/chat/sdk/android/user/friends/delete-friend.mdx @@ -9,16 +9,16 @@ OpenIMClient.getInstance().friendshipManager.deleteFriend( new OnBase() { @Override public void onSuccess(String data) { - markFriendDeletionSubmitted(friendUserID); + // 删除好友成功 } @Override public void onError(int code, String error) { - recordFriendDeletionFailure(code, error); + // 处理错误 } }, friendUserID ); ``` -成功 callback 表示删除请求完成。`onFriendDeleted` 到达后再按 `userID` 从好友状态中移除记录,事件处理见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。 +成功 callback 表示删除好友请求完成。好友关系发生变化时,通过 `onFriendDeleted` 接收通知,详见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx b/content/zh/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx index c804c69daa..7e4819996e 100644 --- a/content/zh/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx +++ b/content/zh/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx @@ -9,14 +9,12 @@ OpenIMClient.getInstance().friendshipManager.getFriendListPage( new OnBase>() { @Override public void onSuccess(List friends) { - for (UserInfo friend : friends) { - friendStore.put(friend.getUserID(), friend); - } + // 使用 friends 更新好友列表 } @Override public void onError(int code, String error) { - recordFriendListFailure(code, error); + // 处理错误 } }, 0, @@ -27,15 +25,13 @@ OpenIMClient.getInstance().friendshipManager.getFriendListPage( 参数依次为 `offset`、`count` 和 `filterBlack`。`offset` 从 `0` 开始,`count` 是页大小,`filterBlack` 为 `true` 时过滤黑名单用户。成功 callback 返回当前页 `List`,好友关系详情可通过 `getFriendInfo()` 读取。继续加载下一页时按实际请求数量增加 `offset`;返回数量小于 `count` 时通常表示到达末页。 -只使用分页 API,不使用非分页的 `getFriendList()`。快照和增量都应按 `userID` 合并。 - ## 好友资料字段 -`UserInfo` 是 Android wrapper 的组合对象。好友列表中的 `getFriendInfo()` 返回 `FriendInfo`,常用字段如下: +好友列表中的 `UserInfo.getFriendInfo()` 返回 `FriendInfo`,常用字段如下: | 字段 | 说明 | | ---------------- | ------------------------------------- | -| `userID` | 好友用户 ID,也是好友列表的稳定标识。 | +| `userID` | 好友用户 ID。 | | `nickname` | 好友账号昵称。 | | `faceURL` | 好友账号头像地址。 | | `remark` | 当前账号设置的好友备注。 | @@ -44,23 +40,23 @@ OpenIMClient.getInstance().friendshipManager.getFriendListPage( | `operatorUserID` | 建立或更新关系的操作用户 ID。 | | `createTime` | 好友关系创建时间。 | -`nickname` 和 `faceURL` 是账号资料,`remark` 和 `ex` 属于好友关系。`UpdateFriendsReq` 支持提交 `isPinned`,但当前 Android `FriendInfo` 模型不提供对应读取字段,置顶状态应由业务层单独维护。不要用好友对象覆盖陌生人的 `PublicUserInfo`,也不要把好友备注写回账号昵称。 +`nickname` 和 `faceURL` 是账号资料,`remark` 和 `ex` 属于好友关系。`UpdateFriendsReq` 支持提交 `isPinned`,但当前 Android `FriendInfo` 模型不提供对应读取字段。 -本页归属好友新增、资料变化和删除事件。以下 callback 应组合进应用唯一的 `OnFriendshipListener`: +好友新增、资料变化和删除时,可通过 `OnFriendshipListener` 接收以下回调: ```java @Override public void onFriendAdded(FriendInfo friend) { - friendStore.put(friend.getUserID(), friend); + // 处理新增好友 } @Override public void onFriendInfoChanged(FriendInfo friend) { - friendStore.put(friend.getUserID(), friend); + // 处理好友资料变化 } @Override public void onFriendDeleted(FriendInfo friend) { - friendStore.remove(friend.getUserID()); + // 处理好友删除 } ``` diff --git a/content/zh/docs/chat/sdk/android/user/friends/get-friends-info.mdx b/content/zh/docs/chat/sdk/android/user/friends/get-friends-info.mdx index 7000e76a0e..d321c492c9 100644 --- a/content/zh/docs/chat/sdk/android/user/friends/get-friends-info.mdx +++ b/content/zh/docs/chat/sdk/android/user/friends/get-friends-info.mdx @@ -10,13 +10,13 @@ OpenIMClient.getInstance().friendshipManager.getFriendsInfo( @Override public void onSuccess(List friends) { for (UserInfo friend : friends) { - friendStore.put(friend.getUserID(), friend); + // 使用 friends 更新好友资料 } } @Override public void onError(int code, String error) { - recordFriendInfoFailure(code, error); + // 处理错误 } }, Arrays.asList("user_a", "user_b"), @@ -24,8 +24,8 @@ OpenIMClient.getInstance().friendshipManager.getFriendsInfo( ); ``` -第二个参数是目标用户 ID 列表,`filterBlack` 决定是否过滤黑名单用户。成功 callback 返回 `List`;通过 `getFriendInfo()` 读取好友备注和关系字段,并按 `userID` 合并。调用前应去除空值和重复 ID。 +第二个参数是目标用户 ID 列表,`filterBlack` 决定是否过滤黑名单用户。成功 callback 返回 `List`;通过 `getFriendInfo()` 读取好友备注和关系字段。调用前应去除空值和重复 ID。 -当目标用户不是好友,或目标用户因 `filterBlack == true` 被过滤时,返回结果中可能没有对应记录。需要同时展示账号公开资料时,应再调用[获取指定用户资料](/sdk/android/user/user-profile/get-users-info),并按 `userID` 合并两类数据。 +当目标用户不是好友,或目标用户因 `filterBlack == true` 被过滤时,返回结果中可能没有对应记录。需要同时展示账号公开资料时,可再调用[获取指定用户资料](/sdk/android/user/user-profile/get-users-info)。 -该查询不会触发好友 listener。只需要判断好友关系时使用 [`checkFriend()`](/sdk/android/user/friends/check-friend)。 +只需要判断好友关系时,使用 [`checkFriend()`](/sdk/android/user/friends/check-friend)。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/search-friends.mdx b/content/zh/docs/chat/sdk/android/user/friends/search-friends.mdx index c2906f3348..dce3022ce9 100644 --- a/content/zh/docs/chat/sdk/android/user/friends/search-friends.mdx +++ b/content/zh/docs/chat/sdk/android/user/friends/search-friends.mdx @@ -9,12 +9,12 @@ OpenIMClient.getInstance().friendshipManager.searchFriends( new OnBase>() { @Override public void onSuccess(List results) { - showFriendSearchResults(results); + // 使用 results 显示搜索结果 } @Override public void onError(int code, String error) { - recordFriendSearchFailure(code, error); + // 处理错误 } }, Collections.singletonList(keyword.trim()), @@ -24,6 +24,6 @@ OpenIMClient.getInstance().friendshipManager.searchFriends( ); ``` -`keywordList` 当前只传一个非空关键词。后面的三个布尔值依次控制是否匹配用户 ID、昵称和好友备注,至少应启用一种匹配方式。需要同时搜索多个字段时,将对应开关设为 `true`;不支持把多个关键词作为同一请求的独立搜索条件。 +`keywordList` 当前只传一个非空关键词。后面的三个布尔值依次控制是否匹配用户 ID、昵称和好友备注,至少应启用一种匹配方式。需要同时搜索多个字段时,将对应开关设为 `true`。 -成功 callback 返回 `List`。搜索结果只属于当前搜索视图,不应覆盖完整好友列表,也不会触发好友 listener。 +成功 callback 返回 `List`,可用于显示搜索结果。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/update-friends.mdx b/content/zh/docs/chat/sdk/android/user/friends/update-friends.mdx index 2e60882934..ae1aaaf11c 100644 --- a/content/zh/docs/chat/sdk/android/user/friends/update-friends.mdx +++ b/content/zh/docs/chat/sdk/android/user/friends/update-friends.mdx @@ -13,12 +13,12 @@ OpenIMClient.getInstance().friendshipManager.updateFriendsReq( new OnBase() { @Override public void onSuccess(String data) { - markFriendUpdateSubmitted(); + // 更新好友资料成功 } @Override public void onError(int code, String error) { - recordFriendUpdateFailure(code, error); + // 处理错误 } }, request @@ -32,6 +32,6 @@ OpenIMClient.getInstance().friendshipManager.updateFriendsReq( | `friendUserIDs` | 待更新的好友 ID 数组。 | | `remark` | 当前账号设置的好友备注。 | | `isPinned` | 是否置顶好友。 | -| `ex` | 好友关系扩展字符串,按完整值覆盖。 | +| `ex` | 好友关系扩展字符串。 | -成功 callback 表示更新请求完成。好友资料增量通过 `onFriendInfoChanged` 合并,事件处理见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。 +成功 callback 表示更新好友资料请求完成。好友资料发生变化时,可通过 `onFriendInfoChanged` 接收通知,详见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。 diff --git a/content/zh/docs/chat/sdk/android/user/overview-user.mdx b/content/zh/docs/chat/sdk/android/user/overview-user.mdx index 7b447ea85c..cc118c4bd8 100644 --- a/content/zh/docs/chat/sdk/android/user/overview-user.mdx +++ b/content/zh/docs/chat/sdk/android/user/overview-user.mdx @@ -16,7 +16,7 @@ Android SDK 会根据使用场景返回不同的用户对象: | ----------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------- | | `LocalUser` | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | `getSelfLocalUserInfo()`、`setSelfInfo()` | | `PublicUserInfo` | 查询应用用户、查找好友候选人和展示陌生人资料卡 | `getUsersInfo()` | -| `UserInfo` | Android wrapper 返回的组合对象,可承载公开资料、好友资料或黑名单资料 | `getFriendListPage()`、`getFriendsInfo()`、`getBlacklist()` | +| `UserInfo` | 查询好友列表、好友资料或黑名单时返回的用户对象,可包含对应关系资料 | `getFriendListPage()`、`getFriendsInfo()`、`getBlacklist()` | | `FriendInfo` | 当前用户的好友列表、好友备注和关系扩展字段 | `searchFriends()`、`getFriendListPage()` | | `FriendApplicationInfo` | 好友申请双方、处理状态和附言 | 好友申请查询与 listener | | `BlacklistInfo` | 当前用户拉黑的用户及黑名单关系字段 | `getBlacklist()`、`addBlacklist()`、`removeBlacklist()` | diff --git a/data/structure/android-content-audit.json b/data/structure/android-content-audit.json index 71ad274635..7fb62faf38 100644 --- a/data/structure/android-content-audit.json +++ b/data/structure/android-content-audit.json @@ -1730,7 +1730,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "not-applicable", "evidence": [], @@ -1740,7 +1740,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "not-applicable", "evidence": [], @@ -1936,7 +1936,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -1949,7 +1949,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -1978,7 +1978,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -1990,7 +1990,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2018,7 +2018,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2030,7 +2030,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2058,7 +2058,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2070,7 +2070,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2098,7 +2098,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2110,7 +2110,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2138,7 +2138,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2150,7 +2150,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2178,7 +2178,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2190,7 +2190,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2224,7 +2224,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2237,7 +2237,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2266,7 +2266,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2278,7 +2278,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2306,7 +2306,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2318,7 +2318,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2346,7 +2346,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2358,7 +2358,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2386,7 +2386,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2398,7 +2398,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2429,7 +2429,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2442,7 +2442,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2474,7 +2474,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ @@ -2487,7 +2487,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-18", "exampleVerification": { "status": "verified", "evidence": [ diff --git a/src/generated/android-sdk-zh-content.json b/src/generated/android-sdk-zh-content.json index a10ef61c5d..71d8f90260 100644 --- a/src/generated/android-sdk-zh-content.json +++ b/src/generated/android-sdk-zh-content.json @@ -713,7 +713,7 @@ "title": "发送第一条消息" }, "/sdk/android/user/overview-user": { - "body": "OpenIM Android SDK 使用 `userID` 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。\n\n群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。\n\n## 用户类型\n\nAndroid SDK 会根据使用场景返回不同的用户对象:\n\n| 类型 | 适用场景 | 主要 API |\n| ----------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------- |\n| `LocalUser` | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | `getSelfLocalUserInfo()`、`setSelfInfo()` |\n| `PublicUserInfo` | 查询应用用户、查找好友候选人和展示陌生人资料卡 | `getUsersInfo()` |\n| `UserInfo` | Android wrapper 返回的组合对象,可承载公开资料、好友资料或黑名单资料 | `getFriendListPage()`、`getFriendsInfo()`、`getBlacklist()` |\n| `FriendInfo` | 当前用户的好友列表、好友备注和关系扩展字段 | `searchFriends()`、`getFriendListPage()` |\n| `FriendApplicationInfo` | 好友申请双方、处理状态和附言 | 好友申请查询与 listener |\n| `BlacklistInfo` | 当前用户拉黑的用户及黑名单关系字段 | `getBlacklist()`、`addBlacklist()`、`removeBlacklist()` |\n| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()`、`unsubscribeOnlineUsersStatus()` |\n\n同一个 `userID` 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 `UserInfo.getFriendInfo()`;只需要账号公开资料时使用 `PublicUserInfo`;黑名单页面使用 `UserInfo.getBlackInfo()`。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。\n\n所有列表和事件都应使用 `userID` 作为稳定标识。好友申请同时包含申请方和接收方,应使用 `fromUserID:toUserID` 标识一条申请。\n\n## 功能入口\n\n下表列出了用户相关的常见需求和对应页面:\n\n| 需求 | 推荐页面 |\n| -------------------------------------------------------- | -------------------------------------------------------------------------------------------- |\n| 按 `userID` 查询公开资料,用于查找好友候选人或展示资料卡 | [获取指定用户资料](/sdk/android/user/user-profile/get-users-info) |\n| 分页、搜索或按 ID 查询好友关系 | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) |\n| 发送、查询、接受或拒绝好友申请 | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) |\n| 修改好友资料 | [更新好友资料](/sdk/android/user/friends/update-friends) |\n| 删除好友关系 | [删除好友](/sdk/android/user/friends/delete-friend) |\n| 查看和维护当前用户黑名单 | [获取黑名单列表](/sdk/android/user/blacklist/get-blacklist) |\n| 读取或更新当前用户的昵称、头像和扩展资料 | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) |\n| 设置账号级消息接收和通知策略 | [设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception) |\n| 订阅、读取和取消在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)、[取消用户状态订阅](/sdk/android/user/online-status/unsubscribe-users-online-status) |\n\n## 状态更新\n\n用户相关事件由对应能力页负责监听和合并:\n\n- 当前用户资料变化:见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。\n- 好友申请变化:见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。\n- 好友关系和好友资料变化:见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。\n- 黑名单变化:见[拉黑用户](/sdk/android/user/blacklist/add-blacklist)。\n- 在线状态变化:见[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。\n\nAndroid SDK 的 `UserInfoManager` 和 `FriendshipManager` 各保存一个 listener,`setOnUserListener()` 和 `setOnFriendshipListener()` 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。", + "body": "OpenIM Android SDK 使用 `userID` 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。\n\n群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。\n\n## 用户类型\n\nAndroid SDK 会根据使用场景返回不同的用户对象:\n\n| 类型 | 适用场景 | 主要 API |\n| ----------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------- |\n| `LocalUser` | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | `getSelfLocalUserInfo()`、`setSelfInfo()` |\n| `PublicUserInfo` | 查询应用用户、查找好友候选人和展示陌生人资料卡 | `getUsersInfo()` |\n| `UserInfo` | 查询好友列表、好友资料或黑名单时返回的用户对象,可包含对应关系资料 | `getFriendListPage()`、`getFriendsInfo()`、`getBlacklist()` |\n| `FriendInfo` | 当前用户的好友列表、好友备注和关系扩展字段 | `searchFriends()`、`getFriendListPage()` |\n| `FriendApplicationInfo` | 好友申请双方、处理状态和附言 | 好友申请查询与 listener |\n| `BlacklistInfo` | 当前用户拉黑的用户及黑名单关系字段 | `getBlacklist()`、`addBlacklist()`、`removeBlacklist()` |\n| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()`、`unsubscribeOnlineUsersStatus()` |\n\n同一个 `userID` 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 `UserInfo.getFriendInfo()`;只需要账号公开资料时使用 `PublicUserInfo`;黑名单页面使用 `UserInfo.getBlackInfo()`。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。\n\n所有列表和事件都应使用 `userID` 作为稳定标识。好友申请同时包含申请方和接收方,应使用 `fromUserID:toUserID` 标识一条申请。\n\n## 功能入口\n\n下表列出了用户相关的常见需求和对应页面:\n\n| 需求 | 推荐页面 |\n| -------------------------------------------------------- | -------------------------------------------------------------------------------------------- |\n| 按 `userID` 查询公开资料,用于查找好友候选人或展示资料卡 | [获取指定用户资料](/sdk/android/user/user-profile/get-users-info) |\n| 分页、搜索或按 ID 查询好友关系 | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) |\n| 发送、查询、接受或拒绝好友申请 | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) |\n| 修改好友资料 | [更新好友资料](/sdk/android/user/friends/update-friends) |\n| 删除好友关系 | [删除好友](/sdk/android/user/friends/delete-friend) |\n| 查看和维护当前用户黑名单 | [获取黑名单列表](/sdk/android/user/blacklist/get-blacklist) |\n| 读取或更新当前用户的昵称、头像和扩展资料 | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) |\n| 设置账号级消息接收和通知策略 | [设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception) |\n| 订阅、读取和取消在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)、[取消用户状态订阅](/sdk/android/user/online-status/unsubscribe-users-online-status) |\n\n## 状态更新\n\n用户相关事件由对应能力页负责监听和合并:\n\n- 当前用户资料变化:见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。\n- 好友申请变化:见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。\n- 好友关系和好友资料变化:见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。\n- 黑名单变化:见[拉黑用户](/sdk/android/user/blacklist/add-blacklist)。\n- 在线状态变化:见[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。\n\nAndroid SDK 的 `UserInfoManager` 和 `FriendshipManager` 各保存一个 listener,`setOnUserListener()` 和 `setOnFriendshipListener()` 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。", "description": "了解 Android SDK 中的用户资料、好友关系、好友申请、黑名单和在线状态 API。", "headings": [ { @@ -814,7 +814,7 @@ "title": "取消用户状态订阅" }, "/sdk/android/user/friends/get-friend-list-page": { - "body": "```java\nOpenIMClient.getInstance().friendshipManager.getFriendListPage(\n new OnBase>() {\n @Override\n public void onSuccess(List friends) {\n for (UserInfo friend : friends) {\n friendStore.put(friend.getUserID(), friend);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendListFailure(code, error);\n }\n },\n 0,\n 40,\n true\n);\n```\n\n参数依次为 `offset`、`count` 和 `filterBlack`。`offset` 从 `0` 开始,`count` 是页大小,`filterBlack` 为 `true` 时过滤黑名单用户。成功 callback 返回当前页 `List`,好友关系详情可通过 `getFriendInfo()` 读取。继续加载下一页时按实际请求数量增加 `offset`;返回数量小于 `count` 时通常表示到达末页。\n\n只使用分页 API,不使用非分页的 `getFriendList()`。快照和增量都应按 `userID` 合并。\n\n## 好友资料字段\n\n`UserInfo` 是 Android wrapper 的组合对象。好友列表中的 `getFriendInfo()` 返回 `FriendInfo`,常用字段如下:\n\n| 字段 | 说明 |\n| ---------------- | ------------------------------------- |\n| `userID` | 好友用户 ID,也是好友列表的稳定标识。 |\n| `nickname` | 好友账号昵称。 |\n| `faceURL` | 好友账号头像地址。 |\n| `remark` | 当前账号设置的好友备注。 |\n| `ex` | 好友关系扩展字符串。 |\n| `addSource` | 好友关系添加来源。 |\n| `operatorUserID` | 建立或更新关系的操作用户 ID。 |\n| `createTime` | 好友关系创建时间。 |\n\n`nickname` 和 `faceURL` 是账号资料,`remark` 和 `ex` 属于好友关系。`UpdateFriendsReq` 支持提交 `isPinned`,但当前 Android `FriendInfo` 模型不提供对应读取字段,置顶状态应由业务层单独维护。不要用好友对象覆盖陌生人的 `PublicUserInfo`,也不要把好友备注写回账号昵称。\n\n本页归属好友新增、资料变化和删除事件。以下 callback 应组合进应用唯一的 `OnFriendshipListener`:\n\n```java\n@Override\npublic void onFriendAdded(FriendInfo friend) {\n friendStore.put(friend.getUserID(), friend);\n}\n\n@Override\npublic void onFriendInfoChanged(FriendInfo friend) {\n friendStore.put(friend.getUserID(), friend);\n}\n\n@Override\npublic void onFriendDeleted(FriendInfo friend) {\n friendStore.remove(friend.getUserID());\n}\n```", + "body": "```java\nOpenIMClient.getInstance().friendshipManager.getFriendListPage(\n new OnBase>() {\n @Override\n public void onSuccess(List friends) {\n // 使用 friends 更新好友列表\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n 0,\n 40,\n true\n);\n```\n\n参数依次为 `offset`、`count` 和 `filterBlack`。`offset` 从 `0` 开始,`count` 是页大小,`filterBlack` 为 `true` 时过滤黑名单用户。成功 callback 返回当前页 `List`,好友关系详情可通过 `getFriendInfo()` 读取。继续加载下一页时按实际请求数量增加 `offset`;返回数量小于 `count` 时通常表示到达末页。\n\n## 好友资料字段\n\n好友列表中的 `UserInfo.getFriendInfo()` 返回 `FriendInfo`,常用字段如下:\n\n| 字段 | 说明 |\n| ---------------- | ------------------------------------- |\n| `userID` | 好友用户 ID。 |\n| `nickname` | 好友账号昵称。 |\n| `faceURL` | 好友账号头像地址。 |\n| `remark` | 当前账号设置的好友备注。 |\n| `ex` | 好友关系扩展字符串。 |\n| `addSource` | 好友关系添加来源。 |\n| `operatorUserID` | 建立或更新关系的操作用户 ID。 |\n| `createTime` | 好友关系创建时间。 |\n\n`nickname` 和 `faceURL` 是账号资料,`remark` 和 `ex` 属于好友关系。`UpdateFriendsReq` 支持提交 `isPinned`,但当前 Android `FriendInfo` 模型不提供对应读取字段。\n\n好友新增、资料变化和删除时,可通过 `OnFriendshipListener` 接收以下回调:\n\n```java\n@Override\npublic void onFriendAdded(FriendInfo friend) {\n // 处理新增好友\n}\n\n@Override\npublic void onFriendInfoChanged(FriendInfo friend) {\n // 处理好友资料变化\n}\n\n@Override\npublic void onFriendDeleted(FriendInfo friend) {\n // 处理好友删除\n}\n```", "description": "使用 getFriendListPage() 分页获取当前用户的好友列表。", "headings": [ { @@ -827,77 +827,77 @@ "title": "分页获取好友列表" }, "/sdk/android/user/friends/search-friends": { - "body": "```java\nOpenIMClient.getInstance().friendshipManager.searchFriends(\n new OnBase>() {\n @Override\n public void onSuccess(List results) {\n showFriendSearchResults(results);\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendSearchFailure(code, error);\n }\n },\n Collections.singletonList(keyword.trim()),\n true,\n true,\n true\n);\n```\n\n`keywordList` 当前只传一个非空关键词。后面的三个布尔值依次控制是否匹配用户 ID、昵称和好友备注,至少应启用一种匹配方式。需要同时搜索多个字段时,将对应开关设为 `true`;不支持把多个关键词作为同一请求的独立搜索条件。\n\n成功 callback 返回 `List`。搜索结果只属于当前搜索视图,不应覆盖完整好友列表,也不会触发好友 listener。", + "body": "```java\nOpenIMClient.getInstance().friendshipManager.searchFriends(\n new OnBase>() {\n @Override\n public void onSuccess(List results) {\n // 使用 results 显示搜索结果\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n Collections.singletonList(keyword.trim()),\n true,\n true,\n true\n);\n```\n\n`keywordList` 当前只传一个非空关键词。后面的三个布尔值依次控制是否匹配用户 ID、昵称和好友备注,至少应启用一种匹配方式。需要同时搜索多个字段时,将对应开关设为 `true`。\n\n成功 callback 返回 `List`,可用于显示搜索结果。", "description": "使用 searchFriends() 搜索当前用户的好友。", "headings": [], "sourcePath": "/sdk/android/user/friends/search-friends", "title": "搜索好友" }, "/sdk/android/user/friends/get-friends-info": { - "body": "```java\nOpenIMClient.getInstance().friendshipManager.getFriendsInfo(\n new OnBase>() {\n @Override\n public void onSuccess(List friends) {\n for (UserInfo friend : friends) {\n friendStore.put(friend.getUserID(), friend);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendInfoFailure(code, error);\n }\n },\n Arrays.asList(\"user_a\", \"user_b\"),\n true\n);\n```\n\n第二个参数是目标用户 ID 列表,`filterBlack` 决定是否过滤黑名单用户。成功 callback 返回 `List`;通过 `getFriendInfo()` 读取好友备注和关系字段,并按 `userID` 合并。调用前应去除空值和重复 ID。\n\n当目标用户不是好友,或目标用户因 `filterBlack == true` 被过滤时,返回结果中可能没有对应记录。需要同时展示账号公开资料时,应再调用[获取指定用户资料](/sdk/android/user/user-profile/get-users-info),并按 `userID` 合并两类数据。\n\n该查询不会触发好友 listener。只需要判断好友关系时使用 [`checkFriend()`](/sdk/android/user/friends/check-friend)。", + "body": "```java\nOpenIMClient.getInstance().friendshipManager.getFriendsInfo(\n new OnBase>() {\n @Override\n public void onSuccess(List friends) {\n for (UserInfo friend : friends) {\n // 使用 friends 更新好友资料\n }\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n Arrays.asList(\"user_a\", \"user_b\"),\n true\n);\n```\n\n第二个参数是目标用户 ID 列表,`filterBlack` 决定是否过滤黑名单用户。成功 callback 返回 `List`;通过 `getFriendInfo()` 读取好友备注和关系字段。调用前应去除空值和重复 ID。\n\n当目标用户不是好友,或目标用户因 `filterBlack == true` 被过滤时,返回结果中可能没有对应记录。需要同时展示账号公开资料时,可再调用[获取指定用户资料](/sdk/android/user/user-profile/get-users-info)。\n\n只需要判断好友关系时,使用 [`checkFriend()`](/sdk/android/user/friends/check-friend)。", "description": "使用 getFriendsInfo() 查询指定用户的好友关系资料。", "headings": [], "sourcePath": "/sdk/android/user/friends/get-friends-info", "title": "查询指定好友资料" }, "/sdk/android/user/friends/check-friend": { - "body": "```java\nOpenIMClient.getInstance().friendshipManager.checkFriend(\n new OnBase>() {\n @Override\n public void onSuccess(List relations) {\n showFriendshipStates(relations);\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendshipCheckFailure(code, error);\n }\n },\n Arrays.asList(\"user_a\", \"user_b\")\n);\n```\n\n成功 callback 返回 `List`。每项的 `userID` 标识目标用户,`result == 1` 表示目标是好友且不在黑名单中。`result` 以服务端返回值为准,不应在客户端扩展未声明的状态枚举。\n\n该方法只建立关系快照,不触发好友 listener。需要昵称、头像或好友备注时使用 [`getFriendsInfo()`](/sdk/android/user/friends/get-friends-info)。", + "body": "```java\nOpenIMClient.getInstance().friendshipManager.checkFriend(\n new OnBase>() {\n @Override\n public void onSuccess(List relations) {\n // 使用 relations 更新好友关系显示\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n Arrays.asList(\"user_a\", \"user_b\")\n);\n```\n\n成功 callback 返回 `List`。每项的 `userID` 是目标用户 ID,调用 `friendshipInfo.getResult()` 获取关系结果;返回 `1` 表示该用户是当前用户的好友且不在黑名单中。\n\n需要昵称、头像或好友备注时,使用 [`getFriendsInfo()`](/sdk/android/user/friends/get-friends-info)。", "description": "使用 checkFriend() 检查指定用户是否为当前用户的好友。", "headings": [], "sourcePath": "/sdk/android/user/friends/check-friend", "title": "检查好友关系" }, "/sdk/android/user/friends/update-friends": { - "body": "```java\nUpdateFriendsReq request = new UpdateFriendsReq();\nrequest.setFriendUserIDs(new String[] { friendUserID });\nrequest.setRemark(remark.trim());\n\nOpenIMClient.getInstance().friendshipManager.updateFriendsReq(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markFriendUpdateSubmitted();\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendUpdateFailure(code, error);\n }\n },\n request\n);\n```\n\n`UpdateFriendsReq` 可设置 `friendUserIDs`、`remark`、`isPinned` 和 `ex`。一次调用会把同一字段值应用到全部目标好友;不同好友需要不同值时应分别调用。`ex` 是完整字符串。\n\n| 字段 | 说明 |\n| --------------- | ---------------------------------- |\n| `friendUserIDs` | 待更新的好友 ID 数组。 |\n| `remark` | 当前账号设置的好友备注。 |\n| `isPinned` | 是否置顶好友。 |\n| `ex` | 好友关系扩展字符串,按完整值覆盖。 |\n\n成功 callback 表示更新请求完成。好友资料增量通过 `onFriendInfoChanged` 合并,事件处理见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。", + "body": "```java\nUpdateFriendsReq request = new UpdateFriendsReq();\nrequest.setFriendUserIDs(new String[] { friendUserID });\nrequest.setRemark(remark.trim());\n\nOpenIMClient.getInstance().friendshipManager.updateFriendsReq(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 更新好友资料成功\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n request\n);\n```\n\n`UpdateFriendsReq` 可设置 `friendUserIDs`、`remark`、`isPinned` 和 `ex`。一次调用会把同一字段值应用到全部目标好友;不同好友需要不同值时应分别调用。`ex` 是完整字符串。\n\n| 字段 | 说明 |\n| --------------- | ---------------------------------- |\n| `friendUserIDs` | 待更新的好友 ID 数组。 |\n| `remark` | 当前账号设置的好友备注。 |\n| `isPinned` | 是否置顶好友。 |\n| `ex` | 好友关系扩展字符串。 |\n\n成功 callback 表示更新好友资料请求完成。好友资料发生变化时,可通过 `onFriendInfoChanged` 接收通知,详见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。", "description": "使用 updateFriendsReq() 更新好友备注、置顶状态或扩展字段。", "headings": [], "sourcePath": "/sdk/android/user/friends/update-friends", "title": "更新好友资料" }, "/sdk/android/user/friends/delete-friend": { - "body": "```java\nOpenIMClient.getInstance().friendshipManager.deleteFriend(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markFriendDeletionSubmitted(friendUserID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendDeletionFailure(code, error);\n }\n },\n friendUserID\n);\n```\n\n成功 callback 表示删除请求完成。`onFriendDeleted` 到达后再按 `userID` 从好友状态中移除记录,事件处理见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。", + "body": "```java\nOpenIMClient.getInstance().friendshipManager.deleteFriend(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 删除好友成功\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n friendUserID\n);\n```\n\n成功 callback 表示删除好友请求完成。好友关系发生变化时,通过 `onFriendDeleted` 接收通知,详见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。", "description": "使用 deleteFriend() 删除当前用户的一条好友关系。", "headings": [], "sourcePath": "/sdk/android/user/friends/delete-friend", "title": "删除好友" }, "/sdk/android/user/friend-applications/add-friend": { - "body": "```java\nOpenIMClient.getInstance().friendshipManager.addFriend(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markFriendApplicationSubmitted();\n }\n\n @Override\n public void onError(int code, String error) {\n recordFriendApplicationFailure(code, error);\n }\n },\n \"user_b\",\n \"你好,我是 Alex\"\n);\n```\n\n第二个参数是申请接收方的 `userID`,第三个参数是申请附言。成功 callback 表示服务端已收到申请,不表示对方已经同意。目标用户 ID 不能为空;按昵称、手机号等字段搜索目标用户应先由业务后端完成。\n\n好友申请状态变化通过 `OnFriendshipListener` 合并,见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。", + "body": "```java\nOpenIMClient.getInstance().friendshipManager.addFriend(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 好友申请发送成功\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n \"user_b\",\n \"你好,我是 Alex\"\n);\n```\n\n第二个参数是申请接收方的 `userID`,第三个参数是申请附言。成功 callback 表示服务端已收到申请,不表示对方已经同意。目标用户 ID 不能为空;按昵称、手机号等字段搜索目标用户应先由业务后端完成。\n\n好友申请状态变化通过 `OnFriendshipListener` 接收,见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。", "description": "使用 addFriend() 向指定用户发送好友申请。", "headings": [], "sourcePath": "/sdk/android/user/friend-applications/add-friend", "title": "发送好友申请" }, "/sdk/android/user/friend-applications/get-recv-friend-application-list": { - "body": "```java\nGetFriendApplicationListAsRecipientReq request =\n new GetFriendApplicationListAsRecipientReq(0, 20);\n\nOpenIMClient.getInstance().friendshipManager.getRecvFriendApplicationList(\n new OnBase>() {\n @Override\n public void onSuccess(List applications) {\n replaceReceivedApplications(applications);\n }\n\n @Override\n public void onError(int code, String error) {\n recordReceivedApplicationFailure(code, error);\n }\n },\n request\n);\n```\n\n`offset` 从 `0` 开始,`count` 是页大小。需要筛选处理状态时可通过 `setHandleResults(int[])` 设置服务端约定的状态值。成功 callback 返回当前页 `List`。\n\n| 字段 | 说明 |\n| --------------------------------------------- | ---------------------------------------------- |\n| `fromUserID` / `fromNickname` / `fromFaceURL` | 申请发起人的 ID、昵称和头像快照。 |\n| `toUserID` / `toNickname` / `toFaceURL` | 申请接收人的 ID、昵称和头像快照。 |\n| `reqMsg` | 申请附言。 |\n| `handleResult` | 处理结果:`0` 待处理,`1` 已同意,`2` 已拒绝。 |\n| `handlerUserID` | 执行处理的用户 ID,待处理时可能为空。 |\n| `handleMsg` | 处理附言。 |\n| `handleTime` | 处理时间,待处理时不应作为有效时间使用。 |\n| `createTime` | 申请记录创建时间。 |\n| `ex` | 申请记录扩展字符串。 |\n\n好友申请使用 `fromUserID:toUserID` 作为稳定标识。本页归属好友申请新增、接受、拒绝和删除事件,以下 callback 应组合进应用唯一的 `OnFriendshipListener`:\n\n```java\n@Override\npublic void onFriendApplicationAdded(FriendApplicationInfo application) {\n friendApplicationStore.merge(application);\n}\n\n@Override\npublic void onFriendApplicationAccepted(FriendApplicationInfo application) {\n friendApplicationStore.merge(application);\n}\n\n@Override\npublic void onFriendApplicationRejected(FriendApplicationInfo application) {\n friendApplicationStore.merge(application);\n}\n\n@Override\npublic void onFriendApplicationDeleted(FriendApplicationInfo application) {\n friendApplicationStore.remove(\n application.getFromUserID(),\n application.getToUserID()\n );\n}\n```\n\n按 `toUserID` 是否等于当前登录用户 ID,将记录分流到收到或发出的列表。申请被接受后,新好友关系由[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)归属的 `onFriendAdded` 合并。", + "body": "```java\nGetFriendApplicationListAsRecipientReq request =\n new GetFriendApplicationListAsRecipientReq(0, 20);\n\nOpenIMClient.getInstance().friendshipManager.getRecvFriendApplicationList(\n new OnBase>() {\n @Override\n public void onSuccess(List applications) {\n // 使用 applications 更新收到的好友申请列表\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n request\n);\n```\n\n`offset` 从 `0` 开始,`count` 是页大小。需要筛选处理状态时可通过 `setHandleResults(int[])` 设置服务端约定的状态值。成功 callback 返回当前页 `List`。\n\n| 字段 | 说明 |\n| --------------------------------------------- | ---------------------------------------------- |\n| `fromUserID` / `fromNickname` / `fromFaceURL` | 申请发起人的 ID、昵称和头像。 |\n| `toUserID` / `toNickname` / `toFaceURL` | 申请接收人的 ID、昵称和头像。 |\n| `reqMsg` | 申请附言。 |\n| `handleResult` | 处理结果:`0` 待处理,`1` 已同意,`2` 已拒绝。 |\n| `handlerUserID` | 执行处理的用户 ID,待处理时可能为空。 |\n| `handleMsg` | 处理附言。 |\n| `handleTime` | 处理时间,待处理时不应作为有效时间使用。 |\n| `createTime` | 申请记录创建时间。 |\n| `ex` | 申请记录扩展字符串。 |\n\n好友申请新增、接受、拒绝和删除时,可通过 `OnFriendshipListener` 接收以下回调:\n\n```java\n@Override\npublic void onFriendApplicationAdded(FriendApplicationInfo application) {\n // 处理新增或更新的好友申请\n}\n\n@Override\npublic void onFriendApplicationAccepted(FriendApplicationInfo application) {\n // 处理已接受的好友申请\n}\n\n@Override\npublic void onFriendApplicationRejected(FriendApplicationInfo application) {\n // 处理已拒绝的好友申请\n}\n\n@Override\npublic void onFriendApplicationDeleted(FriendApplicationInfo application) {\n // 处理已删除的好友申请\n}\n```\n\n按 `toUserID` 是否等于当前登录用户 ID,将记录分流到收到或发出的列表。申请被接受后,通过 `onFriendAdded` 接收新好友关系通知,详见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。", "description": "使用 getRecvFriendApplicationList() 分页查询当前用户收到的好友申请。", "headings": [], "sourcePath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", "title": "获取收到的好友申请" }, "/sdk/android/user/friend-applications/get-send-friend-application-list": { - "body": "```java\nGetFriendApplicationListAsApplicantReq request =\n new GetFriendApplicationListAsApplicantReq(0, 20);\n\nOpenIMClient.getInstance().friendshipManager.getSendFriendApplicationList(\n new OnBase>() {\n @Override\n public void onSuccess(List applications) {\n replaceSentApplications(applications);\n }\n\n @Override\n public void onError(int code, String error) {\n recordSentApplicationFailure(code, error);\n }\n },\n request\n);\n```\n\n`offset` 从 `0` 开始,`count` 是页大小。成功 callback 返回当前页 `List`;按 `fromUserID:toUserID` 合并。查询只建立快照,不触发好友申请事件。\n\n发出的申请中,当前用户通常是 `fromUserID`。列表字段和处理结果含义与[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)相同;申请处理状态使用 Android 服务端约定的 `0`(待处理)、`1`(已同意)和 `2`(已拒绝)。", + "body": "```java\nGetFriendApplicationListAsApplicantReq request =\n new GetFriendApplicationListAsApplicantReq(0, 20);\n\nOpenIMClient.getInstance().friendshipManager.getSendFriendApplicationList(\n new OnBase>() {\n @Override\n public void onSuccess(List applications) {\n // 使用 applications 更新发出的好友申请列表\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n request\n);\n```\n\n`offset` 从 `0` 开始,`count` 是页大小。成功 callback 返回当前页 `List`。\n\n发出的申请中,当前用户通常是 `fromUserID`。列表字段和处理结果含义与[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)相同。", "description": "使用 getSendFriendApplicationList() 分页查询当前用户发出的好友申请。", "headings": [], "sourcePath": "/sdk/android/user/friend-applications/get-send-friend-application-list", "title": "获取发出的好友申请" }, "/sdk/android/user/friend-applications/accept-friend-application": { - "body": "```java\nOpenIMClient.getInstance().friendshipManager.acceptFriendApplication(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markApplicationAccepted(applicantUserID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordApplicationAcceptFailure(code, error);\n }\n },\n applicantUserID,\n \"已通过\"\n);\n```\n\n`applicantUserID` 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示接受请求完成;好友申请状态和新增好友关系可能通过不同 callback 到达,应分别合并。申请状态由 `onFriendApplicationAccepted` 更新,新好友关系由 `onFriendAdded` 更新。", + "body": "```java\nOpenIMClient.getInstance().friendshipManager.acceptFriendApplication(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 接受好友申请成功\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n applicantUserID,\n \"已通过\"\n);\n```\n\n`applicantUserID` 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示接受好友申请请求完成。申请状态通过 `onFriendApplicationAccepted` 通知,新好友关系通过 `onFriendAdded` 通知。", "description": "使用 acceptFriendApplication() 接受好友申请。", "headings": [], "sourcePath": "/sdk/android/user/friend-applications/accept-friend-application", "title": "接受好友申请" }, "/sdk/android/user/friend-applications/refuse-friend-application": { - "body": "```java\nOpenIMClient.getInstance().friendshipManager.refuseFriendApplication(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markApplicationRejected(applicantUserID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordApplicationRejectFailure(code, error);\n }\n },\n applicantUserID,\n \"暂不添加\"\n);\n```\n\n`applicantUserID` 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示拒绝请求完成;申请状态通过统一好友申请 listener 合并,并最终以 `handleResult == 2` 表示已拒绝。", + "body": "```java\nOpenIMClient.getInstance().friendshipManager.refuseFriendApplication(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 拒绝好友申请成功\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n applicantUserID,\n \"暂不添加\"\n);\n```\n\n`applicantUserID` 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示拒绝好友申请请求完成;申请状态通过 `OnFriendshipListener` 通知,`handleResult == 2` 表示已拒绝。", "description": "使用 refuseFriendApplication() 拒绝好友申请。", "headings": [], "sourcePath": "/sdk/android/user/friend-applications/refuse-friend-application", "title": "拒绝好友申请" }, "/sdk/android/user/blacklist/get-blacklist": { - "body": "黑名单记录当前用户主动拉黑的用户,可用于黑名单设置页、资料卡中的关系状态和聊天入口限制。黑名单与群成员管理是独立能力;禁言、移除群成员或调整群角色时,应使用群组 API。\n\n## 获取黑名单\n\n完成 SDK 初始化并登录后,调用 `getBlacklist()` 获取当前账号的完整黑名单。返回空列表表示当前没有黑名单用户。\n\n```java\nOpenIMClient.getInstance().friendshipManager.getBlacklist(\n new OnBase>() {\n @Override\n public void onSuccess(List users) {\n blacklistStore.replace(users);\n }\n\n @Override\n public void onError(int code, String error) {\n recordBlacklistFailure(code, error);\n }\n }\n);\n```\n\n成功 callback 返回 `List`;通过 `UserInfo.getBlackInfo()` 读取黑名单关系对象。\n\n## 黑名单记录字段\n\n`BlacklistInfo` 的常用字段如下:\n\n| 字段 | 说明 |\n| ---------------- | ------------------------------------------------- |\n| `userID` | 被当前用户拉黑的目标用户 ID,也是列表的稳定 key。 |\n| `nickname` | 目标用户昵称快照。 |\n| `faceURL` | 目标用户头像地址。 |\n| `gender` | 目标用户性别值。 |\n| `operatorUserID` | 执行拉黑操作的用户 ID。 |\n| `createTime` | 黑名单关系创建时间。 |\n| `addSource` | 黑名单关系的添加来源。 |\n| `ex` | 黑名单关系扩展字符串。 |\n\n如果页面还要展示好友备注或最新公开资料,应按 `userID` 额外合并 `FriendInfo` 或 `PublicUserInfo`,不能把黑名单字段当作好友资料。\n\n黑名单状态统一按 `userID` 合并。查询本身不会触发黑名单新增或删除事件。\n\n首次进入页面、重连或用户主动刷新时,使用返回的完整列表替换本地快照;增量变化由[拉黑用户](/sdk/android/user/blacklist/add-blacklist)和[取消拉黑用户](/sdk/android/user/blacklist/remove-blacklist)页面归属的 listener 处理。", + "body": "黑名单记录当前用户主动拉黑的用户,可用于黑名单设置页、资料卡中的关系状态和聊天入口限制。\n\n## 获取黑名单\n\n完成 SDK 初始化并登录后,调用 `getBlacklist()` 获取当前账号的完整黑名单。返回空列表表示当前没有黑名单用户。\n\n```java\nOpenIMClient.getInstance().friendshipManager.getBlacklist(\n new OnBase>() {\n @Override\n public void onSuccess(List users) {\n // 使用 users 更新黑名单列表\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n }\n);\n```\n\n成功 callback 返回 `List`;通过 `UserInfo.getBlackInfo()` 读取黑名单关系对象。\n\n## 黑名单记录字段\n\n`BlacklistInfo` 的常用字段如下:\n\n| 字段 | 说明 |\n| ---------------- | ------------------------------------------------- |\n| `userID` | 被当前用户拉黑的目标用户 ID。 |\n| `nickname` | 目标用户昵称。 |\n| `faceURL` | 目标用户头像地址。 |\n| `gender` | 目标用户性别值。 |\n| `operatorUserID` | 执行拉黑操作的用户 ID。 |\n| `createTime` | 黑名单关系创建时间。 |\n| `addSource` | 黑名单关系的添加来源。 |\n| `ex` | 黑名单关系扩展字符串。 |\n\n如果页面还要展示好友备注或最新公开资料,可额外查询好友资料或公开资料。\n\n黑名单新增或删除时,可通过[拉黑用户](/sdk/android/user/blacklist/add-blacklist)和[取消拉黑用户](/sdk/android/user/blacklist/remove-blacklist)页面中的 listener 接收通知。", "description": "使用 getBlacklist() 获取当前用户的黑名单。", "headings": [ { @@ -915,14 +915,14 @@ "title": "获取黑名单列表" }, "/sdk/android/user/blacklist/add-blacklist": { - "body": "```java\nOpenIMClient.getInstance().friendshipManager.addBlacklist(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markBlacklistRequestSubmitted(targetUserID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordBlacklistAddFailure(code, error);\n }\n },\n targetUserID,\n \"{\\\"source\\\":\\\"profile-menu\\\"}\"\n);\n```\n\n第二个参数是目标 `userID`,第三个参数是可选扩展字符串。无需扩展信息时可使用不带 `ex` 的重载。成功 callback 表示拉黑请求完成,不表示事件已经到达。\n\n黑名单是单向关系:被拉黑用户不能向当前用户发送消息,但当前用户是否允许继续向对方发送消息由业务层决定。`ex` 是完整字符串,更新前应合并业务自己的扩展字段。\n\n`onBlacklistAdded` 由本页归属,应组合进应用唯一的 `OnFriendshipListener`:\n\n```java\n@Override\npublic void onBlacklistAdded(BlacklistInfo user) {\n blacklistStore.put(user.getUserID(), user);\n}\n```", + "body": "```java\nOpenIMClient.getInstance().friendshipManager.addBlacklist(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 拉黑用户成功\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n targetUserID,\n \"{\\\"source\\\":\\\"profile-menu\\\"}\"\n);\n```\n\n第二个参数是目标 `userID`,第三个参数是可选扩展字符串。无需扩展信息时可使用不带 `ex` 的重载。成功 callback 表示拉黑请求完成,不表示事件已经到达。\n\n黑名单是单向关系:被拉黑用户不能向当前用户发送消息,但当前用户是否允许继续向对方发送消息由业务层决定。`ex` 是用于保存黑名单扩展信息的字符串,也可以存储 JSON 字符串。\n\n拉黑状态变化时,可通过 `OnFriendshipListener` 接收 `onBlacklistAdded`:\n\n```java\n@Override\npublic void onBlacklistAdded(BlacklistInfo user) {\n // 处理新增的黑名单记录\n}\n```", "description": "使用 addBlacklist() 将用户加入当前账号黑名单。", "headings": [], "sourcePath": "/sdk/android/user/blacklist/add-blacklist", "title": "拉黑用户" }, "/sdk/android/user/blacklist/remove-blacklist": { - "body": "```java\nOpenIMClient.getInstance().friendshipManager.removeBlacklist(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markBlacklistRemovalSubmitted(targetUserID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordBlacklistRemovalFailure(code, error);\n }\n },\n targetUserID\n);\n```\n\n成功 callback 表示移除请求完成,不表示事件已经到达。黑名单快照应在 `onBlacklistDeleted` 到达后按 `userID` 删除;如果事件丢失,可重新调用[获取黑名单列表](/sdk/android/user/blacklist/get-blacklist)校准。\n\n`onBlacklistDeleted` 由本页归属,应按 `userID` 删除本地记录:\n\n```java\n@Override\npublic void onBlacklistDeleted(BlacklistInfo user) {\n blacklistStore.remove(user.getUserID());\n}\n```", + "body": "```java\nOpenIMClient.getInstance().friendshipManager.removeBlacklist(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 取消拉黑成功\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n targetUserID\n);\n```\n\n成功 callback 表示取消拉黑请求完成。黑名单发生变化时,通过 `onBlacklistDeleted` 接收通知;需要重新获取列表时,调用[获取黑名单列表](/sdk/android/user/blacklist/get-blacklist)。\n\n取消拉黑时,可通过 `OnFriendshipListener` 接收 `onBlacklistDeleted`:\n\n```java\n@Override\npublic void onBlacklistDeleted(BlacklistInfo user) {\n // 处理已移除的黑名单记录\n}\n```", "description": "使用 removeBlacklist() 将用户移出当前账号黑名单。", "headings": [], "sourcePath": "/sdk/android/user/blacklist/remove-blacklist", diff --git a/src/generated/search-index-zh.json b/src/generated/search-index-zh.json index f2018177e6..eeee830873 100644 --- a/src/generated/search-index-zh.json +++ b/src/generated/search-index-zh.json @@ -1941,7 +1941,7 @@ "description": "了解 Android SDK 中的用户资料、好友关系、好友申请、黑名单和在线状态 API。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user overview-user", - "content": "OpenIM Android SDK 使用 userID 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。 群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。 用户类型 Android SDK 会根据使用场景返回不同的用户对象: | 类型 | 适用场景 | 主要 API | | | | | | LocalUser | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | getSelfLocalUserInfo 、 setSelfInfo | | PublicUserInfo | 查询应用用户、查找好友候选人和展示陌生人资料卡 | getUsersInfo | | UserInfo | Android wrapper 返回的组合对象,可承载公开资料、好友资料或黑名单资料 | getFriendListPage 、 getFriendsInfo 、 getBlacklist | | FriendInfo | 当前用户的好友列表、好友备注和关系扩展字段 | searchFriends 、 getFriendListPage | | FriendApplicationInfo | 好友申请双方、处理状态和附言 | 好友申请查询与 listener | | BlacklistInfo | 当前用户拉黑的用户及黑名单关系字段 | getBlacklist 、 addBlacklist 、 removeBlacklist | | UsersOnlineStatus | 用户在线状态和在线平台列表 | subscribeUsersOnlineStatus 、 getSubscribeOnlineUsersStatus 、 unsubscribeOnlineUsersStatus | 同一个 userID 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 UserInfo.getFriendInfo ;只需要账号公开资料时使用 PublicUserInfo ;黑名单页面使用 UserInfo.getBlackInfo 。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。 所有列表和事件都应使用 userID 作为稳定标识。好友申请同时包含申请方和接收方,应使用 fromUserID:toUserID 标识一条申请。 功能入口 下表列出了用户相关的常见需求和对应页面: | 需求 | 推荐页面 | | | | | 按 userID 查询公开资料,用于查找好友候选人或展示资料卡 | 获取指定用户资料 /sdk/android/user/user profile/get users info | | 分页、搜索或按 ID 查询好友关系 | 分页获取好友列表 /sdk/android/user/friends/get friend list page | | 发送、查询、接受或拒绝好友申请 | 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list | | 修改好友资料 | 更新好友资料 /sdk/android/user/friends/update friends | | 删除好友关系 | 删除好友 /sdk/android/user/friends/delete friend | | 查看和维护当前用户黑名单 | 获取黑名单列表 /sdk/android/user/blacklist/get blacklist | | 读取或更新当前用户的昵称、头像和扩展资料 | 更新当前用户资料 /sdk/android/user/user profile/set self info | | 设置账号级消息接收和通知策略 | 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception | | 订阅、读取和取消在线状态 | 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 、 取消用户状态订阅 /sdk/android/user/online status/unsubscribe users online status | 状态更新 用户相关事件由对应能力页负责监听和合并: 当前用户资料变化:见 更新当前用户资料 /sdk/android/user/user profile/set self info 。 好友申请变化:见 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 。 好友关系和好友资料变化:见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。 黑名单变化:见 拉黑用户 /sdk/android/user/blacklist/add blacklist 。 在线状态变化:见 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 。 Android SDK 的 UserInfoManager 和 FriendshipManager 各保存一个 listener, setOnUserListener 和 setOnFriendshipListener 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。" + "content": "OpenIM Android SDK 使用 userID 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。 群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。 用户类型 Android SDK 会根据使用场景返回不同的用户对象: | 类型 | 适用场景 | 主要 API | | | | | | LocalUser | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | getSelfLocalUserInfo 、 setSelfInfo | | PublicUserInfo | 查询应用用户、查找好友候选人和展示陌生人资料卡 | getUsersInfo | | UserInfo | 查询好友列表、好友资料或黑名单时返回的用户对象,可包含对应关系资料 | getFriendListPage 、 getFriendsInfo 、 getBlacklist | | FriendInfo | 当前用户的好友列表、好友备注和关系扩展字段 | searchFriends 、 getFriendListPage | | FriendApplicationInfo | 好友申请双方、处理状态和附言 | 好友申请查询与 listener | | BlacklistInfo | 当前用户拉黑的用户及黑名单关系字段 | getBlacklist 、 addBlacklist 、 removeBlacklist | | UsersOnlineStatus | 用户在线状态和在线平台列表 | subscribeUsersOnlineStatus 、 getSubscribeOnlineUsersStatus 、 unsubscribeOnlineUsersStatus | 同一个 userID 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 UserInfo.getFriendInfo ;只需要账号公开资料时使用 PublicUserInfo ;黑名单页面使用 UserInfo.getBlackInfo 。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。 所有列表和事件都应使用 userID 作为稳定标识。好友申请同时包含申请方和接收方,应使用 fromUserID:toUserID 标识一条申请。 功能入口 下表列出了用户相关的常见需求和对应页面: | 需求 | 推荐页面 | | | | | 按 userID 查询公开资料,用于查找好友候选人或展示资料卡 | 获取指定用户资料 /sdk/android/user/user profile/get users info | | 分页、搜索或按 ID 查询好友关系 | 分页获取好友列表 /sdk/android/user/friends/get friend list page | | 发送、查询、接受或拒绝好友申请 | 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list | | 修改好友资料 | 更新好友资料 /sdk/android/user/friends/update friends | | 删除好友关系 | 删除好友 /sdk/android/user/friends/delete friend | | 查看和维护当前用户黑名单 | 获取黑名单列表 /sdk/android/user/blacklist/get blacklist | | 读取或更新当前用户的昵称、头像和扩展资料 | 更新当前用户资料 /sdk/android/user/user profile/set self info | | 设置账号级消息接收和通知策略 | 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception | | 订阅、读取和取消在线状态 | 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 、 取消用户状态订阅 /sdk/android/user/online status/unsubscribe users online status | 状态更新 用户相关事件由对应能力页负责监听和合并: 当前用户资料变化:见 更新当前用户资料 /sdk/android/user/user profile/set self info 。 好友申请变化:见 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 。 好友关系和好友资料变化:见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。 黑名单变化:见 拉黑用户 /sdk/android/user/blacklist/add blacklist 。 在线状态变化:见 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 。 Android SDK 的 UserInfoManager 和 FriendshipManager 各保存一个 listener, setOnUserListener 和 setOnFriendshipListener 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。" }, { "path": "/sdk/android/user/user-profile/get-users-info", @@ -2005,7 +2005,7 @@ "description": "使用 getFriendListPage() 分页获取当前用户的好友列表。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friends get-friend-list-page", - "content": "OpenIMClient.getInstance .friendshipManager.getFriendListPage new OnBase @Override public void onSuccess List friends for UserInfo friend : friends friendStore.put friend.getUserID , friend ; @Override public void onError int code, String error recordFriendListFailure code, error ; , 0, 40, true ; 参数依次为 offset 、 count 和 filterBlack 。 offset 从 0 开始, count 是页大小, filterBlack 为 true 时过滤黑名单用户。成功 callback 返回当前页 List ,好友关系详情可通过 getFriendInfo 读取。继续加载下一页时按实际请求数量增加 offset ;返回数量小于 count 时通常表示到达末页。 只使用分页 API,不使用非分页的 getFriendList 。快照和增量都应按 userID 合并。 好友资料字段 UserInfo 是 Android wrapper 的组合对象。好友列表中的 getFriendInfo 返回 FriendInfo ,常用字段如下: | 字段 | 说明 | | | | | userID | 好友用户 ID,也是好友列表的稳定标识。 | | nickname | 好友账号昵称。 | | faceURL | 好友账号头像地址。 | | remark | 当前账号设置的好友备注。 | | ex | 好友关系扩展字符串。 | | addSource | 好友关系添加来源。 | | operatorUserID | 建立或更新关系的操作用户 ID。 | | createTime | 好友关系创建时间。 | nickname 和 faceURL 是账号资料, remark 和 ex 属于好友关系。 UpdateFriendsReq 支持提交 isPinned ,但当前 Android FriendInfo 模型不提供对应读取字段,置顶状态应由业务层单独维护。不要用好友对象覆盖陌生人的 PublicUserInfo ,也不要把好友备注写回账号昵称。 本页归属好友新增、资料变化和删除事件。以下 callback 应组合进应用唯一的 OnFriendshipListener : @Override public void onFriendAdded FriendInfo friend friendStore.put friend.getUserID , friend ; @Override public void onFriendInfoChanged FriendInfo friend friendStore.put friend.getUserID , friend ; @Override public void onFriendDeleted FriendInfo friend friendStore.remove friend.getUserID ;" + "content": "OpenIMClient.getInstance .friendshipManager.getFriendListPage new OnBase @Override public void onSuccess List friends // 使用 friends 更新好友列表 @Override public void onError int code, String error // 处理错误 , 0, 40, true ; 参数依次为 offset 、 count 和 filterBlack 。 offset 从 0 开始, count 是页大小, filterBlack 为 true 时过滤黑名单用户。成功 callback 返回当前页 List ,好友关系详情可通过 getFriendInfo 读取。继续加载下一页时按实际请求数量增加 offset ;返回数量小于 count 时通常表示到达末页。 好友资料字段 好友列表中的 UserInfo.getFriendInfo 返回 FriendInfo ,常用字段如下: | 字段 | 说明 | | | | | userID | 好友用户 ID。 | | nickname | 好友账号昵称。 | | faceURL | 好友账号头像地址。 | | remark | 当前账号设置的好友备注。 | | ex | 好友关系扩展字符串。 | | addSource | 好友关系添加来源。 | | operatorUserID | 建立或更新关系的操作用户 ID。 | | createTime | 好友关系创建时间。 | nickname 和 faceURL 是账号资料, remark 和 ex 属于好友关系。 UpdateFriendsReq 支持提交 isPinned ,但当前 Android FriendInfo 模型不提供对应读取字段。 好友新增、资料变化和删除时,可通过 OnFriendshipListener 接收以下回调: @Override public void onFriendAdded FriendInfo friend // 处理新增好友 @Override public void onFriendInfoChanged FriendInfo friend // 处理好友资料变化 @Override public void onFriendDeleted FriendInfo friend // 处理好友删除" }, { "path": "/sdk/android/user/friends/search-friends", @@ -2013,7 +2013,7 @@ "description": "使用 searchFriends() 搜索当前用户的好友。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friends search-friends", - "content": "OpenIMClient.getInstance .friendshipManager.searchFriends new OnBase @Override public void onSuccess List results showFriendSearchResults results ; @Override public void onError int code, String error recordFriendSearchFailure code, error ; , Collections.singletonList keyword.trim , true, true, true ; keywordList 当前只传一个非空关键词。后面的三个布尔值依次控制是否匹配用户 ID、昵称和好友备注,至少应启用一种匹配方式。需要同时搜索多个字段时,将对应开关设为 true ;不支持把多个关键词作为同一请求的独立搜索条件。 成功 callback 返回 List 。搜索结果只属于当前搜索视图,不应覆盖完整好友列表,也不会触发好友 listener。" + "content": "OpenIMClient.getInstance .friendshipManager.searchFriends new OnBase @Override public void onSuccess List results // 使用 results 显示搜索结果 @Override public void onError int code, String error // 处理错误 , Collections.singletonList keyword.trim , true, true, true ; keywordList 当前只传一个非空关键词。后面的三个布尔值依次控制是否匹配用户 ID、昵称和好友备注,至少应启用一种匹配方式。需要同时搜索多个字段时,将对应开关设为 true 。 成功 callback 返回 List ,可用于显示搜索结果。" }, { "path": "/sdk/android/user/friends/get-friends-info", @@ -2021,7 +2021,7 @@ "description": "使用 getFriendsInfo() 查询指定用户的好友关系资料。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friends get-friends-info", - "content": "OpenIMClient.getInstance .friendshipManager.getFriendsInfo new OnBase @Override public void onSuccess List friends for UserInfo friend : friends friendStore.put friend.getUserID , friend ; @Override public void onError int code, String error recordFriendInfoFailure code, error ; , Arrays.asList \"user a\", \"user b\" , true ; 第二个参数是目标用户 ID 列表, filterBlack 决定是否过滤黑名单用户。成功 callback 返回 List ;通过 getFriendInfo 读取好友备注和关系字段,并按 userID 合并。调用前应去除空值和重复 ID。 当目标用户不是好友,或目标用户因 filterBlack == true 被过滤时,返回结果中可能没有对应记录。需要同时展示账号公开资料时,应再调用 获取指定用户资料 /sdk/android/user/user profile/get users info ,并按 userID 合并两类数据。 该查询不会触发好友 listener。只需要判断好友关系时使用 checkFriend /sdk/android/user/friends/check friend 。" + "content": "OpenIMClient.getInstance .friendshipManager.getFriendsInfo new OnBase @Override public void onSuccess List friends for UserInfo friend : friends // 使用 friends 更新好友资料 @Override public void onError int code, String error // 处理错误 , Arrays.asList \"user a\", \"user b\" , true ; 第二个参数是目标用户 ID 列表, filterBlack 决定是否过滤黑名单用户。成功 callback 返回 List ;通过 getFriendInfo 读取好友备注和关系字段。调用前应去除空值和重复 ID。 当目标用户不是好友,或目标用户因 filterBlack == true 被过滤时,返回结果中可能没有对应记录。需要同时展示账号公开资料时,可再调用 获取指定用户资料 /sdk/android/user/user profile/get users info 。 只需要判断好友关系时,使用 checkFriend /sdk/android/user/friends/check friend 。" }, { "path": "/sdk/android/user/friends/check-friend", @@ -2029,7 +2029,7 @@ "description": "使用 checkFriend() 检查指定用户是否为当前用户的好友。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friends check-friend", - "content": "OpenIMClient.getInstance .friendshipManager.checkFriend new OnBase @Override public void onSuccess List relations showFriendshipStates relations ; @Override public void onError int code, String error recordFriendshipCheckFailure code, error ; , Arrays.asList \"user a\", \"user b\" ; 成功 callback 返回 List 。每项的 userID 标识目标用户, result == 1 表示目标是好友且不在黑名单中。 result 以服务端返回值为准,不应在客户端扩展未声明的状态枚举。 该方法只建立关系快照,不触发好友 listener。需要昵称、头像或好友备注时使用 getFriendsInfo /sdk/android/user/friends/get friends info 。" + "content": "OpenIMClient.getInstance .friendshipManager.checkFriend new OnBase @Override public void onSuccess List relations // 使用 relations 更新好友关系显示 @Override public void onError int code, String error // 处理错误 , Arrays.asList \"user a\", \"user b\" ; 成功 callback 返回 List 。每项的 userID 是目标用户 ID,调用 friendshipInfo.getResult 获取关系结果;返回 1 表示该用户是当前用户的好友且不在黑名单中。 需要昵称、头像或好友备注时,使用 getFriendsInfo /sdk/android/user/friends/get friends info 。" }, { "path": "/sdk/android/user/friends/update-friends", @@ -2037,7 +2037,7 @@ "description": "使用 updateFriendsReq() 更新好友备注、置顶状态或扩展字段。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friends update-friends", - "content": "UpdateFriendsReq request = new UpdateFriendsReq ; request.setFriendUserIDs new String friendUserID ; request.setRemark remark.trim ; OpenIMClient.getInstance .friendshipManager.updateFriendsReq new OnBase @Override public void onSuccess String data markFriendUpdateSubmitted ; @Override public void onError int code, String error recordFriendUpdateFailure code, error ; , request ; UpdateFriendsReq 可设置 friendUserIDs 、 remark 、 isPinned 和 ex 。一次调用会把同一字段值应用到全部目标好友;不同好友需要不同值时应分别调用。 ex 是完整字符串。 | 字段 | 说明 | | | | | friendUserIDs | 待更新的好友 ID 数组。 | | remark | 当前账号设置的好友备注。 | | isPinned | 是否置顶好友。 | | ex | 好友关系扩展字符串,按完整值覆盖。 | 成功 callback 表示更新请求完成。好友资料增量通过 onFriendInfoChanged 合并,事件处理见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。" + "content": "UpdateFriendsReq request = new UpdateFriendsReq ; request.setFriendUserIDs new String friendUserID ; request.setRemark remark.trim ; OpenIMClient.getInstance .friendshipManager.updateFriendsReq new OnBase @Override public void onSuccess String data // 更新好友资料成功 @Override public void onError int code, String error // 处理错误 , request ; UpdateFriendsReq 可设置 friendUserIDs 、 remark 、 isPinned 和 ex 。一次调用会把同一字段值应用到全部目标好友;不同好友需要不同值时应分别调用。 ex 是完整字符串。 | 字段 | 说明 | | | | | friendUserIDs | 待更新的好友 ID 数组。 | | remark | 当前账号设置的好友备注。 | | isPinned | 是否置顶好友。 | | ex | 好友关系扩展字符串。 | 成功 callback 表示更新好友资料请求完成。好友资料发生变化时,可通过 onFriendInfoChanged 接收通知,详见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。" }, { "path": "/sdk/android/user/friends/delete-friend", @@ -2045,7 +2045,7 @@ "description": "使用 deleteFriend() 删除当前用户的一条好友关系。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friends delete-friend", - "content": "OpenIMClient.getInstance .friendshipManager.deleteFriend new OnBase @Override public void onSuccess String data markFriendDeletionSubmitted friendUserID ; @Override public void onError int code, String error recordFriendDeletionFailure code, error ; , friendUserID ; 成功 callback 表示删除请求完成。 onFriendDeleted 到达后再按 userID 从好友状态中移除记录,事件处理见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。" + "content": "OpenIMClient.getInstance .friendshipManager.deleteFriend new OnBase @Override public void onSuccess String data // 删除好友成功 @Override public void onError int code, String error // 处理错误 , friendUserID ; 成功 callback 表示删除好友请求完成。好友关系发生变化时,通过 onFriendDeleted 接收通知,详见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。" }, { "path": "/sdk/android/user/friend-applications/add-friend", @@ -2053,7 +2053,7 @@ "description": "使用 addFriend() 向指定用户发送好友申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friend-applications add-friend", - "content": "OpenIMClient.getInstance .friendshipManager.addFriend new OnBase @Override public void onSuccess String data markFriendApplicationSubmitted ; @Override public void onError int code, String error recordFriendApplicationFailure code, error ; , \"user b\", \"你好,我是 Alex\" ; 第二个参数是申请接收方的 userID ,第三个参数是申请附言。成功 callback 表示服务端已收到申请,不表示对方已经同意。目标用户 ID 不能为空;按昵称、手机号等字段搜索目标用户应先由业务后端完成。 好友申请状态变化通过 OnFriendshipListener 合并,见 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 。" + "content": "OpenIMClient.getInstance .friendshipManager.addFriend new OnBase @Override public void onSuccess String data // 好友申请发送成功 @Override public void onError int code, String error // 处理错误 , \"user b\", \"你好,我是 Alex\" ; 第二个参数是申请接收方的 userID ,第三个参数是申请附言。成功 callback 表示服务端已收到申请,不表示对方已经同意。目标用户 ID 不能为空;按昵称、手机号等字段搜索目标用户应先由业务后端完成。 好友申请状态变化通过 OnFriendshipListener 接收,见 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 。" }, { "path": "/sdk/android/user/friend-applications/get-recv-friend-application-list", @@ -2061,7 +2061,7 @@ "description": "使用 getRecvFriendApplicationList() 分页查询当前用户收到的好友申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friend-applications get-recv-friend-application-list", - "content": "GetFriendApplicationListAsRecipientReq request = new GetFriendApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .friendshipManager.getRecvFriendApplicationList new OnBase @Override public void onSuccess List applications replaceReceivedApplications applications ; @Override public void onError int code, String error recordReceivedApplicationFailure code, error ; , request ; offset 从 0 开始, count 是页大小。需要筛选处理状态时可通过 setHandleResults int 设置服务端约定的状态值。成功 callback 返回当前页 List 。 | 字段 | 说明 | | | | | fromUserID / fromNickname / fromFaceURL | 申请发起人的 ID、昵称和头像快照。 | | toUserID / toNickname / toFaceURL | 申请接收人的 ID、昵称和头像快照。 | | reqMsg | 申请附言。 | | handleResult | 处理结果: 0 待处理, 1 已同意, 2 已拒绝。 | | handlerUserID | 执行处理的用户 ID,待处理时可能为空。 | | handleMsg | 处理附言。 | | handleTime | 处理时间,待处理时不应作为有效时间使用。 | | createTime | 申请记录创建时间。 | | ex | 申请记录扩展字符串。 | 好友申请使用 fromUserID:toUserID 作为稳定标识。本页归属好友申请新增、接受、拒绝和删除事件,以下 callback 应组合进应用唯一的 OnFriendshipListener : @Override public void onFriendApplicationAdded FriendApplicationInfo application friendApplicationStore.merge application ; @Override public void onFriendApplicationAccepted FriendApplicationInfo application friendApplicationStore.merge application ; @Override public void onFriendApplicationRejected FriendApplicationInfo application friendApplicationStore.merge application ; @Override public void onFriendApplicationDeleted FriendApplicationInfo application friendApplicationStore.remove application.getFromUserID , application.getToUserID ; 按 toUserID 是否等于当前登录用户 ID,将记录分流到收到或发出的列表。申请被接受后,新好友关系由 分页获取好友列表 /sdk/android/user/friends/get friend list page 归属的 onFriendAdded 合并。" + "content": "GetFriendApplicationListAsRecipientReq request = new GetFriendApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .friendshipManager.getRecvFriendApplicationList new OnBase @Override public void onSuccess List applications // 使用 applications 更新收到的好友申请列表 @Override public void onError int code, String error // 处理错误 , request ; offset 从 0 开始, count 是页大小。需要筛选处理状态时可通过 setHandleResults int 设置服务端约定的状态值。成功 callback 返回当前页 List 。 | 字段 | 说明 | | | | | fromUserID / fromNickname / fromFaceURL | 申请发起人的 ID、昵称和头像。 | | toUserID / toNickname / toFaceURL | 申请接收人的 ID、昵称和头像。 | | reqMsg | 申请附言。 | | handleResult | 处理结果: 0 待处理, 1 已同意, 2 已拒绝。 | | handlerUserID | 执行处理的用户 ID,待处理时可能为空。 | | handleMsg | 处理附言。 | | handleTime | 处理时间,待处理时不应作为有效时间使用。 | | createTime | 申请记录创建时间。 | | ex | 申请记录扩展字符串。 | 好友申请新增、接受、拒绝和删除时,可通过 OnFriendshipListener 接收以下回调: @Override public void onFriendApplicationAdded FriendApplicationInfo application // 处理新增或更新的好友申请 @Override public void onFriendApplicationAccepted FriendApplicationInfo application // 处理已接受的好友申请 @Override public void onFriendApplicationRejected FriendApplicationInfo application // 处理已拒绝的好友申请 @Override public void onFriendApplicationDeleted FriendApplicationInfo application // 处理已删除的好友申请 按 toUserID 是否等于当前登录用户 ID,将记录分流到收到或发出的列表。申请被接受后,通过 onFriendAdded 接收新好友关系通知,详见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。" }, { "path": "/sdk/android/user/friend-applications/get-send-friend-application-list", @@ -2069,7 +2069,7 @@ "description": "使用 getSendFriendApplicationList() 分页查询当前用户发出的好友申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friend-applications get-send-friend-application-list", - "content": "GetFriendApplicationListAsApplicantReq request = new GetFriendApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .friendshipManager.getSendFriendApplicationList new OnBase @Override public void onSuccess List applications replaceSentApplications applications ; @Override public void onError int code, String error recordSentApplicationFailure code, error ; , request ; offset 从 0 开始, count 是页大小。成功 callback 返回当前页 List ;按 fromUserID:toUserID 合并。查询只建立快照,不触发好友申请事件。 发出的申请中,当前用户通常是 fromUserID 。列表字段和处理结果含义与 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 相同;申请处理状态使用 Android 服务端约定的 0 (待处理)、 1 (已同意)和 2 (已拒绝)。" + "content": "GetFriendApplicationListAsApplicantReq request = new GetFriendApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .friendshipManager.getSendFriendApplicationList new OnBase @Override public void onSuccess List applications // 使用 applications 更新发出的好友申请列表 @Override public void onError int code, String error // 处理错误 , request ; offset 从 0 开始, count 是页大小。成功 callback 返回当前页 List 。 发出的申请中,当前用户通常是 fromUserID 。列表字段和处理结果含义与 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 相同。" }, { "path": "/sdk/android/user/friend-applications/accept-friend-application", @@ -2077,7 +2077,7 @@ "description": "使用 acceptFriendApplication() 接受好友申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friend-applications accept-friend-application", - "content": "OpenIMClient.getInstance .friendshipManager.acceptFriendApplication new OnBase @Override public void onSuccess String data markApplicationAccepted applicantUserID ; @Override public void onError int code, String error recordApplicationAcceptFailure code, error ; , applicantUserID, \"已通过\" ; applicantUserID 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示接受请求完成;好友申请状态和新增好友关系可能通过不同 callback 到达,应分别合并。申请状态由 onFriendApplicationAccepted 更新,新好友关系由 onFriendAdded 更新。" + "content": "OpenIMClient.getInstance .friendshipManager.acceptFriendApplication new OnBase @Override public void onSuccess String data // 接受好友申请成功 @Override public void onError int code, String error // 处理错误 , applicantUserID, \"已通过\" ; applicantUserID 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示接受好友申请请求完成。申请状态通过 onFriendApplicationAccepted 通知,新好友关系通过 onFriendAdded 通知。" }, { "path": "/sdk/android/user/friend-applications/refuse-friend-application", @@ -2085,7 +2085,7 @@ "description": "使用 refuseFriendApplication() 拒绝好友申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friend-applications refuse-friend-application", - "content": "OpenIMClient.getInstance .friendshipManager.refuseFriendApplication new OnBase @Override public void onSuccess String data markApplicationRejected applicantUserID ; @Override public void onError int code, String error recordApplicationRejectFailure code, error ; , applicantUserID, \"暂不添加\" ; applicantUserID 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示拒绝请求完成;申请状态通过统一好友申请 listener 合并,并最终以 handleResult == 2 表示已拒绝。" + "content": "OpenIMClient.getInstance .friendshipManager.refuseFriendApplication new OnBase @Override public void onSuccess String data // 拒绝好友申请成功 @Override public void onError int code, String error // 处理错误 , applicantUserID, \"暂不添加\" ; applicantUserID 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示拒绝好友申请请求完成;申请状态通过 OnFriendshipListener 通知, handleResult == 2 表示已拒绝。" }, { "path": "/sdk/android/user/blacklist/get-blacklist", @@ -2093,7 +2093,7 @@ "description": "使用 getBlacklist() 获取当前用户的黑名单。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user blacklist get-blacklist", - "content": "黑名单记录当前用户主动拉黑的用户,可用于黑名单设置页、资料卡中的关系状态和聊天入口限制。黑名单与群成员管理是独立能力;禁言、移除群成员或调整群角色时,应使用群组 API。 获取黑名单 完成 SDK 初始化并登录后,调用 getBlacklist 获取当前账号的完整黑名单。返回空列表表示当前没有黑名单用户。 OpenIMClient.getInstance .friendshipManager.getBlacklist new OnBase @Override public void onSuccess List users blacklistStore.replace users ; @Override public void onError int code, String error recordBlacklistFailure code, error ; ; 成功 callback 返回 List ;通过 UserInfo.getBlackInfo 读取黑名单关系对象。 黑名单记录字段 BlacklistInfo 的常用字段如下: | 字段 | 说明 | | | | | userID | 被当前用户拉黑的目标用户 ID,也是列表的稳定 key。 | | nickname | 目标用户昵称快照。 | | faceURL | 目标用户头像地址。 | | gender | 目标用户性别值。 | | operatorUserID | 执行拉黑操作的用户 ID。 | | createTime | 黑名单关系创建时间。 | | addSource | 黑名单关系的添加来源。 | | ex | 黑名单关系扩展字符串。 | 如果页面还要展示好友备注或最新公开资料,应按 userID 额外合并 FriendInfo 或 PublicUserInfo ,不能把黑名单字段当作好友资料。 黑名单状态统一按 userID 合并。查询本身不会触发黑名单新增或删除事件。 首次进入页面、重连或用户主动刷新时,使用返回的完整列表替换本地快照;增量变化由 拉黑用户 /sdk/android/user/blacklist/add blacklist 和 取消拉黑用户 /sdk/android/user/blacklist/remove blacklist 页面归属的 listener 处理。" + "content": "黑名单记录当前用户主动拉黑的用户,可用于黑名单设置页、资料卡中的关系状态和聊天入口限制。 获取黑名单 完成 SDK 初始化并登录后,调用 getBlacklist 获取当前账号的完整黑名单。返回空列表表示当前没有黑名单用户。 OpenIMClient.getInstance .friendshipManager.getBlacklist new OnBase @Override public void onSuccess List users // 使用 users 更新黑名单列表 @Override public void onError int code, String error // 处理错误 ; 成功 callback 返回 List ;通过 UserInfo.getBlackInfo 读取黑名单关系对象。 黑名单记录字段 BlacklistInfo 的常用字段如下: | 字段 | 说明 | | | | | userID | 被当前用户拉黑的目标用户 ID。 | | nickname | 目标用户昵称。 | | faceURL | 目标用户头像地址。 | | gender | 目标用户性别值。 | | operatorUserID | 执行拉黑操作的用户 ID。 | | createTime | 黑名单关系创建时间。 | | addSource | 黑名单关系的添加来源。 | | ex | 黑名单关系扩展字符串。 | 如果页面还要展示好友备注或最新公开资料,可额外查询好友资料或公开资料。 黑名单新增或删除时,可通过 拉黑用户 /sdk/android/user/blacklist/add blacklist 和 取消拉黑用户 /sdk/android/user/blacklist/remove blacklist 页面中的 listener 接收通知。" }, { "path": "/sdk/android/user/blacklist/add-blacklist", @@ -2101,7 +2101,7 @@ "description": "使用 addBlacklist() 将用户加入当前账号黑名单。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user blacklist add-blacklist", - "content": "OpenIMClient.getInstance .friendshipManager.addBlacklist new OnBase @Override public void onSuccess String data markBlacklistRequestSubmitted targetUserID ; @Override public void onError int code, String error recordBlacklistAddFailure code, error ; , targetUserID, \" \\\"source\\\":\\\"profile menu\\\" \" ; 第二个参数是目标 userID ,第三个参数是可选扩展字符串。无需扩展信息时可使用不带 ex 的重载。成功 callback 表示拉黑请求完成,不表示事件已经到达。 黑名单是单向关系:被拉黑用户不能向当前用户发送消息,但当前用户是否允许继续向对方发送消息由业务层决定。 ex 是完整字符串,更新前应合并业务自己的扩展字段。 onBlacklistAdded 由本页归属,应组合进应用唯一的 OnFriendshipListener : @Override public void onBlacklistAdded BlacklistInfo user blacklistStore.put user.getUserID , user ;" + "content": "OpenIMClient.getInstance .friendshipManager.addBlacklist new OnBase @Override public void onSuccess String data // 拉黑用户成功 @Override public void onError int code, String error // 处理错误 , targetUserID, \" \\\"source\\\":\\\"profile menu\\\" \" ; 第二个参数是目标 userID ,第三个参数是可选扩展字符串。无需扩展信息时可使用不带 ex 的重载。成功 callback 表示拉黑请求完成,不表示事件已经到达。 黑名单是单向关系:被拉黑用户不能向当前用户发送消息,但当前用户是否允许继续向对方发送消息由业务层决定。 ex 是用于保存黑名单扩展信息的字符串,也可以存储 JSON 字符串。 拉黑状态变化时,可通过 OnFriendshipListener 接收 onBlacklistAdded : @Override public void onBlacklistAdded BlacklistInfo user // 处理新增的黑名单记录" }, { "path": "/sdk/android/user/blacklist/remove-blacklist", @@ -2109,7 +2109,7 @@ "description": "使用 removeBlacklist() 将用户移出当前账号黑名单。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user blacklist remove-blacklist", - "content": "OpenIMClient.getInstance .friendshipManager.removeBlacklist new OnBase @Override public void onSuccess String data markBlacklistRemovalSubmitted targetUserID ; @Override public void onError int code, String error recordBlacklistRemovalFailure code, error ; , targetUserID ; 成功 callback 表示移除请求完成,不表示事件已经到达。黑名单快照应在 onBlacklistDeleted 到达后按 userID 删除;如果事件丢失,可重新调用 获取黑名单列表 /sdk/android/user/blacklist/get blacklist 校准。 onBlacklistDeleted 由本页归属,应按 userID 删除本地记录: @Override public void onBlacklistDeleted BlacklistInfo user blacklistStore.remove user.getUserID ;" + "content": "OpenIMClient.getInstance .friendshipManager.removeBlacklist new OnBase @Override public void onSuccess String data // 取消拉黑成功 @Override public void onError int code, String error // 处理错误 , targetUserID ; 成功 callback 表示取消拉黑请求完成。黑名单发生变化时,通过 onBlacklistDeleted 接收通知;需要重新获取列表时,调用 获取黑名单列表 /sdk/android/user/blacklist/get blacklist 。 取消拉黑时,可通过 OnFriendshipListener 接收 onBlacklistDeleted : @Override public void onBlacklistDeleted BlacklistInfo user // 处理已移除的黑名单记录" }, { "path": "/sdk/android/conversation/overview-conversation", diff --git a/src/generated/search-index.json b/src/generated/search-index.json index 13ecd6c1ab..a8ebbbfe20 100644 --- a/src/generated/search-index.json +++ b/src/generated/search-index.json @@ -1941,7 +1941,7 @@ "description": "Learn about user profiles, friendships, friend requests, blacklists, and online status in the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user overview-user", - "content": "OpenIM Android SDK identifies each user by userID . When implementing profile cards, friend requests, contacts, or a blocklist, distinguish an application's public user profile from the current user's friend relationship and blocklist state. Group member lists, in group nicknames, group roles, and member administration belong to the Groups domain. User APIs cover profiles, friendships, friend requests, blacklists, and online status. User objects Android SDK returns different user objects for different scenarios: | Type | Use case | Main APIs | | | | | | LocalUser | The current user's local profile, settings page, avatar, nickname, and account level receive setting | getSelfLocalUserInfo , setSelfInfo | | PublicUserInfo | Application user lookup, friend candidates, and profiles for users who are not friends | getUsersInfo | | UserInfo | Combined Android wrapper object that can carry public, friend, or blacklist information | getFriendListPage , getFriendsInfo , getBlacklist | | FriendInfo | The current user's friend list, friend remarks, and relationship extension data | searchFriends , getFriendListPage | | FriendApplicationInfo | The parties, handling state, and message for a friend request | Friend request queries and callbacks | | BlacklistInfo | Users blocked by the current user and their blocklist relationship fields | getBlacklist , addBlacklist , removeBlacklist | | UsersOnlineStatus | User online status and connected platforms | subscribeUsersOnlineStatus , getSubscribeOnlineUsersStatus , unsubscribeOnlineUsersStatus | The same userID can appear in public profile, friend, blocklist, and group member data. Prefer UserInfo.getFriendInfo when displaying a contact, PublicUserInfo when only a public account profile is needed, and UserInfo.getBlackInfo on a blocklist screen. Conversation list and chat page titles belong to conversation data and should use the conversation display name. Use userID as the stable key for user lists and events. A friend request contains both parties, so use fromUserID:toUserID to identify one request. Feature entry points | Requirement | Recommended page | | | | | Retrieve public profiles by userID for friend candidates or profile cards | Get specified user profiles /sdk/android/user/user profile/get users info | | Page through, search, or retrieve friend relationships by ID | Get the friend list by page /sdk/android/user/friends/get friend list page | | Send, retrieve, accept, or reject friend requests | Get received friend requests /sdk/android/user/friend applications/get recv friend application list | | Update friend data | Update friend profiles /sdk/android/user/friends/update friends | | Delete a friend relationship | Delete a friend /sdk/android/user/friends/delete friend | | View and maintain the current user's blocklist | Get the blacklist /sdk/android/user/blacklist/get blacklist | | Read or update the current user's nickname, avatar, and extension data | Update the current user profile /sdk/android/user/user profile/set self info | | Configure account level message reception and notification behavior | Set global message reception /sdk/android/user/user profile/set global message reception | | Subscribe to, retrieve, and unsubscribe from online status | Subscribe to user online status /sdk/android/user/online status/subscribe users online status , Unsubscribe from user status /sdk/android/user/online status/unsubscribe users online status | State updates Each user related capability page owns the listener and merge behavior for its events: Current user profile changes: Update the current user profile /sdk/android/user/user profile/set self info . Friend request changes: Get received friend requests /sdk/android/user/friend applications/get recv friend application list . Friend relationship and profile changes: Get the friend list by page /sdk/android/user/friends/get friend list page . Blocklist changes: Block a user /sdk/android/user/blacklist/add blacklist . Online status changes: Subscribe to user online status /sdk/android/user/online status/subscribe users online status . UserInfoManager and FriendshipManager each retain one listener. setOnUserListener and setOnFriendshipListener replace the current listener. Combine the required callbacks in a shared state layer and set each listener once; multiple pages must not overwrite one another's listeners." + "content": "OpenIM Android SDK identifies each user by userID . When implementing profile cards, friend requests, contacts, or a blocklist, distinguish an application's public user profile from the current user's friend relationship and blocklist state. Group member lists, in group nicknames, group roles, and member administration belong to the Groups domain. User APIs cover profiles, friendships, friend requests, blacklists, and online status. User objects Android SDK returns different user objects for different scenarios: | Type | Use case | Main APIs | | | | | | LocalUser | The current user's local profile, settings page, avatar, nickname, and account level receive setting | getSelfLocalUserInfo , setSelfInfo | | PublicUserInfo | Application user lookup, friend candidates, and profiles for users who are not friends | getUsersInfo | | UserInfo | User object returned by friend list, friend profile, or blocklist queries; it can include relationship data | getFriendListPage , getFriendsInfo , getBlacklist | | FriendInfo | The current user's friend list, friend remarks, and relationship extension data | searchFriends , getFriendListPage | | FriendApplicationInfo | The parties, handling state, and message for a friend request | Friend request queries and callbacks | | BlacklistInfo | Users blocked by the current user and their blocklist relationship fields | getBlacklist , addBlacklist , removeBlacklist | | UsersOnlineStatus | User online status and connected platforms | subscribeUsersOnlineStatus , getSubscribeOnlineUsersStatus , unsubscribeOnlineUsersStatus | The same userID can appear in public profile, friend, blocklist, and group member data. Prefer UserInfo.getFriendInfo when displaying a contact, PublicUserInfo when only a public account profile is needed, and UserInfo.getBlackInfo on a blocklist screen. Conversation list and chat page titles belong to conversation data and should use the conversation display name. Use userID as the stable key for user lists and events. A friend request contains both parties, so use fromUserID:toUserID to identify one request. Feature entry points | Requirement | Recommended page | | | | | Retrieve public profiles by userID for friend candidates or profile cards | Get specified user profiles /sdk/android/user/user profile/get users info | | Page through, search, or retrieve friend relationships by ID | Get the friend list by page /sdk/android/user/friends/get friend list page | | Send, retrieve, accept, or reject friend requests | Get received friend requests /sdk/android/user/friend applications/get recv friend application list | | Update friend data | Update friend profiles /sdk/android/user/friends/update friends | | Delete a friend relationship | Delete a friend /sdk/android/user/friends/delete friend | | View and maintain the current user's blocklist | Get the blacklist /sdk/android/user/blacklist/get blacklist | | Read or update the current user's nickname, avatar, and extension data | Update the current user profile /sdk/android/user/user profile/set self info | | Configure account level message reception and notification behavior | Set global message reception /sdk/android/user/user profile/set global message reception | | Subscribe to, retrieve, and unsubscribe from online status | Subscribe to user online status /sdk/android/user/online status/subscribe users online status , Unsubscribe from user status /sdk/android/user/online status/unsubscribe users online status | State updates Each user related capability page owns the listener and merge behavior for its events: Current user profile changes: Update the current user profile /sdk/android/user/user profile/set self info . Friend request changes: Get received friend requests /sdk/android/user/friend applications/get recv friend application list . Friend relationship and profile changes: Get the friend list by page /sdk/android/user/friends/get friend list page . Blocklist changes: Block a user /sdk/android/user/blacklist/add blacklist . Online status changes: Subscribe to user online status /sdk/android/user/online status/subscribe users online status . UserInfoManager and FriendshipManager each retain one listener. setOnUserListener and setOnFriendshipListener replace the current listener. Combine the required callbacks in a shared state layer and set each listener once; multiple pages must not overwrite one another's listeners." }, { "path": "/sdk/android/user/user-profile/get-users-info", @@ -2005,7 +2005,7 @@ "description": "Use getFriendListPage() to retrieve the current user friend list by page.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friends get-friend-list-page", - "content": "OpenIMClient.getInstance .friendshipManager.getFriendListPage new OnBase @Override public void onSuccess List friends for UserInfo friend : friends friendStore.put friend.getUserID , friend ; @Override public void onError int code, String error recordFriendListFailure code, error ; , 0, 40, true ; The arguments after the callback are offset , count , and filterBlack . offset starts at 0 , count is the page size, and filterBlack removes blocked users when true . The callback returns the current page as List ; call getFriendInfo on each item for relationship details. Increase offset by the requested item count when loading another page; a page smaller than count normally marks the end. Use the paged API instead of getFriendList . Merge snapshots and increments by userID . Friend profile fields UserInfo is the Android wrapper object. getFriendInfo returns FriendInfo for a friend list item. Common fields are: | Field | Description | | | | | userID | Friend user ID and the stable friend list key. | | nickname | Account nickname of the friend. | | faceURL | Account avatar URL of the friend. | | remark | Friend remark set by the current account. | | ex | Friendship extension string. | | addSource | Source that created the friendship. | | operatorUserID | User ID that created or updated the relationship. | | createTime | Friendship creation time. | nickname and faceURL are account data, while remark and ex belong to the friendship. UpdateFriendsReq can submit isPinned , but the current Android FriendInfo model has no corresponding read field, so pinned state needs application owned storage. Do not use a friend object to overwrite a stranger's PublicUserInfo , or write a friend remark back to the account nickname. This page owns the friend added, changed, and deleted callbacks. Combine them into the application's single OnFriendshipListener : @Override public void onFriendAdded FriendInfo friend friendStore.put friend.getUserID , friend ; @Override public void onFriendInfoChanged FriendInfo friend friendStore.put friend.getUserID , friend ; @Override public void onFriendDeleted FriendInfo friend friendStore.remove friend.getUserID ;" + "content": "OpenIMClient.getInstance .friendshipManager.getFriendListPage new OnBase @Override public void onSuccess List friends // Use friends to update the friend list. @Override public void onError int code, String error // Handle the error. , 0, 40, true ; The arguments after the callback are offset , count , and filterBlack . offset starts at 0 , count is the page size, and filterBlack removes blocked users when true . The callback returns the current page as List ; call getFriendInfo on each item for relationship details. Increase offset by the requested item count when loading another page; a page smaller than count normally marks the end. Friend profile fields UserInfo.getFriendInfo returns FriendInfo for a friend list item. Common fields are: | Field | Description | | | | | userID | Friend user ID. | | nickname | Account nickname of the friend. | | faceURL | Account avatar URL of the friend. | | remark | Friend remark set by the current account. | | ex | Friendship extension string. | | addSource | Source that created the friendship. | | operatorUserID | User ID that created or updated the relationship. | | createTime | Friendship creation time. | nickname and faceURL are account data, while remark and ex belong to the friendship. UpdateFriendsReq can submit isPinned , but the current Android FriendInfo model has no corresponding read field. Receive friend added, changed, and deleted callbacks through OnFriendshipListener : @Override public void onFriendAdded FriendInfo friend // Handle the added friend. @Override public void onFriendInfoChanged FriendInfo friend // Handle the changed friend. @Override public void onFriendDeleted FriendInfo friend // Handle the deleted friend." }, { "path": "/sdk/android/user/friends/search-friends", @@ -2013,7 +2013,7 @@ "description": "Use searchFriends() to search the current user friend list.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friends search-friends", - "content": "OpenIMClient.getInstance .friendshipManager.searchFriends new OnBase @Override public void onSuccess List results showFriendSearchResults results ; @Override public void onError int code, String error recordFriendSearchFailure code, error ; , Collections.singletonList keyword.trim , true, true, true ; Pass one non empty value in keywordList . The three Boolean arguments select matching by user ID, nickname, and friend remark. Enable at least one field. To search multiple fields, enable the corresponding flags; the API does not treat multiple keywords as independent search conditions. The callback returns List . Search results belong to the current search view and should not replace the full friend snapshot. This query does not trigger friendship callbacks." + "content": "OpenIMClient.getInstance .friendshipManager.searchFriends new OnBase @Override public void onSuccess List results // Use results to display the search results. @Override public void onError int code, String error // Handle the error. , Collections.singletonList keyword.trim , true, true, true ; Pass one non empty value in keywordList . The three Boolean arguments select matching by user ID, nickname, and friend remark. Enable at least one field. To search multiple fields, enable the corresponding flags. The callback returns List , which can be used to display the search results." }, { "path": "/sdk/android/user/friends/get-friends-info", @@ -2021,7 +2021,7 @@ "description": "Use getFriendsInfo() to query friendship profiles for specified users.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friends get-friends-info", - "content": "OpenIMClient.getInstance .friendshipManager.getFriendsInfo new OnBase @Override public void onSuccess List friends for UserInfo friend : friends friendStore.put friend.getUserID , friend ; @Override public void onError int code, String error recordFriendInfoFailure code, error ; , Arrays.asList \"user a\", \"user b\" , true ; The second argument is the target user ID list. filterBlack controls whether blocked users are removed. Remove empty and duplicate IDs before calling. The callback returns List ; use getFriendInfo for friend remarks and relationship fields, then merge by userID . The result can omit a target that is not a friend or is excluded by filterBlack == true . When the UI also needs account level public data, call Get specified user profiles /sdk/android/user/user profile/get users info and merge the two sources by userID . This query does not trigger friendship callbacks. Use checkFriend /sdk/android/user/friends/check friend when only the relationship state is needed." + "content": "OpenIMClient.getInstance .friendshipManager.getFriendsInfo new OnBase @Override public void onSuccess List friends for UserInfo friend : friends // Use friends to update the friend profiles. @Override public void onError int code, String error // Handle the error. , Arrays.asList \"user a\", \"user b\" , true ; The second argument is the target user ID list. filterBlack controls whether blocked users are removed. Remove empty and duplicate IDs before calling. The callback returns List ; use getFriendInfo for friend remarks and relationship fields. The result can omit a target that is not a friend or is excluded by filterBlack == true . When the UI also needs account level public data, call Get specified user profiles /sdk/android/user/user profile/get users info . Use checkFriend /sdk/android/user/friends/check friend when only the relationship state is needed." }, { "path": "/sdk/android/user/friends/check-friend", @@ -2029,7 +2029,7 @@ "description": "Use checkFriend() to check whether specified users are friends of the current user.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friends check-friend", - "content": "OpenIMClient.getInstance .friendshipManager.checkFriend new OnBase @Override public void onSuccess List relations showFriendshipStates relations ; @Override public void onError int code, String error recordFriendshipCheckFailure code, error ; , Arrays.asList \"user a\", \"user b\" ; The callback returns List . Each item's userID identifies the target user. result == 1 means the user is a friend and is not in the blacklist. Interpret other result values only through the server contract; do not create additional client side states. This method only establishes a relationship snapshot and does not trigger friendship callbacks. Use getFriendsInfo /sdk/android/user/friends/get friends info when nickname, avatar, or friend remark data is required." + "content": "OpenIMClient.getInstance .friendshipManager.checkFriend new OnBase @Override public void onSuccess List relations // Use relations to update the friendship display. @Override public void onError int code, String error // Handle the error. , Arrays.asList \"user a\", \"user b\" ; The callback returns List . Each item's userID is the target user ID. Call friendshipInfo.getResult to get the relationship result; 1 means the user is a friend of the current user and is not in the blacklist. Use getFriendsInfo /sdk/android/user/friends/get friends info when nickname, avatar, or friend remark data is required." }, { "path": "/sdk/android/user/friends/update-friends", @@ -2037,7 +2037,7 @@ "description": "Use updateFriendsReq() to update friend remarks, pinned state, or extension data.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friends update-friends", - "content": "UpdateFriendsReq request = new UpdateFriendsReq ; request.setFriendUserIDs new String friendUserID ; request.setRemark remark.trim ; OpenIMClient.getInstance .friendshipManager.updateFriendsReq new OnBase @Override public void onSuccess String data markFriendUpdateSubmitted ; @Override public void onError int code, String error recordFriendUpdateFailure code, error ; , request ; UpdateFriendsReq supports friendUserIDs , remark , isPinned , and ex . One call applies the same field value to every target friend. Use separate calls when friends need different values. ex is a complete string. | Field | Description | | | | | friendUserIDs | Friend ID array to update. | | remark | Friend remark for the current account. | | isPinned | Whether to pin the friend. | | ex | Friendship extension string, replaced as a complete value. | A successful callback means the update request completed. Merge the friend increment through onFriendInfoChanged , as documented in Get the friend list by page /sdk/android/user/friends/get friend list page ." + "content": "UpdateFriendsReq request = new UpdateFriendsReq ; request.setFriendUserIDs new String friendUserID ; request.setRemark remark.trim ; OpenIMClient.getInstance .friendshipManager.updateFriendsReq new OnBase @Override public void onSuccess String data // Friend profile update succeeded. @Override public void onError int code, String error // Handle the error. , request ; UpdateFriendsReq supports friendUserIDs , remark , isPinned , and ex . One call applies the same field value to every target friend. Use separate calls when friends need different values. ex is a complete string. | Field | Description | | | | | friendUserIDs | Friend ID array to update. | | remark | Friend remark for the current account. | | isPinned | Whether to pin the friend. | | ex | Friendship extension string. | A successful callback means the update friends request completed. Receive friend profile changes through onFriendInfoChanged , as documented in Get the friend list by page /sdk/android/user/friends/get friend list page ." }, { "path": "/sdk/android/user/friends/delete-friend", @@ -2045,7 +2045,7 @@ "description": "Use deleteFriend() to remove one friendship from the current user.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friends delete-friend", - "content": "OpenIMClient.getInstance .friendshipManager.deleteFriend new OnBase @Override public void onSuccess String data markFriendDeletionSubmitted friendUserID ; @Override public void onError int code, String error recordFriendDeletionFailure code, error ; , friendUserID ; A successful callback means the delete request completed. Remove the local record by userID after onFriendDeleted arrives. Event handling is documented in Get the friend list by page /sdk/android/user/friends/get friend list page ." + "content": "OpenIMClient.getInstance .friendshipManager.deleteFriend new OnBase @Override public void onSuccess String data // Friend deletion succeeded. @Override public void onError int code, String error // Handle the error. , friendUserID ; A successful callback means the delete friend request completed. Receive relationship changes through onFriendDeleted ; see Get the friend list by page /sdk/android/user/friends/get friend list page ." }, { "path": "/sdk/android/user/friend-applications/add-friend", @@ -2053,7 +2053,7 @@ "description": "Use addFriend() to send a friend request to a specified user.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friend-applications add-friend", - "content": "OpenIMClient.getInstance .friendshipManager.addFriend new OnBase @Override public void onSuccess String data markFriendApplicationSubmitted ; @Override public void onError int code, String error recordFriendApplicationFailure code, error ; , \"user b\", \"Hello, I am Alex\" ; The second argument is the recipient's userID , and the third argument is the request message. A successful callback means the server received the request, not that the recipient accepted it. The target ID cannot be empty. Let a trusted application backend handle lookup by nickname, phone number, or other private fields. Merge friend request changes through OnFriendshipListener , as documented in Get received friend requests /sdk/android/user/friend applications/get recv friend application list ." + "content": "OpenIMClient.getInstance .friendshipManager.addFriend new OnBase @Override public void onSuccess String data // Friend request sent successfully. @Override public void onError int code, String error // Handle the error. , \"user b\", \"Hello, I am Alex\" ; The second argument is the recipient's userID , and the third argument is the request message. A successful callback means the server received the request, not that the recipient accepted it. The target ID cannot be empty. Let a trusted application backend handle lookup by nickname, phone number, or other private fields. Receive friend request changes through OnFriendshipListener , as documented in Get received friend requests /sdk/android/user/friend applications/get recv friend application list ." }, { "path": "/sdk/android/user/friend-applications/get-recv-friend-application-list", @@ -2061,7 +2061,7 @@ "description": "Use getRecvFriendApplicationList() to query received friend requests by page.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friend-applications get-recv-friend-application-list", - "content": "GetFriendApplicationListAsRecipientReq request = new GetFriendApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .friendshipManager.getRecvFriendApplicationList new OnBase @Override public void onSuccess List applications replaceReceivedApplications applications ; @Override public void onError int code, String error recordReceivedApplicationFailure code, error ; , request ; offset starts at 0 , and count is the page size. To filter by handling state, use setHandleResults int with values defined by the server contract. The callback returns the current page as List . | Field | Description | | | | | fromUserID / fromNickname / fromFaceURL | Applicant ID, nickname, and avatar snapshot. | | toUserID / toNickname / toFaceURL | Recipient ID, nickname, and avatar snapshot. | | reqMsg | Friend request message. | | handleResult | Handling result: 0 pending, 1 accepted, 2 rejected. | | handlerUserID | User ID that handled the request; it can be empty while pending. | | handleMsg | Handling message. | | handleTime | Handling time; do not treat it as valid while pending. | | createTime | Request creation time. | | ex | Friend request extension string. | Use fromUserID:toUserID as the stable request key. This page owns the friend request added, accepted, rejected, and deleted callbacks. Combine them into the application's single OnFriendshipListener : @Override public void onFriendApplicationAdded FriendApplicationInfo application friendApplicationStore.merge application ; @Override public void onFriendApplicationAccepted FriendApplicationInfo application friendApplicationStore.merge application ; @Override public void onFriendApplicationRejected FriendApplicationInfo application friendApplicationStore.merge application ; @Override public void onFriendApplicationDeleted FriendApplicationInfo application friendApplicationStore.remove application.getFromUserID , application.getToUserID ; Use whether toUserID equals the signed in user ID to route a record to the received or sent list. After an application is accepted, onFriendAdded , owned by Get the friend list by page /sdk/android/user/friends/get friend list page , merges the new friendship." + "content": "GetFriendApplicationListAsRecipientReq request = new GetFriendApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .friendshipManager.getRecvFriendApplicationList new OnBase @Override public void onSuccess List applications // Use applications to update the received request list. @Override public void onError int code, String error // Handle the error. , request ; offset starts at 0 , and count is the page size. To filter by handling state, use setHandleResults int with values defined by the server contract. The callback returns the current page as List . | Field | Description | | | | | fromUserID / fromNickname / fromFaceURL | Applicant ID, nickname, and avatar. | | toUserID / toNickname / toFaceURL | Recipient ID, nickname, and avatar. | | reqMsg | Friend request message. | | handleResult | Handling result: 0 pending, 1 accepted, 2 rejected. | | handlerUserID | User ID that handled the request; it can be empty while pending. | | handleMsg | Handling message. | | handleTime | Handling time; do not treat it as valid while pending. | | createTime | Request creation time. | | ex | Friend request extension string. | Receive friend request added, accepted, rejected, and deleted callbacks through OnFriendshipListener : @Override public void onFriendApplicationAdded FriendApplicationInfo application // Handle a new or updated friend request. @Override public void onFriendApplicationAccepted FriendApplicationInfo application // Handle an accepted friend request. @Override public void onFriendApplicationRejected FriendApplicationInfo application // Handle a rejected friend request. @Override public void onFriendApplicationDeleted FriendApplicationInfo application // Handle a deleted friend request. Use whether toUserID equals the signed in user ID to route a record to the received or sent list. After an application is accepted, receive the new friendship through onFriendAdded ; see Get the friend list by page /sdk/android/user/friends/get friend list page ." }, { "path": "/sdk/android/user/friend-applications/get-send-friend-application-list", @@ -2069,7 +2069,7 @@ "description": "Use getSendFriendApplicationList() to query sent friend requests by page.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friend-applications get-send-friend-application-list", - "content": "GetFriendApplicationListAsApplicantReq request = new GetFriendApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .friendshipManager.getSendFriendApplicationList new OnBase @Override public void onSuccess List applications replaceSentApplications applications ; @Override public void onError int code, String error recordSentApplicationFailure code, error ; , request ; offset starts at 0 , and count is the page size. The callback returns the current page as List . Merge items by fromUserID:toUserID . This query only establishes a snapshot and does not trigger friend request callbacks. For sent requests, the signed in user is normally fromUserID . The record fields and handling semantics are the same as Get received friend requests /sdk/android/user/friend applications/get recv friend application list : the Android server contract uses 0 for pending, 1 for accepted, and 2 for rejected." + "content": "GetFriendApplicationListAsApplicantReq request = new GetFriendApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .friendshipManager.getSendFriendApplicationList new OnBase @Override public void onSuccess List applications // Use applications to update the sent request list. @Override public void onError int code, String error // Handle the error. , request ; offset starts at 0 , and count is the page size. The callback returns the current page as List . For sent requests, the signed in user is normally fromUserID . The record fields and handling semantics are the same as Get received friend requests /sdk/android/user/friend applications/get recv friend application list ." }, { "path": "/sdk/android/user/friend-applications/accept-friend-application", @@ -2077,7 +2077,7 @@ "description": "Use acceptFriendApplication() to accept a friend request.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friend-applications accept-friend-application", - "content": "OpenIMClient.getInstance .friendshipManager.acceptFriendApplication new OnBase @Override public void onSuccess String data markApplicationAccepted applicantUserID ; @Override public void onError int code, String error recordApplicationAcceptFailure code, error ; , applicantUserID, \"Accepted\" ; applicantUserID identifies the applicant, and the final argument is the handling message. A successful callback means the accept request completed. The request state and new friendship can arrive through separate callbacks and should be merged independently: onFriendApplicationAccepted updates the application and onFriendAdded updates the friendship." + "content": "OpenIMClient.getInstance .friendshipManager.acceptFriendApplication new OnBase @Override public void onSuccess String data // Friend request accepted successfully. @Override public void onError int code, String error // Handle the error. , applicantUserID, \"Accepted\" ; applicantUserID identifies the applicant, and the final argument is the handling message. A successful callback means the accept friend request call completed. onFriendApplicationAccepted reports the application status, and onFriendAdded reports the new friendship." }, { "path": "/sdk/android/user/friend-applications/refuse-friend-application", @@ -2085,7 +2085,7 @@ "description": "Use refuseFriendApplication() to reject a friend request.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user friend-applications refuse-friend-application", - "content": "OpenIMClient.getInstance .friendshipManager.refuseFriendApplication new OnBase @Override public void onSuccess String data markApplicationRejected applicantUserID ; @Override public void onError int code, String error recordApplicationRejectFailure code, error ; , applicantUserID, \"Not now\" ; applicantUserID identifies the applicant, and the final argument is the handling message. A successful callback means the reject request completed. Merge request state through the shared friend request listener; the final rejected state is handleResult == 2 ." + "content": "OpenIMClient.getInstance .friendshipManager.refuseFriendApplication new OnBase @Override public void onSuccess String data // Friend request rejected successfully. @Override public void onError int code, String error // Handle the error. , applicantUserID, \"Not now\" ; applicantUserID identifies the applicant, and the final argument is the handling message. A successful callback means the reject friend request call completed. OnFriendshipListener reports the application status; handleResult == 2 means rejected." }, { "path": "/sdk/android/user/blacklist/get-blacklist", @@ -2093,7 +2093,7 @@ "description": "Use getBlacklist() to retrieve the current user blacklist.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user blacklist get-blacklist", - "content": "The blacklist records users blocked by the current account. Use it for a blacklist settings screen, relationship state on a profile card, or to limit a chat entry point. Blacklist management and group member management are separate capabilities; use Group APIs to mute, remove, or change the role of a group member. Get the blacklist After SDK initialization and login, call getBlacklist to retrieve the full blacklist for the signed in account. An empty list means no users are blocked. OpenIMClient.getInstance .friendshipManager.getBlacklist new OnBase @Override public void onSuccess List users blacklistStore.replace users ; @Override public void onError int code, String error recordBlacklistFailure code, error ; ; The callback returns List ; call UserInfo.getBlackInfo to retrieve the blacklist relationship object. Blacklist record fields Common BlacklistInfo fields are: | Field | Description | | | | | userID | Target user ID blocked by the current user and the stable list key. | | nickname | Target user nickname snapshot. | | faceURL | Target user avatar URL. | | gender | Target user gender value. | | operatorUserID | User ID that performed the block operation. | | createTime | Blacklist relationship creation time. | | addSource | Source that added the blacklist relationship. | | ex | Blacklist relationship extension string. | When the screen also needs friend remarks or the latest public profile, separately merge FriendInfo or PublicUserInfo by userID . Do not treat blacklist fields as friend profile data. Merge blacklist state by userID . This query does not trigger blacklist added or deleted callbacks. Replace the local snapshot on initial load, after reconnecting, or after an explicit refresh; incremental changes are owned by the Block a user /sdk/android/user/blacklist/add blacklist and Unblock a user /sdk/android/user/blacklist/remove blacklist listener pages." + "content": "The blacklist records users blocked by the current account. Use it for a blacklist settings screen, relationship state on a profile card, or to limit a chat entry point. Get the blacklist After SDK initialization and login, call getBlacklist to retrieve the full blacklist for the signed in account. An empty list means no users are blocked. OpenIMClient.getInstance .friendshipManager.getBlacklist new OnBase @Override public void onSuccess List users // Use users to update the blacklist. @Override public void onError int code, String error // Handle the error. ; The callback returns List ; call UserInfo.getBlackInfo to retrieve the blacklist relationship object. Blacklist record fields Common BlacklistInfo fields are: | Field | Description | | | | | userID | Target user ID blocked by the current user. | | nickname | Target user nickname. | | faceURL | Target user avatar URL. | | gender | Target user gender value. | | operatorUserID | User ID that performed the block operation. | | createTime | Blacklist relationship creation time. | | addSource | Source that added the blacklist relationship. | | ex | Blacklist relationship extension string. | When the screen also needs friend remarks or the latest public profile, query the corresponding friend or public profile data. Receive blacklist changes through the listeners described in Block a user /sdk/android/user/blacklist/add blacklist and Unblock a user /sdk/android/user/blacklist/remove blacklist ." }, { "path": "/sdk/android/user/blacklist/add-blacklist", @@ -2101,7 +2101,7 @@ "description": "Use addBlacklist() to add a user to the current account blacklist.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user blacklist add-blacklist", - "content": "OpenIMClient.getInstance .friendshipManager.addBlacklist new OnBase @Override public void onSuccess String data markBlacklistRequestSubmitted targetUserID ; @Override public void onError int code, String error recordBlacklistAddFailure code, error ; , targetUserID, \" \\\"source\\\":\\\"profile menu\\\" \" ; The second argument is the target userID , and the third argument is optional extension data. Use the overload without ex when no extension data is needed. A successful callback means the block request completed, not that the event has arrived. The blacklist is one way: the blocked user cannot send messages to the current account. Whether the current account can continue to send messages is an application level rule. ex is a complete string, so merge application owned fields before updating it. This page owns onBlacklistAdded . Combine it into the application's single OnFriendshipListener : @Override public void onBlacklistAdded BlacklistInfo user blacklistStore.put user.getUserID , user ;" + "content": "OpenIMClient.getInstance .friendshipManager.addBlacklist new OnBase @Override public void onSuccess String data // User blocked successfully. @Override public void onError int code, String error // Handle the error. , targetUserID, \" \\\"source\\\":\\\"profile menu\\\" \" ; The second argument is the target userID , and the third argument is optional extension data. Use the overload without ex when no extension data is needed. A successful callback means the block request completed, not that the event has arrived. The blacklist is one way: the blocked user cannot send messages to the current account. Whether the current account can continue to send messages is an application level rule. ex stores blacklist extension data and can contain a JSON string. Receive onBlacklistAdded through OnFriendshipListener : @Override public void onBlacklistAdded BlacklistInfo user // Handle the added blacklist record." }, { "path": "/sdk/android/user/blacklist/remove-blacklist", @@ -2109,7 +2109,7 @@ "description": "Use removeBlacklist() to remove a user from the current account blacklist.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user blacklist remove-blacklist", - "content": "OpenIMClient.getInstance .friendshipManager.removeBlacklist new OnBase @Override public void onSuccess String data markBlacklistRemovalSubmitted targetUserID ; @Override public void onError int code, String error recordBlacklistRemovalFailure code, error ; , targetUserID ; A successful callback means the remove request completed, not that the event has arrived. Remove the local entry after onBlacklistDeleted ; if the event is missed, reconcile through Get the blacklist /sdk/android/user/blacklist/get blacklist . This page owns onBlacklistDeleted ; remove the local entry by userID : @Override public void onBlacklistDeleted BlacklistInfo user blacklistStore.remove user.getUserID ;" + "content": "OpenIMClient.getInstance .friendshipManager.removeBlacklist new OnBase @Override public void onSuccess String data // User unblocked successfully. @Override public void onError int code, String error // Handle the error. , targetUserID ; A successful callback means the unblock request completed. Receive blacklist changes through onBlacklistDeleted ; to retrieve the list again, use Get the blacklist /sdk/android/user/blacklist/get blacklist . Receive onBlacklistDeleted through OnFriendshipListener : @Override public void onBlacklistDeleted BlacklistInfo user // Handle the removed blacklist record." }, { "path": "/sdk/android/conversation/overview-conversation", From 780f88ce04d0c27214e458f30b9a5382126c0a96 Mon Sep 17 00:00:00 2001 From: chan <1499188352@qq.com> Date: Wed, 19 Aug 2026 12:41:38 +0800 Subject: [PATCH 07/12] docs(android): publish Android SDK user documentation and add relationship overview - Split friendship, friend request, and blacklist content from the user overview into a new relationship overview. - Keep user profiles, account settings, and online status guidance in the user overview. --- .../get-subscribe-online-users-status.mdx | 10 +- .../subscribe-users-online-status.mdx | 14 +- .../unsubscribe-users-online-status.mdx | 10 +- .../android/user/overview-relationships.mdx | 97 ++ .../chat/sdk/android/user/overview-user.mdx | 69 +- .../user-profile/get-self-local-user-info.mdx | 14 +- .../user/user-profile/get-users-info.mdx | 60 +- .../set-friend-add-permission.mdx | 46 + .../set-global-message-reception.mdx | 12 +- .../user/user-profile/set-self-info.mdx | 22 +- .../get-subscribe-online-users-status.mdx | 10 +- .../subscribe-users-online-status.mdx | 12 +- .../unsubscribe-users-online-status.mdx | 10 +- .../android/user/overview-relationships.mdx | 92 ++ .../chat/sdk/android/user/overview-user.mdx | 67 +- .../user-profile/get-self-local-user-info.mdx | 12 +- .../user/user-profile/get-users-info.mdx | 58 +- .../set-friend-add-permission.mdx | 39 + .../set-global-message-reception.mdx | 10 +- .../user/user-profile/set-self-info.mdx | 22 +- data/structure/android-content-audit.json | 146 ++- data/structure/android-navigation-labels.json | 8 +- data/structure/android-sidebar.json | 8 + data/structure/chat-pages.json | 16 + scripts/sync-client-sdk-route-skeletons.mjs | 2 + src/generated/android-sdk-zh-content.json | 93 +- src/generated/navigation.json | 348 +++---- src/generated/routes.json | 886 +++++++++--------- src/generated/search-index-zh.json | 40 +- src/generated/search-index.json | 36 +- src/lib/client-sdk-commercial.ts | 1 + 31 files changed, 1422 insertions(+), 848 deletions(-) create mode 100644 content/docs/chat/sdk/android/user/overview-relationships.mdx create mode 100644 content/docs/chat/sdk/android/user/user-profile/set-friend-add-permission.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/overview-relationships.mdx create mode 100644 content/zh/docs/chat/sdk/android/user/user-profile/set-friend-add-permission.mdx diff --git a/content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx b/content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx index 4c61c8b9c7..4af6f0c892 100644 --- a/content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx +++ b/content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-06' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/user/online-status/get-subscribe-online-users-status' @@ -16,17 +16,15 @@ OpenIMClient.getInstance().userInfoManager.getSubscribeOnlineUsersStatus( new OnBase>() { @Override public void onSuccess(List states) { - mergeOnlineStates(states); + // Use states to display online status. } @Override public void onError(int code, String error) { - recordStatusQueryFailure(code, error); + // Handle the error. } } ); ``` -This method does not accept user IDs or modify the subscription set. The callback returns the current subscribed-user `List` snapshot, which can reconcile status by `userID` after reconnecting or reopening a screen. - -The query does not trigger `onUserStatusChanged`. Apply the snapshot only to presence state; retrieve names and avatars through the user profile APIs. +The callback returns the current subscribed-user `List`. diff --git a/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx b/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx index 64258f4353..d7625e4900 100644 --- a/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx +++ b/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/user/online-status/subscribe-users-online-status' @@ -18,19 +18,19 @@ OpenIMClient.getInstance().userInfoManager.subscribeUsersOnlineStatus( new OnBase>() { @Override public void onSuccess(List states) { - mergeOnlineStates(states); + // Use states to display online status. } @Override public void onError(int code, String error) { - recordStatusSubscriptionFailure(code, error); + // Handle the error. } }, userIDs ); ``` -Remove empty and duplicate IDs, and subscribe only to users whose status is needed. The callback returns the initial `List` snapshot. Each item contains `userID`, `status`, and `platformIDs`. Deduplicate repeated subscriptions in the application state layer. +Remove empty and duplicate IDs, and subscribe only to users whose status is needed. The callback returns the initial `List`. Each item contains `userID`, `status`, and `platformIDs`. ## Status fields @@ -40,13 +40,13 @@ Remove empty and duplicate IDs, and subscribe only to users whose status is need | `status` | Online status value defined by the server contract. | | `platformIDs` | Platforms on which the user is online. | -This page owns `onUserStatusChanged`. Combine it into the application's single `OnUserListener` and merge by `userID`: +Receive `onUserStatusChanged` through `OnUserListener` when a user's online status changes: ```java @Override public void onUserStatusChanged(UsersOnlineStatus status) { - onlineStatusStore.put(status.getUserID(), status); + // Handle the online-status change. } ``` -Subscription only creates or updates the subscription set; do not treat its callback as friend profile data. Manage the subscription set centrally when users leave the visible range or the account changes, and remove users that are no longer needed through [Unsubscribe from user status](/sdk/android/user/online-status/unsubscribe-users-online-status). +Subscription creates or updates the subscription set. When a user's status is no longer needed, cancel the subscription through [Unsubscribe from user status](/sdk/android/user/online-status/unsubscribe-users-online-status). diff --git a/content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx b/content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx index 86256bcdd4..3e3ffd3307 100644 --- a/content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx +++ b/content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/user/online-status/unsubscribe-users-online-status' @@ -20,20 +20,18 @@ OpenIMClient.getInstance().userInfoManager.unsubscribeOnlineUsersStatus( new OnBase() { @Override public void onSuccess(String data) { - for (String userID : userIDs) { - presenceByUserID.remove(userID); - } + // Unsubscription succeeded. } @Override public void onError(int code, String error) { - recordStatusUnsubscribeFailure(code, error); + // Handle the error. } }, userIDs ); ``` -A successful callback means that the unsubscribe request completed. Only then remove the IDs from the application's subscription set and presence cache. Retain the previous state after an error so the operation can be retried. This operation does not change user profiles or friend relationships. +A successful callback means that the unsubscribe request completed. Call [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status) when those users need to be tracked again. diff --git a/content/docs/chat/sdk/android/user/overview-relationships.mdx b/content/docs/chat/sdk/android/user/overview-relationships.mdx new file mode 100644 index 0000000000..400dc92c49 --- /dev/null +++ b/content/docs/chat/sdk/android/user/overview-relationships.mdx @@ -0,0 +1,97 @@ +--- +title: 'Relationship overview' +description: 'Learn about friends, friend requests, and blacklist APIs in the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-19' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/overview-relationships' +--- + +Relationships record friendships, friend requests, and blacklist entries between the current user and other users. Profiles, account settings, and online status belong to user capabilities. See [User overview](/sdk/android/user/overview-user). + +## Relationship objects + +Android SDK returns different objects for relationship scenarios: + +| Type | Use case | Main APIs | +| --- | --- | --- | +| `UserInfo` | User profile and relationship data in friend lists, specified-friend queries, and the blacklist | `getFriendListPage()`, `getFriendsInfo()`, `getBlacklist()` | +| `FriendInfo` | Friend profiles, remarks, and relationship extension data | `UserInfo.getFriendInfo()`, `searchFriends()` | +| `FriendshipInfo` | Friendship result between the current user and a target user | `checkFriend()` | +| `FriendApplicationInfo` | Received and sent friend requests and their handling status | `getRecvFriendApplicationList()`, `getSendFriendApplicationList()` | +| `BlacklistInfo` | Blacklist relationship data | `UserInfo.getBlackInfo()`, `getBlacklist()` | + +`UserInfo` can contain friend or blacklist relationship data. Call `getFriendInfo()` to obtain `FriendInfo`, or `getBlackInfo()` to obtain `BlacklistInfo`. + +## Feature entry points + +| Requirement | Recommended page | +| --- | --- | +| Page through, search, or retrieve specified friend profiles | [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page), [Search friends](/sdk/android/user/friends/search-friends), [Get specified friend profiles](/sdk/android/user/friends/get-friends-info) | +| Check the friendship between the current user and a target user | [Check friendship](/sdk/android/user/friends/check-friend) | +| Update or delete a friend relationship | [Update friend profiles](/sdk/android/user/friends/update-friends), [Delete a friend](/sdk/android/user/friends/delete-friend) | +| Send, retrieve, accept, or reject friend requests | [Send a friend request](/sdk/android/user/friend-applications/add-friend), [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list), [Get sent friend requests](/sdk/android/user/friend-applications/get-send-friend-application-list), [Accept a friend request](/sdk/android/user/friend-applications/accept-friend-application), [Reject a friend request](/sdk/android/user/friend-applications/refuse-friend-application) | +| View or maintain the blacklist | [Get the blacklist](/sdk/android/user/blacklist/get-blacklist), [Block a user](/sdk/android/user/blacklist/add-blacklist), [Unblock a user](/sdk/android/user/blacklist/remove-blacklist) | + +## State updates + +Set the friendship listener for relationship state changes. See the corresponding capability pages below for details about each callback: + +```java +OpenIMClient client = OpenIMClient.getInstance(); + +client.friendshipManager.setOnFriendshipListener(new OnFriendshipListener() { + @Override + public void onFriendApplicationAdded(FriendApplicationInfo application) { + // Handle friend request changes. + } + + @Override + public void onFriendApplicationAccepted(FriendApplicationInfo application) { + // Handle an accepted friend request. + } + + @Override + public void onFriendApplicationRejected(FriendApplicationInfo application) { + // Handle a rejected friend request. + } + + @Override + public void onFriendApplicationDeleted(FriendApplicationInfo application) { + // Handle friend request deletion. + } + + @Override + public void onFriendAdded(FriendInfo friend) { + // Handle friendship changes. + } + + @Override + public void onFriendInfoChanged(FriendInfo friend) { + // Handle friend profile changes. + } + + @Override + public void onFriendDeleted(FriendInfo friend) { + // Handle friendship deletion. + } + + @Override + public void onBlacklistAdded(BlacklistInfo user) { + // Handle a new blacklist entry. + } + + @Override + public void onBlacklistDeleted(BlacklistInfo user) { + // Handle blacklist entry deletion. + } +}); +``` + +- Friend request changes: [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list). +- Friendship and friend profile changes: [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page). +- Blacklist changes: [Get the blacklist](/sdk/android/user/blacklist/get-blacklist). diff --git a/content/docs/chat/sdk/android/user/overview-user.mdx b/content/docs/chat/sdk/android/user/overview-user.mdx index eeb5920e22..2545b4ffc7 100644 --- a/content/docs/chat/sdk/android/user/overview-user.mdx +++ b/content/docs/chat/sdk/android/user/overview-user.mdx @@ -1,60 +1,63 @@ --- title: 'User overview' -description: 'Learn about user profiles, friendships, friend requests, blacklists, and online status in the Android SDK.' +description: 'Learn about current-user profiles, public user profiles, account settings, and online status in the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-19' version: 'v4' platform: 'android' sourcePath: '/sdk/android/user/overview-user' --- -OpenIM Android SDK identifies each user by `userID`. When implementing profile cards, friend requests, contacts, or a blocklist, distinguish an application's public user profile from the current user's friend relationship and blocklist state. +OpenIM Android SDK identifies each user by `userID`. User APIs retrieve and update the current account profile, retrieve public user profiles, and subscribe to user online status. -Group member lists, in-group nicknames, group roles, and member administration belong to the Groups domain. User APIs cover profiles, friendships, friend requests, blacklists, and online status. +Friends, friend requests, and blacklists are relationship capabilities between users. See [Relationship overview](/sdk/android/user/overview-relationships) for their types, APIs, and state updates. ## User objects Android SDK returns different user objects for different scenarios: -| Type | Use case | Main APIs | -| ----------------------- | ---------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | -| `LocalUser` | The current user's local profile, settings page, avatar, nickname, and account-level receive setting | `getSelfLocalUserInfo()`, `setSelfInfo()` | -| `PublicUserInfo` | Application user lookup, friend candidates, and profiles for users who are not friends | `getUsersInfo()` | -| `UserInfo` | User object returned by friend-list, friend-profile, or blocklist queries; it can include relationship data | `getFriendListPage()`, `getFriendsInfo()`, `getBlacklist()` | -| `FriendInfo` | The current user's friend list, friend remarks, and relationship extension data | `searchFriends()`, `getFriendListPage()` | -| `FriendApplicationInfo` | The parties, handling state, and message for a friend request | Friend request queries and callbacks | -| `BlacklistInfo` | Users blocked by the current user and their blocklist relationship fields | `getBlacklist()`, `addBlacklist()`, `removeBlacklist()` | -| `UsersOnlineStatus` | User online status and connected platforms | `subscribeUsersOnlineStatus()`, `getSubscribeOnlineUsersStatus()`, `unsubscribeOnlineUsersStatus()` | +| Type | Use case | Main APIs | +| --- | --- | --- | +| `LocalUser` | The signed-in user's local profile, settings page, avatar, nickname, and account-level settings | `getSelfLocalUserInfo()`, `setSelfInfo()` | +| `PublicUserInfo` | Application user lookup and public profile cards | `getUsersInfo()` | +| `UsersOnlineStatus` | User online status and connected platforms | `subscribeUsersOnlineStatus()`, `getSubscribeOnlineUsersStatus()`, `unsubscribeOnlineUsersStatus()` | -The same `userID` can appear in public profile, friend, blocklist, and group member data. Prefer `UserInfo.getFriendInfo()` when displaying a contact, `PublicUserInfo` when only a public account profile is needed, and `UserInfo.getBlackInfo()` on a blocklist screen. Conversation list and chat page titles belong to conversation data and should use the conversation display name. - -Use `userID` as the stable key for user lists and events. A friend request contains both parties, so use `fromUserID:toUserID` to identify one request. +`LocalUser` represents the signed-in user, while `PublicUserInfo` represents a public user profile returned by a query. Group member profiles, in-group nicknames, and member management belong to group capabilities. ## Feature entry points -| Requirement | Recommended page | -| --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | -| Retrieve public profiles by `userID` for friend candidates or profile cards | [Get specified user profiles](/sdk/android/user/user-profile/get-users-info) | -| Page through, search, or retrieve friend relationships by ID | [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page) | -| Send, retrieve, accept, or reject friend requests | [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list) | -| Update friend data | [Update friend profiles](/sdk/android/user/friends/update-friends) | -| Delete a friend relationship | [Delete a friend](/sdk/android/user/friends/delete-friend) | -| View and maintain the current user's blocklist | [Get the blacklist](/sdk/android/user/blacklist/get-blacklist) | -| Read or update the current user's nickname, avatar, and extension data | [Update the current user profile](/sdk/android/user/user-profile/set-self-info) | -| Configure account-level message reception and notification behavior | [Set global message reception](/sdk/android/user/user-profile/set-global-message-reception) | -| Subscribe to, retrieve, and unsubscribe from online status | [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status), [Unsubscribe from user status](/sdk/android/user/online-status/unsubscribe-users-online-status) | +| Requirement | Recommended page | +| --- | --- | +| Retrieve public profiles by `userID` for profile cards | [Get specified user profiles](/sdk/android/user/user-profile/get-users-info) | +| Read or update the current user's nickname, avatar, and extension data | [Get the current user profile](/sdk/android/user/user-profile/get-self-local-user-info), [Update the current user profile](/sdk/android/user/user-profile/set-self-info) | +| Configure account-level message reception and notification behavior | [Set global message reception](/sdk/android/user/user-profile/set-global-message-reception) | +| Choose how other users can add the current account | [Set friend request permissions](/sdk/android/user/user-profile/set-friend-add-permission) | +| Subscribe to, retrieve, and unsubscribe from online status | [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status), [Get subscribed user online status](/sdk/android/user/online-status/get-subscribe-online-users-status), [Unsubscribe from user status](/sdk/android/user/online-status/unsubscribe-users-online-status) | +| Manage friends, friend requests, or the blacklist | [Relationship overview](/sdk/android/user/overview-relationships) | ## State updates -Each user-related capability page owns the listener and merge behavior for its events: +Set the user listener for user-related state changes. See the corresponding capability pages below for details about each callback: + +```java +OpenIMClient client = OpenIMClient.getInstance(); + +client.userInfoManager.setOnUserListener(new OnUserListener() { + @Override + public void onSelfInfoUpdated(UserInfo info) { + // Handle current-user profile changes. + } + + @Override + public void onUserStatusChanged(UsersOnlineStatus status) { + // Handle user online-status changes. + } +}); +``` - Current user profile changes: [Update the current user profile](/sdk/android/user/user-profile/set-self-info). -- Friend request changes: [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list). -- Friend relationship and profile changes: [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page). -- Blocklist changes: [Block a user](/sdk/android/user/blacklist/add-blacklist). - Online status changes: [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status). - -`UserInfoManager` and `FriendshipManager` each retain one listener. `setOnUserListener()` and `setOnFriendshipListener()` replace the current listener. Combine the required callbacks in a shared state layer and set each listener once; multiple pages must not overwrite one another's listeners. +- Friend, friend-request, and blacklist changes: [Relationship overview](/sdk/android/user/overview-relationships). diff --git a/content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx b/content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx index fab369eb88..fac0a79ef4 100644 --- a/content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx +++ b/content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx @@ -5,7 +5,7 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-06' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/user/user-profile/get-self-local-user-info' @@ -16,12 +16,12 @@ OpenIMClient.getInstance().userInfoManager.getSelfLocalUserInfo( new OnBase() { @Override public void onSuccess(LocalUser user) { - currentUserStore.set(user); + // Use user to display the current profile. } @Override public void onError(int code, String error) { - recordSelfProfileFailure(code, error); + // Handle the error. } } ); @@ -37,10 +37,6 @@ After initialization and login, call this method to retrieve the current account | `nickname` | Current account nickname. | | `faceURL` | Current account avatar URL. | | `ex` | Current account extension string. | -| `attachedInfo` | SDK-attached data; parse only an application-defined format. | +| `attachedInfo` Enterprise | Additional information with an application-defined format. | | `globalRecvMsgOpt` | Global message reception: `0` receive, `1` do not receive, `2` receive without notification. | -| `addFriendPermission` | Add-friend permission value defined by the server contract. | - -The query does not trigger a profile callback. Clear the previous account snapshot when logging out or switching accounts so that the previous user's data is not rendered for the new account. - -`getSelfUserInfo()` is deprecated and is not the recommended API. +| `addFriendPermission` Enterprise | Add-friend permission value; see [Set friend request permissions](/sdk/android/user/user-profile/set-friend-add-permission) for the meanings. | diff --git a/content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx b/content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx index 900d018e33..5c54f53e93 100644 --- a/content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx +++ b/content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx @@ -1,17 +1,21 @@ --- title: 'Get specified user profiles' -description: 'Use getUsersInfo() to query public profiles by userID.' +description: 'Retrieve public user profiles in batches by userID using PublicUserInfo.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-06' +lastUpdated: '2026-08-19' version: 'v4' platform: 'android' sourcePath: '/sdk/android/user/user-profile/get-users-info' --- -`getUsersInfo()` returns public profiles for a list of user IDs. It is suitable for friend candidates and profiles of users outside the current friend list. It does not return relationship fields such as the current user's friend remark. +`getUsersInfo()` retrieves public profiles for a list of `userID` values. Use it to display friend candidates and profiles for users who are not friends. + +## Retrieve public profiles + +Call `getUsersInfo()` with the user IDs to retrieve. Remove empty and duplicate IDs before calling, and keep each request within the supported batch size. ```java List userIDs = Arrays.asList("user_a", "user_b"); @@ -20,36 +24,52 @@ OpenIMClient.getInstance().userInfoManager.getUsersInfo( new OnBase>() { @Override public void onSuccess(List users) { - for (PublicUserInfo user : users) { - publicUserStore.put(user.getUserID(), user); - } + // Use users to display public profiles. } @Override public void onError(int code, String error) { - recordUserQueryFailure(code, error); + // Handle the error. } }, userIDs ); ``` -Remove empty and duplicate IDs before calling the API, and keep each request within the application's batch limit. The callback returns `List` with fields such as `userID`, `nickname`, `faceURL`, `ex`, and `createTime`. This query does not trigger `OnUserListener`; query again and merge by `userID` when the profile snapshot must be refreshed. +`userIDs` is the list of user IDs to query. A successful callback returns `List`. + +### Returned fields + +| Field | Description | +| --- | --- | +| `userID` | User ID. | +| `nickname` | Public account nickname. | +| `faceURL` | Public account avatar URL. | +| `ex` | Public account extension string defined by the application. | +| `createTime` | User profile creation time. | + +The returned `ex` contains the user's public extension data. Update the current user's extension data through [Update your profile](/sdk/android/user/user-profile/set-self-info). + +## Search and add a friend + +When the application already has candidate user IDs, call `getUsersInfo()` to display their public profiles. After the user confirms a target, send a request through [Send a friend request](/sdk/android/user/friend-applications/add-friend). + +`getUsersInfo()` queries public profiles by `userID`; searching by nickname, phone number, or other fields is outside this API. -## Returned fields +## Choose data by scenario -| Field | Description | -| ------------ | ----------------------------------------------------------------- | -| `userID` | OpenIM user ID and the stable local cache key. | -| `nickname` | Account-level public nickname. | -| `faceURL` | Account-level public avatar URL. | -| `ex` | Account-level public extension string defined by the application. | -| `createTime` | User profile creation time. | +Use the corresponding user type for each scenario: -Do not use `PublicUserInfo` to overwrite friend remarks, pinned state, or in-group nicknames. Use `FriendInfo` for friends and the group member model for group members. +| Scenario | Type | +| --- | --- | +| User search and stranger profile cards | `PublicUserInfo` | +| Friend lists, contact pages, and friend remarks | `FriendInfo` | +| Group member lists, in-group nicknames, and group roles | `GroupMembersInfo` | -Searching by nickname, phone number, or email is an application backend capability. A trusted backend should perform the search and permission checks, then return candidate user IDs for this API. +For friend data, see [Get specified friend profiles](/sdk/android/user/friends/get-friends-info). For group-member data, see [Get group members by page](/sdk/android/group/retrieving-group-members/get-group-member-list). -## Refreshing profiles +## Next steps -Replace or merge the public profile snapshot after a successful query. Re-query when opening a profile card, when the user explicitly refreshes, after reconnecting, or after a trusted backend reports a profile change. `OnUserListener.onSelfInfoUpdated` only describes the signed-in user's profile and is not a change event for other users. +- [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page) +- [Get specified friend profiles](/sdk/android/user/friends/get-friends-info) +- [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list) diff --git a/content/docs/chat/sdk/android/user/user-profile/set-friend-add-permission.mdx b/content/docs/chat/sdk/android/user/user-profile/set-friend-add-permission.mdx new file mode 100644 index 0000000000..aeb131f456 --- /dev/null +++ b/content/docs/chat/sdk/android/user/user-profile/set-friend-add-permission.mdx @@ -0,0 +1,46 @@ +--- +title: 'Set friend request permissions' +description: 'Choose how friend requests sent to the current account are handled.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-19' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/user-profile/set-friend-add-permission' +--- + +Use `addFriendPermission` to choose whether requests from other users to add the current account require approval. This capability is available in the Enterprise edition. + +Set the value with `UserInfoReq.setAddFriendPermission()`, then call `setSelfInfo()`: + +```java +UserInfoReq request = new UserInfoReq(); +request.setAddFriendPermission(AddFriendPermission.Allow.getValue()); + +OpenIMClient.getInstance().userInfoManager.setSelfInfo( + new OnBase() { + @Override + public void onSuccess(String data) { + // Friend request permission updated. + } + + @Override + public void onError(int code, String error) { + // Handle the error. + } + }, + request +); +``` + +## Permission values + +| Enum value | Numeric value | Meaning | +| --- | --- | --- | +| `AddFriendPermission.Allow` | `0` | Allow requests, but require the current user to approve them. | +| `AddFriendPermission.AllowNoReview` | `1` | Allow requests and create the friendship without approval. | +| `AddFriendPermission.Deny` | `2` | Do not allow other users to add the current account. | + +A successful callback means that the update request completed. This setting affects subsequent attempts to add the account; it does not remove existing friendships or process friend requests that already exist. diff --git a/content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx b/content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx index 6a42e061ef..dd8f7d6c6d 100644 --- a/content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx +++ b/content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx @@ -5,13 +5,13 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-06' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/user/user-profile/set-global-message-reception' --- -Use a separate `UserInfoReq` for `globalRecvMsgOpt` so profile updates do not accidentally overwrite the account-wide message policy. +Use `UserInfoReq` to set `globalRecvMsgOpt`. ```java UserInfoReq request = new UserInfoReq(); @@ -21,12 +21,12 @@ OpenIMClient.getInstance().userInfoManager.setSelfInfo( new OnBase() { @Override public void onSuccess(String data) { - markGlobalReceiveOptionSubmitted(); + // Global message reception updated successfully. } @Override public void onError(int code, String error) { - recordGlobalReceiveOptionFailure(code, error); + // Handle the error. } }, request @@ -39,6 +39,6 @@ OpenIMClient.getInstance().userInfoManager.setSelfInfo( | `1` | Do not receive messages. | | `2` | Receive messages without notifications. | -If the product exposes only a global do-not-disturb switch, it usually toggles between `0` and `2`; `1` stops message reception and should be presented as a separate option. Per-conversation reception is managed by conversation APIs and is not replaced by this setting. +If the product exposes only a global do-not-disturb switch, it can toggle between `0` and `2`; `1` stops message reception and should be presented as a separate option. Per-conversation reception is managed by conversation APIs. -A successful callback means the request completed. Reconcile the final account snapshot through `onSelfInfoUpdated` or `getSelfLocalUserInfo()`. Event handling is documented in [Update the current user profile](/sdk/android/user/user-profile/set-self-info). +A successful callback means the setting request completed. diff --git a/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx b/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx index 7a80357bd7..34680bc7e0 100644 --- a/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx +++ b/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx @@ -5,39 +5,39 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-10' +lastUpdated: '2026-08-18' version: 'v4' platform: 'android' sourcePath: '/sdk/android/user/user-profile/set-self-info' --- -Set only the fields that must change on `UserInfoReq`. The SDK omits `null` fields when serializing the request. +Set only the fields that must change on `UserInfoReq`. ```java UserInfoReq request = new UserInfoReq(); request.setNickname(displayName.trim()); request.setFaceURL(avatarURL); -request.setEx(mergedExtra); +request.setEx(extra); OpenIMClient.getInstance().userInfoManager.setSelfInfo( new OnBase() { @Override public void onSuccess(String data) { - markProfileUpdateSubmitted(); + // Profile update succeeded. } @Override public void onError(int code, String error) { - recordProfileUpdateFailure(code, error); + // Handle the error. } }, request ); ``` -`UserInfoReq` supports fields such as `nickname`, `faceURL`, `ex`, and `addFriendPermission`. `ex` is a complete string; read, parse, and merge the application's namespace before updating it rather than overwriting the value with a partial JSON object. +`UserInfoReq` supports fields such as `nickname`, `faceURL`, `ex`, and `addFriendPermission`. Use `ex` to store extension data for the current user. -A successful callback means the update request completed. Merge the final profile increment from `onSelfInfoUpdated(UserInfo info)`, or query `getSelfLocalUserInfo()` again. +A successful callback means the update request completed. `onSelfInfoUpdated(UserInfo info)` reports changes to the current user's profile. ## Updatable fields @@ -45,16 +45,16 @@ A successful callback means the update request completed. Merge the final profil | --------------------- | ---------------------------- | | `nickname` | New nickname. | | `faceURL` | New avatar URL. | -| `ex` | Complete extension string. | +| `ex` | User extension string. | | `addFriendPermission` | Add-friend permission value. | -Send only fields that should change. Although the global message reception setting is also written with `setSelfInfo()`, use the dedicated [Set global message reception](/sdk/android/user/user-profile/set-global-message-reception) entry point. +Send only fields that should change. To set global message reception, see [Set global message reception](/sdk/android/user/user-profile/set-global-message-reception). -This page owns `onSelfInfoUpdated`. Combine it into the application's single `OnUserListener`: +Receive `onSelfInfoUpdated` through `OnUserListener` when the current user's profile changes: ```java @Override public void onSelfInfoUpdated(UserInfo info) { - currentUserStore.merge(info.getUserID(), info); + // Handle the current user's profile change. } ``` diff --git a/content/zh/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx b/content/zh/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx index 906c4b4045..abf5da56ae 100644 --- a/content/zh/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx +++ b/content/zh/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx @@ -1,6 +1,6 @@ --- title: '查询已订阅用户状态' -description: '使用 getSubscribeOnlineUsersStatus() 获取已订阅用户的在线状态快照。' +description: '使用 getSubscribeOnlineUsersStatus() 获取已订阅用户的在线状态。' sourcePath: '/sdk/android/user/online-status/get-subscribe-online-users-status' --- @@ -9,17 +9,15 @@ OpenIMClient.getInstance().userInfoManager.getSubscribeOnlineUsersStatus( new OnBase>() { @Override public void onSuccess(List states) { - mergeOnlineStates(states); + // 使用 states 显示在线状态 } @Override public void onError(int code, String error) { - recordStatusQueryFailure(code, error); + // 处理错误 } } ); ``` -该方法不接收用户 ID,也不改变订阅集合。成功 callback 返回当前已订阅用户的 `List` 状态快照,适合在重连或重新进入页面时按 `userID` 校准状态。 - -查询本身不会触发 `onUserStatusChanged`。状态快照只应覆盖在线状态存储,不要覆盖用户昵称、头像等资料字段;需要资料时分别调用用户资料 API。 +成功 callback 返回当前已订阅用户的 `List`。 diff --git a/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx b/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx index db82484ce2..37648be7e8 100644 --- a/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx +++ b/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx @@ -11,19 +11,19 @@ OpenIMClient.getInstance().userInfoManager.subscribeUsersOnlineStatus( new OnBase>() { @Override public void onSuccess(List states) { - mergeOnlineStates(states); + // 使用 states 显示在线状态 } @Override public void onError(int code, String error) { - recordStatusSubscriptionFailure(code, error); + // 处理错误 } }, userIDs ); ``` -调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 `List` 快照,每项包含 `userID`、`status` 和 `platformIDs`。重复订阅同一个用户时,应由应用层去重并保留一份状态。 +调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 `List`,每项包含 `userID`、`status` 和 `platformIDs`。 ## 状态字段 @@ -33,13 +33,13 @@ OpenIMClient.getInstance().userInfoManager.subscribeUsersOnlineStatus( | `status` | 在线状态值,具体枚举含义以服务端契约为准。 | | `platformIDs` | 当前在线的平台 ID 列表。 | -`onUserStatusChanged` 由本页归属,应组合进应用唯一的 `OnUserListener`,并按 `userID` 合并: +用户在线状态变化时,可通过 `OnUserListener` 接收 `onUserStatusChanged`: ```java @Override public void onUserStatusChanged(UsersOnlineStatus status) { - onlineStatusStore.put(status.getUserID(), status); + // 处理在线状态变化 } ``` -订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合,并通过[取消用户状态订阅](/sdk/android/user/online-status/unsubscribe-users-online-status)移除不再需要的用户。 +订阅操作只建立或更新订阅集合。用户不再需要某个用户的在线状态时,通过[取消订阅用户状态](/sdk/android/user/online-status/unsubscribe-users-online-status)取消订阅。 diff --git a/content/zh/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx b/content/zh/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx index caf17506e6..0c873559b9 100644 --- a/content/zh/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx +++ b/content/zh/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx @@ -1,5 +1,5 @@ --- -title: '取消用户状态订阅' +title: '取消订阅用户状态' description: '使用 unsubscribeOnlineUsersStatus 取消指定用户的在线状态订阅。' sourcePath: '/sdk/android/user/online-status/unsubscribe-users-online-status' --- @@ -13,20 +13,18 @@ OpenIMClient.getInstance().userInfoManager.unsubscribeOnlineUsersStatus( new OnBase() { @Override public void onSuccess(String data) { - for (String userID : userIDs) { - presenceByUserID.remove(userID); - } + // 取消订阅成功 } @Override public void onError(int code, String error) { - recordStatusUnsubscribeFailure(code, error); + // 处理错误 } }, userIDs ); ``` -成功 callback 表示取消订阅请求已完成。此后再从应用维护的订阅集合和在线状态缓存中移除这些 `userID`;失败时保留原状态,以便重试。该操作不会修改用户资料或好友关系。 +成功 callback 表示取消订阅请求已完成。 需要再次跟踪用户状态时,重新调用[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。 diff --git a/content/zh/docs/chat/sdk/android/user/overview-relationships.mdx b/content/zh/docs/chat/sdk/android/user/overview-relationships.mdx new file mode 100644 index 0000000000..dc5b593c3d --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/overview-relationships.mdx @@ -0,0 +1,92 @@ +--- +title: '关系链概览' +description: '了解 Android SDK 中的好友、好友申请和黑名单 API。' +sourcePath: '/sdk/android/user/overview-relationships' +--- + +关系链记录当前用户与其他用户之间的好友关系、好友申请和黑名单。资料、账号设置和在线状态属于用户能力,见[用户概览](/sdk/android/user/overview-user)。 + +## 关系链类型 + +Android SDK 会根据关系链场景返回不同的对象: + +| 类型 | 适用场景 | 主要 API | +| --- | --- | --- | +| `UserInfo` | 好友列表、指定好友资料和黑名单列表中的用户资料及关系信息 | `getFriendListPage()`、`getFriendsInfo()`、`getBlacklist()` | +| `FriendInfo` | 好友资料、备注和关系扩展字段 | `UserInfo.getFriendInfo()`、`searchFriends()` | +| `FriendshipInfo` | 当前用户与目标用户的好友关系结果 | `checkFriend()` | +| `FriendApplicationInfo` | 收到或发出的好友申请及其处理状态 | `getRecvFriendApplicationList()`、`getSendFriendApplicationList()` | +| `BlacklistInfo` | 黑名单关系信息 | `UserInfo.getBlackInfo()`、`getBlacklist()` | + +`UserInfo` 可包含好友或黑名单关系信息;通过 `getFriendInfo()` 获取 `FriendInfo`,通过 `getBlackInfo()` 获取 `BlacklistInfo`。 + +## 功能入口 + +下表列出了关系链相关的常见需求和对应页面: + +| 需求 | 推荐页面 | +| --- | --- | +| 分页获取、搜索或查询指定好友资料 | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)、[搜索好友](/sdk/android/user/friends/search-friends)、[查询指定好友资料](/sdk/android/user/friends/get-friends-info) | +| 检查当前用户与目标用户的好友关系 | [检查好友关系](/sdk/android/user/friends/check-friend) | +| 更新或删除好友关系 | [更新好友资料](/sdk/android/user/friends/update-friends)、[删除好友](/sdk/android/user/friends/delete-friend) | +| 发送、查询、接受或拒绝好友申请 | [发送好友申请](/sdk/android/user/friend-applications/add-friend)、[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)、[获取发出的好友申请](/sdk/android/user/friend-applications/get-send-friend-application-list)、[接受好友申请](/sdk/android/user/friend-applications/accept-friend-application)、[拒绝好友申请](/sdk/android/user/friend-applications/refuse-friend-application) | +| 查看或维护黑名单 | [获取黑名单列表](/sdk/android/user/blacklist/get-blacklist)、[拉黑用户](/sdk/android/user/blacklist/add-blacklist)、[取消拉黑用户](/sdk/android/user/blacklist/remove-blacklist) | + +## 状态更新 + +关系链状态变化需要设置好友关系监听器;具体回调说明见下方对应能力页: + +```java +OpenIMClient client = OpenIMClient.getInstance(); + +client.friendshipManager.setOnFriendshipListener(new OnFriendshipListener() { + @Override + public void onFriendApplicationAdded(FriendApplicationInfo application) { + // 处理好友申请变化 + } + + @Override + public void onFriendApplicationAccepted(FriendApplicationInfo application) { + // 处理好友申请已接受 + } + + @Override + public void onFriendApplicationRejected(FriendApplicationInfo application) { + // 处理好友申请已拒绝 + } + + @Override + public void onFriendApplicationDeleted(FriendApplicationInfo application) { + // 处理好友申请删除 + } + + @Override + public void onFriendAdded(FriendInfo friend) { + // 处理好友关系变化 + } + + @Override + public void onFriendInfoChanged(FriendInfo friend) { + // 处理好友资料变化 + } + + @Override + public void onFriendDeleted(FriendInfo friend) { + // 处理好友关系删除 + } + + @Override + public void onBlacklistAdded(BlacklistInfo user) { + // 处理新增黑名单记录 + } + + @Override + public void onBlacklistDeleted(BlacklistInfo user) { + // 处理黑名单记录删除 + } +}); +``` + +- 好友申请变化:见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。 +- 好友关系和好友资料变化:见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。 +- 黑名单变化:见[获取黑名单列表](/sdk/android/user/blacklist/get-blacklist)。 diff --git a/content/zh/docs/chat/sdk/android/user/overview-user.mdx b/content/zh/docs/chat/sdk/android/user/overview-user.mdx index cc118c4bd8..f7dd51cfe6 100644 --- a/content/zh/docs/chat/sdk/android/user/overview-user.mdx +++ b/content/zh/docs/chat/sdk/android/user/overview-user.mdx @@ -1,55 +1,58 @@ --- title: '用户概览' -description: '了解 Android SDK 中的用户资料、好友关系、好友申请、黑名单和在线状态 API。' +description: '了解 Android SDK 中的当前用户资料、公开用户资料、账号设置和在线状态。' sourcePath: '/sdk/android/user/overview-user' --- -OpenIM Android SDK 使用 `userID` 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。 +OpenIM Android SDK 使用 `userID` 标识用户。用户相关 API 用于读取和更新当前账号资料、查询公开用户资料,以及订阅用户在线状态。 -群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。 +好友、好友申请和黑名单属于用户之间的关系链能力,相关类型、API 和状态更新见[关系链概览](/sdk/android/user/overview-relationships)。 ## 用户类型 Android SDK 会根据使用场景返回不同的用户对象: -| 类型 | 适用场景 | 主要 API | -| ----------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------- | -| `LocalUser` | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | `getSelfLocalUserInfo()`、`setSelfInfo()` | -| `PublicUserInfo` | 查询应用用户、查找好友候选人和展示陌生人资料卡 | `getUsersInfo()` | -| `UserInfo` | 查询好友列表、好友资料或黑名单时返回的用户对象,可包含对应关系资料 | `getFriendListPage()`、`getFriendsInfo()`、`getBlacklist()` | -| `FriendInfo` | 当前用户的好友列表、好友备注和关系扩展字段 | `searchFriends()`、`getFriendListPage()` | -| `FriendApplicationInfo` | 好友申请双方、处理状态和附言 | 好友申请查询与 listener | -| `BlacklistInfo` | 当前用户拉黑的用户及黑名单关系字段 | `getBlacklist()`、`addBlacklist()`、`removeBlacklist()` | -| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()`、`unsubscribeOnlineUsersStatus()` | +| 类型 | 适用场景 | 主要 API | +| --- | --- | --- | +| `LocalUser` | 当前登录用户的本地资料、设置页、头像、昵称和账号级设置 | `getSelfLocalUserInfo()`、`setSelfInfo()` | +| `PublicUserInfo` | 查询应用用户和展示公开资料卡 | `getUsersInfo()` | +| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()`、`unsubscribeOnlineUsersStatus()` | -同一个 `userID` 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 `UserInfo.getFriendInfo()`;只需要账号公开资料时使用 `PublicUserInfo`;黑名单页面使用 `UserInfo.getBlackInfo()`。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。 - -所有列表和事件都应使用 `userID` 作为稳定标识。好友申请同时包含申请方和接收方,应使用 `fromUserID:toUserID` 标识一条申请。 +`LocalUser` 表示当前登录用户,`PublicUserInfo` 表示可查询的公开用户资料。群成员资料、群内昵称和成员管理属于群组能力。 ## 功能入口 下表列出了用户相关的常见需求和对应页面: -| 需求 | 推荐页面 | -| -------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -| 按 `userID` 查询公开资料,用于查找好友候选人或展示资料卡 | [获取指定用户资料](/sdk/android/user/user-profile/get-users-info) | -| 分页、搜索或按 ID 查询好友关系 | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) | -| 发送、查询、接受或拒绝好友申请 | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) | -| 修改好友资料 | [更新好友资料](/sdk/android/user/friends/update-friends) | -| 删除好友关系 | [删除好友](/sdk/android/user/friends/delete-friend) | -| 查看和维护当前用户黑名单 | [获取黑名单列表](/sdk/android/user/blacklist/get-blacklist) | -| 读取或更新当前用户的昵称、头像和扩展资料 | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) | -| 设置账号级消息接收和通知策略 | [设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception) | -| 订阅、读取和取消在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)、[取消用户状态订阅](/sdk/android/user/online-status/unsubscribe-users-online-status) | +| 需求 | 推荐页面 | +| --- | --- | +| 按 `userID` 查询公开资料,用于展示资料卡 | [获取指定用户资料](/sdk/android/user/user-profile/get-users-info) | +| 读取或更新当前用户的昵称、头像和扩展资料 | [获取当前用户资料](/sdk/android/user/user-profile/get-self-local-user-info)、[更新当前用户资料](/sdk/android/user/user-profile/set-self-info) | +| 设置账号级消息接收和通知策略 | [设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception) | +| 设置其他用户添加当前账号时的处理策略 | [设置好友添加权限](/sdk/android/user/user-profile/set-friend-add-permission) | +| 订阅、读取和取消在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)、[查询已订阅用户状态](/sdk/android/user/online-status/get-subscribe-online-users-status)、[取消订阅用户状态](/sdk/android/user/online-status/unsubscribe-users-online-status) | +| 管理好友、好友申请或黑名单 | [关系链概览](/sdk/android/user/overview-relationships) | ## 状态更新 -用户相关事件由对应能力页负责监听和合并: +用户相关状态变化需要设置用户监听器;具体回调说明见下方对应能力页: + +```java +OpenIMClient client = OpenIMClient.getInstance(); + +client.userInfoManager.setOnUserListener(new OnUserListener() { + @Override + public void onSelfInfoUpdated(UserInfo info) { + // 处理当前用户资料变化 + } + + @Override + public void onUserStatusChanged(UsersOnlineStatus status) { + // 处理用户在线状态变化 + } +}); +``` - 当前用户资料变化:见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。 -- 好友申请变化:见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。 -- 好友关系和好友资料变化:见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。 -- 黑名单变化:见[拉黑用户](/sdk/android/user/blacklist/add-blacklist)。 - 在线状态变化:见[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。 - -Android SDK 的 `UserInfoManager` 和 `FriendshipManager` 各保存一个 listener,`setOnUserListener()` 和 `setOnFriendshipListener()` 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。 +- 好友、好友申请和黑名单变化:见[关系链概览](/sdk/android/user/overview-relationships)。 diff --git a/content/zh/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx b/content/zh/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx index ba1e47677b..31e6c15683 100644 --- a/content/zh/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx +++ b/content/zh/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx @@ -9,12 +9,12 @@ OpenIMClient.getInstance().userInfoManager.getSelfLocalUserInfo( new OnBase() { @Override public void onSuccess(LocalUser user) { - currentUserStore.set(user); + // 使用 user 更新当前用户资料 } @Override public void onError(int code, String error) { - recordSelfProfileFailure(code, error); + // 处理错误 } } ); @@ -30,10 +30,6 @@ OpenIMClient.getInstance().userInfoManager.getSelfLocalUserInfo( | `nickname` | 当前账号昵称。 | | `faceURL` | 当前账号头像地址。 | | `ex` | 当前账号扩展字符串。 | -| `attachedInfo` | SDK 附加信息,只按业务约定解析。 | +| `attachedInfo` 商业版 | 附加信息,格式由业务约定。 | | `globalRecvMsgOpt` | 全局消息接收方式:`0` 正常接收,`1` 不接收,`2` 接收但不提示。 | -| `addFriendPermission` | 添加好友权限值,具体含义由服务端契约定义。 | - -查询不会触发资料变更 callback。退出或切换账号时应清理旧账号快照,避免把上一个账号的资料显示在当前页面。 - -`getSelfUserInfo()` 已废弃,不作为推荐用法。 +| `addFriendPermission` 商业版 | 添加好友权限值,具体含义见[设置好友添加权限](/sdk/android/user/user-profile/set-friend-add-permission)。 | diff --git a/content/zh/docs/chat/sdk/android/user/user-profile/get-users-info.mdx b/content/zh/docs/chat/sdk/android/user/user-profile/get-users-info.mdx index ecda2545f8..6755c632af 100644 --- a/content/zh/docs/chat/sdk/android/user/user-profile/get-users-info.mdx +++ b/content/zh/docs/chat/sdk/android/user/user-profile/get-users-info.mdx @@ -1,10 +1,14 @@ --- title: '获取指定用户资料' -description: '使用 getUsersInfo() 按 userID 批量查询用户公开资料。' +description: '按 userID 批量查询应用用户公开资料(PublicUserInfo)。' sourcePath: '/sdk/android/user/user-profile/get-users-info' --- -`getUsersInfo()` 根据 `userID` 列表返回用户的公开资料,适合展示好友候选人或陌生人资料卡。该方法只读取公开资料,不返回当前账号为好友设置的备注等关系字段。 +`getUsersInfo()` 按 `userID` 查询应用用户的公开资料,适合展示好友候选人和陌生人资料卡。 + +## 查询公开资料 + +调用 `getUsersInfo()` 并传入要查询的用户 ID 列表,即可获取这些用户的公开资料。调用前应去除空值和重复 ID,并控制单次请求数量。 ```java List userIDs = Arrays.asList("user_a", "user_b"); @@ -13,36 +17,52 @@ OpenIMClient.getInstance().userInfoManager.getUsersInfo( new OnBase>() { @Override public void onSuccess(List users) { - for (PublicUserInfo user : users) { - publicUserStore.put(user.getUserID(), user); - } + // 使用 users 显示用户资料 } @Override public void onError(int code, String error) { - recordUserQueryFailure(code, error); + // 处理错误 } }, userIDs ); ``` -调用前应去除空值和重复 ID,并控制单次请求的数量。成功 callback 返回 `List`,主要字段包括 `userID`、`nickname`、`faceURL`、`ex` 和 `createTime`。查询不会触发 `OnUserListener`,需要刷新资料时应重新调用并按 `userID` 合并结果。 +`userIDs` 是要查询的用户 ID 列表。成功 callback 返回 `List`。 + +### 返回结果 + +| 字段 | 说明 | +| --- | --- | +| `userID` | 用户 ID。 | +| `nickname` | 账号公开昵称。 | +| `faceURL` | 账号公开头像地址。 | +| `ex` | 账号公开扩展字符串,格式由业务约定。 | +| `createTime` | 用户资料创建时间。 | + +这里返回的 `ex` 用于读取用户的公开扩展资料。当前用户自己的扩展资料通过[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)修改。 + +## 搜索添加好友 + +当业务已经获得候选用户的 `userID` 时,可以先调用 `getUsersInfo()` 展示公开资料,用户确认后再通过[发送好友申请](/sdk/android/user/friend-applications/add-friend)向目标用户发起申请。 + +`getUsersInfo()` 只按 `userID` 查询公开资料;昵称、手机号等其他条件的用户搜索不属于该 API。 -## 返回结果 +## 按场景选择展示数据 -| 字段 | 说明 | -| ------------ | ---------------------------------------- | -| `userID` | OpenIM 用户 ID,也是本地缓存的稳定 key。 | -| `nickname` | 账号级公开昵称。 | -| `faceURL` | 账号级公开头像地址。 | -| `ex` | 账号级公开扩展字符串,格式由业务约定。 | -| `createTime` | 用户资料创建时间。 | +同一个 `userID` 在不同场景中使用不同的资料类型: -`PublicUserInfo` 中的资料不能用于覆盖好友备注、置顶状态或群内昵称。展示好友时应使用 `FriendInfo`,展示群成员时应使用群成员模型。 +| 场景 | 使用的类型 | +| --- | --- | +| 用户搜索、陌生人资料卡 | `PublicUserInfo` | +| 好友列表、联系人页和好友备注 | `FriendInfo` | +| 群成员列表、群内昵称和群角色 | `GroupMembersInfo` | -按昵称、手机号或邮箱搜索用户属于业务服务能力,应由可信后端完成搜索和权限校验,再把候选 `userID` 交给客户端查询公开资料。 +好友资料使用[查询指定好友资料](/sdk/android/user/friends/get-friends-info),群成员资料使用[分页查询群成员](/sdk/android/group/retrieving-group-members/get-group-member-list)。 -## 资料刷新 +## 下一步 -查询成功后,以返回结果更新公开资料快照。打开资料卡、用户主动刷新、断线重连或业务后端通知资料变化时,可以重新调用该方法校准数据。`OnUserListener.onSelfInfoUpdated` 只表示当前登录用户资料变化,不能作为其他用户资料变化事件。 +- [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) +- [查询指定好友资料](/sdk/android/user/friends/get-friends-info) +- [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) diff --git a/content/zh/docs/chat/sdk/android/user/user-profile/set-friend-add-permission.mdx b/content/zh/docs/chat/sdk/android/user/user-profile/set-friend-add-permission.mdx new file mode 100644 index 0000000000..c166c9d880 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/user-profile/set-friend-add-permission.mdx @@ -0,0 +1,39 @@ +--- +title: '设置好友添加权限' +description: '设置其他用户向当前账号发起好友申请时的处理方式。' +sourcePath: '/sdk/android/user/user-profile/set-friend-add-permission' +--- + +`addFriendPermission` 用于设置其他用户添加当前账号时是否需要审核。该能力属于商业版。 + +使用 `UserInfoReq.setAddFriendPermission()` 设置权限值,再调用 `setSelfInfo()`: + +```java +UserInfoReq request = new UserInfoReq(); +request.setAddFriendPermission(AddFriendPermission.Allow.getValue()); + +OpenIMClient.getInstance().userInfoManager.setSelfInfo( + new OnBase() { + @Override + public void onSuccess(String data) { + // 设置好友添加权限成功 + } + + @Override + public void onError(int code, String error) { + // 处理错误 + } + }, + request +); +``` + +## 权限值 + +| 枚举值 | 数值 | 含义 | +| --- | --- | --- | +| `AddFriendPermission.Allow` | `0` | 允许其他用户添加,但需要当前用户审核好友申请。 | +| `AddFriendPermission.AllowNoReview` | `1` | 允许其他用户添加,并直接建立好友关系,无需审核。 | +| `AddFriendPermission.Deny` | `2` | 不允许其他用户添加当前账号。 | + +成功 callback 表示设置请求完成。该设置只影响之后的添加行为,不会删除已有好友关系或处理已经存在的好友申请。 diff --git a/content/zh/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx b/content/zh/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx index 6b8608767f..58ea33f7b6 100644 --- a/content/zh/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx +++ b/content/zh/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx @@ -4,7 +4,7 @@ description: '通过 setSelfInfo() 设置当前账号的全局消息接收与通 sourcePath: '/sdk/android/user/user-profile/set-global-message-reception' --- -使用独立的 `UserInfoReq` 写入 `globalRecvMsgOpt`,避免在更新昵称或头像时意外覆盖账号级消息策略。 +使用 `UserInfoReq` 设置 `globalRecvMsgOpt`。 ```java UserInfoReq request = new UserInfoReq(); @@ -14,12 +14,12 @@ OpenIMClient.getInstance().userInfoManager.setSelfInfo( new OnBase() { @Override public void onSuccess(String data) { - markGlobalReceiveOptionSubmitted(); + // 设置全局消息接收方式成功 } @Override public void onError(int code, String error) { - recordGlobalReceiveOptionFailure(code, error); + // 处理错误 } }, request @@ -32,6 +32,6 @@ OpenIMClient.getInstance().userInfoManager.setSelfInfo( | `1` | 屏蔽消息。 | | `2` | 接收消息但不提示。 | -如果产品只提供“全局免打扰”开关,通常在 `0` 和 `2` 之间切换;`1` 会停止接收消息,应单独展示。单个会话的接收方式由会话 API 管理,不受本设置替代。 +如果产品只提供“全局免打扰”开关,可以在 `0` 和 `2` 之间切换;`1` 会停止接收消息,应单独展示。单个会话的接收方式由会话 API 管理。 -成功 callback 表示请求完成。最终账号快照通过 `onSelfInfoUpdated` 或 `getSelfLocalUserInfo()` 校准,事件处理见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。 +成功 callback 表示设置请求完成。 diff --git a/content/zh/docs/chat/sdk/android/user/user-profile/set-self-info.mdx b/content/zh/docs/chat/sdk/android/user/user-profile/set-self-info.mdx index 0378abf4a0..2ca6a98eac 100644 --- a/content/zh/docs/chat/sdk/android/user/user-profile/set-self-info.mdx +++ b/content/zh/docs/chat/sdk/android/user/user-profile/set-self-info.mdx @@ -4,33 +4,33 @@ description: '使用 setSelfInfo() 更新当前用户的昵称、头像或扩展 sourcePath: '/sdk/android/user/user-profile/set-self-info' --- -使用 `UserInfoReq` 只设置实际需要修改的字段。SDK 序列化请求时会忽略 `null` 字段。 +使用 `UserInfoReq` 只设置实际需要修改的字段。 ```java UserInfoReq request = new UserInfoReq(); request.setNickname(displayName.trim()); request.setFaceURL(avatarURL); -request.setEx(mergedExtra); +request.setEx(extra); OpenIMClient.getInstance().userInfoManager.setSelfInfo( new OnBase() { @Override public void onSuccess(String data) { - markProfileUpdateSubmitted(); + // 更新当前用户资料成功 } @Override public void onError(int code, String error) { - recordProfileUpdateFailure(code, error); + // 处理错误 } }, request ); ``` -`UserInfoReq` 支持 `nickname`、`faceURL`、`ex` 和 `addFriendPermission` 等字段。`ex` 是完整字符串,更新前应读取、解析并合并业务自己的命名空间;不要把部分 JSON 直接覆盖到服务端。 +`UserInfoReq` 支持 `nickname`、`faceURL`、`ex` 和 `addFriendPermission` 等字段。`ex` 用于保存当前用户的扩展信息。 -成功 callback 表示更新请求完成;当前账号资料的最终增量通过 `onSelfInfoUpdated(UserInfo info)` 到达,或重新调用 `getSelfLocalUserInfo()` 校准。 +成功 callback 表示更新请求完成。当前账号资料变化时,可通过 `onSelfInfoUpdated(UserInfo info)` 接收通知。 ## 更新字段 @@ -38,18 +38,16 @@ OpenIMClient.getInstance().userInfoManager.setSelfInfo( | --------------------- | ------------------ | | `nickname` | 要更新的昵称。 | | `faceURL` | 要更新的头像地址。 | -| `ex` | 完整扩展字符串。 | +| `ex` | 用户扩展字符串。 | | `addFriendPermission` | 添加好友权限值。 | -一次请求只写入需要变更的字段。全局消息接收策略虽然也由 `setSelfInfo()` 写入,但应使用独立入口,见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。 +一次请求只写入需要变更的字段。设置全局消息接收方式时,参见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。 -`onSelfInfoUpdated` 由本页归属,应组合进应用唯一的 `OnUserListener`: +当前用户资料变化时,可通过 `OnUserListener` 接收 `onSelfInfoUpdated`: ```java @Override public void onSelfInfoUpdated(UserInfo info) { - currentUserStore.merge(info.getUserID(), info); + // 处理当前用户资料变化 } ``` - -账号级消息接收策略也通过 `UserInfoReq` 更新,但应使用独立入口,见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。 diff --git a/data/structure/android-content-audit.json b/data/structure/android-content-audit.json index 7fb62faf38..9c6b92ab8a 100644 --- a/data/structure/android-content-audit.json +++ b/data/structure/android-content-audit.json @@ -1721,30 +1721,37 @@ "sourceKind": "openim-specific", "disposition": "adapt", "openimSources": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "sdkMethods": [ + "setOnUserListener" ], - "sdkMethods": [], "sdkEvents": [], "locales": { "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-18", + "reviewedAt": "2026-08-19", "exampleVerification": { - "status": "not-applicable", - "evidence": [], - "reason": "概览页不包含代码示例。" + "status": "verified", + "evidence": [ + "UserInfoManager.setOnUserListener", + "OnUserListener" + ], + "reason": null } }, "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-18", + "reviewedAt": "2026-08-19", "exampleVerification": { - "status": "not-applicable", - "evidence": [], - "reason": "The overview does not contain code examples." + "status": "verified", + "evidence": [ + "UserInfoManager.setOnUserListener", + "OnUserListener" + ], + "reason": "Manually translated and verified against the pinned Android source." } } }, @@ -1766,7 +1773,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -1778,7 +1785,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -1806,7 +1813,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -1818,7 +1825,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -1849,7 +1856,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -1862,7 +1869,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -1891,7 +1898,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -1903,7 +1910,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -2519,7 +2526,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -2532,7 +2539,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -2561,7 +2568,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -2573,7 +2580,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -2601,7 +2608,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -2613,7 +2620,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -6060,6 +6067,95 @@ } }, "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/user-profile/set-friend-add-permission", + "targetPath": "/sdk/android/user/user-profile/set-friend-add-permission", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/UserInfoReq.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/enums/AddFriendPermission.java" + ], + "sdkMethods": [ + "setSelfInfo" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-19", + "exampleVerification": { + "status": "verified", + "evidence": [ + "UserInfoReq.setAddFriendPermission", + "AddFriendPermission", + "UserInfoManager.setSelfInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-19", + "exampleVerification": { + "status": "verified", + "evidence": [ + "UserInfoReq.setAddFriendPermission", + "AddFriendPermission", + "UserInfoManager.setSelfInfo" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/overview-relationships", + "targetPath": "/sdk/android/user/overview-relationships", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "sdkMethods": [ + "setOnFriendshipListener" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-19", + "exampleVerification": { + "status": "verified", + "evidence": [ + "FriendshipManager.setOnFriendshipListener", + "OnFriendshipListener" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-19", + "exampleVerification": { + "status": "verified", + "evidence": [ + "FriendshipManager.setOnFriendshipListener", + "OnFriendshipListener" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null } ] } diff --git a/data/structure/android-navigation-labels.json b/data/structure/android-navigation-labels.json index db5e9f396a..ca575fe192 100644 --- a/data/structure/android-navigation-labels.json +++ b/data/structure/android-navigation-labels.json @@ -30,8 +30,12 @@ "set-self-info": "更新当前用户资料", "Set global message reception": "设置全局消息接收方式", "set-global-message-reception": "设置全局消息接收方式", + "Set friend request permissions": "设置好友添加权限", + "set-friend-add-permission": "设置好友添加权限", "Relationships": "关系链", "relationships": "关系链", + "Relationship overview": "关系链概览", + "overview-relationships": "关系链概览", "Friends": "好友", "friends": "好友", "user/friends": "好友", @@ -88,8 +92,8 @@ "Get subscribed user online status": "查询已订阅用户状态", "Refresh subscribed user status": "查询已订阅用户状态", "get-subscribe-online-users-status": "查询已订阅用户状态", - "Unsubscribe from user status": "取消用户状态订阅", - "unsubscribe-users-online-status": "取消用户状态订阅", + "Unsubscribe from user status": "取消订阅用户状态", + "unsubscribe-users-online-status": "取消订阅用户状态", "Conversation": "会话", "conversation": "会话", "Conversation overview": "会话概览", diff --git a/data/structure/android-sidebar.json b/data/structure/android-sidebar.json index b8403a27df..5c363cb3a6 100644 --- a/data/structure/android-sidebar.json +++ b/data/structure/android-sidebar.json @@ -33,6 +33,10 @@ "path": "/sdk/android/user/user-profile/set-global-message-reception", "navigationTitle": "Set global message reception" }, + { + "path": "/sdk/android/user/user-profile/set-friend-add-permission", + "navigationTitle": "Set friend request permissions" + }, { "id": "user/online-status", "title": "Online status", @@ -57,6 +61,10 @@ "id": "relationships", "title": "Relationships", "children": [ + { + "path": "/sdk/android/user/overview-relationships", + "navigationTitle": "Relationship overview" + }, { "id": "user/friends", "title": "Friends", diff --git a/data/structure/chat-pages.json b/data/structure/chat-pages.json index 0abc6a18de..e26d1cb2df 100644 --- a/data/structure/chat-pages.json +++ b/data/structure/chat-pages.json @@ -1975,6 +1975,14 @@ "template": "guide", "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx" }, + { + "sourcePath": "/sdk/android/user/user-profile/set-friend-add-permission", + "openimPath": "/sdk/android/user/user-profile/set-friend-add-permission", + "title": "Set friend request permissions", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-friend-add-permission.mdx" + }, { "sourcePath": "/sdk/android/user/online-status/subscribe-users-online-status", "openimPath": "/sdk/android/user/online-status/subscribe-users-online-status", @@ -1999,6 +2007,14 @@ "template": "guide", "contentFile": "content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx" }, + { + "sourcePath": "/sdk/android/user/overview-relationships", + "openimPath": "/sdk/android/user/overview-relationships", + "title": "Relationship overview", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/user/overview-relationships.mdx" + }, { "sourcePath": "/sdk/android/user/friends/get-friend-list-page", "openimPath": "/sdk/android/user/friends/get-friend-list-page", diff --git a/scripts/sync-client-sdk-route-skeletons.mjs b/scripts/sync-client-sdk-route-skeletons.mjs index 6226b9a323..a9e2951648 100644 --- a/scripts/sync-client-sdk-route-skeletons.mjs +++ b/scripts/sync-client-sdk-route-skeletons.mjs @@ -13,6 +13,8 @@ const androidRouteTitles = { 'user/user-profile/get-self-local-user-info': 'Get the current user profile', 'user/user-profile/set-self-info': 'Update the current user profile', 'user/user-profile/set-global-message-reception': 'Set global message reception', + 'user/user-profile/set-friend-add-permission': 'Set friend request permissions', + 'user/overview-relationships': 'Relationship overview', 'user/friends/get-friend-list-page': 'Get the friend list by page', 'user/friends/search-friends': 'Search friends', 'user/friends/get-friends-info': 'Get specified friend profiles', diff --git a/src/generated/android-sdk-zh-content.json b/src/generated/android-sdk-zh-content.json index 71d8f90260..9667c7aca3 100644 --- a/src/generated/android-sdk-zh-content.json +++ b/src/generated/android-sdk-zh-content.json @@ -1,8 +1,8 @@ { "sourceContext": "chat/sdk/android", "sourceRoot": "content/zh/docs/chat/sdk/android", - "pageCount": 144, - "manualPageCount": 144, + "pageCount": 146, + "manualPageCount": 146, "pendingPaths": [], "reviewStates": { "/sdk/android/overview": "published", @@ -15,9 +15,11 @@ "/sdk/android/user/user-profile/get-self-local-user-info": "published", "/sdk/android/user/user-profile/set-self-info": "published", "/sdk/android/user/user-profile/set-global-message-reception": "published", + "/sdk/android/user/user-profile/set-friend-add-permission": "published", "/sdk/android/user/online-status/subscribe-users-online-status": "published", "/sdk/android/user/online-status/get-subscribe-online-users-status": "published", "/sdk/android/user/online-status/unsubscribe-users-online-status": "published", + "/sdk/android/user/overview-relationships": "published", "/sdk/android/user/friends/get-friend-list-page": "published", "/sdk/android/user/friends/search-friends": "published", "/sdk/android/user/friends/get-friends-info": "published", @@ -182,8 +184,12 @@ "set-self-info": "更新当前用户资料", "Set global message reception": "设置全局消息接收方式", "set-global-message-reception": "设置全局消息接收方式", + "Set friend request permissions": "设置好友添加权限", + "set-friend-add-permission": "设置好友添加权限", "Relationships": "关系链", "relationships": "关系链", + "Relationship overview": "关系链概览", + "overview-relationships": "关系链概览", "Friends": "好友", "friends": "好友", "user/friends": "好友", @@ -240,8 +246,8 @@ "Get subscribed user online status": "查询已订阅用户状态", "Refresh subscribed user status": "查询已订阅用户状态", "get-subscribe-online-users-status": "查询已订阅用户状态", - "Unsubscribe from user status": "取消用户状态订阅", - "unsubscribe-users-online-status": "取消用户状态订阅", + "Unsubscribe from user status": "取消订阅用户状态", + "unsubscribe-users-online-status": "取消订阅用户状态", "Conversation": "会话", "conversation": "会话", "Conversation overview": "会话概览", @@ -713,8 +719,8 @@ "title": "发送第一条消息" }, "/sdk/android/user/overview-user": { - "body": "OpenIM Android SDK 使用 `userID` 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。\n\n群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。\n\n## 用户类型\n\nAndroid SDK 会根据使用场景返回不同的用户对象:\n\n| 类型 | 适用场景 | 主要 API |\n| ----------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------- |\n| `LocalUser` | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | `getSelfLocalUserInfo()`、`setSelfInfo()` |\n| `PublicUserInfo` | 查询应用用户、查找好友候选人和展示陌生人资料卡 | `getUsersInfo()` |\n| `UserInfo` | 查询好友列表、好友资料或黑名单时返回的用户对象,可包含对应关系资料 | `getFriendListPage()`、`getFriendsInfo()`、`getBlacklist()` |\n| `FriendInfo` | 当前用户的好友列表、好友备注和关系扩展字段 | `searchFriends()`、`getFriendListPage()` |\n| `FriendApplicationInfo` | 好友申请双方、处理状态和附言 | 好友申请查询与 listener |\n| `BlacklistInfo` | 当前用户拉黑的用户及黑名单关系字段 | `getBlacklist()`、`addBlacklist()`、`removeBlacklist()` |\n| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()`、`unsubscribeOnlineUsersStatus()` |\n\n同一个 `userID` 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 `UserInfo.getFriendInfo()`;只需要账号公开资料时使用 `PublicUserInfo`;黑名单页面使用 `UserInfo.getBlackInfo()`。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。\n\n所有列表和事件都应使用 `userID` 作为稳定标识。好友申请同时包含申请方和接收方,应使用 `fromUserID:toUserID` 标识一条申请。\n\n## 功能入口\n\n下表列出了用户相关的常见需求和对应页面:\n\n| 需求 | 推荐页面 |\n| -------------------------------------------------------- | -------------------------------------------------------------------------------------------- |\n| 按 `userID` 查询公开资料,用于查找好友候选人或展示资料卡 | [获取指定用户资料](/sdk/android/user/user-profile/get-users-info) |\n| 分页、搜索或按 ID 查询好友关系 | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) |\n| 发送、查询、接受或拒绝好友申请 | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) |\n| 修改好友资料 | [更新好友资料](/sdk/android/user/friends/update-friends) |\n| 删除好友关系 | [删除好友](/sdk/android/user/friends/delete-friend) |\n| 查看和维护当前用户黑名单 | [获取黑名单列表](/sdk/android/user/blacklist/get-blacklist) |\n| 读取或更新当前用户的昵称、头像和扩展资料 | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) |\n| 设置账号级消息接收和通知策略 | [设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception) |\n| 订阅、读取和取消在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)、[取消用户状态订阅](/sdk/android/user/online-status/unsubscribe-users-online-status) |\n\n## 状态更新\n\n用户相关事件由对应能力页负责监听和合并:\n\n- 当前用户资料变化:见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。\n- 好友申请变化:见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。\n- 好友关系和好友资料变化:见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。\n- 黑名单变化:见[拉黑用户](/sdk/android/user/blacklist/add-blacklist)。\n- 在线状态变化:见[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。\n\nAndroid SDK 的 `UserInfoManager` 和 `FriendshipManager` 各保存一个 listener,`setOnUserListener()` 和 `setOnFriendshipListener()` 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。", - "description": "了解 Android SDK 中的用户资料、好友关系、好友申请、黑名单和在线状态 API。", + "body": "OpenIM Android SDK 使用 `userID` 标识用户。用户相关 API 用于读取和更新当前账号资料、查询公开用户资料,以及订阅用户在线状态。\n\n好友、好友申请和黑名单属于用户之间的关系链能力,相关类型、API 和状态更新见[关系链概览](/sdk/android/user/overview-relationships)。\n\n## 用户类型\n\nAndroid SDK 会根据使用场景返回不同的用户对象:\n\n| 类型 | 适用场景 | 主要 API |\n| --- | --- | --- |\n| `LocalUser` | 当前登录用户的本地资料、设置页、头像、昵称和账号级设置 | `getSelfLocalUserInfo()`、`setSelfInfo()` |\n| `PublicUserInfo` | 查询应用用户和展示公开资料卡 | `getUsersInfo()` |\n| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()`、`unsubscribeOnlineUsersStatus()` |\n\n`LocalUser` 表示当前登录用户,`PublicUserInfo` 表示可查询的公开用户资料。群成员资料、群内昵称和成员管理属于群组能力。\n\n## 功能入口\n\n下表列出了用户相关的常见需求和对应页面:\n\n| 需求 | 推荐页面 |\n| --- | --- |\n| 按 `userID` 查询公开资料,用于展示资料卡 | [获取指定用户资料](/sdk/android/user/user-profile/get-users-info) |\n| 读取或更新当前用户的昵称、头像和扩展资料 | [获取当前用户资料](/sdk/android/user/user-profile/get-self-local-user-info)、[更新当前用户资料](/sdk/android/user/user-profile/set-self-info) |\n| 设置账号级消息接收和通知策略 | [设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception) |\n| 设置其他用户添加当前账号时的处理策略 | [设置好友添加权限](/sdk/android/user/user-profile/set-friend-add-permission) |\n| 订阅、读取和取消在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)、[查询已订阅用户状态](/sdk/android/user/online-status/get-subscribe-online-users-status)、[取消订阅用户状态](/sdk/android/user/online-status/unsubscribe-users-online-status) |\n| 管理好友、好友申请或黑名单 | [关系链概览](/sdk/android/user/overview-relationships) |\n\n## 状态更新\n\n用户相关状态变化需要设置用户监听器;具体回调说明见下方对应能力页:\n\n```java\nOpenIMClient client = OpenIMClient.getInstance();\n\nclient.userInfoManager.setOnUserListener(new OnUserListener() {\n @Override\n public void onSelfInfoUpdated(UserInfo info) {\n // 处理当前用户资料变化\n }\n\n @Override\n public void onUserStatusChanged(UsersOnlineStatus status) {\n // 处理用户在线状态变化\n }\n});\n```\n\n- 当前用户资料变化:见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。\n- 在线状态变化:见[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。\n- 好友、好友申请和黑名单变化:见[关系链概览](/sdk/android/user/overview-relationships)。", + "description": "了解 Android SDK 中的当前用户资料、公开用户资料、账号设置和在线状态。", "headings": [ { "depth": 2, @@ -736,25 +742,40 @@ "title": "用户概览" }, "/sdk/android/user/user-profile/get-users-info": { - "body": "`getUsersInfo()` 根据 `userID` 列表返回用户的公开资料,适合展示好友候选人或陌生人资料卡。该方法只读取公开资料,不返回当前账号为好友设置的备注等关系字段。\n\n```java\nList userIDs = Arrays.asList(\"user_a\", \"user_b\");\n\nOpenIMClient.getInstance().userInfoManager.getUsersInfo(\n new OnBase>() {\n @Override\n public void onSuccess(List users) {\n for (PublicUserInfo user : users) {\n publicUserStore.put(user.getUserID(), user);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordUserQueryFailure(code, error);\n }\n },\n userIDs\n);\n```\n\n调用前应去除空值和重复 ID,并控制单次请求的数量。成功 callback 返回 `List`,主要字段包括 `userID`、`nickname`、`faceURL`、`ex` 和 `createTime`。查询不会触发 `OnUserListener`,需要刷新资料时应重新调用并按 `userID` 合并结果。\n\n## 返回结果\n\n| 字段 | 说明 |\n| ------------ | ---------------------------------------- |\n| `userID` | OpenIM 用户 ID,也是本地缓存的稳定 key。 |\n| `nickname` | 账号级公开昵称。 |\n| `faceURL` | 账号级公开头像地址。 |\n| `ex` | 账号级公开扩展字符串,格式由业务约定。 |\n| `createTime` | 用户资料创建时间。 |\n\n`PublicUserInfo` 中的资料不能用于覆盖好友备注、置顶状态或群内昵称。展示好友时应使用 `FriendInfo`,展示群成员时应使用群成员模型。\n\n按昵称、手机号或邮箱搜索用户属于业务服务能力,应由可信后端完成搜索和权限校验,再把候选 `userID` 交给客户端查询公开资料。\n\n## 资料刷新\n\n查询成功后,以返回结果更新公开资料快照。打开资料卡、用户主动刷新、断线重连或业务后端通知资料变化时,可以重新调用该方法校准数据。`OnUserListener.onSelfInfoUpdated` 只表示当前登录用户资料变化,不能作为其他用户资料变化事件。", - "description": "使用 getUsersInfo() 按 userID 批量查询用户公开资料。", + "body": "`getUsersInfo()` 按 `userID` 查询应用用户的公开资料,适合展示好友候选人和陌生人资料卡。\n\n## 查询公开资料\n\n调用 `getUsersInfo()` 并传入要查询的用户 ID 列表,即可获取这些用户的公开资料。调用前应去除空值和重复 ID,并控制单次请求数量。\n\n```java\nList userIDs = Arrays.asList(\"user_a\", \"user_b\");\n\nOpenIMClient.getInstance().userInfoManager.getUsersInfo(\n new OnBase>() {\n @Override\n public void onSuccess(List users) {\n // 使用 users 显示用户资料\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n userIDs\n);\n```\n\n`userIDs` 是要查询的用户 ID 列表。成功 callback 返回 `List`。\n\n### 返回结果\n\n| 字段 | 说明 |\n| --- | --- |\n| `userID` | 用户 ID。 |\n| `nickname` | 账号公开昵称。 |\n| `faceURL` | 账号公开头像地址。 |\n| `ex` | 账号公开扩展字符串,格式由业务约定。 |\n| `createTime` | 用户资料创建时间。 |\n\n这里返回的 `ex` 用于读取用户的公开扩展资料。当前用户自己的扩展资料通过[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)修改。\n\n## 搜索添加好友\n\n当业务已经获得候选用户的 `userID` 时,可以先调用 `getUsersInfo()` 展示公开资料,用户确认后再通过[发送好友申请](/sdk/android/user/friend-applications/add-friend)向目标用户发起申请。\n\n`getUsersInfo()` 只按 `userID` 查询公开资料;昵称、手机号等其他条件的用户搜索不属于该 API。\n\n## 按场景选择展示数据\n\n同一个 `userID` 在不同场景中使用不同的资料类型:\n\n| 场景 | 使用的类型 |\n| --- | --- |\n| 用户搜索、陌生人资料卡 | `PublicUserInfo` |\n| 好友列表、联系人页和好友备注 | `FriendInfo` |\n| 群成员列表、群内昵称和群角色 | `GroupMembersInfo` |\n\n好友资料使用[查询指定好友资料](/sdk/android/user/friends/get-friends-info),群成员资料使用[分页查询群成员](/sdk/android/group/retrieving-group-members/get-group-member-list)。\n\n## 下一步\n\n- [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)\n- [查询指定好友资料](/sdk/android/user/friends/get-friends-info)\n- [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)", + "description": "按 userID 批量查询应用用户公开资料(PublicUserInfo)。", "headings": [ { "depth": 2, + "title": "查询公开资料", + "url": "#查询公开资料" + }, + { + "depth": 3, "title": "返回结果", "url": "#返回结果" }, { "depth": 2, - "title": "资料刷新", - "url": "#资料刷新" + "title": "搜索添加好友", + "url": "#搜索添加好友" + }, + { + "depth": 2, + "title": "按场景选择展示数据", + "url": "#按场景选择展示数据" + }, + { + "depth": 2, + "title": "下一步", + "url": "#下一步" } ], "sourcePath": "/sdk/android/user/user-profile/get-users-info", "title": "获取指定用户资料" }, "/sdk/android/user/user-profile/get-self-local-user-info": { - "body": "```java\nOpenIMClient.getInstance().userInfoManager.getSelfLocalUserInfo(\n new OnBase() {\n @Override\n public void onSuccess(LocalUser user) {\n currentUserStore.set(user);\n }\n\n @Override\n public void onError(int code, String error) {\n recordSelfProfileFailure(code, error);\n }\n }\n);\n```\n\n完成初始化并登录后调用该方法获取当前账号的本地资料。成功 callback 返回 `LocalUser`,包含 `userID`、`nickname`、`faceURL`、`ex`、`attachedInfo`、`globalRecvMsgOpt` 和 `addFriendPermission` 等字段。\n\n## 返回结果\n\n| 字段 | 说明 |\n| --------------------- | -------------------------------------------------------------- |\n| `userID` | 当前登录用户 ID。 |\n| `nickname` | 当前账号昵称。 |\n| `faceURL` | 当前账号头像地址。 |\n| `ex` | 当前账号扩展字符串。 |\n| `attachedInfo` | SDK 附加信息,只按业务约定解析。 |\n| `globalRecvMsgOpt` | 全局消息接收方式:`0` 正常接收,`1` 不接收,`2` 接收但不提示。 |\n| `addFriendPermission` | 添加好友权限值,具体含义由服务端契约定义。 |\n\n查询不会触发资料变更 callback。退出或切换账号时应清理旧账号快照,避免把上一个账号的资料显示在当前页面。\n\n`getSelfUserInfo()` 已废弃,不作为推荐用法。", + "body": "```java\nOpenIMClient.getInstance().userInfoManager.getSelfLocalUserInfo(\n new OnBase() {\n @Override\n public void onSuccess(LocalUser user) {\n // 使用 user 更新当前用户资料\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n }\n);\n```\n\n完成初始化并登录后调用该方法获取当前账号的本地资料。成功 callback 返回 `LocalUser`,包含 `userID`、`nickname`、`faceURL`、`ex`、`attachedInfo`、`globalRecvMsgOpt` 和 `addFriendPermission` 等字段。\n\n## 返回结果\n\n| 字段 | 说明 |\n| --------------------- | -------------------------------------------------------------- |\n| `userID` | 当前登录用户 ID。 |\n| `nickname` | 当前账号昵称。 |\n| `faceURL` | 当前账号头像地址。 |\n| `ex` | 当前账号扩展字符串。 |\n| `attachedInfo` 商业版 | 附加信息,格式由业务约定。 |\n| `globalRecvMsgOpt` | 全局消息接收方式:`0` 正常接收,`1` 不接收,`2` 接收但不提示。 |\n| `addFriendPermission` 商业版 | 添加好友权限值,具体含义见[设置好友添加权限](/sdk/android/user/user-profile/set-friend-add-permission)。 |", "description": "使用 getSelfLocalUserInfo() 获取当前登录用户的本地资料。", "headings": [ { @@ -767,7 +788,7 @@ "title": "获取当前用户资料" }, "/sdk/android/user/user-profile/set-self-info": { - "body": "使用 `UserInfoReq` 只设置实际需要修改的字段。SDK 序列化请求时会忽略 `null` 字段。\n\n```java\nUserInfoReq request = new UserInfoReq();\nrequest.setNickname(displayName.trim());\nrequest.setFaceURL(avatarURL);\nrequest.setEx(mergedExtra);\n\nOpenIMClient.getInstance().userInfoManager.setSelfInfo(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markProfileUpdateSubmitted();\n }\n\n @Override\n public void onError(int code, String error) {\n recordProfileUpdateFailure(code, error);\n }\n },\n request\n);\n```\n\n`UserInfoReq` 支持 `nickname`、`faceURL`、`ex` 和 `addFriendPermission` 等字段。`ex` 是完整字符串,更新前应读取、解析并合并业务自己的命名空间;不要把部分 JSON 直接覆盖到服务端。\n\n成功 callback 表示更新请求完成;当前账号资料的最终增量通过 `onSelfInfoUpdated(UserInfo info)` 到达,或重新调用 `getSelfLocalUserInfo()` 校准。\n\n## 更新字段\n\n| 字段 | 说明 |\n| --------------------- | ------------------ |\n| `nickname` | 要更新的昵称。 |\n| `faceURL` | 要更新的头像地址。 |\n| `ex` | 完整扩展字符串。 |\n| `addFriendPermission` | 添加好友权限值。 |\n\n一次请求只写入需要变更的字段。全局消息接收策略虽然也由 `setSelfInfo()` 写入,但应使用独立入口,见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。\n\n`onSelfInfoUpdated` 由本页归属,应组合进应用唯一的 `OnUserListener`:\n\n```java\n@Override\npublic void onSelfInfoUpdated(UserInfo info) {\n currentUserStore.merge(info.getUserID(), info);\n}\n```\n\n账号级消息接收策略也通过 `UserInfoReq` 更新,但应使用独立入口,见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。", + "body": "使用 `UserInfoReq` 只设置实际需要修改的字段。\n\n```java\nUserInfoReq request = new UserInfoReq();\nrequest.setNickname(displayName.trim());\nrequest.setFaceURL(avatarURL);\nrequest.setEx(extra);\n\nOpenIMClient.getInstance().userInfoManager.setSelfInfo(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 更新当前用户资料成功\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n request\n);\n```\n\n`UserInfoReq` 支持 `nickname`、`faceURL`、`ex` 和 `addFriendPermission` 等字段。`ex` 用于保存当前用户的扩展信息。\n\n成功 callback 表示更新请求完成。当前账号资料变化时,可通过 `onSelfInfoUpdated(UserInfo info)` 接收通知。\n\n## 更新字段\n\n| 字段 | 说明 |\n| --------------------- | ------------------ |\n| `nickname` | 要更新的昵称。 |\n| `faceURL` | 要更新的头像地址。 |\n| `ex` | 用户扩展字符串。 |\n| `addFriendPermission` | 添加好友权限值。 |\n\n一次请求只写入需要变更的字段。设置全局消息接收方式时,参见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。\n\n当前用户资料变化时,可通过 `OnUserListener` 接收 `onSelfInfoUpdated`:\n\n```java\n@Override\npublic void onSelfInfoUpdated(UserInfo info) {\n // 处理当前用户资料变化\n}\n```", "description": "使用 setSelfInfo() 更新当前用户的昵称、头像或扩展资料。", "headings": [ { @@ -780,14 +801,27 @@ "title": "更新当前用户资料" }, "/sdk/android/user/user-profile/set-global-message-reception": { - "body": "使用独立的 `UserInfoReq` 写入 `globalRecvMsgOpt`,避免在更新昵称或头像时意外覆盖账号级消息策略。\n\n```java\nUserInfoReq request = new UserInfoReq();\nrequest.setGlobalRecvMsgOpt(2);\n\nOpenIMClient.getInstance().userInfoManager.setSelfInfo(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markGlobalReceiveOptionSubmitted();\n }\n\n @Override\n public void onError(int code, String error) {\n recordGlobalReceiveOptionFailure(code, error);\n }\n },\n request\n);\n```\n\n| 数值 | 含义 |\n| ---- | ------------------------ |\n| `0` | 正常接收消息并允许通知。 |\n| `1` | 屏蔽消息。 |\n| `2` | 接收消息但不提示。 |\n\n如果产品只提供“全局免打扰”开关,通常在 `0` 和 `2` 之间切换;`1` 会停止接收消息,应单独展示。单个会话的接收方式由会话 API 管理,不受本设置替代。\n\n成功 callback 表示请求完成。最终账号快照通过 `onSelfInfoUpdated` 或 `getSelfLocalUserInfo()` 校准,事件处理见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。", + "body": "使用 `UserInfoReq` 设置 `globalRecvMsgOpt`。\n\n```java\nUserInfoReq request = new UserInfoReq();\nrequest.setGlobalRecvMsgOpt(2);\n\nOpenIMClient.getInstance().userInfoManager.setSelfInfo(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 设置全局消息接收方式成功\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n request\n);\n```\n\n| 数值 | 含义 |\n| ---- | ------------------------ |\n| `0` | 正常接收消息并允许通知。 |\n| `1` | 屏蔽消息。 |\n| `2` | 接收消息但不提示。 |\n\n如果产品只提供“全局免打扰”开关,可以在 `0` 和 `2` 之间切换;`1` 会停止接收消息,应单独展示。单个会话的接收方式由会话 API 管理。\n\n成功 callback 表示设置请求完成。", "description": "通过 setSelfInfo() 设置当前账号的全局消息接收与通知策略。", "headings": [], "sourcePath": "/sdk/android/user/user-profile/set-global-message-reception", "title": "设置全局消息接收方式" }, + "/sdk/android/user/user-profile/set-friend-add-permission": { + "body": "`addFriendPermission` 用于设置其他用户添加当前账号时是否需要审核。该能力属于商业版。\n\n使用 `UserInfoReq.setAddFriendPermission()` 设置权限值,再调用 `setSelfInfo()`:\n\n```java\nUserInfoReq request = new UserInfoReq();\nrequest.setAddFriendPermission(AddFriendPermission.Allow.getValue());\n\nOpenIMClient.getInstance().userInfoManager.setSelfInfo(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 设置好友添加权限成功\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n request\n);\n```\n\n## 权限值\n\n| 枚举值 | 数值 | 含义 |\n| --- | --- | --- |\n| `AddFriendPermission.Allow` | `0` | 允许其他用户添加,但需要当前用户审核好友申请。 |\n| `AddFriendPermission.AllowNoReview` | `1` | 允许其他用户添加,并直接建立好友关系,无需审核。 |\n| `AddFriendPermission.Deny` | `2` | 不允许其他用户添加当前账号。 |\n\n成功 callback 表示设置请求完成。该设置只影响之后的添加行为,不会删除已有好友关系或处理已经存在的好友申请。", + "description": "设置其他用户向当前账号发起好友申请时的处理方式。", + "headings": [ + { + "depth": 2, + "title": "权限值", + "url": "#权限值" + } + ], + "sourcePath": "/sdk/android/user/user-profile/set-friend-add-permission", + "title": "设置好友添加权限" + }, "/sdk/android/user/online-status/subscribe-users-online-status": { - "body": "```java\nList userIDs = Arrays.asList(\"user_a\", \"user_b\");\n\nOpenIMClient.getInstance().userInfoManager.subscribeUsersOnlineStatus(\n new OnBase>() {\n @Override\n public void onSuccess(List states) {\n mergeOnlineStates(states);\n }\n\n @Override\n public void onError(int code, String error) {\n recordStatusSubscriptionFailure(code, error);\n }\n },\n userIDs\n);\n```\n\n调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 `List` 快照,每项包含 `userID`、`status` 和 `platformIDs`。重复订阅同一个用户时,应由应用层去重并保留一份状态。\n\n## 状态字段\n\n| 字段 | 说明 |\n| ------------- | ------------------------------------------ |\n| `userID` | 目标用户 ID。 |\n| `status` | 在线状态值,具体枚举含义以服务端契约为准。 |\n| `platformIDs` | 当前在线的平台 ID 列表。 |\n\n`onUserStatusChanged` 由本页归属,应组合进应用唯一的 `OnUserListener`,并按 `userID` 合并:\n\n```java\n@Override\npublic void onUserStatusChanged(UsersOnlineStatus status) {\n onlineStatusStore.put(status.getUserID(), status);\n}\n```\n\n订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合,并通过[取消用户状态订阅](/sdk/android/user/online-status/unsubscribe-users-online-status)移除不再需要的用户。", + "body": "```java\nList userIDs = Arrays.asList(\"user_a\", \"user_b\");\n\nOpenIMClient.getInstance().userInfoManager.subscribeUsersOnlineStatus(\n new OnBase>() {\n @Override\n public void onSuccess(List states) {\n // 使用 states 显示在线状态\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n userIDs\n);\n```\n\n调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 `List`,每项包含 `userID`、`status` 和 `platformIDs`。\n\n## 状态字段\n\n| 字段 | 说明 |\n| ------------- | ------------------------------------------ |\n| `userID` | 目标用户 ID。 |\n| `status` | 在线状态值,具体枚举含义以服务端契约为准。 |\n| `platformIDs` | 当前在线的平台 ID 列表。 |\n\n用户在线状态变化时,可通过 `OnUserListener` 接收 `onUserStatusChanged`:\n\n```java\n@Override\npublic void onUserStatusChanged(UsersOnlineStatus status) {\n // 处理在线状态变化\n}\n```\n\n订阅操作只建立或更新订阅集合。用户不再需要某个用户的在线状态时,通过[取消订阅用户状态](/sdk/android/user/online-status/unsubscribe-users-online-status)取消订阅。", "description": "使用 subscribeUsersOnlineStatus() 订阅指定用户的在线状态。", "headings": [ { @@ -800,18 +834,41 @@ "title": "订阅用户在线状态" }, "/sdk/android/user/online-status/get-subscribe-online-users-status": { - "body": "```java\nOpenIMClient.getInstance().userInfoManager.getSubscribeOnlineUsersStatus(\n new OnBase>() {\n @Override\n public void onSuccess(List states) {\n mergeOnlineStates(states);\n }\n\n @Override\n public void onError(int code, String error) {\n recordStatusQueryFailure(code, error);\n }\n }\n);\n```\n\n该方法不接收用户 ID,也不改变订阅集合。成功 callback 返回当前已订阅用户的 `List` 状态快照,适合在重连或重新进入页面时按 `userID` 校准状态。\n\n查询本身不会触发 `onUserStatusChanged`。状态快照只应覆盖在线状态存储,不要覆盖用户昵称、头像等资料字段;需要资料时分别调用用户资料 API。", - "description": "使用 getSubscribeOnlineUsersStatus() 获取已订阅用户的在线状态快照。", + "body": "```java\nOpenIMClient.getInstance().userInfoManager.getSubscribeOnlineUsersStatus(\n new OnBase>() {\n @Override\n public void onSuccess(List states) {\n // 使用 states 显示在线状态\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n }\n);\n```\n\n成功 callback 返回当前已订阅用户的 `List`。", + "description": "使用 getSubscribeOnlineUsersStatus() 获取已订阅用户的在线状态。", "headings": [], "sourcePath": "/sdk/android/user/online-status/get-subscribe-online-users-status", "title": "查询已订阅用户状态" }, "/sdk/android/user/online-status/unsubscribe-users-online-status": { - "body": "用户离开可见范围、页面结束或切换账号时,取消不再需要的在线状态订阅。调用前应去除空值和重复 ID。\n\n```java\nList userIDs = Arrays.asList(\"user_a\", \"user_b\");\n\nOpenIMClient.getInstance().userInfoManager.unsubscribeOnlineUsersStatus(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n for (String userID : userIDs) {\n presenceByUserID.remove(userID);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordStatusUnsubscribeFailure(code, error);\n }\n },\n userIDs\n);\n```\n\n成功 callback 表示取消订阅请求已完成。此后再从应用维护的订阅集合和在线状态缓存中移除这些 `userID`;失败时保留原状态,以便重试。该操作不会修改用户资料或好友关系。\n\n需要再次跟踪用户状态时,重新调用[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。", + "body": "用户离开可见范围、页面结束或切换账号时,取消不再需要的在线状态订阅。调用前应去除空值和重复 ID。\n\n```java\nList userIDs = Arrays.asList(\"user_a\", \"user_b\");\n\nOpenIMClient.getInstance().userInfoManager.unsubscribeOnlineUsersStatus(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 取消订阅成功\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n userIDs\n);\n```\n\n成功 callback 表示取消订阅请求已完成。\n\n需要再次跟踪用户状态时,重新调用[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。", "description": "使用 unsubscribeOnlineUsersStatus 取消指定用户的在线状态订阅。", "headings": [], "sourcePath": "/sdk/android/user/online-status/unsubscribe-users-online-status", - "title": "取消用户状态订阅" + "title": "取消订阅用户状态" + }, + "/sdk/android/user/overview-relationships": { + "body": "关系链记录当前用户与其他用户之间的好友关系、好友申请和黑名单。资料、账号设置和在线状态属于用户能力,见[用户概览](/sdk/android/user/overview-user)。\n\n## 关系链类型\n\nAndroid SDK 会根据关系链场景返回不同的对象:\n\n| 类型 | 适用场景 | 主要 API |\n| --- | --- | --- |\n| `UserInfo` | 好友列表、指定好友资料和黑名单列表中的用户资料及关系信息 | `getFriendListPage()`、`getFriendsInfo()`、`getBlacklist()` |\n| `FriendInfo` | 好友资料、备注和关系扩展字段 | `UserInfo.getFriendInfo()`、`searchFriends()` |\n| `FriendshipInfo` | 当前用户与目标用户的好友关系结果 | `checkFriend()` |\n| `FriendApplicationInfo` | 收到或发出的好友申请及其处理状态 | `getRecvFriendApplicationList()`、`getSendFriendApplicationList()` |\n| `BlacklistInfo` | 黑名单关系信息 | `UserInfo.getBlackInfo()`、`getBlacklist()` |\n\n`UserInfo` 可包含好友或黑名单关系信息;通过 `getFriendInfo()` 获取 `FriendInfo`,通过 `getBlackInfo()` 获取 `BlacklistInfo`。\n\n## 功能入口\n\n下表列出了关系链相关的常见需求和对应页面:\n\n| 需求 | 推荐页面 |\n| --- | --- |\n| 分页获取、搜索或查询指定好友资料 | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)、[搜索好友](/sdk/android/user/friends/search-friends)、[查询指定好友资料](/sdk/android/user/friends/get-friends-info) |\n| 检查当前用户与目标用户的好友关系 | [检查好友关系](/sdk/android/user/friends/check-friend) |\n| 更新或删除好友关系 | [更新好友资料](/sdk/android/user/friends/update-friends)、[删除好友](/sdk/android/user/friends/delete-friend) |\n| 发送、查询、接受或拒绝好友申请 | [发送好友申请](/sdk/android/user/friend-applications/add-friend)、[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)、[获取发出的好友申请](/sdk/android/user/friend-applications/get-send-friend-application-list)、[接受好友申请](/sdk/android/user/friend-applications/accept-friend-application)、[拒绝好友申请](/sdk/android/user/friend-applications/refuse-friend-application) |\n| 查看或维护黑名单 | [获取黑名单列表](/sdk/android/user/blacklist/get-blacklist)、[拉黑用户](/sdk/android/user/blacklist/add-blacklist)、[取消拉黑用户](/sdk/android/user/blacklist/remove-blacklist) |\n\n## 状态更新\n\n关系链状态变化需要设置好友关系监听器;具体回调说明见下方对应能力页:\n\n```java\nOpenIMClient client = OpenIMClient.getInstance();\n\nclient.friendshipManager.setOnFriendshipListener(new OnFriendshipListener() {\n @Override\n public void onFriendApplicationAdded(FriendApplicationInfo application) {\n // 处理好友申请变化\n }\n\n @Override\n public void onFriendApplicationAccepted(FriendApplicationInfo application) {\n // 处理好友申请已接受\n }\n\n @Override\n public void onFriendApplicationRejected(FriendApplicationInfo application) {\n // 处理好友申请已拒绝\n }\n\n @Override\n public void onFriendApplicationDeleted(FriendApplicationInfo application) {\n // 处理好友申请删除\n }\n\n @Override\n public void onFriendAdded(FriendInfo friend) {\n // 处理好友关系变化\n }\n\n @Override\n public void onFriendInfoChanged(FriendInfo friend) {\n // 处理好友资料变化\n }\n\n @Override\n public void onFriendDeleted(FriendInfo friend) {\n // 处理好友关系删除\n }\n\n @Override\n public void onBlacklistAdded(BlacklistInfo user) {\n // 处理新增黑名单记录\n }\n\n @Override\n public void onBlacklistDeleted(BlacklistInfo user) {\n // 处理黑名单记录删除\n }\n});\n```\n\n- 好友申请变化:见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。\n- 好友关系和好友资料变化:见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。\n- 黑名单变化:见[获取黑名单列表](/sdk/android/user/blacklist/get-blacklist)。", + "description": "了解 Android SDK 中的好友、好友申请和黑名单 API。", + "headings": [ + { + "depth": 2, + "title": "关系链类型", + "url": "#关系链类型" + }, + { + "depth": 2, + "title": "功能入口", + "url": "#功能入口" + }, + { + "depth": 2, + "title": "状态更新", + "url": "#状态更新" + } + ], + "sourcePath": "/sdk/android/user/overview-relationships", + "title": "关系链概览" }, "/sdk/android/user/friends/get-friend-list-page": { "body": "```java\nOpenIMClient.getInstance().friendshipManager.getFriendListPage(\n new OnBase>() {\n @Override\n public void onSuccess(List friends) {\n // 使用 friends 更新好友列表\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理错误\n }\n },\n 0,\n 40,\n true\n);\n```\n\n参数依次为 `offset`、`count` 和 `filterBlack`。`offset` 从 `0` 开始,`count` 是页大小,`filterBlack` 为 `true` 时过滤黑名单用户。成功 callback 返回当前页 `List`,好友关系详情可通过 `getFriendInfo()` 读取。继续加载下一页时按实际请求数量增加 `offset`;返回数量小于 `count` 时通常表示到达末页。\n\n## 好友资料字段\n\n好友列表中的 `UserInfo.getFriendInfo()` 返回 `FriendInfo`,常用字段如下:\n\n| 字段 | 说明 |\n| ---------------- | ------------------------------------- |\n| `userID` | 好友用户 ID。 |\n| `nickname` | 好友账号昵称。 |\n| `faceURL` | 好友账号头像地址。 |\n| `remark` | 当前账号设置的好友备注。 |\n| `ex` | 好友关系扩展字符串。 |\n| `addSource` | 好友关系添加来源。 |\n| `operatorUserID` | 建立或更新关系的操作用户 ID。 |\n| `createTime` | 好友关系创建时间。 |\n\n`nickname` 和 `faceURL` 是账号资料,`remark` 和 `ex` 属于好友关系。`UpdateFriendsReq` 支持提交 `isPinned`,但当前 Android `FriendInfo` 模型不提供对应读取字段。\n\n好友新增、资料变化和删除时,可通过 `OnFriendshipListener` 接收以下回调:\n\n```java\n@Override\npublic void onFriendAdded(FriendInfo friend) {\n // 处理新增好友\n}\n\n@Override\npublic void onFriendInfoChanged(FriendInfo friend) {\n // 处理好友资料变化\n}\n\n@Override\npublic void onFriendDeleted(FriendInfo friend) {\n // 处理好友删除\n}\n```", diff --git a/src/generated/navigation.json b/src/generated/navigation.json index 683065b3fe..1411d08647 100644 --- a/src/generated/navigation.json +++ b/src/generated/navigation.json @@ -4421,6 +4421,16 @@ "minIndex": 138, "navigationTitle": "Set global message reception" }, + { + "id": "user/user-profile/set-friend-add-permission", + "segment": "set-friend-add-permission", + "title": "Set friend request permissions", + "href": "/sdk/android/user/user-profile/set-friend-add-permission", + "type": "page", + "children": [], + "minIndex": 139, + "navigationTitle": "Set friend request permissions" + }, { "id": "user/online-status", "segment": "online-status", @@ -4435,7 +4445,7 @@ "href": "/sdk/android/user/online-status/subscribe-users-online-status", "type": "page", "children": [], - "minIndex": 139, + "minIndex": 140, "navigationTitle": "Subscribe to user status" }, { @@ -4445,7 +4455,7 @@ "href": "/sdk/android/user/online-status/get-subscribe-online-users-status", "type": "page", "children": [], - "minIndex": 140, + "minIndex": 141, "navigationTitle": "Refresh subscribed user status" }, { @@ -4455,11 +4465,11 @@ "href": "/sdk/android/user/online-status/unsubscribe-users-online-status", "type": "page", "children": [], - "minIndex": 141, + "minIndex": 142, "navigationTitle": "Unsubscribe from user status" } ], - "minIndex": 139 + "minIndex": 140 } ], "minIndex": 134 @@ -4471,6 +4481,16 @@ "href": null, "type": "folder", "children": [ + { + "id": "user/overview-relationships", + "segment": "overview-relationships", + "title": "Relationship overview", + "href": "/sdk/android/user/overview-relationships", + "type": "page", + "children": [], + "minIndex": 143, + "navigationTitle": "Relationship overview" + }, { "id": "user/friends", "segment": "friends", @@ -4485,7 +4505,7 @@ "href": "/sdk/android/user/friends/get-friend-list-page", "type": "page", "children": [], - "minIndex": 142, + "minIndex": 144, "navigationTitle": "Get the friend list" }, { @@ -4495,7 +4515,7 @@ "href": "/sdk/android/user/friends/search-friends", "type": "page", "children": [], - "minIndex": 143, + "minIndex": 145, "navigationTitle": "Search friends" }, { @@ -4505,7 +4525,7 @@ "href": "/sdk/android/user/friends/get-friends-info", "type": "page", "children": [], - "minIndex": 144, + "minIndex": 146, "navigationTitle": "Get friend profiles" }, { @@ -4515,7 +4535,7 @@ "href": "/sdk/android/user/friends/check-friend", "type": "page", "children": [], - "minIndex": 145, + "minIndex": 147, "navigationTitle": "Check friendship status" }, { @@ -4525,7 +4545,7 @@ "href": "/sdk/android/user/friends/update-friends", "type": "page", "children": [], - "minIndex": 146, + "minIndex": 148, "navigationTitle": "Update friend information" }, { @@ -4535,7 +4555,7 @@ "href": "/sdk/android/user/friends/delete-friend", "type": "page", "children": [], - "minIndex": 147, + "minIndex": 149, "navigationTitle": "Delete a friend" }, { @@ -4552,7 +4572,7 @@ "href": "/sdk/android/user/friend-applications/add-friend", "type": "page", "children": [], - "minIndex": 148, + "minIndex": 150, "navigationTitle": "Send a friend application" }, { @@ -4562,7 +4582,7 @@ "href": "/sdk/android/user/friend-applications/get-recv-friend-application-list", "type": "page", "children": [], - "minIndex": 149, + "minIndex": 151, "navigationTitle": "Get received friend applications" }, { @@ -4572,7 +4592,7 @@ "href": "/sdk/android/user/friend-applications/get-send-friend-application-list", "type": "page", "children": [], - "minIndex": 150, + "minIndex": 152, "navigationTitle": "Get sent friend applications" }, { @@ -4582,7 +4602,7 @@ "href": "/sdk/android/user/friend-applications/accept-friend-application", "type": "page", "children": [], - "minIndex": 151, + "minIndex": 153, "navigationTitle": "Accept a friend application" }, { @@ -4592,14 +4612,14 @@ "href": "/sdk/android/user/friend-applications/refuse-friend-application", "type": "page", "children": [], - "minIndex": 152, + "minIndex": 154, "navigationTitle": "Reject a friend application" } ], - "minIndex": 148 + "minIndex": 150 } ], - "minIndex": 142 + "minIndex": 144 }, { "id": "user/blacklist", @@ -4615,7 +4635,7 @@ "href": "/sdk/android/user/blacklist/get-blacklist", "type": "page", "children": [], - "minIndex": 153 + "minIndex": 155 }, { "id": "user/blacklist/add-blacklist", @@ -4624,7 +4644,7 @@ "href": "/sdk/android/user/blacklist/add-blacklist", "type": "page", "children": [], - "minIndex": 154, + "minIndex": 156, "navigationTitle": "Block a user" }, { @@ -4634,14 +4654,14 @@ "href": "/sdk/android/user/blacklist/remove-blacklist", "type": "page", "children": [], - "minIndex": 155, + "minIndex": 157, "navigationTitle": "Unblock a user" } ], - "minIndex": 153 + "minIndex": 155 } ], - "minIndex": 142 + "minIndex": 143 }, { "id": "conversation", @@ -4657,7 +4677,7 @@ "href": "/sdk/android/conversation/overview-conversation", "type": "page", "children": [], - "minIndex": 156 + "minIndex": 158 }, { "id": "conversation/retrieving-conversations", @@ -4673,7 +4693,7 @@ "href": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", "type": "page", "children": [], - "minIndex": 157, + "minIndex": 159, "navigationTitle": "Open a conversation" }, { @@ -4683,7 +4703,7 @@ "href": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", "type": "page", "children": [], - "minIndex": 158, + "minIndex": 160, "navigationTitle": "Resolve a conversation ID" }, { @@ -4693,7 +4713,7 @@ "href": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", "type": "page", "children": [], - "minIndex": 159, + "minIndex": 161, "navigationTitle": "Get conversations by ID" }, { @@ -4703,10 +4723,10 @@ "href": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", "type": "page", "children": [], - "minIndex": 160 + "minIndex": 162 } ], - "minIndex": 157 + "minIndex": 159 }, { "id": "conversation/conversation-list-and-drafts", @@ -4722,7 +4742,7 @@ "href": "/sdk/android/conversation/managing-conversations/pin-conversation", "type": "page", "children": [], - "minIndex": 161, + "minIndex": 163, "navigationTitle": "Pin or unpin a conversation" }, { @@ -4732,7 +4752,7 @@ "href": "/sdk/android/conversation/managing-conversations/set-conversation-extension", "type": "page", "children": [], - "minIndex": 162, + "minIndex": 164, "navigationTitle": "Set conversation extra data" }, { @@ -4742,10 +4762,10 @@ "href": "/sdk/android/conversation/managing-conversations/set-conversation-draft", "type": "page", "children": [], - "minIndex": 163 + "minIndex": 165 } ], - "minIndex": 161 + "minIndex": 163 }, { "id": "conversation/message-reception-and-reminders", @@ -4761,7 +4781,7 @@ "href": "/sdk/android/conversation/managing-conversations/set-message-receive-option", "type": "page", "children": [], - "minIndex": 164, + "minIndex": 166, "navigationTitle": "Set conversation message reception" }, { @@ -4771,7 +4791,7 @@ "href": "/sdk/android/conversation/managing-conversations/clear-group-mentions", "type": "page", "children": [], - "minIndex": 165, + "minIndex": 167, "navigationTitle": "Reset group mention status" }, { @@ -4781,7 +4801,7 @@ "href": "/sdk/android/conversation/managing-conversations/mark-conversation-read", "type": "page", "children": [], - "minIndex": 166, + "minIndex": 168, "navigationTitle": "Mark a conversation as read" }, { @@ -4791,11 +4811,11 @@ "href": "/sdk/android/conversation/managing-conversations/get-total-unread-count", "type": "page", "children": [], - "minIndex": 167, + "minIndex": 169, "navigationTitle": "Track the total unread count" } ], - "minIndex": 164 + "minIndex": 166 }, { "id": "conversation/message-retention-and-privacy", @@ -4811,7 +4831,7 @@ "href": "/sdk/android/conversation/managing-conversations/set-private-chat", "type": "page", "children": [], - "minIndex": 168, + "minIndex": 170, "navigationTitle": "Enable or disable burn after reading" }, { @@ -4821,7 +4841,7 @@ "href": "/sdk/android/conversation/managing-conversations/set-burn-duration", "type": "page", "children": [], - "minIndex": 169, + "minIndex": 171, "navigationTitle": "Set the burn duration" }, { @@ -4831,11 +4851,11 @@ "href": "/sdk/android/conversation/managing-conversations/set-message-destruct", "type": "page", "children": [], - "minIndex": 170, + "minIndex": 172, "navigationTitle": "Schedule server message deletion" } ], - "minIndex": 168 + "minIndex": 170 }, { "id": "conversation/hiding-and-deleting-conversations", @@ -4851,7 +4871,7 @@ "href": "/sdk/android/conversation/managing-conversations/hide-a-conversation", "type": "page", "children": [], - "minIndex": 171 + "minIndex": 173 }, { "id": "conversation/managing-conversations/delete-conversation-with-messages", @@ -4860,7 +4880,7 @@ "href": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", "type": "page", "children": [], - "minIndex": 172, + "minIndex": 174, "navigationTitle": "Delete a conversation and its messages" }, { @@ -4870,14 +4890,14 @@ "href": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", "type": "page", "children": [], - "minIndex": 173, + "minIndex": 175, "navigationTitle": "Clear messages in a conversation" } ], - "minIndex": 171 + "minIndex": 173 } ], - "minIndex": 156 + "minIndex": 158 }, { "id": "group", @@ -4893,7 +4913,7 @@ "href": "/sdk/android/group/overview-group", "type": "page", "children": [], - "minIndex": 174, + "minIndex": 176, "navigationTitle": "Group overview" }, { @@ -4910,7 +4930,7 @@ "href": "/sdk/android/group/create-group", "type": "page", "children": [], - "minIndex": 175, + "minIndex": 177, "navigationTitle": "Create a group" }, { @@ -4920,7 +4940,7 @@ "href": "/sdk/android/group/update-group-profile", "type": "page", "children": [], - "minIndex": 176, + "minIndex": 178, "navigationTitle": "Update group profile" }, { @@ -4930,7 +4950,7 @@ "href": "/sdk/android/group/set-group-announcement", "type": "page", "children": [], - "minIndex": 177, + "minIndex": 179, "navigationTitle": "Publish a group announcement" }, { @@ -4940,11 +4960,11 @@ "href": "/sdk/android/group/set-group-extension", "type": "page", "children": [], - "minIndex": 178, + "minIndex": 180, "navigationTitle": "Set group extra data" } ], - "minIndex": 175 + "minIndex": 177 }, { "id": "group/permissions", @@ -4960,7 +4980,7 @@ "href": "/sdk/android/group/set-group-join-verification", "type": "page", "children": [], - "minIndex": 179, + "minIndex": 181, "navigationTitle": "Set group join verification" }, { @@ -4970,7 +4990,7 @@ "href": "/sdk/android/group/set-group-member-profile-access", "type": "page", "children": [], - "minIndex": 180, + "minIndex": 182, "navigationTitle": "Set member profile access" }, { @@ -4980,7 +5000,7 @@ "href": "/sdk/android/group/set-group-member-friend-permission", "type": "page", "children": [], - "minIndex": 181, + "minIndex": 183, "navigationTitle": "Set member friend request permission" }, { @@ -4990,11 +5010,11 @@ "href": "/sdk/android/group/change-group-mute", "type": "page", "children": [], - "minIndex": 182, + "minIndex": 184, "navigationTitle": "Change group mute status" } ], - "minIndex": 179 + "minIndex": 181 }, { "id": "group/joining-and-leaving", @@ -5010,7 +5030,7 @@ "href": "/sdk/android/group/join-group", "type": "page", "children": [], - "minIndex": 183, + "minIndex": 185, "navigationTitle": "Apply to join a group" }, { @@ -5020,7 +5040,7 @@ "href": "/sdk/android/group/quit-group", "type": "page", "children": [], - "minIndex": 184, + "minIndex": 186, "navigationTitle": "Leave a group" }, { @@ -5030,11 +5050,11 @@ "href": "/sdk/android/group/dismiss-group", "type": "page", "children": [], - "minIndex": 185, + "minIndex": 187, "navigationTitle": "Dismiss a group" } ], - "minIndex": 183 + "minIndex": 185 }, { "id": "group/retrieving-groups", @@ -5050,7 +5070,7 @@ "href": "/sdk/android/group/retrieving-groups/get-specified-groups-info", "type": "page", "children": [], - "minIndex": 186, + "minIndex": 188, "navigationTitle": "Get group information" }, { @@ -5060,7 +5080,7 @@ "href": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", "type": "page", "children": [], - "minIndex": 187, + "minIndex": 189, "navigationTitle": "Get joined groups by page" }, { @@ -5070,7 +5090,7 @@ "href": "/sdk/android/group/retrieving-groups/is-join-group", "type": "page", "children": [], - "minIndex": 188, + "minIndex": 190, "navigationTitle": "Check group membership" }, { @@ -5080,11 +5100,11 @@ "href": "/sdk/android/group/retrieving-groups/search-groups", "type": "page", "children": [], - "minIndex": 189, + "minIndex": 191, "navigationTitle": "Search groups" } ], - "minIndex": 186 + "minIndex": 188 }, { "id": "group/group-applications", @@ -5100,7 +5120,7 @@ "href": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", "type": "page", "children": [], - "minIndex": 190, + "minIndex": 192, "navigationTitle": "Get received group applications" }, { @@ -5110,7 +5130,7 @@ "href": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", "type": "page", "children": [], - "minIndex": 191, + "minIndex": 193, "navigationTitle": "Get sent group applications" }, { @@ -5120,7 +5140,7 @@ "href": "/sdk/android/group/group-applications/accept-group-application", "type": "page", "children": [], - "minIndex": 192, + "minIndex": 194, "navigationTitle": "Accept a group application" }, { @@ -5130,7 +5150,7 @@ "href": "/sdk/android/group/group-applications/refuse-group-application", "type": "page", "children": [], - "minIndex": 193, + "minIndex": 195, "navigationTitle": "Reject a group application" }, { @@ -5140,11 +5160,11 @@ "href": "/sdk/android/group/group-applications/delete-group-requests", "type": "page", "children": [], - "minIndex": 194, + "minIndex": 196, "navigationTitle": "Delete group applications" } ], - "minIndex": 190 + "minIndex": 192 }, { "id": "group/retrieving-group-members", @@ -5160,7 +5180,7 @@ "href": "/sdk/android/group/retrieving-group-members/get-group-member-list", "type": "page", "children": [], - "minIndex": 195, + "minIndex": 197, "navigationTitle": "Get group members" }, { @@ -5170,7 +5190,7 @@ "href": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", "type": "page", "children": [], - "minIndex": 196, + "minIndex": 198, "navigationTitle": "Get group member profiles" }, { @@ -5180,7 +5200,7 @@ "href": "/sdk/android/group/retrieving-group-members/get-users-in-group", "type": "page", "children": [], - "minIndex": 197, + "minIndex": 199, "navigationTitle": "Check users in a group" }, { @@ -5190,7 +5210,7 @@ "href": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", "type": "page", "children": [], - "minIndex": 198, + "minIndex": 200, "navigationTitle": "Get group owners and admins" }, { @@ -5200,11 +5220,11 @@ "href": "/sdk/android/group/retrieving-group-members/search-group-members", "type": "page", "children": [], - "minIndex": 199, + "minIndex": 201, "navigationTitle": "Search group members" } ], - "minIndex": 195 + "minIndex": 197 }, { "id": "group/managing-group-members", @@ -5220,7 +5240,7 @@ "href": "/sdk/android/group/managing-group-members/invite-user-to-group", "type": "page", "children": [], - "minIndex": 200, + "minIndex": 202, "navigationTitle": "Invite users to a group" }, { @@ -5230,7 +5250,7 @@ "href": "/sdk/android/group/managing-group-members/kick-group-member", "type": "page", "children": [], - "minIndex": 201, + "minIndex": 203, "navigationTitle": "Remove group members" }, { @@ -5240,7 +5260,7 @@ "href": "/sdk/android/group/managing-group-members/set-group-member-nickname", "type": "page", "children": [], - "minIndex": 202, + "minIndex": 204, "navigationTitle": "Update a group nickname" }, { @@ -5250,7 +5270,7 @@ "href": "/sdk/android/group/managing-group-members/set-group-member-role-level", "type": "page", "children": [], - "minIndex": 203, + "minIndex": 205, "navigationTitle": "Manage group administrators" }, { @@ -5260,7 +5280,7 @@ "href": "/sdk/android/group/managing-group-members/set-group-member-avatar", "type": "page", "children": [], - "minIndex": 204, + "minIndex": 206, "navigationTitle": "Update a group member avatar" }, { @@ -5270,7 +5290,7 @@ "href": "/sdk/android/group/managing-group-members/set-group-member-extension", "type": "page", "children": [], - "minIndex": 205, + "minIndex": 207, "navigationTitle": "Set group member extra data" }, { @@ -5280,7 +5300,7 @@ "href": "/sdk/android/group/managing-group-members/transfer-group-owner", "type": "page", "children": [], - "minIndex": 206, + "minIndex": 208, "navigationTitle": "Transfer group ownership" }, { @@ -5290,14 +5310,14 @@ "href": "/sdk/android/group/managing-group-members/change-group-member-mute", "type": "page", "children": [], - "minIndex": 207, + "minIndex": 209, "navigationTitle": "Mute or unmute a group member" } ], - "minIndex": 200 + "minIndex": 202 } ], - "minIndex": 174 + "minIndex": 176 }, { "id": "message", @@ -5313,7 +5333,7 @@ "href": "/sdk/android/message/overview-message", "type": "page", "children": [], - "minIndex": 208 + "minIndex": 210 }, { "id": "message/creating-messages", @@ -5329,7 +5349,7 @@ "href": "/sdk/android/message/creating-messages/create-text-message", "type": "page", "children": [], - "minIndex": 209 + "minIndex": 211 }, { "id": "message/creating-messages/create-text-at-message", @@ -5338,7 +5358,7 @@ "href": "/sdk/android/message/creating-messages/create-text-at-message", "type": "page", "children": [], - "minIndex": 210 + "minIndex": 212 }, { "id": "message/creating-messages/create-custom-message", @@ -5347,7 +5367,7 @@ "href": "/sdk/android/message/creating-messages/create-custom-message", "type": "page", "children": [], - "minIndex": 211 + "minIndex": 213 }, { "id": "message/creating-messages/create-image-message", @@ -5356,7 +5376,7 @@ "href": "/sdk/android/message/creating-messages/create-image-message", "type": "page", "children": [], - "minIndex": 212, + "minIndex": 214, "navigationTitle": "Create an image message" }, { @@ -5366,7 +5386,7 @@ "href": "/sdk/android/message/creating-messages/create-image-message-by-file", "type": "page", "children": [], - "minIndex": 213, + "minIndex": 215, "navigationTitle": "Create an image message from a path" }, { @@ -5376,7 +5396,7 @@ "href": "/sdk/android/message/creating-messages/create-image-message-by-url", "type": "page", "children": [], - "minIndex": 214 + "minIndex": 216 }, { "id": "message/creating-messages/create-sound-message", @@ -5385,7 +5405,7 @@ "href": "/sdk/android/message/creating-messages/create-sound-message", "type": "page", "children": [], - "minIndex": 215, + "minIndex": 217, "navigationTitle": "Create an audio message" }, { @@ -5395,7 +5415,7 @@ "href": "/sdk/android/message/creating-messages/create-sound-message-by-file", "type": "page", "children": [], - "minIndex": 216, + "minIndex": 218, "navigationTitle": "Create an audio message from a path" }, { @@ -5405,7 +5425,7 @@ "href": "/sdk/android/message/creating-messages/create-sound-message-by-url", "type": "page", "children": [], - "minIndex": 217 + "minIndex": 219 }, { "id": "message/creating-messages/create-video-message", @@ -5414,7 +5434,7 @@ "href": "/sdk/android/message/creating-messages/create-video-message", "type": "page", "children": [], - "minIndex": 218, + "minIndex": 220, "navigationTitle": "Create a video message" }, { @@ -5424,7 +5444,7 @@ "href": "/sdk/android/message/creating-messages/create-video-message-by-file", "type": "page", "children": [], - "minIndex": 219, + "minIndex": 221, "navigationTitle": "Create a video message from a path" }, { @@ -5434,7 +5454,7 @@ "href": "/sdk/android/message/creating-messages/create-video-message-by-url", "type": "page", "children": [], - "minIndex": 220 + "minIndex": 222 }, { "id": "message/creating-messages/create-file-message", @@ -5443,7 +5463,7 @@ "href": "/sdk/android/message/creating-messages/create-file-message", "type": "page", "children": [], - "minIndex": 221, + "minIndex": 223, "navigationTitle": "Create a file message" }, { @@ -5453,7 +5473,7 @@ "href": "/sdk/android/message/creating-messages/create-file-message-by-file", "type": "page", "children": [], - "minIndex": 222, + "minIndex": 224, "navigationTitle": "Create a file message from a path" }, { @@ -5463,7 +5483,7 @@ "href": "/sdk/android/message/creating-messages/create-file-message-by-url", "type": "page", "children": [], - "minIndex": 223 + "minIndex": 225 }, { "id": "message/creating-messages/create-card-message", @@ -5472,7 +5492,7 @@ "href": "/sdk/android/message/creating-messages/create-card-message", "type": "page", "children": [], - "minIndex": 224 + "minIndex": 226 }, { "id": "message/creating-messages/create-location-message", @@ -5481,7 +5501,7 @@ "href": "/sdk/android/message/creating-messages/create-location-message", "type": "page", "children": [], - "minIndex": 225 + "minIndex": 227 }, { "id": "message/creating-messages/create-face-message", @@ -5490,7 +5510,7 @@ "href": "/sdk/android/message/creating-messages/create-face-message", "type": "page", "children": [], - "minIndex": 226 + "minIndex": 228 }, { "id": "message/creating-messages/create-quote-message", @@ -5499,7 +5519,7 @@ "href": "/sdk/android/message/creating-messages/create-quote-message", "type": "page", "children": [], - "minIndex": 227 + "minIndex": 229 }, { "id": "message/creating-messages/create-advanced-text-message", @@ -5508,7 +5528,7 @@ "href": "/sdk/android/message/creating-messages/create-advanced-text-message", "type": "page", "children": [], - "minIndex": 228, + "minIndex": 230, "navigationTitle": "Create rich text" }, { @@ -5518,7 +5538,7 @@ "href": "/sdk/android/message/creating-messages/create-advanced-quote-message", "type": "page", "children": [], - "minIndex": 229, + "minIndex": 231, "navigationTitle": "Create a rich reply" }, { @@ -5528,7 +5548,7 @@ "href": "/sdk/android/message/creating-messages/create-forward-message", "type": "page", "children": [], - "minIndex": 230 + "minIndex": 232 }, { "id": "message/creating-messages/create-merger-message", @@ -5537,10 +5557,10 @@ "href": "/sdk/android/message/creating-messages/create-merger-message", "type": "page", "children": [], - "minIndex": 231 + "minIndex": 233 } ], - "minIndex": 209 + "minIndex": 211 }, { "id": "message/sending-messages", @@ -5556,7 +5576,7 @@ "href": "/sdk/android/message/sending-messages/send-message", "type": "page", "children": [], - "minIndex": 232 + "minIndex": 234 }, { "id": "message/sending-messages/send-message-not-oss", @@ -5565,7 +5585,7 @@ "href": "/sdk/android/message/sending-messages/send-message-not-oss", "type": "page", "children": [], - "minIndex": 233 + "minIndex": 235 }, { "id": "message/sending-messages/set-msg-send-progress-listener", @@ -5574,11 +5594,11 @@ "href": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", "type": "page", "children": [], - "minIndex": 234, + "minIndex": 236, "navigationTitle": "Track message sending progress" } ], - "minIndex": 232 + "minIndex": 234 }, { "id": "message/receiving-messages/receive-messages", @@ -5587,7 +5607,7 @@ "href": "/sdk/android/message/receiving-messages/receive-messages", "type": "page", "children": [], - "minIndex": 235 + "minIndex": 237 }, { "id": "message/receiving-messages/receive-custom-business-messages", @@ -5596,7 +5616,7 @@ "href": "/sdk/android/message/receiving-messages/receive-custom-business-messages", "type": "page", "children": [], - "minIndex": 236 + "minIndex": 238 }, { "id": "message/retrieving-messages", @@ -5612,7 +5632,7 @@ "href": "/sdk/android/message/retrieving-messages/load-older-messages", "type": "page", "children": [], - "minIndex": 237 + "minIndex": 239 }, { "id": "message/retrieving-messages/load-newer-messages", @@ -5621,7 +5641,7 @@ "href": "/sdk/android/message/retrieving-messages/load-newer-messages", "type": "page", "children": [], - "minIndex": 238 + "minIndex": 240 }, { "id": "message/retrieving-messages/find-messages-by-id", @@ -5630,7 +5650,7 @@ "href": "/sdk/android/message/retrieving-messages/find-messages-by-id", "type": "page", "children": [], - "minIndex": 239 + "minIndex": 241 }, { "id": "message/retrieving-messages/load-message-context", @@ -5639,7 +5659,7 @@ "href": "/sdk/android/message/retrieving-messages/load-message-context", "type": "page", "children": [], - "minIndex": 240, + "minIndex": 242, "navigationTitle": "Load message context" }, { @@ -5649,10 +5669,10 @@ "href": "/sdk/android/message/searching-messages/search-messages", "type": "page", "children": [], - "minIndex": 241 + "minIndex": 243 } ], - "minIndex": 237 + "minIndex": 239 }, { "id": "message/composing-messages", @@ -5668,7 +5688,7 @@ "href": "/sdk/android/message/composing-messages/update-typing-status", "type": "page", "children": [], - "minIndex": 242, + "minIndex": 244, "navigationTitle": "Update typing status" }, { @@ -5678,11 +5698,11 @@ "href": "/sdk/android/message/composing-messages/get-typing-status", "type": "page", "children": [], - "minIndex": 243, + "minIndex": 245, "navigationTitle": "Get typing status" } ], - "minIndex": 242 + "minIndex": 244 }, { "id": "message/managing-messages", @@ -5698,7 +5718,7 @@ "href": "/sdk/android/message/managing-messages/delete-local-message", "type": "page", "children": [], - "minIndex": 244 + "minIndex": 246 }, { "id": "message/managing-messages/delete-saved-messages", @@ -5707,7 +5727,7 @@ "href": "/sdk/android/message/managing-messages/delete-saved-messages", "type": "page", "children": [], - "minIndex": 245, + "minIndex": 247, "navigationTitle": "Delete saved messages" }, { @@ -5717,7 +5737,7 @@ "href": "/sdk/android/message/managing-messages/delete-user-messages", "type": "page", "children": [], - "minIndex": 246, + "minIndex": 248, "navigationTitle": "Delete messages from a user" }, { @@ -5727,7 +5747,7 @@ "href": "/sdk/android/message/managing-messages/revoke-a-message", "type": "page", "children": [], - "minIndex": 247 + "minIndex": 249 }, { "id": "message/managing-messages/modify-a-message", @@ -5736,7 +5756,7 @@ "href": "/sdk/android/message/managing-messages/modify-a-message", "type": "page", "children": [], - "minIndex": 248 + "minIndex": 250 }, { "id": "message/managing-messages/get-pinned-messages", @@ -5745,7 +5765,7 @@ "href": "/sdk/android/message/managing-messages/get-pinned-messages", "type": "page", "children": [], - "minIndex": 249 + "minIndex": 251 }, { "id": "message/managing-messages/set-message-pinned", @@ -5754,7 +5774,7 @@ "href": "/sdk/android/message/managing-messages/set-message-pinned", "type": "page", "children": [], - "minIndex": 250 + "minIndex": 252 }, { "id": "message/managing-messages/insert-local-single-message", @@ -5763,7 +5783,7 @@ "href": "/sdk/android/message/managing-messages/insert-local-single-message", "type": "page", "children": [], - "minIndex": 251 + "minIndex": 253 }, { "id": "message/managing-messages/insert-local-group-message", @@ -5772,7 +5792,7 @@ "href": "/sdk/android/message/managing-messages/insert-local-group-message", "type": "page", "children": [], - "minIndex": 252 + "minIndex": 254 }, { "id": "message/managing-messages/clear-all-local-messages", @@ -5781,7 +5801,7 @@ "href": "/sdk/android/message/managing-messages/clear-all-local-messages", "type": "page", "children": [], - "minIndex": 253 + "minIndex": 255 }, { "id": "message/managing-messages/clear-all-messages", @@ -5790,7 +5810,7 @@ "href": "/sdk/android/message/managing-messages/clear-all-messages", "type": "page", "children": [], - "minIndex": 254 + "minIndex": 256 }, { "id": "message/managing-messages/set-message-local-ex", @@ -5799,10 +5819,10 @@ "href": "/sdk/android/message/managing-messages/set-message-local-ex", "type": "page", "children": [], - "minIndex": 255 + "minIndex": 257 } ], - "minIndex": 244 + "minIndex": 246 }, { "id": "message/group-message-read-status", @@ -5818,7 +5838,7 @@ "href": "/sdk/android/message/managing-read-status/send-group-read-receipts", "type": "page", "children": [], - "minIndex": 256, + "minIndex": 258, "navigationTitle": "Send group read receipts" }, { @@ -5828,14 +5848,14 @@ "href": "/sdk/android/message/managing-read-status/get-group-message-readers", "type": "page", "children": [], - "minIndex": 257, + "minIndex": 259, "navigationTitle": "View group message readers" } ], - "minIndex": 256 + "minIndex": 258 } ], - "minIndex": 208 + "minIndex": 210 }, { "id": "file-uploads/upload-file", @@ -5844,7 +5864,7 @@ "href": "/sdk/android/file-uploads/upload-file", "type": "page", "children": [], - "minIndex": 258, + "minIndex": 260, "navigationTitle": "Upload a file" }, { @@ -5861,7 +5881,7 @@ "href": "/sdk/android/calling/overview-calling", "type": "page", "children": [], - "minIndex": 259 + "minIndex": 261 }, { "id": "calling/managing-calls", @@ -5877,7 +5897,7 @@ "href": "/sdk/android/calling/managing-calls/start-single-call", "type": "page", "children": [], - "minIndex": 260, + "minIndex": 262, "navigationTitle": "Start a one-to-one call" }, { @@ -5887,7 +5907,7 @@ "href": "/sdk/android/calling/managing-calls/start-group-call", "type": "page", "children": [], - "minIndex": 261, + "minIndex": 263, "navigationTitle": "Start a group call" }, { @@ -5897,7 +5917,7 @@ "href": "/sdk/android/calling/managing-calls/accept-call", "type": "page", "children": [], - "minIndex": 262, + "minIndex": 264, "navigationTitle": "Accept a call" }, { @@ -5907,7 +5927,7 @@ "href": "/sdk/android/calling/managing-calls/reject-call", "type": "page", "children": [], - "minIndex": 263, + "minIndex": 265, "navigationTitle": "Reject a call" }, { @@ -5917,7 +5937,7 @@ "href": "/sdk/android/calling/managing-calls/cancel-call", "type": "page", "children": [], - "minIndex": 264, + "minIndex": 266, "navigationTitle": "Cancel a call invitation" }, { @@ -5927,7 +5947,7 @@ "href": "/sdk/android/calling/managing-calls/hang-up-call", "type": "page", "children": [], - "minIndex": 265, + "minIndex": 267, "navigationTitle": "Hang up a call" }, { @@ -5937,11 +5957,11 @@ "href": "/sdk/android/calling/managing-calls/handle-call-events", "type": "page", "children": [], - "minIndex": 266, + "minIndex": 268, "navigationTitle": "Handle call events" } ], - "minIndex": 260 + "minIndex": 262 }, { "id": "calling/retrieving-call-information", @@ -5957,7 +5977,7 @@ "href": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", "type": "page", "children": [], - "minIndex": 267, + "minIndex": 269, "navigationTitle": "Restore a pending invitation" }, { @@ -5967,7 +5987,7 @@ "href": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", "type": "page", "children": [], - "minIndex": 268, + "minIndex": 270, "navigationTitle": "Get a group call room" }, { @@ -5977,11 +5997,11 @@ "href": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", "type": "page", "children": [], - "minIndex": 269, + "minIndex": 271, "navigationTitle": "Get room credentials" } ], - "minIndex": 267 + "minIndex": 269 }, { "id": "calling/sending-custom-signals/send-a-custom-signal", @@ -5990,10 +6010,10 @@ "href": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", "type": "page", "children": [], - "minIndex": 270 + "minIndex": 272 } ], - "minIndex": 259 + "minIndex": 261 }, { "id": "events/overview-events", @@ -6002,7 +6022,7 @@ "href": "/sdk/android/events/overview-events", "type": "page", "children": [], - "minIndex": 271, + "minIndex": 273, "navigationTitle": "Events" }, { @@ -6012,10 +6032,10 @@ "href": "/sdk/android/logger", "type": "page", "children": [], - "minIndex": 272 + "minIndex": 274 } ], - "pageCount": 144, + "pageCount": 146, "sidebarExpansion": "active-path" }, { diff --git a/src/generated/routes.json b/src/generated/routes.json index 636f387ccc..e3c98303bb 100644 --- a/src/generated/routes.json +++ b/src/generated/routes.json @@ -4266,7 +4266,7 @@ "navOrder": 164 }, { - "id": 1821, + "id": 2287, "path": "/sdk/android/overview", "relativePath": "sdk/android/overview", "sourcePath": "/sdk/android/overview", @@ -4279,12 +4279,12 @@ "contextTitle": "SDKs · Android · v4", "template": "overview", "status": "published", - "sourceIndex": 3191, + "sourceIndex": 3657, "contentFile": "content/docs/chat/sdk/android/overview.mdx", "navOrder": 129 }, { - "id": 1822, + "id": 2288, "path": "/sdk/android/getting-started/before-you-start", "relativePath": "sdk/android/getting-started/before-you-start", "sourcePath": "/sdk/android/getting-started/before-you-start", @@ -4297,12 +4297,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3192, + "sourceIndex": 3658, "contentFile": "content/docs/chat/sdk/android/getting-started/before-you-start.mdx", "navOrder": 130 }, { - "id": 1823, + "id": 2289, "path": "/sdk/android/getting-started/environment-specific-implementation", "relativePath": "sdk/android/getting-started/environment-specific-implementation", "sourcePath": "/sdk/android/getting-started/environment-specific-implementation", @@ -4315,12 +4315,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3193, + "sourceIndex": 3659, "contentFile": "content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx", "navOrder": 131 }, { - "id": 1824, + "id": 2290, "path": "/sdk/android/getting-started/authenticate-and-manage-session", "relativePath": "sdk/android/getting-started/authenticate-and-manage-session", "sourcePath": "/sdk/android/getting-started/authenticate-and-manage-session", @@ -4333,12 +4333,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3194, + "sourceIndex": 3660, "contentFile": "content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx", "navOrder": 132 }, { - "id": 1825, + "id": 2291, "path": "/sdk/android/getting-started/send-first-message", "relativePath": "sdk/android/getting-started/send-first-message", "sourcePath": "/sdk/android/getting-started/send-first-message", @@ -4351,17 +4351,17 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3195, + "sourceIndex": 3661, "contentFile": "content/docs/chat/sdk/android/getting-started/send-first-message.mdx", "navOrder": 133 }, { - "id": 1826, + "id": 2292, "path": "/sdk/android/user/overview-user", "relativePath": "sdk/android/user/overview-user", "sourcePath": "/sdk/android/user/overview-user", "title": "User overview", - "description": "Learn about user profiles, friendships, friend requests, blacklists, and online status in the Android SDK.", + "description": "Learn about current-user profiles, public user profiles, account settings, and online status in the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", @@ -4369,17 +4369,17 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3196, + "sourceIndex": 3662, "contentFile": "content/docs/chat/sdk/android/user/overview-user.mdx", "navOrder": 134 }, { - "id": 1827, + "id": 2293, "path": "/sdk/android/user/user-profile/get-users-info", "relativePath": "sdk/android/user/user-profile/get-users-info", "sourcePath": "/sdk/android/user/user-profile/get-users-info", "title": "Get specified user profiles", - "description": "Use getUsersInfo() to query public profiles by userID.", + "description": "Retrieve public user profiles in batches by userID using PublicUserInfo.", "product": "sdk", "version": "v4", "platform": "android", @@ -4387,12 +4387,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3197, + "sourceIndex": 3663, "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx", "navOrder": 135 }, { - "id": 1828, + "id": 2294, "path": "/sdk/android/user/user-profile/get-self-local-user-info", "relativePath": "sdk/android/user/user-profile/get-self-local-user-info", "sourcePath": "/sdk/android/user/user-profile/get-self-local-user-info", @@ -4405,12 +4405,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3198, + "sourceIndex": 3664, "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx", "navOrder": 136 }, { - "id": 1829, + "id": 2295, "path": "/sdk/android/user/user-profile/set-self-info", "relativePath": "sdk/android/user/user-profile/set-self-info", "sourcePath": "/sdk/android/user/user-profile/set-self-info", @@ -4423,12 +4423,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3199, + "sourceIndex": 3665, "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx", "navOrder": 137 }, { - "id": 1830, + "id": 2296, "path": "/sdk/android/user/user-profile/set-global-message-reception", "relativePath": "sdk/android/user/user-profile/set-global-message-reception", "sourcePath": "/sdk/android/user/user-profile/set-global-message-reception", @@ -4441,12 +4441,30 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3200, + "sourceIndex": 3666, "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx", "navOrder": 138 }, { - "id": 1831, + "id": 2297, + "path": "/sdk/android/user/user-profile/set-friend-add-permission", + "relativePath": "sdk/android/user/user-profile/set-friend-add-permission", + "sourcePath": "/sdk/android/user/user-profile/set-friend-add-permission", + "title": "Set friend request permissions", + "description": "Choose how friend requests sent to the current account are handled.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 3667, + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-friend-add-permission.mdx", + "navOrder": 139 + }, + { + "id": 2298, "path": "/sdk/android/user/online-status/subscribe-users-online-status", "relativePath": "sdk/android/user/online-status/subscribe-users-online-status", "sourcePath": "/sdk/android/user/online-status/subscribe-users-online-status", @@ -4459,12 +4477,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3201, + "sourceIndex": 3668, "contentFile": "content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx", - "navOrder": 139 + "navOrder": 140 }, { - "id": 1832, + "id": 2299, "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", "relativePath": "sdk/android/user/online-status/get-subscribe-online-users-status", "sourcePath": "/sdk/android/user/online-status/get-subscribe-online-users-status", @@ -4477,12 +4495,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3202, + "sourceIndex": 3669, "contentFile": "content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx", - "navOrder": 140 + "navOrder": 141 }, { - "id": 1833, + "id": 2300, "path": "/sdk/android/user/online-status/unsubscribe-users-online-status", "relativePath": "sdk/android/user/online-status/unsubscribe-users-online-status", "sourcePath": "/sdk/android/user/online-status/unsubscribe-users-online-status", @@ -4495,12 +4513,30 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3203, + "sourceIndex": 3670, "contentFile": "content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx", - "navOrder": 141 + "navOrder": 142 }, { - "id": 1834, + "id": 2301, + "path": "/sdk/android/user/overview-relationships", + "relativePath": "sdk/android/user/overview-relationships", + "sourcePath": "/sdk/android/user/overview-relationships", + "title": "Relationship overview", + "description": "Learn about friends, friend requests, and blacklist APIs in the Android SDK.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 3671, + "contentFile": "content/docs/chat/sdk/android/user/overview-relationships.mdx", + "navOrder": 143 + }, + { + "id": 2302, "path": "/sdk/android/user/friends/get-friend-list-page", "relativePath": "sdk/android/user/friends/get-friend-list-page", "sourcePath": "/sdk/android/user/friends/get-friend-list-page", @@ -4513,12 +4549,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3204, + "sourceIndex": 3672, "contentFile": "content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx", - "navOrder": 142 + "navOrder": 144 }, { - "id": 1835, + "id": 2303, "path": "/sdk/android/user/friends/search-friends", "relativePath": "sdk/android/user/friends/search-friends", "sourcePath": "/sdk/android/user/friends/search-friends", @@ -4531,12 +4567,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3205, + "sourceIndex": 3673, "contentFile": "content/docs/chat/sdk/android/user/friends/search-friends.mdx", - "navOrder": 143 + "navOrder": 145 }, { - "id": 1836, + "id": 2304, "path": "/sdk/android/user/friends/get-friends-info", "relativePath": "sdk/android/user/friends/get-friends-info", "sourcePath": "/sdk/android/user/friends/get-friends-info", @@ -4549,12 +4585,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3206, + "sourceIndex": 3674, "contentFile": "content/docs/chat/sdk/android/user/friends/get-friends-info.mdx", - "navOrder": 144 + "navOrder": 146 }, { - "id": 1837, + "id": 2305, "path": "/sdk/android/user/friends/check-friend", "relativePath": "sdk/android/user/friends/check-friend", "sourcePath": "/sdk/android/user/friends/check-friend", @@ -4567,12 +4603,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3207, + "sourceIndex": 3675, "contentFile": "content/docs/chat/sdk/android/user/friends/check-friend.mdx", - "navOrder": 145 + "navOrder": 147 }, { - "id": 1838, + "id": 2306, "path": "/sdk/android/user/friends/update-friends", "relativePath": "sdk/android/user/friends/update-friends", "sourcePath": "/sdk/android/user/friends/update-friends", @@ -4585,12 +4621,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3208, + "sourceIndex": 3676, "contentFile": "content/docs/chat/sdk/android/user/friends/update-friends.mdx", - "navOrder": 146 + "navOrder": 148 }, { - "id": 1839, + "id": 2307, "path": "/sdk/android/user/friends/delete-friend", "relativePath": "sdk/android/user/friends/delete-friend", "sourcePath": "/sdk/android/user/friends/delete-friend", @@ -4603,12 +4639,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3209, + "sourceIndex": 3677, "contentFile": "content/docs/chat/sdk/android/user/friends/delete-friend.mdx", - "navOrder": 147 + "navOrder": 149 }, { - "id": 1840, + "id": 2308, "path": "/sdk/android/user/friend-applications/add-friend", "relativePath": "sdk/android/user/friend-applications/add-friend", "sourcePath": "/sdk/android/user/friend-applications/add-friend", @@ -4621,12 +4657,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3210, + "sourceIndex": 3678, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx", - "navOrder": 148 + "navOrder": 150 }, { - "id": 1841, + "id": 2309, "path": "/sdk/android/user/friend-applications/get-recv-friend-application-list", "relativePath": "sdk/android/user/friend-applications/get-recv-friend-application-list", "sourcePath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", @@ -4639,12 +4675,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3211, + "sourceIndex": 3679, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx", - "navOrder": 149 + "navOrder": 151 }, { - "id": 1842, + "id": 2310, "path": "/sdk/android/user/friend-applications/get-send-friend-application-list", "relativePath": "sdk/android/user/friend-applications/get-send-friend-application-list", "sourcePath": "/sdk/android/user/friend-applications/get-send-friend-application-list", @@ -4657,12 +4693,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3212, + "sourceIndex": 3680, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx", - "navOrder": 150 + "navOrder": 152 }, { - "id": 1843, + "id": 2311, "path": "/sdk/android/user/friend-applications/accept-friend-application", "relativePath": "sdk/android/user/friend-applications/accept-friend-application", "sourcePath": "/sdk/android/user/friend-applications/accept-friend-application", @@ -4675,12 +4711,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3213, + "sourceIndex": 3681, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx", - "navOrder": 151 + "navOrder": 153 }, { - "id": 1844, + "id": 2312, "path": "/sdk/android/user/friend-applications/refuse-friend-application", "relativePath": "sdk/android/user/friend-applications/refuse-friend-application", "sourcePath": "/sdk/android/user/friend-applications/refuse-friend-application", @@ -4693,12 +4729,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3214, + "sourceIndex": 3682, "contentFile": "content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx", - "navOrder": 152 + "navOrder": 154 }, { - "id": 1845, + "id": 2313, "path": "/sdk/android/user/blacklist/get-blacklist", "relativePath": "sdk/android/user/blacklist/get-blacklist", "sourcePath": "/sdk/android/user/blacklist/get-blacklist", @@ -4711,12 +4747,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3215, + "sourceIndex": 3683, "contentFile": "content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx", - "navOrder": 153 + "navOrder": 155 }, { - "id": 1846, + "id": 2314, "path": "/sdk/android/user/blacklist/add-blacklist", "relativePath": "sdk/android/user/blacklist/add-blacklist", "sourcePath": "/sdk/android/user/blacklist/add-blacklist", @@ -4729,12 +4765,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3216, + "sourceIndex": 3684, "contentFile": "content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx", - "navOrder": 154 + "navOrder": 156 }, { - "id": 1847, + "id": 2315, "path": "/sdk/android/user/blacklist/remove-blacklist", "relativePath": "sdk/android/user/blacklist/remove-blacklist", "sourcePath": "/sdk/android/user/blacklist/remove-blacklist", @@ -4747,12 +4783,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3217, + "sourceIndex": 3685, "contentFile": "content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx", - "navOrder": 155 + "navOrder": 157 }, { - "id": 1848, + "id": 2316, "path": "/sdk/android/conversation/overview-conversation", "relativePath": "sdk/android/conversation/overview-conversation", "sourcePath": "/sdk/android/conversation/overview-conversation", @@ -4765,12 +4801,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3218, + "sourceIndex": 3686, "contentFile": "content/docs/chat/sdk/android/conversation/overview-conversation.mdx", - "navOrder": 156 + "navOrder": 158 }, { - "id": 1849, + "id": 2317, "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", "relativePath": "sdk/android/conversation/retrieving-conversations/get-conversation-by-target", "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", @@ -4783,12 +4819,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3219, + "sourceIndex": 3687, "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx", - "navOrder": 157 + "navOrder": 159 }, { - "id": 1850, + "id": 2318, "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", "relativePath": "sdk/android/conversation/retrieving-conversations/get-conversation-id", "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", @@ -4801,12 +4837,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3220, + "sourceIndex": 3688, "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx", - "navOrder": 158 + "navOrder": 160 }, { - "id": 1851, + "id": 2319, "path": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", "relativePath": "sdk/android/conversation/retrieving-conversations/get-conversations-by-id", "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", @@ -4819,12 +4855,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3221, + "sourceIndex": 3689, "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx", - "navOrder": 159 + "navOrder": 161 }, { - "id": 1852, + "id": 2320, "path": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", "relativePath": "sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", "sourcePath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", @@ -4837,12 +4873,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3222, + "sourceIndex": 3690, "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx", - "navOrder": 160 + "navOrder": 162 }, { - "id": 1853, + "id": 2321, "path": "/sdk/android/conversation/managing-conversations/pin-conversation", "relativePath": "sdk/android/conversation/managing-conversations/pin-conversation", "sourcePath": "/sdk/android/conversation/managing-conversations/pin-conversation", @@ -4855,12 +4891,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3223, + "sourceIndex": 3691, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx", - "navOrder": 161 + "navOrder": 163 }, { - "id": 1854, + "id": 2322, "path": "/sdk/android/conversation/managing-conversations/set-conversation-extension", "relativePath": "sdk/android/conversation/managing-conversations/set-conversation-extension", "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", @@ -4873,12 +4909,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3224, + "sourceIndex": 3692, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx", - "navOrder": 162 + "navOrder": 164 }, { - "id": 1855, + "id": 2323, "path": "/sdk/android/conversation/managing-conversations/set-conversation-draft", "relativePath": "sdk/android/conversation/managing-conversations/set-conversation-draft", "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", @@ -4891,12 +4927,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3225, + "sourceIndex": 3693, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx", - "navOrder": 163 + "navOrder": 165 }, { - "id": 1856, + "id": 2324, "path": "/sdk/android/conversation/managing-conversations/set-message-receive-option", "relativePath": "sdk/android/conversation/managing-conversations/set-message-receive-option", "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", @@ -4909,12 +4945,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3226, + "sourceIndex": 3694, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx", - "navOrder": 164 + "navOrder": 166 }, { - "id": 1857, + "id": 2325, "path": "/sdk/android/conversation/managing-conversations/clear-group-mentions", "relativePath": "sdk/android/conversation/managing-conversations/clear-group-mentions", "sourcePath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", @@ -4927,12 +4963,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3227, + "sourceIndex": 3695, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx", - "navOrder": 165 + "navOrder": 167 }, { - "id": 1858, + "id": 2326, "path": "/sdk/android/conversation/managing-conversations/mark-conversation-read", "relativePath": "sdk/android/conversation/managing-conversations/mark-conversation-read", "sourcePath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", @@ -4945,12 +4981,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3228, + "sourceIndex": 3696, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx", - "navOrder": 166 + "navOrder": 168 }, { - "id": 1859, + "id": 2327, "path": "/sdk/android/conversation/managing-conversations/get-total-unread-count", "relativePath": "sdk/android/conversation/managing-conversations/get-total-unread-count", "sourcePath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", @@ -4963,12 +4999,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3229, + "sourceIndex": 3697, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx", - "navOrder": 167 + "navOrder": 169 }, { - "id": 1860, + "id": 2328, "path": "/sdk/android/conversation/managing-conversations/set-private-chat", "relativePath": "sdk/android/conversation/managing-conversations/set-private-chat", "sourcePath": "/sdk/android/conversation/managing-conversations/set-private-chat", @@ -4981,12 +5017,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3230, + "sourceIndex": 3698, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx", - "navOrder": 168 + "navOrder": 170 }, { - "id": 1861, + "id": 2329, "path": "/sdk/android/conversation/managing-conversations/set-burn-duration", "relativePath": "sdk/android/conversation/managing-conversations/set-burn-duration", "sourcePath": "/sdk/android/conversation/managing-conversations/set-burn-duration", @@ -4999,12 +5035,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3231, + "sourceIndex": 3699, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx", - "navOrder": 169 + "navOrder": 171 }, { - "id": 1862, + "id": 2330, "path": "/sdk/android/conversation/managing-conversations/set-message-destruct", "relativePath": "sdk/android/conversation/managing-conversations/set-message-destruct", "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-destruct", @@ -5017,12 +5053,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3232, + "sourceIndex": 3700, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx", - "navOrder": 170 + "navOrder": 172 }, { - "id": 1863, + "id": 2331, "path": "/sdk/android/conversation/managing-conversations/hide-a-conversation", "relativePath": "sdk/android/conversation/managing-conversations/hide-a-conversation", "sourcePath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", @@ -5035,12 +5071,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3233, + "sourceIndex": 3701, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx", - "navOrder": 171 + "navOrder": 173 }, { - "id": 1864, + "id": 2332, "path": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", "relativePath": "sdk/android/conversation/managing-conversations/delete-conversation-with-messages", "sourcePath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", @@ -5053,12 +5089,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3234, + "sourceIndex": 3702, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx", - "navOrder": 172 + "navOrder": 174 }, { - "id": 1865, + "id": 2333, "path": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", "relativePath": "sdk/android/conversation/managing-conversations/clear-conversation-messages", "sourcePath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", @@ -5071,17 +5107,17 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3235, + "sourceIndex": 3703, "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx", - "navOrder": 173 + "navOrder": 175 }, { - "id": 1866, + "id": 2334, "path": "/sdk/android/group/overview-group", "relativePath": "sdk/android/group/overview-group", "sourcePath": "/sdk/android/group/overview-group", "title": "Group overview", - "description": "Learn how group profiles, members, applications, and group events are organized in the Android SDK.", + "description": "Understand group concepts, core data types, and main capabilities in the Android SDK.", "product": "sdk", "version": "v4", "platform": "android", @@ -5089,12 +5125,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3236, + "sourceIndex": 3704, "contentFile": "content/docs/chat/sdk/android/group/overview-group.mdx", - "navOrder": 174 + "navOrder": 176 }, { - "id": 1867, + "id": 2335, "path": "/sdk/android/group/create-group", "relativePath": "sdk/android/group/create-group", "sourcePath": "/sdk/android/group/create-group", @@ -5107,12 +5143,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3237, + "sourceIndex": 3705, "contentFile": "content/docs/chat/sdk/android/group/create-group.mdx", - "navOrder": 175 + "navOrder": 177 }, { - "id": 1868, + "id": 2336, "path": "/sdk/android/group/update-group-profile", "relativePath": "sdk/android/group/update-group-profile", "sourcePath": "/sdk/android/group/update-group-profile", @@ -5125,12 +5161,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3238, + "sourceIndex": 3706, "contentFile": "content/docs/chat/sdk/android/group/update-group-profile.mdx", - "navOrder": 176 + "navOrder": 178 }, { - "id": 1869, + "id": 2337, "path": "/sdk/android/group/set-group-announcement", "relativePath": "sdk/android/group/set-group-announcement", "sourcePath": "/sdk/android/group/set-group-announcement", @@ -5143,12 +5179,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3239, + "sourceIndex": 3707, "contentFile": "content/docs/chat/sdk/android/group/set-group-announcement.mdx", - "navOrder": 177 + "navOrder": 179 }, { - "id": 1870, + "id": 2338, "path": "/sdk/android/group/set-group-extension", "relativePath": "sdk/android/group/set-group-extension", "sourcePath": "/sdk/android/group/set-group-extension", @@ -5161,12 +5197,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3240, + "sourceIndex": 3708, "contentFile": "content/docs/chat/sdk/android/group/set-group-extension.mdx", - "navOrder": 178 + "navOrder": 180 }, { - "id": 1871, + "id": 2339, "path": "/sdk/android/group/set-group-join-verification", "relativePath": "sdk/android/group/set-group-join-verification", "sourcePath": "/sdk/android/group/set-group-join-verification", @@ -5179,12 +5215,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3241, + "sourceIndex": 3709, "contentFile": "content/docs/chat/sdk/android/group/set-group-join-verification.mdx", - "navOrder": 179 + "navOrder": 181 }, { - "id": 1872, + "id": 2340, "path": "/sdk/android/group/set-group-member-profile-access", "relativePath": "sdk/android/group/set-group-member-profile-access", "sourcePath": "/sdk/android/group/set-group-member-profile-access", @@ -5197,12 +5233,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3242, + "sourceIndex": 3710, "contentFile": "content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx", - "navOrder": 180 + "navOrder": 182 }, { - "id": 1873, + "id": 2341, "path": "/sdk/android/group/set-group-member-friend-permission", "relativePath": "sdk/android/group/set-group-member-friend-permission", "sourcePath": "/sdk/android/group/set-group-member-friend-permission", @@ -5215,12 +5251,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3243, + "sourceIndex": 3711, "contentFile": "content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx", - "navOrder": 181 + "navOrder": 183 }, { - "id": 1874, + "id": 2342, "path": "/sdk/android/group/change-group-mute", "relativePath": "sdk/android/group/change-group-mute", "sourcePath": "/sdk/android/group/change-group-mute", @@ -5233,12 +5269,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3244, + "sourceIndex": 3712, "contentFile": "content/docs/chat/sdk/android/group/change-group-mute.mdx", - "navOrder": 182 + "navOrder": 184 }, { - "id": 1875, + "id": 2343, "path": "/sdk/android/group/join-group", "relativePath": "sdk/android/group/join-group", "sourcePath": "/sdk/android/group/join-group", @@ -5251,12 +5287,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3245, + "sourceIndex": 3713, "contentFile": "content/docs/chat/sdk/android/group/join-group.mdx", - "navOrder": 183 + "navOrder": 185 }, { - "id": 1876, + "id": 2344, "path": "/sdk/android/group/quit-group", "relativePath": "sdk/android/group/quit-group", "sourcePath": "/sdk/android/group/quit-group", @@ -5269,12 +5305,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3246, + "sourceIndex": 3714, "contentFile": "content/docs/chat/sdk/android/group/quit-group.mdx", - "navOrder": 184 + "navOrder": 186 }, { - "id": 1877, + "id": 2345, "path": "/sdk/android/group/dismiss-group", "relativePath": "sdk/android/group/dismiss-group", "sourcePath": "/sdk/android/group/dismiss-group", @@ -5287,12 +5323,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3247, + "sourceIndex": 3715, "contentFile": "content/docs/chat/sdk/android/group/dismiss-group.mdx", - "navOrder": 185 + "navOrder": 187 }, { - "id": 1878, + "id": 2346, "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", "relativePath": "sdk/android/group/retrieving-groups/get-specified-groups-info", "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", @@ -5305,12 +5341,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3248, + "sourceIndex": 3716, "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx", - "navOrder": 186 + "navOrder": 188 }, { - "id": 1879, + "id": 2347, "path": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", "relativePath": "sdk/android/group/retrieving-groups/get-joined-group-list-page", "sourcePath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", @@ -5323,12 +5359,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3249, + "sourceIndex": 3717, "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx", - "navOrder": 187 + "navOrder": 189 }, { - "id": 1880, + "id": 2348, "path": "/sdk/android/group/retrieving-groups/is-join-group", "relativePath": "sdk/android/group/retrieving-groups/is-join-group", "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", @@ -5341,12 +5377,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3250, + "sourceIndex": 3718, "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx", - "navOrder": 188 + "navOrder": 190 }, { - "id": 1881, + "id": 2349, "path": "/sdk/android/group/retrieving-groups/search-groups", "relativePath": "sdk/android/group/retrieving-groups/search-groups", "sourcePath": "/sdk/android/group/retrieving-groups/search-groups", @@ -5359,12 +5395,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3251, + "sourceIndex": 3719, "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx", - "navOrder": 189 + "navOrder": 191 }, { - "id": 1882, + "id": 2350, "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", "relativePath": "sdk/android/group/group-applications/get-group-application-list-as-recipient", "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", @@ -5377,12 +5413,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3252, + "sourceIndex": 3720, "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx", - "navOrder": 190 + "navOrder": 192 }, { - "id": 1883, + "id": 2351, "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", "relativePath": "sdk/android/group/group-applications/get-group-application-list-as-applicant", "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", @@ -5395,12 +5431,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3253, + "sourceIndex": 3721, "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx", - "navOrder": 191 + "navOrder": 193 }, { - "id": 1884, + "id": 2352, "path": "/sdk/android/group/group-applications/accept-group-application", "relativePath": "sdk/android/group/group-applications/accept-group-application", "sourcePath": "/sdk/android/group/group-applications/accept-group-application", @@ -5413,12 +5449,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3254, + "sourceIndex": 3722, "contentFile": "content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx", - "navOrder": 192 + "navOrder": 194 }, { - "id": 1885, + "id": 2353, "path": "/sdk/android/group/group-applications/refuse-group-application", "relativePath": "sdk/android/group/group-applications/refuse-group-application", "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", @@ -5431,12 +5467,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3255, + "sourceIndex": 3723, "contentFile": "content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx", - "navOrder": 193 + "navOrder": 195 }, { - "id": 1886, + "id": 2354, "path": "/sdk/android/group/group-applications/delete-group-requests", "relativePath": "sdk/android/group/group-applications/delete-group-requests", "sourcePath": "/sdk/android/group/group-applications/delete-group-requests", @@ -5449,12 +5485,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3256, + "sourceIndex": 3724, "contentFile": "content/docs/chat/sdk/android/group/group-applications/delete-group-requests.mdx", - "navOrder": 194 + "navOrder": 196 }, { - "id": 1887, + "id": 2355, "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", "relativePath": "sdk/android/group/retrieving-group-members/get-group-member-list", "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", @@ -5467,12 +5503,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3257, + "sourceIndex": 3725, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx", - "navOrder": 195 + "navOrder": 197 }, { - "id": 1888, + "id": 2356, "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", "relativePath": "sdk/android/group/retrieving-group-members/get-specified-group-members-info", "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", @@ -5485,12 +5521,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3258, + "sourceIndex": 3726, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx", - "navOrder": 196 + "navOrder": 198 }, { - "id": 1889, + "id": 2357, "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", "relativePath": "sdk/android/group/retrieving-group-members/get-users-in-group", "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", @@ -5503,12 +5539,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3259, + "sourceIndex": 3727, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx", - "navOrder": 197 + "navOrder": 199 }, { - "id": 1890, + "id": 2358, "path": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", "relativePath": "sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", @@ -5521,12 +5557,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3260, + "sourceIndex": 3728, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx", - "navOrder": 198 + "navOrder": 200 }, { - "id": 1891, + "id": 2359, "path": "/sdk/android/group/retrieving-group-members/search-group-members", "relativePath": "sdk/android/group/retrieving-group-members/search-group-members", "sourcePath": "/sdk/android/group/retrieving-group-members/search-group-members", @@ -5539,12 +5575,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3261, + "sourceIndex": 3729, "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx", - "navOrder": 199 + "navOrder": 201 }, { - "id": 1892, + "id": 2360, "path": "/sdk/android/group/managing-group-members/invite-user-to-group", "relativePath": "sdk/android/group/managing-group-members/invite-user-to-group", "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", @@ -5557,12 +5593,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3262, + "sourceIndex": 3730, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx", - "navOrder": 200 + "navOrder": 202 }, { - "id": 1893, + "id": 2361, "path": "/sdk/android/group/managing-group-members/kick-group-member", "relativePath": "sdk/android/group/managing-group-members/kick-group-member", "sourcePath": "/sdk/android/group/managing-group-members/kick-group-member", @@ -5575,12 +5611,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3263, + "sourceIndex": 3731, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx", - "navOrder": 201 + "navOrder": 203 }, { - "id": 1894, + "id": 2362, "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", "relativePath": "sdk/android/group/managing-group-members/set-group-member-nickname", "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", @@ -5593,12 +5629,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3264, + "sourceIndex": 3732, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx", - "navOrder": 202 + "navOrder": 204 }, { - "id": 1895, + "id": 2363, "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", "relativePath": "sdk/android/group/managing-group-members/set-group-member-role-level", "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", @@ -5611,12 +5647,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3265, + "sourceIndex": 3733, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx", - "navOrder": 203 + "navOrder": 205 }, { - "id": 1896, + "id": 2364, "path": "/sdk/android/group/managing-group-members/set-group-member-avatar", "relativePath": "sdk/android/group/managing-group-members/set-group-member-avatar", "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-avatar", @@ -5629,12 +5665,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3266, + "sourceIndex": 3734, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx", - "navOrder": 204 + "navOrder": 206 }, { - "id": 1897, + "id": 2365, "path": "/sdk/android/group/managing-group-members/set-group-member-extension", "relativePath": "sdk/android/group/managing-group-members/set-group-member-extension", "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-extension", @@ -5647,12 +5683,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3267, + "sourceIndex": 3735, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx", - "navOrder": 205 + "navOrder": 207 }, { - "id": 1898, + "id": 2366, "path": "/sdk/android/group/managing-group-members/transfer-group-owner", "relativePath": "sdk/android/group/managing-group-members/transfer-group-owner", "sourcePath": "/sdk/android/group/managing-group-members/transfer-group-owner", @@ -5665,12 +5701,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3268, + "sourceIndex": 3736, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx", - "navOrder": 206 + "navOrder": 208 }, { - "id": 1899, + "id": 2367, "path": "/sdk/android/group/managing-group-members/change-group-member-mute", "relativePath": "sdk/android/group/managing-group-members/change-group-member-mute", "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", @@ -5683,12 +5719,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3269, + "sourceIndex": 3737, "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx", - "navOrder": 207 + "navOrder": 209 }, { - "id": 1900, + "id": 2368, "path": "/sdk/android/message/overview-message", "relativePath": "sdk/android/message/overview-message", "sourcePath": "/sdk/android/message/overview-message", @@ -5701,12 +5737,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3270, + "sourceIndex": 3738, "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx", - "navOrder": 208 + "navOrder": 210 }, { - "id": 1901, + "id": 2369, "path": "/sdk/android/message/creating-messages/create-text-message", "relativePath": "sdk/android/message/creating-messages/create-text-message", "sourcePath": "/sdk/android/message/creating-messages/create-text-message", @@ -5719,12 +5755,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3271, + "sourceIndex": 3739, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx", - "navOrder": 209 + "navOrder": 211 }, { - "id": 1902, + "id": 2370, "path": "/sdk/android/message/creating-messages/create-text-at-message", "relativePath": "sdk/android/message/creating-messages/create-text-at-message", "sourcePath": "/sdk/android/message/creating-messages/create-text-at-message", @@ -5737,12 +5773,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3272, + "sourceIndex": 3740, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx", - "navOrder": 210 + "navOrder": 212 }, { - "id": 1903, + "id": 2371, "path": "/sdk/android/message/creating-messages/create-custom-message", "relativePath": "sdk/android/message/creating-messages/create-custom-message", "sourcePath": "/sdk/android/message/creating-messages/create-custom-message", @@ -5755,12 +5791,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3273, + "sourceIndex": 3741, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx", - "navOrder": 211 + "navOrder": 213 }, { - "id": 1904, + "id": 2372, "path": "/sdk/android/message/creating-messages/create-image-message", "relativePath": "sdk/android/message/creating-messages/create-image-message", "sourcePath": "/sdk/android/message/creating-messages/create-image-message", @@ -5773,12 +5809,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3274, + "sourceIndex": 3742, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx", - "navOrder": 212 + "navOrder": 214 }, { - "id": 1905, + "id": 2373, "path": "/sdk/android/message/creating-messages/create-image-message-by-file", "relativePath": "sdk/android/message/creating-messages/create-image-message-by-file", "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-file", @@ -5791,12 +5827,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3275, + "sourceIndex": 3743, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx", - "navOrder": 213 + "navOrder": 215 }, { - "id": 1906, + "id": 2374, "path": "/sdk/android/message/creating-messages/create-image-message-by-url", "relativePath": "sdk/android/message/creating-messages/create-image-message-by-url", "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-url", @@ -5809,12 +5845,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3276, + "sourceIndex": 3744, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx", - "navOrder": 214 + "navOrder": 216 }, { - "id": 1907, + "id": 2375, "path": "/sdk/android/message/creating-messages/create-sound-message", "relativePath": "sdk/android/message/creating-messages/create-sound-message", "sourcePath": "/sdk/android/message/creating-messages/create-sound-message", @@ -5827,12 +5863,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3277, + "sourceIndex": 3745, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx", - "navOrder": 215 + "navOrder": 217 }, { - "id": 1908, + "id": 2376, "path": "/sdk/android/message/creating-messages/create-sound-message-by-file", "relativePath": "sdk/android/message/creating-messages/create-sound-message-by-file", "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-file", @@ -5845,12 +5881,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3278, + "sourceIndex": 3746, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx", - "navOrder": 216 + "navOrder": 218 }, { - "id": 1909, + "id": 2377, "path": "/sdk/android/message/creating-messages/create-sound-message-by-url", "relativePath": "sdk/android/message/creating-messages/create-sound-message-by-url", "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-url", @@ -5863,12 +5899,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3279, + "sourceIndex": 3747, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx", - "navOrder": 217 + "navOrder": 219 }, { - "id": 1910, + "id": 2378, "path": "/sdk/android/message/creating-messages/create-video-message", "relativePath": "sdk/android/message/creating-messages/create-video-message", "sourcePath": "/sdk/android/message/creating-messages/create-video-message", @@ -5881,12 +5917,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3280, + "sourceIndex": 3748, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx", - "navOrder": 218 + "navOrder": 220 }, { - "id": 1911, + "id": 2379, "path": "/sdk/android/message/creating-messages/create-video-message-by-file", "relativePath": "sdk/android/message/creating-messages/create-video-message-by-file", "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-file", @@ -5899,12 +5935,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3281, + "sourceIndex": 3749, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx", - "navOrder": 219 + "navOrder": 221 }, { - "id": 1912, + "id": 2380, "path": "/sdk/android/message/creating-messages/create-video-message-by-url", "relativePath": "sdk/android/message/creating-messages/create-video-message-by-url", "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-url", @@ -5917,12 +5953,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3282, + "sourceIndex": 3750, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx", - "navOrder": 220 + "navOrder": 222 }, { - "id": 1913, + "id": 2381, "path": "/sdk/android/message/creating-messages/create-file-message", "relativePath": "sdk/android/message/creating-messages/create-file-message", "sourcePath": "/sdk/android/message/creating-messages/create-file-message", @@ -5935,12 +5971,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3283, + "sourceIndex": 3751, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx", - "navOrder": 221 + "navOrder": 223 }, { - "id": 1914, + "id": 2382, "path": "/sdk/android/message/creating-messages/create-file-message-by-file", "relativePath": "sdk/android/message/creating-messages/create-file-message-by-file", "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-file", @@ -5953,12 +5989,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3284, + "sourceIndex": 3752, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx", - "navOrder": 222 + "navOrder": 224 }, { - "id": 1915, + "id": 2383, "path": "/sdk/android/message/creating-messages/create-file-message-by-url", "relativePath": "sdk/android/message/creating-messages/create-file-message-by-url", "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-url", @@ -5971,12 +6007,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3285, + "sourceIndex": 3753, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx", - "navOrder": 223 + "navOrder": 225 }, { - "id": 1916, + "id": 2384, "path": "/sdk/android/message/creating-messages/create-card-message", "relativePath": "sdk/android/message/creating-messages/create-card-message", "sourcePath": "/sdk/android/message/creating-messages/create-card-message", @@ -5989,12 +6025,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3286, + "sourceIndex": 3754, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx", - "navOrder": 224 + "navOrder": 226 }, { - "id": 1917, + "id": 2385, "path": "/sdk/android/message/creating-messages/create-location-message", "relativePath": "sdk/android/message/creating-messages/create-location-message", "sourcePath": "/sdk/android/message/creating-messages/create-location-message", @@ -6007,12 +6043,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3287, + "sourceIndex": 3755, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx", - "navOrder": 225 + "navOrder": 227 }, { - "id": 1918, + "id": 2386, "path": "/sdk/android/message/creating-messages/create-face-message", "relativePath": "sdk/android/message/creating-messages/create-face-message", "sourcePath": "/sdk/android/message/creating-messages/create-face-message", @@ -6025,12 +6061,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3288, + "sourceIndex": 3756, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx", - "navOrder": 226 + "navOrder": 228 }, { - "id": 1919, + "id": 2387, "path": "/sdk/android/message/creating-messages/create-quote-message", "relativePath": "sdk/android/message/creating-messages/create-quote-message", "sourcePath": "/sdk/android/message/creating-messages/create-quote-message", @@ -6043,12 +6079,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3289, + "sourceIndex": 3757, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx", - "navOrder": 227 + "navOrder": 229 }, { - "id": 1920, + "id": 2388, "path": "/sdk/android/message/creating-messages/create-advanced-text-message", "relativePath": "sdk/android/message/creating-messages/create-advanced-text-message", "sourcePath": "/sdk/android/message/creating-messages/create-advanced-text-message", @@ -6061,12 +6097,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3290, + "sourceIndex": 3758, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx", - "navOrder": 228 + "navOrder": 230 }, { - "id": 1921, + "id": 2389, "path": "/sdk/android/message/creating-messages/create-advanced-quote-message", "relativePath": "sdk/android/message/creating-messages/create-advanced-quote-message", "sourcePath": "/sdk/android/message/creating-messages/create-advanced-quote-message", @@ -6079,12 +6115,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3291, + "sourceIndex": 3759, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx", - "navOrder": 229 + "navOrder": 231 }, { - "id": 1922, + "id": 2390, "path": "/sdk/android/message/creating-messages/create-forward-message", "relativePath": "sdk/android/message/creating-messages/create-forward-message", "sourcePath": "/sdk/android/message/creating-messages/create-forward-message", @@ -6097,12 +6133,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3292, + "sourceIndex": 3760, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx", - "navOrder": 230 + "navOrder": 232 }, { - "id": 1923, + "id": 2391, "path": "/sdk/android/message/creating-messages/create-merger-message", "relativePath": "sdk/android/message/creating-messages/create-merger-message", "sourcePath": "/sdk/android/message/creating-messages/create-merger-message", @@ -6115,12 +6151,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3293, + "sourceIndex": 3761, "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx", - "navOrder": 231 + "navOrder": 233 }, { - "id": 1924, + "id": 2392, "path": "/sdk/android/message/sending-messages/send-message", "relativePath": "sdk/android/message/sending-messages/send-message", "sourcePath": "/sdk/android/message/sending-messages/send-message", @@ -6133,12 +6169,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3294, + "sourceIndex": 3762, "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message.mdx", - "navOrder": 232 + "navOrder": 234 }, { - "id": 1925, + "id": 2393, "path": "/sdk/android/message/sending-messages/send-message-not-oss", "relativePath": "sdk/android/message/sending-messages/send-message-not-oss", "sourcePath": "/sdk/android/message/sending-messages/send-message-not-oss", @@ -6151,12 +6187,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3295, + "sourceIndex": 3763, "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx", - "navOrder": 233 + "navOrder": 235 }, { - "id": 1926, + "id": 2394, "path": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", "relativePath": "sdk/android/message/sending-messages/set-msg-send-progress-listener", "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", @@ -6169,12 +6205,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3296, + "sourceIndex": 3764, "contentFile": "content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx", - "navOrder": 234 + "navOrder": 236 }, { - "id": 1927, + "id": 2395, "path": "/sdk/android/message/receiving-messages/receive-messages", "relativePath": "sdk/android/message/receiving-messages/receive-messages", "sourcePath": "/sdk/android/message/receiving-messages/receive-messages", @@ -6187,12 +6223,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3297, + "sourceIndex": 3765, "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx", - "navOrder": 235 + "navOrder": 237 }, { - "id": 1928, + "id": 2396, "path": "/sdk/android/message/receiving-messages/receive-custom-business-messages", "relativePath": "sdk/android/message/receiving-messages/receive-custom-business-messages", "sourcePath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", @@ -6205,12 +6241,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3298, + "sourceIndex": 3766, "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx", - "navOrder": 236 + "navOrder": 238 }, { - "id": 1929, + "id": 2397, "path": "/sdk/android/message/retrieving-messages/load-older-messages", "relativePath": "sdk/android/message/retrieving-messages/load-older-messages", "sourcePath": "/sdk/android/message/retrieving-messages/load-older-messages", @@ -6223,12 +6259,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3299, + "sourceIndex": 3767, "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx", - "navOrder": 237 + "navOrder": 239 }, { - "id": 1930, + "id": 2398, "path": "/sdk/android/message/retrieving-messages/load-newer-messages", "relativePath": "sdk/android/message/retrieving-messages/load-newer-messages", "sourcePath": "/sdk/android/message/retrieving-messages/load-newer-messages", @@ -6241,12 +6277,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3300, + "sourceIndex": 3768, "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx", - "navOrder": 238 + "navOrder": 240 }, { - "id": 1931, + "id": 2399, "path": "/sdk/android/message/retrieving-messages/find-messages-by-id", "relativePath": "sdk/android/message/retrieving-messages/find-messages-by-id", "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", @@ -6259,12 +6295,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3301, + "sourceIndex": 3769, "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx", - "navOrder": 239 + "navOrder": 241 }, { - "id": 1932, + "id": 2400, "path": "/sdk/android/message/retrieving-messages/load-message-context", "relativePath": "sdk/android/message/retrieving-messages/load-message-context", "sourcePath": "/sdk/android/message/retrieving-messages/load-message-context", @@ -6277,12 +6313,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3302, + "sourceIndex": 3770, "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx", - "navOrder": 240 + "navOrder": 242 }, { - "id": 1933, + "id": 2401, "path": "/sdk/android/message/searching-messages/search-messages", "relativePath": "sdk/android/message/searching-messages/search-messages", "sourcePath": "/sdk/android/message/searching-messages/search-messages", @@ -6295,12 +6331,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3303, + "sourceIndex": 3771, "contentFile": "content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx", - "navOrder": 241 + "navOrder": 243 }, { - "id": 1934, + "id": 2402, "path": "/sdk/android/message/composing-messages/update-typing-status", "relativePath": "sdk/android/message/composing-messages/update-typing-status", "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", @@ -6313,12 +6349,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3304, + "sourceIndex": 3772, "contentFile": "content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx", - "navOrder": 242 + "navOrder": 244 }, { - "id": 1935, + "id": 2403, "path": "/sdk/android/message/composing-messages/get-typing-status", "relativePath": "sdk/android/message/composing-messages/get-typing-status", "sourcePath": "/sdk/android/message/composing-messages/get-typing-status", @@ -6331,12 +6367,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3305, + "sourceIndex": 3773, "contentFile": "content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx", - "navOrder": 243 + "navOrder": 245 }, { - "id": 1936, + "id": 2404, "path": "/sdk/android/message/managing-messages/delete-local-message", "relativePath": "sdk/android/message/managing-messages/delete-local-message", "sourcePath": "/sdk/android/message/managing-messages/delete-local-message", @@ -6349,12 +6385,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3306, + "sourceIndex": 3774, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx", - "navOrder": 244 + "navOrder": 246 }, { - "id": 1937, + "id": 2405, "path": "/sdk/android/message/managing-messages/delete-saved-messages", "relativePath": "sdk/android/message/managing-messages/delete-saved-messages", "sourcePath": "/sdk/android/message/managing-messages/delete-saved-messages", @@ -6367,12 +6403,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3307, + "sourceIndex": 3775, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx", - "navOrder": 245 + "navOrder": 247 }, { - "id": 1938, + "id": 2406, "path": "/sdk/android/message/managing-messages/delete-user-messages", "relativePath": "sdk/android/message/managing-messages/delete-user-messages", "sourcePath": "/sdk/android/message/managing-messages/delete-user-messages", @@ -6385,12 +6421,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3308, + "sourceIndex": 3776, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx", - "navOrder": 246 + "navOrder": 248 }, { - "id": 1939, + "id": 2407, "path": "/sdk/android/message/managing-messages/revoke-a-message", "relativePath": "sdk/android/message/managing-messages/revoke-a-message", "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", @@ -6403,12 +6439,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3309, + "sourceIndex": 3777, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx", - "navOrder": 247 + "navOrder": 249 }, { - "id": 1940, + "id": 2408, "path": "/sdk/android/message/managing-messages/modify-a-message", "relativePath": "sdk/android/message/managing-messages/modify-a-message", "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", @@ -6421,12 +6457,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3310, + "sourceIndex": 3778, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx", - "navOrder": 248 + "navOrder": 250 }, { - "id": 1941, + "id": 2409, "path": "/sdk/android/message/managing-messages/get-pinned-messages", "relativePath": "sdk/android/message/managing-messages/get-pinned-messages", "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", @@ -6439,12 +6475,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3311, + "sourceIndex": 3779, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx", - "navOrder": 249 + "navOrder": 251 }, { - "id": 1942, + "id": 2410, "path": "/sdk/android/message/managing-messages/set-message-pinned", "relativePath": "sdk/android/message/managing-messages/set-message-pinned", "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", @@ -6457,12 +6493,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3312, + "sourceIndex": 3780, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx", - "navOrder": 250 + "navOrder": 252 }, { - "id": 1943, + "id": 2411, "path": "/sdk/android/message/managing-messages/insert-local-single-message", "relativePath": "sdk/android/message/managing-messages/insert-local-single-message", "sourcePath": "/sdk/android/message/managing-messages/insert-local-single-message", @@ -6475,12 +6511,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3313, + "sourceIndex": 3781, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx", - "navOrder": 251 + "navOrder": 253 }, { - "id": 1944, + "id": 2412, "path": "/sdk/android/message/managing-messages/insert-local-group-message", "relativePath": "sdk/android/message/managing-messages/insert-local-group-message", "sourcePath": "/sdk/android/message/managing-messages/insert-local-group-message", @@ -6493,12 +6529,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3314, + "sourceIndex": 3782, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx", - "navOrder": 252 + "navOrder": 254 }, { - "id": 1945, + "id": 2413, "path": "/sdk/android/message/managing-messages/clear-all-local-messages", "relativePath": "sdk/android/message/managing-messages/clear-all-local-messages", "sourcePath": "/sdk/android/message/managing-messages/clear-all-local-messages", @@ -6511,12 +6547,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3315, + "sourceIndex": 3783, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx", - "navOrder": 253 + "navOrder": 255 }, { - "id": 1946, + "id": 2414, "path": "/sdk/android/message/managing-messages/clear-all-messages", "relativePath": "sdk/android/message/managing-messages/clear-all-messages", "sourcePath": "/sdk/android/message/managing-messages/clear-all-messages", @@ -6529,12 +6565,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3316, + "sourceIndex": 3784, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx", - "navOrder": 254 + "navOrder": 256 }, { - "id": 1947, + "id": 2415, "path": "/sdk/android/message/managing-messages/set-message-local-ex", "relativePath": "sdk/android/message/managing-messages/set-message-local-ex", "sourcePath": "/sdk/android/message/managing-messages/set-message-local-ex", @@ -6547,12 +6583,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3317, + "sourceIndex": 3785, "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx", - "navOrder": 255 + "navOrder": 257 }, { - "id": 1948, + "id": 2416, "path": "/sdk/android/message/managing-read-status/send-group-read-receipts", "relativePath": "sdk/android/message/managing-read-status/send-group-read-receipts", "sourcePath": "/sdk/android/message/managing-read-status/send-group-read-receipts", @@ -6565,12 +6601,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3318, + "sourceIndex": 3786, "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx", - "navOrder": 256 + "navOrder": 258 }, { - "id": 1949, + "id": 2417, "path": "/sdk/android/message/managing-read-status/get-group-message-readers", "relativePath": "sdk/android/message/managing-read-status/get-group-message-readers", "sourcePath": "/sdk/android/message/managing-read-status/get-group-message-readers", @@ -6583,12 +6619,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3319, + "sourceIndex": 3787, "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx", - "navOrder": 257 + "navOrder": 259 }, { - "id": 1950, + "id": 2418, "path": "/sdk/android/file-uploads/upload-file", "relativePath": "sdk/android/file-uploads/upload-file", "sourcePath": "/sdk/android/file-uploads/upload-file", @@ -6601,12 +6637,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3320, + "sourceIndex": 3788, "contentFile": "content/docs/chat/sdk/android/file-uploads/upload-file.mdx", - "navOrder": 258 + "navOrder": 260 }, { - "id": 1951, + "id": 2419, "path": "/sdk/android/calling/overview-calling", "relativePath": "sdk/android/calling/overview-calling", "sourcePath": "/sdk/android/calling/overview-calling", @@ -6619,12 +6655,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3321, + "sourceIndex": 3789, "contentFile": "content/docs/chat/sdk/android/calling/overview-calling.mdx", - "navOrder": 259 + "navOrder": 261 }, { - "id": 1952, + "id": 2420, "path": "/sdk/android/calling/managing-calls/start-single-call", "relativePath": "sdk/android/calling/managing-calls/start-single-call", "sourcePath": "/sdk/android/calling/managing-calls/start-single-call", @@ -6637,12 +6673,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3322, + "sourceIndex": 3790, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx", - "navOrder": 260 + "navOrder": 262 }, { - "id": 1953, + "id": 2421, "path": "/sdk/android/calling/managing-calls/start-group-call", "relativePath": "sdk/android/calling/managing-calls/start-group-call", "sourcePath": "/sdk/android/calling/managing-calls/start-group-call", @@ -6655,12 +6691,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3323, + "sourceIndex": 3791, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx", - "navOrder": 261 + "navOrder": 263 }, { - "id": 1954, + "id": 2422, "path": "/sdk/android/calling/managing-calls/accept-call", "relativePath": "sdk/android/calling/managing-calls/accept-call", "sourcePath": "/sdk/android/calling/managing-calls/accept-call", @@ -6673,12 +6709,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3324, + "sourceIndex": 3792, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx", - "navOrder": 262 + "navOrder": 264 }, { - "id": 1955, + "id": 2423, "path": "/sdk/android/calling/managing-calls/reject-call", "relativePath": "sdk/android/calling/managing-calls/reject-call", "sourcePath": "/sdk/android/calling/managing-calls/reject-call", @@ -6691,12 +6727,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3325, + "sourceIndex": 3793, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx", - "navOrder": 263 + "navOrder": 265 }, { - "id": 1956, + "id": 2424, "path": "/sdk/android/calling/managing-calls/cancel-call", "relativePath": "sdk/android/calling/managing-calls/cancel-call", "sourcePath": "/sdk/android/calling/managing-calls/cancel-call", @@ -6709,12 +6745,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3326, + "sourceIndex": 3794, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx", - "navOrder": 264 + "navOrder": 266 }, { - "id": 1957, + "id": 2425, "path": "/sdk/android/calling/managing-calls/hang-up-call", "relativePath": "sdk/android/calling/managing-calls/hang-up-call", "sourcePath": "/sdk/android/calling/managing-calls/hang-up-call", @@ -6727,12 +6763,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3327, + "sourceIndex": 3795, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx", - "navOrder": 265 + "navOrder": 267 }, { - "id": 1958, + "id": 2426, "path": "/sdk/android/calling/managing-calls/handle-call-events", "relativePath": "sdk/android/calling/managing-calls/handle-call-events", "sourcePath": "/sdk/android/calling/managing-calls/handle-call-events", @@ -6745,12 +6781,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3328, + "sourceIndex": 3796, "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx", - "navOrder": 266 + "navOrder": 268 }, { - "id": 1959, + "id": 2427, "path": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", "relativePath": "sdk/android/calling/retrieving-call-information/restore-pending-invitation", "sourcePath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", @@ -6763,12 +6799,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3329, + "sourceIndex": 3797, "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx", - "navOrder": 267 + "navOrder": 269 }, { - "id": 1960, + "id": 2428, "path": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", "relativePath": "sdk/android/calling/retrieving-call-information/get-room-by-group-id", "sourcePath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", @@ -6781,12 +6817,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3330, + "sourceIndex": 3798, "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx", - "navOrder": 268 + "navOrder": 270 }, { - "id": 1961, + "id": 2429, "path": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", "relativePath": "sdk/android/calling/retrieving-call-information/get-token-by-room-id", "sourcePath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", @@ -6799,12 +6835,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3331, + "sourceIndex": 3799, "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx", - "navOrder": 269 + "navOrder": 271 }, { - "id": 1962, + "id": 2430, "path": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", "relativePath": "sdk/android/calling/sending-custom-signals/send-a-custom-signal", "sourcePath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", @@ -6817,12 +6853,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3332, + "sourceIndex": 3800, "contentFile": "content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx", - "navOrder": 270 + "navOrder": 272 }, { - "id": 1963, + "id": 2431, "path": "/sdk/android/events/overview-events", "relativePath": "sdk/android/events/overview-events", "sourcePath": "/sdk/android/events/overview-events", @@ -6835,12 +6871,12 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3333, + "sourceIndex": 3801, "contentFile": "content/docs/chat/sdk/android/events/overview-events.mdx", - "navOrder": 271 + "navOrder": 273 }, { - "id": 1964, + "id": 2432, "path": "/sdk/android/logger", "relativePath": "sdk/android/logger", "sourcePath": "/sdk/android/logger", @@ -6853,9 +6889,9 @@ "contextTitle": "SDKs · Android · v4", "template": "guide", "status": "published", - "sourceIndex": 3334, + "sourceIndex": 3802, "contentFile": "content/docs/chat/sdk/android/logger.mdx", - "navOrder": 272 + "navOrder": 274 }, { "id": 2129, diff --git a/src/generated/search-index-zh.json b/src/generated/search-index-zh.json index eeee830873..a28deb6c35 100644 --- a/src/generated/search-index-zh.json +++ b/src/generated/search-index-zh.json @@ -1938,18 +1938,18 @@ { "path": "/sdk/android/user/overview-user", "title": "用户概览", - "description": "了解 Android SDK 中的用户资料、好友关系、好友申请、黑名单和在线状态 API。", + "description": "了解 Android SDK 中的当前用户资料、公开用户资料、账号设置和在线状态。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user overview-user", - "content": "OpenIM Android SDK 使用 userID 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。 群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。 用户类型 Android SDK 会根据使用场景返回不同的用户对象: | 类型 | 适用场景 | 主要 API | | | | | | LocalUser | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | getSelfLocalUserInfo 、 setSelfInfo | | PublicUserInfo | 查询应用用户、查找好友候选人和展示陌生人资料卡 | getUsersInfo | | UserInfo | 查询好友列表、好友资料或黑名单时返回的用户对象,可包含对应关系资料 | getFriendListPage 、 getFriendsInfo 、 getBlacklist | | FriendInfo | 当前用户的好友列表、好友备注和关系扩展字段 | searchFriends 、 getFriendListPage | | FriendApplicationInfo | 好友申请双方、处理状态和附言 | 好友申请查询与 listener | | BlacklistInfo | 当前用户拉黑的用户及黑名单关系字段 | getBlacklist 、 addBlacklist 、 removeBlacklist | | UsersOnlineStatus | 用户在线状态和在线平台列表 | subscribeUsersOnlineStatus 、 getSubscribeOnlineUsersStatus 、 unsubscribeOnlineUsersStatus | 同一个 userID 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 UserInfo.getFriendInfo ;只需要账号公开资料时使用 PublicUserInfo ;黑名单页面使用 UserInfo.getBlackInfo 。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。 所有列表和事件都应使用 userID 作为稳定标识。好友申请同时包含申请方和接收方,应使用 fromUserID:toUserID 标识一条申请。 功能入口 下表列出了用户相关的常见需求和对应页面: | 需求 | 推荐页面 | | | | | 按 userID 查询公开资料,用于查找好友候选人或展示资料卡 | 获取指定用户资料 /sdk/android/user/user profile/get users info | | 分页、搜索或按 ID 查询好友关系 | 分页获取好友列表 /sdk/android/user/friends/get friend list page | | 发送、查询、接受或拒绝好友申请 | 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list | | 修改好友资料 | 更新好友资料 /sdk/android/user/friends/update friends | | 删除好友关系 | 删除好友 /sdk/android/user/friends/delete friend | | 查看和维护当前用户黑名单 | 获取黑名单列表 /sdk/android/user/blacklist/get blacklist | | 读取或更新当前用户的昵称、头像和扩展资料 | 更新当前用户资料 /sdk/android/user/user profile/set self info | | 设置账号级消息接收和通知策略 | 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception | | 订阅、读取和取消在线状态 | 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 、 取消用户状态订阅 /sdk/android/user/online status/unsubscribe users online status | 状态更新 用户相关事件由对应能力页负责监听和合并: 当前用户资料变化:见 更新当前用户资料 /sdk/android/user/user profile/set self info 。 好友申请变化:见 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 。 好友关系和好友资料变化:见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。 黑名单变化:见 拉黑用户 /sdk/android/user/blacklist/add blacklist 。 在线状态变化:见 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 。 Android SDK 的 UserInfoManager 和 FriendshipManager 各保存一个 listener, setOnUserListener 和 setOnFriendshipListener 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。" + "content": "OpenIM Android SDK 使用 userID 标识用户。用户相关 API 用于读取和更新当前账号资料、查询公开用户资料,以及订阅用户在线状态。 好友、好友申请和黑名单属于用户之间的关系链能力,相关类型、API 和状态更新见 关系链概览 /sdk/android/user/overview relationships 。 用户类型 Android SDK 会根据使用场景返回不同的用户对象: | 类型 | 适用场景 | 主要 API | | | | | | LocalUser | 当前登录用户的本地资料、设置页、头像、昵称和账号级设置 | getSelfLocalUserInfo 、 setSelfInfo | | PublicUserInfo | 查询应用用户和展示公开资料卡 | getUsersInfo | | UsersOnlineStatus | 用户在线状态和在线平台列表 | subscribeUsersOnlineStatus 、 getSubscribeOnlineUsersStatus 、 unsubscribeOnlineUsersStatus | LocalUser 表示当前登录用户, PublicUserInfo 表示可查询的公开用户资料。群成员资料、群内昵称和成员管理属于群组能力。 功能入口 下表列出了用户相关的常见需求和对应页面: | 需求 | 推荐页面 | | | | | 按 userID 查询公开资料,用于展示资料卡 | 获取指定用户资料 /sdk/android/user/user profile/get users info | | 读取或更新当前用户的昵称、头像和扩展资料 | 获取当前用户资料 /sdk/android/user/user profile/get self local user info 、 更新当前用户资料 /sdk/android/user/user profile/set self info | | 设置账号级消息接收和通知策略 | 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception | | 设置其他用户添加当前账号时的处理策略 | 设置好友添加权限 /sdk/android/user/user profile/set friend add permission | | 订阅、读取和取消在线状态 | 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 、 查询已订阅用户状态 /sdk/android/user/online status/get subscribe online users status 、 取消订阅用户状态 /sdk/android/user/online status/unsubscribe users online status | | 管理好友、好友申请或黑名单 | 关系链概览 /sdk/android/user/overview relationships | 状态更新 用户相关状态变化需要设置用户监听器;具体回调说明见下方对应能力页: OpenIMClient client = OpenIMClient.getInstance ; client.userInfoManager.setOnUserListener new OnUserListener @Override public void onSelfInfoUpdated UserInfo info // 处理当前用户资料变化 @Override public void onUserStatusChanged UsersOnlineStatus status // 处理用户在线状态变化 ; 当前用户资料变化:见 更新当前用户资料 /sdk/android/user/user profile/set self info 。 在线状态变化:见 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 。 好友、好友申请和黑名单变化:见 关系链概览 /sdk/android/user/overview relationships 。" }, { "path": "/sdk/android/user/user-profile/get-users-info", "title": "获取指定用户资料", - "description": "使用 getUsersInfo() 按 userID 批量查询用户公开资料。", + "description": "按 userID 批量查询应用用户公开资料(PublicUserInfo)。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user user-profile get-users-info", - "content": "getUsersInfo 根据 userID 列表返回用户的公开资料,适合展示好友候选人或陌生人资料卡。该方法只读取公开资料,不返回当前账号为好友设置的备注等关系字段。 List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.getUsersInfo new OnBase @Override public void onSuccess List users for PublicUserInfo user : users publicUserStore.put user.getUserID , user ; @Override public void onError int code, String error recordUserQueryFailure code, error ; , userIDs ; 调用前应去除空值和重复 ID,并控制单次请求的数量。成功 callback 返回 List ,主要字段包括 userID 、 nickname 、 faceURL 、 ex 和 createTime 。查询不会触发 OnUserListener ,需要刷新资料时应重新调用并按 userID 合并结果。 返回结果 | 字段 | 说明 | | | | | userID | OpenIM 用户 ID,也是本地缓存的稳定 key。 | | nickname | 账号级公开昵称。 | | faceURL | 账号级公开头像地址。 | | ex | 账号级公开扩展字符串,格式由业务约定。 | | createTime | 用户资料创建时间。 | PublicUserInfo 中的资料不能用于覆盖好友备注、置顶状态或群内昵称。展示好友时应使用 FriendInfo ,展示群成员时应使用群成员模型。 按昵称、手机号或邮箱搜索用户属于业务服务能力,应由可信后端完成搜索和权限校验,再把候选 userID 交给客户端查询公开资料。 资料刷新 查询成功后,以返回结果更新公开资料快照。打开资料卡、用户主动刷新、断线重连或业务后端通知资料变化时,可以重新调用该方法校准数据。 OnUserListener.onSelfInfoUpdated 只表示当前登录用户资料变化,不能作为其他用户资料变化事件。" + "content": "getUsersInfo 按 userID 查询应用用户的公开资料,适合展示好友候选人和陌生人资料卡。 查询公开资料 调用 getUsersInfo 并传入要查询的用户 ID 列表,即可获取这些用户的公开资料。调用前应去除空值和重复 ID,并控制单次请求数量。 List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.getUsersInfo new OnBase @Override public void onSuccess List users // 使用 users 显示用户资料 @Override public void onError int code, String error // 处理错误 , userIDs ; userIDs 是要查询的用户 ID 列表。成功 callback 返回 List 。 返回结果 | 字段 | 说明 | | | | | userID | 用户 ID。 | | nickname | 账号公开昵称。 | | faceURL | 账号公开头像地址。 | | ex | 账号公开扩展字符串,格式由业务约定。 | | createTime | 用户资料创建时间。 | 这里返回的 ex 用于读取用户的公开扩展资料。当前用户自己的扩展资料通过 更新当前用户资料 /sdk/android/user/user profile/set self info 修改。 搜索添加好友 当业务已经获得候选用户的 userID 时,可以先调用 getUsersInfo 展示公开资料,用户确认后再通过 发送好友申请 /sdk/android/user/friend applications/add friend 向目标用户发起申请。 getUsersInfo 只按 userID 查询公开资料;昵称、手机号等其他条件的用户搜索不属于该 API。 按场景选择展示数据 同一个 userID 在不同场景中使用不同的资料类型: | 场景 | 使用的类型 | | | | | 用户搜索、陌生人资料卡 | PublicUserInfo | | 好友列表、联系人页和好友备注 | FriendInfo | | 群成员列表、群内昵称和群角色 | GroupMembersInfo | 好友资料使用 查询指定好友资料 /sdk/android/user/friends/get friends info ,群成员资料使用 分页查询群成员 /sdk/android/group/retrieving group members/get group member list 。 下一步 分页获取好友列表 /sdk/android/user/friends/get friend list page 查询指定好友资料 /sdk/android/user/friends/get friends info 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list" }, { "path": "/sdk/android/user/user-profile/get-self-local-user-info", @@ -1957,7 +1957,7 @@ "description": "使用 getSelfLocalUserInfo() 获取当前登录用户的本地资料。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user user-profile get-self-local-user-info", - "content": "OpenIMClient.getInstance .userInfoManager.getSelfLocalUserInfo new OnBase @Override public void onSuccess LocalUser user currentUserStore.set user ; @Override public void onError int code, String error recordSelfProfileFailure code, error ; ; 完成初始化并登录后调用该方法获取当前账号的本地资料。成功 callback 返回 LocalUser ,包含 userID 、 nickname 、 faceURL 、 ex 、 attachedInfo 、 globalRecvMsgOpt 和 addFriendPermission 等字段。 返回结果 | 字段 | 说明 | | | | | userID | 当前登录用户 ID。 | | nickname | 当前账号昵称。 | | faceURL | 当前账号头像地址。 | | ex | 当前账号扩展字符串。 | | attachedInfo | SDK 附加信息,只按业务约定解析。 | | globalRecvMsgOpt | 全局消息接收方式: 0 正常接收, 1 不接收, 2 接收但不提示。 | | addFriendPermission | 添加好友权限值,具体含义由服务端契约定义。 | 查询不会触发资料变更 callback。退出或切换账号时应清理旧账号快照,避免把上一个账号的资料显示在当前页面。 getSelfUserInfo 已废弃,不作为推荐用法。" + "content": "OpenIMClient.getInstance .userInfoManager.getSelfLocalUserInfo new OnBase @Override public void onSuccess LocalUser user // 使用 user 更新当前用户资料 @Override public void onError int code, String error // 处理错误 ; 完成初始化并登录后调用该方法获取当前账号的本地资料。成功 callback 返回 LocalUser ,包含 userID 、 nickname 、 faceURL 、 ex 、 attachedInfo 、 globalRecvMsgOpt 和 addFriendPermission 等字段。 返回结果 | 字段 | 说明 | | | | | userID | 当前登录用户 ID。 | | nickname | 当前账号昵称。 | | faceURL | 当前账号头像地址。 | | ex | 当前账号扩展字符串。 | | attachedInfo 商业版 | 附加信息,格式由业务约定。 | | globalRecvMsgOpt | 全局消息接收方式: 0 正常接收, 1 不接收, 2 接收但不提示。 | | addFriendPermission 商业版 | 添加好友权限值,具体含义见 设置好友添加权限 /sdk/android/user/user profile/set friend add permission 。 |" }, { "path": "/sdk/android/user/user-profile/set-self-info", @@ -1965,7 +1965,7 @@ "description": "使用 setSelfInfo() 更新当前用户的昵称、头像或扩展资料。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user user-profile set-self-info", - "content": "使用 UserInfoReq 只设置实际需要修改的字段。SDK 序列化请求时会忽略 null 字段。 UserInfoReq request = new UserInfoReq ; request.setNickname displayName.trim ; request.setFaceURL avatarURL ; request.setEx mergedExtra ; OpenIMClient.getInstance .userInfoManager.setSelfInfo new OnBase @Override public void onSuccess String data markProfileUpdateSubmitted ; @Override public void onError int code, String error recordProfileUpdateFailure code, error ; , request ; UserInfoReq 支持 nickname 、 faceURL 、 ex 和 addFriendPermission 等字段。 ex 是完整字符串,更新前应读取、解析并合并业务自己的命名空间;不要把部分 JSON 直接覆盖到服务端。 成功 callback 表示更新请求完成;当前账号资料的最终增量通过 onSelfInfoUpdated UserInfo info 到达,或重新调用 getSelfLocalUserInfo 校准。 更新字段 | 字段 | 说明 | | | | | nickname | 要更新的昵称。 | | faceURL | 要更新的头像地址。 | | ex | 完整扩展字符串。 | | addFriendPermission | 添加好友权限值。 | 一次请求只写入需要变更的字段。全局消息接收策略虽然也由 setSelfInfo 写入,但应使用独立入口,见 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception 。 onSelfInfoUpdated 由本页归属,应组合进应用唯一的 OnUserListener : @Override public void onSelfInfoUpdated UserInfo info currentUserStore.merge info.getUserID , info ; 账号级消息接收策略也通过 UserInfoReq 更新,但应使用独立入口,见 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception 。" + "content": "使用 UserInfoReq 只设置实际需要修改的字段。 UserInfoReq request = new UserInfoReq ; request.setNickname displayName.trim ; request.setFaceURL avatarURL ; request.setEx extra ; OpenIMClient.getInstance .userInfoManager.setSelfInfo new OnBase @Override public void onSuccess String data // 更新当前用户资料成功 @Override public void onError int code, String error // 处理错误 , request ; UserInfoReq 支持 nickname 、 faceURL 、 ex 和 addFriendPermission 等字段。 ex 用于保存当前用户的扩展信息。 成功 callback 表示更新请求完成。当前账号资料变化时,可通过 onSelfInfoUpdated UserInfo info 接收通知。 更新字段 | 字段 | 说明 | | | | | nickname | 要更新的昵称。 | | faceURL | 要更新的头像地址。 | | ex | 用户扩展字符串。 | | addFriendPermission | 添加好友权限值。 | 一次请求只写入需要变更的字段。设置全局消息接收方式时,参见 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception 。 当前用户资料变化时,可通过 OnUserListener 接收 onSelfInfoUpdated : @Override public void onSelfInfoUpdated UserInfo info // 处理当前用户资料变化" }, { "path": "/sdk/android/user/user-profile/set-global-message-reception", @@ -1973,7 +1973,15 @@ "description": "通过 setSelfInfo() 设置当前账号的全局消息接收与通知策略。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user user-profile set-global-message-reception", - "content": "使用独立的 UserInfoReq 写入 globalRecvMsgOpt ,避免在更新昵称或头像时意外覆盖账号级消息策略。 UserInfoReq request = new UserInfoReq ; request.setGlobalRecvMsgOpt 2 ; OpenIMClient.getInstance .userInfoManager.setSelfInfo new OnBase @Override public void onSuccess String data markGlobalReceiveOptionSubmitted ; @Override public void onError int code, String error recordGlobalReceiveOptionFailure code, error ; , request ; | 数值 | 含义 | | | | | 0 | 正常接收消息并允许通知。 | | 1 | 屏蔽消息。 | | 2 | 接收消息但不提示。 | 如果产品只提供“全局免打扰”开关,通常在 0 和 2 之间切换; 1 会停止接收消息,应单独展示。单个会话的接收方式由会话 API 管理,不受本设置替代。 成功 callback 表示请求完成。最终账号快照通过 onSelfInfoUpdated 或 getSelfLocalUserInfo 校准,事件处理见 更新当前用户资料 /sdk/android/user/user profile/set self info 。" + "content": "使用 UserInfoReq 设置 globalRecvMsgOpt 。 UserInfoReq request = new UserInfoReq ; request.setGlobalRecvMsgOpt 2 ; OpenIMClient.getInstance .userInfoManager.setSelfInfo new OnBase @Override public void onSuccess String data // 设置全局消息接收方式成功 @Override public void onError int code, String error // 处理错误 , request ; | 数值 | 含义 | | | | | 0 | 正常接收消息并允许通知。 | | 1 | 屏蔽消息。 | | 2 | 接收消息但不提示。 | 如果产品只提供“全局免打扰”开关,可以在 0 和 2 之间切换; 1 会停止接收消息,应单独展示。单个会话的接收方式由会话 API 管理。 成功 callback 表示设置请求完成。" + }, + { + "path": "/sdk/android/user/user-profile/set-friend-add-permission", + "title": "设置好友添加权限", + "description": "设置其他用户向当前账号发起好友申请时的处理方式。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android user user-profile set-friend-add-permission", + "content": "addFriendPermission 用于设置其他用户添加当前账号时是否需要审核。该能力属于商业版。 使用 UserInfoReq.setAddFriendPermission 设置权限值,再调用 setSelfInfo : UserInfoReq request = new UserInfoReq ; request.setAddFriendPermission AddFriendPermission.Allow.getValue ; OpenIMClient.getInstance .userInfoManager.setSelfInfo new OnBase @Override public void onSuccess String data // 设置好友添加权限成功 @Override public void onError int code, String error // 处理错误 , request ; 权限值 | 枚举值 | 数值 | 含义 | | | | | | AddFriendPermission.Allow | 0 | 允许其他用户添加,但需要当前用户审核好友申请。 | | AddFriendPermission.AllowNoReview | 1 | 允许其他用户添加,并直接建立好友关系,无需审核。 | | AddFriendPermission.Deny | 2 | 不允许其他用户添加当前账号。 | 成功 callback 表示设置请求完成。该设置只影响之后的添加行为,不会删除已有好友关系或处理已经存在的好友申请。" }, { "path": "/sdk/android/user/online-status/subscribe-users-online-status", @@ -1981,23 +1989,31 @@ "description": "使用 subscribeUsersOnlineStatus() 订阅指定用户的在线状态。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user online-status subscribe-users-online-status", - "content": "List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.subscribeUsersOnlineStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusSubscriptionFailure code, error ; , userIDs ; 调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 List 快照,每项包含 userID 、 status 和 platformIDs 。重复订阅同一个用户时,应由应用层去重并保留一份状态。 状态字段 | 字段 | 说明 | | | | | userID | 目标用户 ID。 | | status | 在线状态值,具体枚举含义以服务端契约为准。 | | platformIDs | 当前在线的平台 ID 列表。 | onUserStatusChanged 由本页归属,应组合进应用唯一的 OnUserListener ,并按 userID 合并: @Override public void onUserStatusChanged UsersOnlineStatus status onlineStatusStore.put status.getUserID , status ; 订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合,并通过 取消用户状态订阅 /sdk/android/user/online status/unsubscribe users online status 移除不再需要的用户。" + "content": "List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.subscribeUsersOnlineStatus new OnBase @Override public void onSuccess List states // 使用 states 显示在线状态 @Override public void onError int code, String error // 处理错误 , userIDs ; 调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 List ,每项包含 userID 、 status 和 platformIDs 。 状态字段 | 字段 | 说明 | | | | | userID | 目标用户 ID。 | | status | 在线状态值,具体枚举含义以服务端契约为准。 | | platformIDs | 当前在线的平台 ID 列表。 | 用户在线状态变化时,可通过 OnUserListener 接收 onUserStatusChanged : @Override public void onUserStatusChanged UsersOnlineStatus status // 处理在线状态变化 订阅操作只建立或更新订阅集合。用户不再需要某个用户的在线状态时,通过 取消订阅用户状态 /sdk/android/user/online status/unsubscribe users online status 取消订阅。" }, { "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", "title": "查询已订阅用户状态", - "description": "使用 getSubscribeOnlineUsersStatus() 获取已订阅用户的在线状态快照。", + "description": "使用 getSubscribeOnlineUsersStatus() 获取已订阅用户的在线状态。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user online-status get-subscribe-online-users-status", - "content": "OpenIMClient.getInstance .userInfoManager.getSubscribeOnlineUsersStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusQueryFailure code, error ; ; 该方法不接收用户 ID,也不改变订阅集合。成功 callback 返回当前已订阅用户的 List 状态快照,适合在重连或重新进入页面时按 userID 校准状态。 查询本身不会触发 onUserStatusChanged 。状态快照只应覆盖在线状态存储,不要覆盖用户昵称、头像等资料字段;需要资料时分别调用用户资料 API。" + "content": "OpenIMClient.getInstance .userInfoManager.getSubscribeOnlineUsersStatus new OnBase @Override public void onSuccess List states // 使用 states 显示在线状态 @Override public void onError int code, String error // 处理错误 ; 成功 callback 返回当前已订阅用户的 List 。" }, { "path": "/sdk/android/user/online-status/unsubscribe-users-online-status", - "title": "取消用户状态订阅", + "title": "取消订阅用户状态", "description": "使用 unsubscribeOnlineUsersStatus 取消指定用户的在线状态订阅。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user online-status unsubscribe-users-online-status", - "content": "用户离开可见范围、页面结束或切换账号时,取消不再需要的在线状态订阅。调用前应去除空值和重复 ID。 List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.unsubscribeOnlineUsersStatus new OnBase @Override public void onSuccess String data for String userID : userIDs presenceByUserID.remove userID ; @Override public void onError int code, String error recordStatusUnsubscribeFailure code, error ; , userIDs ; 成功 callback 表示取消订阅请求已完成。此后再从应用维护的订阅集合和在线状态缓存中移除这些 userID ;失败时保留原状态,以便重试。该操作不会修改用户资料或好友关系。 需要再次跟踪用户状态时,重新调用 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 。" + "content": "用户离开可见范围、页面结束或切换账号时,取消不再需要的在线状态订阅。调用前应去除空值和重复 ID。 List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.unsubscribeOnlineUsersStatus new OnBase @Override public void onSuccess String data // 取消订阅成功 @Override public void onError int code, String error // 处理错误 , userIDs ; 成功 callback 表示取消订阅请求已完成。 需要再次跟踪用户状态时,重新调用 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 。" + }, + { + "path": "/sdk/android/user/overview-relationships", + "title": "关系链概览", + "description": "了解 Android SDK 中的好友、好友申请和黑名单 API。", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android user overview-relationships", + "content": "关系链记录当前用户与其他用户之间的好友关系、好友申请和黑名单。资料、账号设置和在线状态属于用户能力,见 用户概览 /sdk/android/user/overview user 。 关系链类型 Android SDK 会根据关系链场景返回不同的对象: | 类型 | 适用场景 | 主要 API | | | | | | UserInfo | 好友列表、指定好友资料和黑名单列表中的用户资料及关系信息 | getFriendListPage 、 getFriendsInfo 、 getBlacklist | | FriendInfo | 好友资料、备注和关系扩展字段 | UserInfo.getFriendInfo 、 searchFriends | | FriendshipInfo | 当前用户与目标用户的好友关系结果 | checkFriend | | FriendApplicationInfo | 收到或发出的好友申请及其处理状态 | getRecvFriendApplicationList 、 getSendFriendApplicationList | | BlacklistInfo | 黑名单关系信息 | UserInfo.getBlackInfo 、 getBlacklist | UserInfo 可包含好友或黑名单关系信息;通过 getFriendInfo 获取 FriendInfo ,通过 getBlackInfo 获取 BlacklistInfo 。 功能入口 下表列出了关系链相关的常见需求和对应页面: | 需求 | 推荐页面 | | | | | 分页获取、搜索或查询指定好友资料 | 分页获取好友列表 /sdk/android/user/friends/get friend list page 、 搜索好友 /sdk/android/user/friends/search friends 、 查询指定好友资料 /sdk/android/user/friends/get friends info | | 检查当前用户与目标用户的好友关系 | 检查好友关系 /sdk/android/user/friends/check friend | | 更新或删除好友关系 | 更新好友资料 /sdk/android/user/friends/update friends 、 删除好友 /sdk/android/user/friends/delete friend | | 发送、查询、接受或拒绝好友申请 | 发送好友申请 /sdk/android/user/friend applications/add friend 、 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 、 获取发出的好友申请 /sdk/android/user/friend applications/get send friend application list 、 接受好友申请 /sdk/android/user/friend applications/accept friend application 、 拒绝好友申请 /sdk/android/user/friend applications/refuse friend application | | 查看或维护黑名单 | 获取黑名单列表 /sdk/android/user/blacklist/get blacklist 、 拉黑用户 /sdk/android/user/blacklist/add blacklist 、 取消拉黑用户 /sdk/android/user/blacklist/remove blacklist | 状态更新 关系链状态变化需要设置好友关系监听器;具体回调说明见下方对应能力页: OpenIMClient client = OpenIMClient.getInstance ; client.friendshipManager.setOnFriendshipListener new OnFriendshipListener @Override public void onFriendApplicationAdded FriendApplicationInfo application // 处理好友申请变化 @Override public void onFriendApplicationAccepted FriendApplicationInfo application // 处理好友申请已接受 @Override public void onFriendApplicationRejected FriendApplicationInfo application // 处理好友申请已拒绝 @Override public void onFriendApplicationDeleted FriendApplicationInfo application // 处理好友申请删除 @Override public void onFriendAdded FriendInfo friend // 处理好友关系变化 @Override public void onFriendInfoChanged FriendInfo friend // 处理好友资料变化 @Override public void onFriendDeleted FriendInfo friend // 处理好友关系删除 @Override public void onBlacklistAdded BlacklistInfo user // 处理新增黑名单记录 @Override public void onBlacklistDeleted BlacklistInfo user // 处理黑名单记录删除 ; 好友申请变化:见 获取收到的好友申请 /sdk/android/user/friend applications/get recv friend application list 。 好友关系和好友资料变化:见 分页获取好友列表 /sdk/android/user/friends/get friend list page 。 黑名单变化:见 获取黑名单列表 /sdk/android/user/blacklist/get blacklist 。" }, { "path": "/sdk/android/user/friends/get-friend-list-page", diff --git a/src/generated/search-index.json b/src/generated/search-index.json index a8ebbbfe20..ddcbbabd19 100644 --- a/src/generated/search-index.json +++ b/src/generated/search-index.json @@ -1938,18 +1938,18 @@ { "path": "/sdk/android/user/overview-user", "title": "User overview", - "description": "Learn about user profiles, friendships, friend requests, blacklists, and online status in the Android SDK.", + "description": "Learn about current-user profiles, public user profiles, account settings, and online status in the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user overview-user", - "content": "OpenIM Android SDK identifies each user by userID . When implementing profile cards, friend requests, contacts, or a blocklist, distinguish an application's public user profile from the current user's friend relationship and blocklist state. Group member lists, in group nicknames, group roles, and member administration belong to the Groups domain. User APIs cover profiles, friendships, friend requests, blacklists, and online status. User objects Android SDK returns different user objects for different scenarios: | Type | Use case | Main APIs | | | | | | LocalUser | The current user's local profile, settings page, avatar, nickname, and account level receive setting | getSelfLocalUserInfo , setSelfInfo | | PublicUserInfo | Application user lookup, friend candidates, and profiles for users who are not friends | getUsersInfo | | UserInfo | User object returned by friend list, friend profile, or blocklist queries; it can include relationship data | getFriendListPage , getFriendsInfo , getBlacklist | | FriendInfo | The current user's friend list, friend remarks, and relationship extension data | searchFriends , getFriendListPage | | FriendApplicationInfo | The parties, handling state, and message for a friend request | Friend request queries and callbacks | | BlacklistInfo | Users blocked by the current user and their blocklist relationship fields | getBlacklist , addBlacklist , removeBlacklist | | UsersOnlineStatus | User online status and connected platforms | subscribeUsersOnlineStatus , getSubscribeOnlineUsersStatus , unsubscribeOnlineUsersStatus | The same userID can appear in public profile, friend, blocklist, and group member data. Prefer UserInfo.getFriendInfo when displaying a contact, PublicUserInfo when only a public account profile is needed, and UserInfo.getBlackInfo on a blocklist screen. Conversation list and chat page titles belong to conversation data and should use the conversation display name. Use userID as the stable key for user lists and events. A friend request contains both parties, so use fromUserID:toUserID to identify one request. Feature entry points | Requirement | Recommended page | | | | | Retrieve public profiles by userID for friend candidates or profile cards | Get specified user profiles /sdk/android/user/user profile/get users info | | Page through, search, or retrieve friend relationships by ID | Get the friend list by page /sdk/android/user/friends/get friend list page | | Send, retrieve, accept, or reject friend requests | Get received friend requests /sdk/android/user/friend applications/get recv friend application list | | Update friend data | Update friend profiles /sdk/android/user/friends/update friends | | Delete a friend relationship | Delete a friend /sdk/android/user/friends/delete friend | | View and maintain the current user's blocklist | Get the blacklist /sdk/android/user/blacklist/get blacklist | | Read or update the current user's nickname, avatar, and extension data | Update the current user profile /sdk/android/user/user profile/set self info | | Configure account level message reception and notification behavior | Set global message reception /sdk/android/user/user profile/set global message reception | | Subscribe to, retrieve, and unsubscribe from online status | Subscribe to user online status /sdk/android/user/online status/subscribe users online status , Unsubscribe from user status /sdk/android/user/online status/unsubscribe users online status | State updates Each user related capability page owns the listener and merge behavior for its events: Current user profile changes: Update the current user profile /sdk/android/user/user profile/set self info . Friend request changes: Get received friend requests /sdk/android/user/friend applications/get recv friend application list . Friend relationship and profile changes: Get the friend list by page /sdk/android/user/friends/get friend list page . Blocklist changes: Block a user /sdk/android/user/blacklist/add blacklist . Online status changes: Subscribe to user online status /sdk/android/user/online status/subscribe users online status . UserInfoManager and FriendshipManager each retain one listener. setOnUserListener and setOnFriendshipListener replace the current listener. Combine the required callbacks in a shared state layer and set each listener once; multiple pages must not overwrite one another's listeners." + "content": "OpenIM Android SDK identifies each user by userID . User APIs retrieve and update the current account profile, retrieve public user profiles, and subscribe to user online status. Friends, friend requests, and blacklists are relationship capabilities between users. See Relationship overview /sdk/android/user/overview relationships for their types, APIs, and state updates. User objects Android SDK returns different user objects for different scenarios: | Type | Use case | Main APIs | | | | | | LocalUser | The signed in user's local profile, settings page, avatar, nickname, and account level settings | getSelfLocalUserInfo , setSelfInfo | | PublicUserInfo | Application user lookup and public profile cards | getUsersInfo | | UsersOnlineStatus | User online status and connected platforms | subscribeUsersOnlineStatus , getSubscribeOnlineUsersStatus , unsubscribeOnlineUsersStatus | LocalUser represents the signed in user, while PublicUserInfo represents a public user profile returned by a query. Group member profiles, in group nicknames, and member management belong to group capabilities. Feature entry points | Requirement | Recommended page | | | | | Retrieve public profiles by userID for profile cards | Get specified user profiles /sdk/android/user/user profile/get users info | | Read or update the current user's nickname, avatar, and extension data | Get the current user profile /sdk/android/user/user profile/get self local user info , Update the current user profile /sdk/android/user/user profile/set self info | | Configure account level message reception and notification behavior | Set global message reception /sdk/android/user/user profile/set global message reception | | Choose how other users can add the current account | Set friend request permissions /sdk/android/user/user profile/set friend add permission | | Subscribe to, retrieve, and unsubscribe from online status | Subscribe to user online status /sdk/android/user/online status/subscribe users online status , Get subscribed user online status /sdk/android/user/online status/get subscribe online users status , Unsubscribe from user status /sdk/android/user/online status/unsubscribe users online status | | Manage friends, friend requests, or the blacklist | Relationship overview /sdk/android/user/overview relationships | State updates Set the user listener for user related state changes. See the corresponding capability pages below for details about each callback: OpenIMClient client = OpenIMClient.getInstance ; client.userInfoManager.setOnUserListener new OnUserListener @Override public void onSelfInfoUpdated UserInfo info // Handle current user profile changes. @Override public void onUserStatusChanged UsersOnlineStatus status // Handle user online status changes. ; Current user profile changes: Update the current user profile /sdk/android/user/user profile/set self info . Online status changes: Subscribe to user online status /sdk/android/user/online status/subscribe users online status . Friend, friend request, and blacklist changes: Relationship overview /sdk/android/user/overview relationships ." }, { "path": "/sdk/android/user/user-profile/get-users-info", "title": "Get specified user profiles", - "description": "Use getUsersInfo() to query public profiles by userID.", + "description": "Retrieve public user profiles in batches by userID using PublicUserInfo.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user user-profile get-users-info", - "content": "getUsersInfo returns public profiles for a list of user IDs. It is suitable for friend candidates and profiles of users outside the current friend list. It does not return relationship fields such as the current user's friend remark. List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.getUsersInfo new OnBase @Override public void onSuccess List users for PublicUserInfo user : users publicUserStore.put user.getUserID , user ; @Override public void onError int code, String error recordUserQueryFailure code, error ; , userIDs ; Remove empty and duplicate IDs before calling the API, and keep each request within the application's batch limit. The callback returns List with fields such as userID , nickname , faceURL , ex , and createTime . This query does not trigger OnUserListener ; query again and merge by userID when the profile snapshot must be refreshed. Returned fields | Field | Description | | | | | userID | OpenIM user ID and the stable local cache key. | | nickname | Account level public nickname. | | faceURL | Account level public avatar URL. | | ex | Account level public extension string defined by the application. | | createTime | User profile creation time. | Do not use PublicUserInfo to overwrite friend remarks, pinned state, or in group nicknames. Use FriendInfo for friends and the group member model for group members. Searching by nickname, phone number, or email is an application backend capability. A trusted backend should perform the search and permission checks, then return candidate user IDs for this API. Refreshing profiles Replace or merge the public profile snapshot after a successful query. Re query when opening a profile card, when the user explicitly refreshes, after reconnecting, or after a trusted backend reports a profile change. OnUserListener.onSelfInfoUpdated only describes the signed in user's profile and is not a change event for other users." + "content": "getUsersInfo retrieves public profiles for a list of userID values. Use it to display friend candidates and profiles for users who are not friends. Retrieve public profiles Call getUsersInfo with the user IDs to retrieve. Remove empty and duplicate IDs before calling, and keep each request within the supported batch size. List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.getUsersInfo new OnBase @Override public void onSuccess List users // Use users to display public profiles. @Override public void onError int code, String error // Handle the error. , userIDs ; userIDs is the list of user IDs to query. A successful callback returns List . Returned fields | Field | Description | | | | | userID | User ID. | | nickname | Public account nickname. | | faceURL | Public account avatar URL. | | ex | Public account extension string defined by the application. | | createTime | User profile creation time. | The returned ex contains the user's public extension data. Update the current user's extension data through Update your profile /sdk/android/user/user profile/set self info . Search and add a friend When the application already has candidate user IDs, call getUsersInfo to display their public profiles. After the user confirms a target, send a request through Send a friend request /sdk/android/user/friend applications/add friend . getUsersInfo queries public profiles by userID ; searching by nickname, phone number, or other fields is outside this API. Choose data by scenario Use the corresponding user type for each scenario: | Scenario | Type | | | | | User search and stranger profile cards | PublicUserInfo | | Friend lists, contact pages, and friend remarks | FriendInfo | | Group member lists, in group nicknames, and group roles | GroupMembersInfo | For friend data, see Get specified friend profiles /sdk/android/user/friends/get friends info . For group member data, see Get group members by page /sdk/android/group/retrieving group members/get group member list . Next steps Get the friend list by page /sdk/android/user/friends/get friend list page Get specified friend profiles /sdk/android/user/friends/get friends info Get received friend requests /sdk/android/user/friend applications/get recv friend application list" }, { "path": "/sdk/android/user/user-profile/get-self-local-user-info", @@ -1957,7 +1957,7 @@ "description": "Use getSelfLocalUserInfo() to retrieve the local profile for the current user.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user user-profile get-self-local-user-info", - "content": "OpenIMClient.getInstance .userInfoManager.getSelfLocalUserInfo new OnBase @Override public void onSuccess LocalUser user currentUserStore.set user ; @Override public void onError int code, String error recordSelfProfileFailure code, error ; ; After initialization and login, call this method to retrieve the current account's local profile. Success returns LocalUser with fields such as userID , nickname , faceURL , ex , attachedInfo , globalRecvMsgOpt , and addFriendPermission . Returned fields | Field | Description | | | | | userID | Signed in user ID. | | nickname | Current account nickname. | | faceURL | Current account avatar URL. | | ex | Current account extension string. | | attachedInfo | SDK attached data; parse only an application defined format. | | globalRecvMsgOpt | Global message reception: 0 receive, 1 do not receive, 2 receive without notification. | | addFriendPermission | Add friend permission value defined by the server contract. | The query does not trigger a profile callback. Clear the previous account snapshot when logging out or switching accounts so that the previous user's data is not rendered for the new account. getSelfUserInfo is deprecated and is not the recommended API." + "content": "OpenIMClient.getInstance .userInfoManager.getSelfLocalUserInfo new OnBase @Override public void onSuccess LocalUser user // Use user to display the current profile. @Override public void onError int code, String error // Handle the error. ; After initialization and login, call this method to retrieve the current account's local profile. Success returns LocalUser with fields such as userID , nickname , faceURL , ex , attachedInfo , globalRecvMsgOpt , and addFriendPermission . Returned fields | Field | Description | | | | | userID | Signed in user ID. | | nickname | Current account nickname. | | faceURL | Current account avatar URL. | | ex | Current account extension string. | | attachedInfo Enterprise | Additional information with an application defined format. | | globalRecvMsgOpt | Global message reception: 0 receive, 1 do not receive, 2 receive without notification. | | addFriendPermission Enterprise | Add friend permission value; see Set friend request permissions /sdk/android/user/user profile/set friend add permission for the meanings. |" }, { "path": "/sdk/android/user/user-profile/set-self-info", @@ -1965,7 +1965,7 @@ "description": "Use setSelfInfo() to update the nickname, avatar, or extension data of the current user.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user user-profile set-self-info", - "content": "Set only the fields that must change on UserInfoReq . The SDK omits null fields when serializing the request. UserInfoReq request = new UserInfoReq ; request.setNickname displayName.trim ; request.setFaceURL avatarURL ; request.setEx mergedExtra ; OpenIMClient.getInstance .userInfoManager.setSelfInfo new OnBase @Override public void onSuccess String data markProfileUpdateSubmitted ; @Override public void onError int code, String error recordProfileUpdateFailure code, error ; , request ; UserInfoReq supports fields such as nickname , faceURL , ex , and addFriendPermission . ex is a complete string; read, parse, and merge the application's namespace before updating it rather than overwriting the value with a partial JSON object. A successful callback means the update request completed. Merge the final profile increment from onSelfInfoUpdated UserInfo info , or query getSelfLocalUserInfo again. Updatable fields | Field | Description | | | | | nickname | New nickname. | | faceURL | New avatar URL. | | ex | Complete extension string. | | addFriendPermission | Add friend permission value. | Send only fields that should change. Although the global message reception setting is also written with setSelfInfo , use the dedicated Set global message reception /sdk/android/user/user profile/set global message reception entry point. This page owns onSelfInfoUpdated . Combine it into the application's single OnUserListener : @Override public void onSelfInfoUpdated UserInfo info currentUserStore.merge info.getUserID , info ;" + "content": "Set only the fields that must change on UserInfoReq . UserInfoReq request = new UserInfoReq ; request.setNickname displayName.trim ; request.setFaceURL avatarURL ; request.setEx extra ; OpenIMClient.getInstance .userInfoManager.setSelfInfo new OnBase @Override public void onSuccess String data // Profile update succeeded. @Override public void onError int code, String error // Handle the error. , request ; UserInfoReq supports fields such as nickname , faceURL , ex , and addFriendPermission . Use ex to store extension data for the current user. A successful callback means the update request completed. onSelfInfoUpdated UserInfo info reports changes to the current user's profile. Updatable fields | Field | Description | | | | | nickname | New nickname. | | faceURL | New avatar URL. | | ex | User extension string. | | addFriendPermission | Add friend permission value. | Send only fields that should change. To set global message reception, see Set global message reception /sdk/android/user/user profile/set global message reception . Receive onSelfInfoUpdated through OnUserListener when the current user's profile changes: @Override public void onSelfInfoUpdated UserInfo info // Handle the current user's profile change." }, { "path": "/sdk/android/user/user-profile/set-global-message-reception", @@ -1973,7 +1973,15 @@ "description": "Use setSelfInfo() to set the account-wide message reception and notification policy.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user user-profile set-global-message-reception", - "content": "Use a separate UserInfoReq for globalRecvMsgOpt so profile updates do not accidentally overwrite the account wide message policy. UserInfoReq request = new UserInfoReq ; request.setGlobalRecvMsgOpt 2 ; OpenIMClient.getInstance .userInfoManager.setSelfInfo new OnBase @Override public void onSuccess String data markGlobalReceiveOptionSubmitted ; @Override public void onError int code, String error recordGlobalReceiveOptionFailure code, error ; , request ; | Value | Meaning | | | | | 0 | Receive messages and allow notifications. | | 1 | Do not receive messages. | | 2 | Receive messages without notifications. | If the product exposes only a global do not disturb switch, it usually toggles between 0 and 2 ; 1 stops message reception and should be presented as a separate option. Per conversation reception is managed by conversation APIs and is not replaced by this setting. A successful callback means the request completed. Reconcile the final account snapshot through onSelfInfoUpdated or getSelfLocalUserInfo . Event handling is documented in Update the current user profile /sdk/android/user/user profile/set self info ." + "content": "Use UserInfoReq to set globalRecvMsgOpt . UserInfoReq request = new UserInfoReq ; request.setGlobalRecvMsgOpt 2 ; OpenIMClient.getInstance .userInfoManager.setSelfInfo new OnBase @Override public void onSuccess String data // Global message reception updated successfully. @Override public void onError int code, String error // Handle the error. , request ; | Value | Meaning | | | | | 0 | Receive messages and allow notifications. | | 1 | Do not receive messages. | | 2 | Receive messages without notifications. | If the product exposes only a global do not disturb switch, it can toggle between 0 and 2 ; 1 stops message reception and should be presented as a separate option. Per conversation reception is managed by conversation APIs. A successful callback means the setting request completed." + }, + { + "path": "/sdk/android/user/user-profile/set-friend-add-permission", + "title": "Set friend request permissions", + "description": "Choose how friend requests sent to the current account are handled.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android user user-profile set-friend-add-permission", + "content": "Use addFriendPermission to choose whether requests from other users to add the current account require approval. This capability is available in the Enterprise edition. Set the value with UserInfoReq.setAddFriendPermission , then call setSelfInfo : UserInfoReq request = new UserInfoReq ; request.setAddFriendPermission AddFriendPermission.Allow.getValue ; OpenIMClient.getInstance .userInfoManager.setSelfInfo new OnBase @Override public void onSuccess String data // Friend request permission updated. @Override public void onError int code, String error // Handle the error. , request ; Permission values | Enum value | Numeric value | Meaning | | | | | | AddFriendPermission.Allow | 0 | Allow requests, but require the current user to approve them. | | AddFriendPermission.AllowNoReview | 1 | Allow requests and create the friendship without approval. | | AddFriendPermission.Deny | 2 | Do not allow other users to add the current account. | A successful callback means that the update request completed. This setting affects subsequent attempts to add the account; it does not remove existing friendships or process friend requests that already exist." }, { "path": "/sdk/android/user/online-status/subscribe-users-online-status", @@ -1981,7 +1989,7 @@ "description": "Use subscribeUsersOnlineStatus() to subscribe to online status for specified users.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user online-status subscribe-users-online-status", - "content": "List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.subscribeUsersOnlineStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusSubscriptionFailure code, error ; , userIDs ; Remove empty and duplicate IDs, and subscribe only to users whose status is needed. The callback returns the initial List snapshot. Each item contains userID , status , and platformIDs . Deduplicate repeated subscriptions in the application state layer. Status fields | Field | Description | | | | | userID | Target user ID. | | status | Online status value defined by the server contract. | | platformIDs | Platforms on which the user is online. | This page owns onUserStatusChanged . Combine it into the application's single OnUserListener and merge by userID : @Override public void onUserStatusChanged UsersOnlineStatus status onlineStatusStore.put status.getUserID , status ; Subscription only creates or updates the subscription set; do not treat its callback as friend profile data. Manage the subscription set centrally when users leave the visible range or the account changes, and remove users that are no longer needed through Unsubscribe from user status /sdk/android/user/online status/unsubscribe users online status ." + "content": "List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.subscribeUsersOnlineStatus new OnBase @Override public void onSuccess List states // Use states to display online status. @Override public void onError int code, String error // Handle the error. , userIDs ; Remove empty and duplicate IDs, and subscribe only to users whose status is needed. The callback returns the initial List . Each item contains userID , status , and platformIDs . Status fields | Field | Description | | | | | userID | Target user ID. | | status | Online status value defined by the server contract. | | platformIDs | Platforms on which the user is online. | Receive onUserStatusChanged through OnUserListener when a user's online status changes: @Override public void onUserStatusChanged UsersOnlineStatus status // Handle the online status change. Subscription creates or updates the subscription set. When a user's status is no longer needed, cancel the subscription through Unsubscribe from user status /sdk/android/user/online status/unsubscribe users online status ." }, { "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", @@ -1989,7 +1997,7 @@ "description": "Use getSubscribeOnlineUsersStatus() to retrieve online status for subscribed users.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user online-status get-subscribe-online-users-status", - "content": "OpenIMClient.getInstance .userInfoManager.getSubscribeOnlineUsersStatus new OnBase @Override public void onSuccess List states mergeOnlineStates states ; @Override public void onError int code, String error recordStatusQueryFailure code, error ; ; This method does not accept user IDs or modify the subscription set. The callback returns the current subscribed user List snapshot, which can reconcile status by userID after reconnecting or reopening a screen. The query does not trigger onUserStatusChanged . Apply the snapshot only to presence state; retrieve names and avatars through the user profile APIs." + "content": "OpenIMClient.getInstance .userInfoManager.getSubscribeOnlineUsersStatus new OnBase @Override public void onSuccess List states // Use states to display online status. @Override public void onError int code, String error // Handle the error. ; The callback returns the current subscribed user List ." }, { "path": "/sdk/android/user/online-status/unsubscribe-users-online-status", @@ -1997,7 +2005,15 @@ "description": "Use unsubscribeOnlineUsersStatus to cancel online-status subscriptions for specified users.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android user online-status unsubscribe-users-online-status", - "content": "Cancel online status subscriptions when users leave the visible range, the screen closes, or the account changes. Remove empty and duplicate IDs before making the call. List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.unsubscribeOnlineUsersStatus new OnBase @Override public void onSuccess String data for String userID : userIDs presenceByUserID.remove userID ; @Override public void onError int code, String error recordStatusUnsubscribeFailure code, error ; , userIDs ; A successful callback means that the unsubscribe request completed. Only then remove the IDs from the application's subscription set and presence cache. Retain the previous state after an error so the operation can be retried. This operation does not change user profiles or friend relationships. Call Subscribe to user online status /sdk/android/user/online status/subscribe users online status when those users need to be tracked again." + "content": "Cancel online status subscriptions when users leave the visible range, the screen closes, or the account changes. Remove empty and duplicate IDs before making the call. List userIDs = Arrays.asList \"user a\", \"user b\" ; OpenIMClient.getInstance .userInfoManager.unsubscribeOnlineUsersStatus new OnBase @Override public void onSuccess String data // Unsubscription succeeded. @Override public void onError int code, String error // Handle the error. , userIDs ; A successful callback means that the unsubscribe request completed. Call Subscribe to user online status /sdk/android/user/online status/subscribe users online status when those users need to be tracked again." + }, + { + "path": "/sdk/android/user/overview-relationships", + "title": "Relationship overview", + "description": "Learn about friends, friend requests, and blacklist APIs in the Android SDK.", + "context": "SDKs · Android · v4", + "keywords": "sdk android v4 sdk android user overview-relationships", + "content": "Relationships record friendships, friend requests, and blacklist entries between the current user and other users. Profiles, account settings, and online status belong to user capabilities. See User overview /sdk/android/user/overview user . Relationship objects Android SDK returns different objects for relationship scenarios: | Type | Use case | Main APIs | | | | | | UserInfo | User profile and relationship data in friend lists, specified friend queries, and the blacklist | getFriendListPage , getFriendsInfo , getBlacklist | | FriendInfo | Friend profiles, remarks, and relationship extension data | UserInfo.getFriendInfo , searchFriends | | FriendshipInfo | Friendship result between the current user and a target user | checkFriend | | FriendApplicationInfo | Received and sent friend requests and their handling status | getRecvFriendApplicationList , getSendFriendApplicationList | | BlacklistInfo | Blacklist relationship data | UserInfo.getBlackInfo , getBlacklist | UserInfo can contain friend or blacklist relationship data. Call getFriendInfo to obtain FriendInfo , or getBlackInfo to obtain BlacklistInfo . Feature entry points | Requirement | Recommended page | | | | | Page through, search, or retrieve specified friend profiles | Get the friend list by page /sdk/android/user/friends/get friend list page , Search friends /sdk/android/user/friends/search friends , Get specified friend profiles /sdk/android/user/friends/get friends info | | Check the friendship between the current user and a target user | Check friendship /sdk/android/user/friends/check friend | | Update or delete a friend relationship | Update friend profiles /sdk/android/user/friends/update friends , Delete a friend /sdk/android/user/friends/delete friend | | Send, retrieve, accept, or reject friend requests | Send a friend request /sdk/android/user/friend applications/add friend , Get received friend requests /sdk/android/user/friend applications/get recv friend application list , Get sent friend requests /sdk/android/user/friend applications/get send friend application list , Accept a friend request /sdk/android/user/friend applications/accept friend application , Reject a friend request /sdk/android/user/friend applications/refuse friend application | | View or maintain the blacklist | Get the blacklist /sdk/android/user/blacklist/get blacklist , Block a user /sdk/android/user/blacklist/add blacklist , Unblock a user /sdk/android/user/blacklist/remove blacklist | State updates Set the friendship listener for relationship state changes. See the corresponding capability pages below for details about each callback: OpenIMClient client = OpenIMClient.getInstance ; client.friendshipManager.setOnFriendshipListener new OnFriendshipListener @Override public void onFriendApplicationAdded FriendApplicationInfo application // Handle friend request changes. @Override public void onFriendApplicationAccepted FriendApplicationInfo application // Handle an accepted friend request. @Override public void onFriendApplicationRejected FriendApplicationInfo application // Handle a rejected friend request. @Override public void onFriendApplicationDeleted FriendApplicationInfo application // Handle friend request deletion. @Override public void onFriendAdded FriendInfo friend // Handle friendship changes. @Override public void onFriendInfoChanged FriendInfo friend // Handle friend profile changes. @Override public void onFriendDeleted FriendInfo friend // Handle friendship deletion. @Override public void onBlacklistAdded BlacklistInfo user // Handle a new blacklist entry. @Override public void onBlacklistDeleted BlacklistInfo user // Handle blacklist entry deletion. ; Friend request changes: Get received friend requests /sdk/android/user/friend applications/get recv friend application list . Friendship and friend profile changes: Get the friend list by page /sdk/android/user/friends/get friend list page . Blacklist changes: Get the blacklist /sdk/android/user/blacklist/get blacklist ." }, { "path": "/sdk/android/user/friends/get-friend-list-page", diff --git a/src/lib/client-sdk-commercial.ts b/src/lib/client-sdk-commercial.ts index c62ff76fc2..7f0c125136 100644 --- a/src/lib/client-sdk-commercial.ts +++ b/src/lib/client-sdk-commercial.ts @@ -119,6 +119,7 @@ const fullCommercialConceptPages = new Set([ '/sdk/android/conversation/managing-conversations/set-private-chat', '/sdk/android/conversation/managing-conversations/set-burn-duration', '/sdk/android/conversation/managing-conversations/set-message-destruct', + '/sdk/android/user/user-profile/set-friend-add-permission', ]); function applyCommercialConceptOverride( From e905e1932b9ab857590751e8920beb45699bfae0 Mon Sep 17 00:00:00 2001 From: chan <1499188352@qq.com> Date: Wed, 19 Aug 2026 17:47:18 +0800 Subject: [PATCH 08/12] docs(android): publish Android SDK conversation documentation --- .../clear-conversation-messages.mdx | 6 +- .../clear-group-mentions.mdx | 6 +- .../delete-conversation-with-messages.mdx | 6 +- .../get-total-unread-count.mdx | 6 +- .../hide-a-conversation.mdx | 4 +- .../mark-conversation-read.mdx | 8 +- .../pin-conversation.mdx | 4 +- .../set-burn-duration.mdx | 4 +- .../set-conversation-draft.mdx | 4 +- .../set-conversation-extension.mdx | 8 +- .../set-message-destruct.mdx | 4 +- .../set-message-receive-option.mdx | 4 +- .../set-private-chat.mdx | 4 +- .../conversation/overview-conversation.mdx | 62 +++++++++----- .../get-conversation-by-target.mdx | 8 +- .../get-conversation-id.mdx | 8 +- .../get-conversations-by-id.mdx | 6 +- .../retrieve-conversation-list.mdx | 34 ++++---- .../clear-conversation-messages.mdx | 6 +- .../clear-group-mentions.mdx | 8 +- .../delete-conversation-with-messages.mdx | 8 +- .../get-total-unread-count.mdx | 8 +- .../hide-a-conversation.mdx | 4 +- .../mark-conversation-read.mdx | 8 +- .../pin-conversation.mdx | 6 +- .../set-burn-duration.mdx | 4 +- .../set-conversation-draft.mdx | 4 +- .../set-conversation-extension.mdx | 8 +- .../set-message-destruct.mdx | 4 +- .../set-message-receive-option.mdx | 4 +- .../set-private-chat.mdx | 4 +- .../conversation/overview-conversation.mdx | 82 ++++++++++--------- .../get-conversation-by-target.mdx | 8 +- .../get-conversation-id.mdx | 8 +- .../get-conversations-by-id.mdx | 8 +- .../retrieve-conversation-list.mdx | 34 ++++---- data/structure/android-content-audit.json | 4 +- src/generated/android-sdk-zh-content.json | 78 +++++++++--------- src/generated/search-index-zh.json | 70 ++++++++-------- src/generated/search-index.json | 70 ++++++++-------- 40 files changed, 328 insertions(+), 296 deletions(-) diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx index 223229b3e4..7a895a54fe 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx @@ -1,6 +1,6 @@ --- title: 'Clear messages in a conversation' -description: 'Use messageManager.clearConversationAndDeleteAllMsg() to keep an Android conversation entry while clearing its messages.' +description: 'Use messageManager.clearConversationAndDeleteAllMsg() to keep a conversation entry while clearing its messages.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/conversation/managing-conversations/clear-conversation-messages' --- -Use `messageManager.clearConversationAndDeleteAllMsg()` for a product action such as “clear chat history”. +`messageManager.clearConversationAndDeleteAllMsg()` clears the messages in a conversation while keeping its entry. ```java OpenIMClient.getInstance().messageManager.clearConversationAndDeleteAllMsg( @@ -30,4 +30,4 @@ OpenIMClient.getInstance().messageManager.clearConversationAndDeleteAllMsg( ); ``` -The conversation entry remains while the current account's messages and summary state are cleared. Clear the visible message list immediately, then reconcile the latest message, summary, and unread state from `onConversationChanged` or a fresh query. +The conversation entry remains, while the current account's messages are cleared. To update the conversation list, query conversations again or receive changes through `onConversationChanged`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx index 05d2285f71..c668ac57d8 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx @@ -1,6 +1,6 @@ --- title: 'Reset group mention status' -description: 'Use resetConversationGroupAtType() to reset an Android conversation group mention state.' +description: 'Use resetConversationGroupAtType() to reset a group mention state for a conversation.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/conversation/managing-conversations/clear-group-mentions' --- -After handling group messages that mention the current user, call `resetConversationGroupAtType()` to reset `groupAtType` to the normal state. +When a group message mentions the current user or all group members, `groupAtType` marks the reminder state in the conversation list. After reading the relevant message, call `resetConversationGroupAtType()` to clear the @ reminder from `groupAtType` for that conversation and update the conversation list UI. ```java OpenIMClient.getInstance().conversationManager.resetConversationGroupAtType( @@ -30,4 +30,4 @@ OpenIMClient.getInstance().conversationManager.resetConversationGroupAtType( ); ``` -This operation only resets the state and must not be used to set `atMe` or `atAll`. Group mention state is distinct from message read state. Reconcile the conversation through `onConversationChanged`. +Conversation list changes can be received through `onConversationChanged`; see [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) for listener setup. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx index ad542400b3..85670b2ff0 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx @@ -1,6 +1,6 @@ --- title: 'Delete a conversation and its messages' -description: 'Use deleteConversationAndDeleteAllMsg() to delete an Android conversation and its messages.' +description: 'Use deleteConversationAndDeleteAllMsg() to delete a conversation and its messages.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/conversation/managing-conversations/delete-conversation-with-messages' --- -Use `deleteConversationAndDeleteAllMsg()` for a product action such as “delete this chat”. +`deleteConversationAndDeleteAllMsg()` deletes a conversation and all of its messages. ```java OpenIMClient.getInstance().conversationManager.deleteConversationAndDeleteAllMsg( @@ -31,4 +31,4 @@ OpenIMClient.getInstance().conversationManager.deleteConversationAndDeleteAllMsg ); ``` -After success, clear the current message list and conversation row. This does not delete a friend relationship or leave or dismiss a group. A conversation can be regenerated by a new message or synchronization while the chat target still exists; reconcile through `onConversationChanged` or a fresh query. +After success, clear the current message list and conversation row. This does not delete a friend relationship or leave or dismiss a group. A conversation can be regenerated by a new message or synchronization while the chat target still exists. To update the conversation list, query conversations again or receive changes through `onConversationChanged`; see [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) for listener setup. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx index 85aee970c4..b52a334016 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx @@ -1,6 +1,6 @@ --- title: 'Track the total unread count' -description: 'Use getTotalUnreadMsgCount() to retrieve the total unread count for the current Android account.' +description: 'Use getTotalUnreadMsgCount() to retrieve the total unread count for the signed-in account.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/conversation/managing-conversations/get-total-unread-count' --- -`getTotalUnreadMsgCount()` returns the complete unread snapshot for the signed-in account. Do not sum `unreadCount` values from only the currently loaded conversation pages. +`getTotalUnreadMsgCount()` returns the total unread count for the signed-in account. ```java OpenIMClient.getInstance().conversationManager.getTotalUnreadMsgCount( @@ -30,4 +30,4 @@ OpenIMClient.getInstance().conversationManager.getTotalUnreadMsgCount( ); ``` -The callback value is a `String`; handle parse failures as an application error rather than treating it as a partial list total. This page owns `OnConversationListener.onTotalUnreadMessageCountChanged(int count)`, which updates the application badge after the initial query. +The callback value is a `String` and can be parsed for display. When the total unread count changes, receive the update through `OnConversationListener.onTotalUnreadMessageCountChanged(int count)`; see [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) for listener setup. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx index 6e105c864a..a42e4fa664 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx @@ -1,6 +1,6 @@ --- title: 'Hide a conversation' -description: 'Use hideConversation() to hide a conversation entry from the current Android account.' +description: 'Use hideConversation() to hide a conversation entry from the current account.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' @@ -30,4 +30,4 @@ OpenIMClient.getInstance().conversationManager.hideConversation( ); ``` -A hidden conversation can appear again after a new message or resynchronization. Remove it optimistically after success, then merge later `onConversationChanged` events idempotently by `conversationID`. +A hidden conversation can appear again after a new message or resynchronization. Remove it from the current list after success. Conversation list changes can be received through `onConversationChanged`; see [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) for listener setup. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx index e73766fafb..0ec021db16 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx @@ -1,6 +1,6 @@ --- title: 'Mark a conversation as read' -description: 'Use messageManager.markConversationMessageAsRead() to mark Android conversation messages as read.' +description: 'Use messageManager.markConversationMessageAsRead() to mark conversation messages as read.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/conversation/managing-conversations/mark-conversation-read' --- -Call `messageManager.markConversationMessageAsRead()` after the user has opened and read visible messages. Do not mark a conversation read merely because a notification was previewed or a message arrived in the background. +After the user has opened and read visible messages, call `messageManager.markConversationMessageAsRead()` to mark the conversation as read. Do not mark a conversation read merely because a notification was previewed or a message arrived in the background. ```java OpenIMClient.getInstance().messageManager.markConversationMessageAsRead( @@ -30,6 +30,6 @@ OpenIMClient.getInstance().messageManager.markConversationMessageAsRead( ); ``` -Request completion does not guarantee `onConversationChanged` has arrived. Merge the current `ConversationInfo` by `conversationID`, or re-query it when immediate confirmation is required. +The callback indicates that the mark-as-read request has completed. To update the conversation list, query conversations again or receive changes through `onConversationChanged`. -For one-to-one chats, the peer can receive `OnAdvanceMsgListener.onRecvC2CReadReceipt`. Validate `sessionType == ConversationType.SINGLE_CHAT` and a non-empty `userID`, then update message read state from `msgIDList`. `MessageManager` retains one advanced message listener and should be configured once in a shared message state layer. +For one-to-one chats, listen for read receipts from the peer through `OnAdvanceMsgListener.onRecvC2CReadReceipt`. See [Receive messages](/sdk/android/message/receiving-messages/receive-messages) for the message listener setup and [Message overview](/sdk/android/message/overview-message) for message callbacks and read-receipt fields. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx index 169a69bdaa..4596020129 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx @@ -1,6 +1,6 @@ --- title: 'Pin or unpin a conversation' -description: 'Use pinConversation() to set the pinned state of an Android conversation.' +description: 'Use pinConversation() to set the pinned state of a conversation.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' @@ -29,4 +29,4 @@ OpenIMClient.getInstance().conversationManager.pinConversation( ); ``` -Pass `true` to pin and `false` to unpin. The setting affects only the current account's conversation list. A successful callback does not mean `onConversationChanged` has arrived; merge the later conversation increment by `conversationID`. +Pass `true` to pin and `false` to unpin. Conversation list changes can be received through `onConversationChanged`; see [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) for listener setup. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx index e8a7398fb2..a1fc1884bb 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx @@ -1,6 +1,6 @@ --- title: 'Set the burn duration' -description: 'Use setConversationBurnDuration() to set the Android burn-after-reading retention duration.' +description: 'Use setConversationBurnDuration() to set the burn-after-reading retention duration.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' @@ -29,4 +29,4 @@ OpenIMClient.getInstance().conversationManager.setConversationBurnDuration( ); ``` -`burnDuration` is measured in seconds. Enable or disable burn after reading with `isPrivateChat`; do not confuse this value with the scheduled server deletion period `msgDestructTime`. Merge the updated duration from `onConversationChanged`. +`burnDuration` is measured in seconds. Enable or disable burn after reading with `isPrivateChat`; do not confuse this value with the scheduled server deletion period `msgDestructTime`. Conversation list changes can be received through `onConversationChanged`; see [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) for listener setup. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx index 82479d7b70..2da6820239 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx @@ -1,6 +1,6 @@ --- title: 'Set a conversation draft' -description: 'Use setConversationDraft() to save an Android conversation draft.' +description: 'Use setConversationDraft() to save a conversation draft.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' @@ -31,4 +31,4 @@ OpenIMClient.getInstance().conversationManager.setConversationDraft( ); ``` -Pass an empty string to clear the draft. Request completion and the later `onConversationChanged` update are separate; merge `draftText` and `draftTextTime` by `conversationID`, and clear in-memory editor state after logout or an account switch. +Pass an empty string to clear the draft. Conversation list changes can be received through `onConversationChanged`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx index db34de0d69..fc072cb13a 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx @@ -1,6 +1,6 @@ --- title: 'Set conversation extra data' -description: 'Use setConversationEx() to set an Android conversation extension string.' +description: 'Use setConversationEx() to set a conversation extension string.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/conversation/managing-conversations/set-conversation-extension' --- -`ex` is a complete string. The SDK does not merge JSON, so read the prior value and retain namespaces owned by other application modules. +`ex` is a string for storing conversation extension data. You can pass a JSON string or another string format defined by your application. ```java OpenIMClient.getInstance().conversationManager.setConversationEx( @@ -27,8 +27,8 @@ OpenIMClient.getInstance().conversationManager.setConversationEx( } }, conversationID, - mergedExtensionJSON + extensionJSON ); ``` -Reconcile the result through `onConversationChanged` by `conversationID`; listener ownership is documented in [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list). +Conversation list changes for the extension field can be received through `onConversationChanged`; see [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) for listener setup. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx index 80d1f51b7e..55587e2b5b 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx @@ -1,6 +1,6 @@ --- title: 'Schedule server message deletion' -description: 'Use setConversation() to configure scheduled server message deletion for an Android conversation.' +description: 'Use setConversation() to configure scheduled server message deletion for a conversation.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' @@ -35,4 +35,4 @@ OpenIMClient.getInstance().conversationManager.setConversation( ); ``` -`msgDestructTime` is measured in seconds. Set `request.setMsgDestruct(false)` to disable the policy. This capability is distinct from burn after reading. Reconcile the latest switch and period through `onConversationChanged`. +`msgDestructTime` is measured in seconds. Set `request.setMsgDestruct(false)` to disable the policy. This capability is distinct from burn after reading. Conversation list changes can be received through `onConversationChanged`; see [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) for listener setup. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx index 2de3a73dd1..85d04b8fea 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx @@ -1,6 +1,6 @@ --- title: 'Set conversation message reception' -description: 'Use setConversationRecvMessageOpt() to set message reception and notification behavior for one Android conversation.' +description: 'Use setConversationRecvMessageOpt() to set message reception and notification behavior for one conversation.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' @@ -35,4 +35,4 @@ OpenIMClient.getInstance().conversationManager.setConversationRecvMessageOpt( | `1` | Do not receive messages from this conversation or notify. | | `2` | Receive messages from this conversation without notification. | -The account default is documented in [Set global message reception](/sdk/android/user/user-profile/set-global-message-reception). Merge the later `onConversationChanged` result by `conversationID`. +The account default is documented in [Set global message reception](/sdk/android/user/user-profile/set-global-message-reception). Conversation list changes for this setting can be received through `onConversationChanged`; see [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) for listener setup. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx index 899e5cb2b4..26906cc6aa 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx @@ -1,6 +1,6 @@ --- title: 'Enable or disable burn after reading' -description: 'Use setOneConversationPrivateChat() to configure burn-after-reading mode for an Android conversation.' +description: 'Use setOneConversationPrivateChat() to configure burn-after-reading mode for a conversation.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' @@ -29,4 +29,4 @@ OpenIMClient.getInstance().conversationManager.setOneConversationPrivateChat( ); ``` -Pass `false` to disable burn after reading. Set the duration separately with `burnDuration`; see [Set the burn duration](/sdk/android/conversation/managing-conversations/set-burn-duration). This is distinct from scheduled server message deletion. Reconcile the final state through `onConversationChanged`. +Pass `false` to disable burn after reading. Set the duration separately with `burnDuration`; see [Set the burn duration](/sdk/android/conversation/managing-conversations/set-burn-duration). This is distinct from scheduled server message deletion. Conversation list changes can be received through `onConversationChanged`; see [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) for listener setup. diff --git a/content/docs/chat/sdk/android/conversation/overview-conversation.mdx b/content/docs/chat/sdk/android/conversation/overview-conversation.mdx index c8dd673cd0..2c5d94c955 100644 --- a/content/docs/chat/sdk/android/conversation/overview-conversation.mdx +++ b/content/docs/chat/sdk/android/conversation/overview-conversation.mdx @@ -5,13 +5,13 @@ product: 'sdk' context: 'chat/sdk/android' template: 'guide' status: 'published' -lastUpdated: '2026-08-07' +lastUpdated: '2026-08-19' version: 'v4' platform: 'android' sourcePath: '/sdk/android/conversation/overview-conversation' --- -A conversation is the chat-list state maintained by the signed-in account for a one-to-one or group chat. A `ConversationInfo` record contains unread count, latest message, pinning, draft, message reception, and extension data. `conversationID` identifies the account's conversation state; the chat target is the peer `userID` for a one-to-one chat or the `groupID` for a group chat. +A conversation is the chat-list state maintained by the signed-in account for a one-to-one or group chat. A `ConversationInfo` record contains unread count, latest message, pinning, draft, message reception, and extension data. `conversationID` uniquely identifies a conversation and is used to query conversation information and set conversation state; the chat target is the peer `userID` for a one-to-one chat or the `groupID` for a group chat. Group profile, membership, and permissions belong to Group APIs. Use `groupID` for group operations and `conversationID` for conversation settings, unread state, drafts, and message cleanup. @@ -24,27 +24,49 @@ Group profile, membership, and permissions belong to Group APIs. Use `groupID` f | `groupID` | Group ID for a group chat and Group API target. | | `sourceId` | Chat target passed to queries and ID resolution: `userID` for a one-to-one chat, `groupID` for a group chat. | -Use `ConversationType.SINGLE_CHAT` for one-to-one chats. For a group chat, use `ConversationType.GROUP_CHAT` or `ConversationType.SUPER_GROUP_CHAT` according to the group type. Do not construct a `conversationID` in application code. - ## ConversationInfo -| Field | Description | -| ------------------------------------- | -------------------------------------------------- | -| `conversationID` / `conversationType` | Conversation ID and type. | -| `userID` / `groupID` | Peer user or target group. | -| `showName` / `faceURL` | Conversation-list display name and avatar. | -| `unreadCount` | Unread count for the conversation. | -| `latestMsg` / `latestMsgSendTime` | Latest-message JSON and send time. | -| `recvMsgOpt` / `groupAtType` | Reception option and group mention state. | -| `draftText` / `draftTextTime` | Draft and draft update time. | -| `isPinned` | Whether the conversation is pinned. | -| `isPrivateChat` / `burnDuration` | Burn-after-reading setting and duration. | -| `isMsgDestruct` / `msgDestructTime` | Server message-destruction configuration. | -| `ex` | Application-defined conversation extension string. | +| Field | Description | +| --- | --- | +| `conversationID` | Conversation ID. | +| `conversationType` | Conversation type: `ConversationType.SINGLE_CHAT` for one-to-one chats; `ConversationType.GROUP_CHAT` or `ConversationType.SUPER_GROUP_CHAT` for group chats. | +| `userID` / `groupID` | `userID` identifies the peer user in a one-to-one chat, while `groupID` identifies the target group in a group chat. Only one applies. | +| `showName` | Conversation name: the target user's nickname or remark for a one-to-one chat, and the group name or remark for a group chat. | +| `faceURL` | Conversation avatar URL. | +| `unreadCount` | Unread count for the conversation. | +| `latestMsg` | JSON string for the latest message. | +| `latestMsgSendTime` | Send time of the latest message. | +| `recvMsgOpt` | Message reception option for the conversation. | +| `groupAtType` | Group mention reminder state. | +| `draftText` | Conversation draft. | +| `draftTextTime` | Draft update time. | +| `isPinned` | Whether the conversation is pinned. | +| `isPrivateChat` | Whether burn after reading is enabled. | +| `burnDuration` | Reading duration for burn-after-reading messages, in seconds. | +| `isMsgDestruct` | Whether scheduled server-message deletion is enabled. | +| `msgDestructTime` | Scheduled server-message deletion time. | +| `ext` | Reserved conversation extension string. | +| `ex` | Application-defined conversation extension string. | +| `isNotInGroup` | Whether the current user is no longer in the group. | + +## Find pages by task + +| Task | Pages | +| --- | --- | +| Query one, several, or a paginated list of conversations | [Get a conversation by target](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target), [Get conversations by ID](/sdk/android/conversation/retrieving-conversations/get-conversations-by-id), [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) | +| Generate a conversation ID | [Generate a conversation ID](/sdk/android/conversation/retrieving-conversations/get-conversation-id) | +| Organize the conversation list | [Pin or unpin a conversation](/sdk/android/conversation/managing-conversations/pin-conversation), [Hide a conversation](/sdk/android/conversation/managing-conversations/hide-a-conversation) | +| Maintain drafts and extension data | [Set a conversation draft](/sdk/android/conversation/managing-conversations/set-conversation-draft), [Set conversation extension data](/sdk/android/conversation/managing-conversations/set-conversation-extension) | +| Set message reception and retention policy | [Set conversation message reception](/sdk/android/conversation/managing-conversations/set-message-receive-option), [Enable or disable burn after reading](/sdk/android/conversation/managing-conversations/set-private-chat), [Set burn-after-reading duration](/sdk/android/conversation/managing-conversations/set-burn-duration), [Schedule server message deletion](/sdk/android/conversation/managing-conversations/set-message-destruct) | +| Handle unread counts and group mention reminders | [Mark a conversation as read](/sdk/android/conversation/managing-conversations/mark-conversation-read), [Get the total unread count](/sdk/android/conversation/managing-conversations/get-total-unread-count), [Reset group mention status](/sdk/android/conversation/managing-conversations/clear-group-mentions) | +| Delete or clear conversation data | [Delete a conversation and its messages](/sdk/android/conversation/managing-conversations/delete-conversation-with-messages), [Clear messages in a conversation](/sdk/android/conversation/managing-conversations/clear-conversation-messages) | ## State updates -- [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) owns `onNewConversation` and `onConversationChanged`. -- [Track the total unread count](/sdk/android/conversation/managing-conversations/get-total-unread-count) owns `onTotalUnreadMessageCountChanged`. +After you set an `OnConversationListener`, you can receive changes to the conversation list and total unread count. See [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list#keep-the-list-synchronized) for complete listener setup: + +- `onNewConversation`: Receives newly created conversations. +- `onConversationChanged`: Receives conversation property changes, such as unread count, pinning, and drafts. +- `onTotalUnreadMessageCountChanged`: Receives changes to the signed-in account's total unread message count. -`ConversationManager` retains one `OnConversationListener`; `setOnConversationListener()` replaces it. Set a composed listener once in a shared state layer. Request completion, event arrival, and snapshot reconciliation are separate stages. +Each call to `setOnConversationListener()` replaces the previously set listener. diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx index ebea8b814b..ff79159810 100644 --- a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx @@ -1,6 +1,6 @@ --- title: 'Open a conversation' -description: 'Use getOneConversation() to retrieve one Android conversation by user or group.' +description: 'Use getOneConversation() to retrieve one conversation by user or group.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversation-by-target' --- -Use `getOneConversation()` when opening a chat from a contact, user profile, or group profile. Pass the peer user ID for a one-to-one chat and the group ID for a group chat; do not construct `ConversationInfo` locally when no messages exist yet. +`getOneConversation()` retrieves one conversation by user or group and is suitable when opening a chat from a contact, user profile, or group profile. Pass the peer user ID for a one-to-one chat and the group ID for a group chat. ```java OpenIMClient.getInstance().conversationManager.getOneConversation( @@ -26,11 +26,11 @@ OpenIMClient.getInstance().conversationManager.getOneConversation( recordConversationOpenFailure(code, error); } }, - targetUserID, + sourceId, ConversationType.SINGLE_CHAT ); ``` `sourceId` is the peer `userID` for a one-to-one chat and `groupID` for a group chat. Use `ConversationType.GROUP_CHAT` or `ConversationType.SUPER_GROUP_CHAT` for a group according to its type. -The callback returns `ConversationInfo`. This query does not trigger a conversation listener; [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) merges later changes by `conversationID`. +The callback returns `ConversationInfo`. To receive newly added or changed conversations, see [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) for how to set `OnConversationListener`. diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx index dc28debd0b..fe40e343cd 100644 --- a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx @@ -1,6 +1,6 @@ --- title: 'Resolve a conversation ID' -description: 'Use getConversationIDBySessionType() to resolve an Android conversation ID from a chat target.' +description: 'Use getConversationIDBySessionType() to resolve a conversation ID from a chat target.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' @@ -11,16 +11,16 @@ platform: 'android' sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversation-id' --- -When only the conversation ID is needed, call `getConversationIDBySessionType()` rather than constructing it in application code. +`getConversationIDBySessionType()` returns a `conversationID` from the chat target `sourceId` and conversation type `sessionType`. ```java String conversationID = OpenIMClient.getInstance().conversationManager .getConversationIDBySessionType( - targetUserID, + sourceId, ConversationType.SINGLE_CHAT ); ``` `sourceId` is the peer `userID` for a one-to-one chat and `groupID` for a group chat. Use the group conversation type that matches the target group. -This Android API synchronously returns a `String` `conversationID`. It does not return `ConversationInfo` or trigger a conversation listener. Use [Open a conversation](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target) when profile data is required. +The return value is a `String` `conversationID`. Use [Open a conversation](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target) when conversation information is required. diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx index 2f522702e2..1d67127636 100644 --- a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx @@ -1,6 +1,6 @@ --- title: 'Get conversations by ID' -description: 'Use getMultipleConversation() to retrieve Android conversations by conversationID.' +description: 'Use getMultipleConversation() to retrieve conversations by conversationID.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversations-by-id' --- -Use `getMultipleConversation()` when a set of `conversationID` values is already available and the latest conversation snapshot is needed. +Use `getMultipleConversation()` to retrieve multiple conversations by `conversationIDs`. `conversationIDs` is the list of conversation IDs to query. ```java OpenIMClient.getInstance().conversationManager.getMultipleConversation( @@ -32,4 +32,4 @@ OpenIMClient.getInstance().conversationManager.getMultipleConversation( ); ``` -Remove empty and duplicate IDs before calling. The callback returns `List`. Treat an ID with no returned item as missing; do not assume response order exactly matches request order. This query does not trigger a conversation listener. +The callback returns `List`. diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx index 78bd222c37..7bab857da0 100644 --- a/content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx @@ -1,6 +1,6 @@ --- title: 'Get the conversation list' -description: 'Use getConversationListSplit() to retrieve the current Android account conversation list by page.' +description: 'Use getConversationListSplit() to retrieve the signed-in account conversation list by page.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' @@ -11,7 +11,7 @@ platform: 'android' sourcePath: '/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list' --- -The conversation list belongs to the signed-in account. Each `ConversationInfo` contains list state such as unread count, latest message, pinning, and draft. Use the paged API instead of the non-paged `getAllConversationList()`. +The conversation list belongs to the signed-in account. Each `ConversationInfo` contains list state such as unread count, latest message, pinning, and draft. ## Retrieve a page @@ -38,22 +38,28 @@ OpenIMClient.getInstance().conversationManager.getConversationListSplit( | `offset` | `long` | Zero-based paging offset; reset it to `0` on refresh. | | `count` | `long` | Requested number of conversations. | -The callback returns the current `List` page. Advance `offset` by the requested item count and deduplicate by `conversationID`. A page smaller than `count` normally indicates the end; clear paging state and reload from `0` on refresh. +The callback returns the current `List` page. Advance `offset` by the requested item count. A page smaller than `count` normally indicates the end. ## Keep the list synchronized -`getConversationListSplit()` only creates a snapshot. Combine these callbacks in the application's single `OnConversationListener`: +Use `OnConversationListener` to receive the following callbacks when conversations are added or changed: ```java -@Override -public void onNewConversation(List conversations) { - mergeConversations(conversations); -} - -@Override -public void onConversationChanged(List conversations) { - mergeConversations(conversations); -} +OnConversationListener conversationListener = new OnConversationListener() { + @Override + public void onNewConversation(List conversations) { + mergeConversations(conversations); + } + + @Override + public void onConversationChanged(List conversations) { + mergeConversations(conversations); + } +}; + +OpenIMClient.getInstance().conversationManager.setOnConversationListener( + conversationListener +); ``` -Both callbacks carry `List` and must merge idempotently by `conversationID`. A user can join a group without an existing conversation, and a historical conversation can remain after leaving a group, so do not substitute the joined-group list for the conversation list. +Both callbacks carry `List`; update the corresponding conversation by `conversationID`. Once set, `setOnConversationListener()` receives conversation changes. diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx index 9d5b035e1f..15fcac5df1 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx @@ -1,10 +1,10 @@ --- title: '清空会话消息' -description: '使用 messageManager.clearConversationAndDeleteAllMsg() 保留 Android 会话入口并清空其消息。' +description: '使用 messageManager.clearConversationAndDeleteAllMsg() 保留会话入口并清空其消息。' sourcePath: '/sdk/android/conversation/managing-conversations/clear-conversation-messages' --- -产品语义为“清空聊天记录”时,调用 `messageManager.clearConversationAndDeleteAllMsg()`。 +`messageManager.clearConversationAndDeleteAllMsg()` 清空指定会话的消息并保留会话入口。 ```java OpenIMClient.getInstance().messageManager.clearConversationAndDeleteAllMsg( @@ -23,4 +23,4 @@ OpenIMClient.getInstance().messageManager.clearConversationAndDeleteAllMsg( ); ``` -成功 callback 后保留会话入口,但清除当前账号下的消息和摘要状态。立即清理当前消息列表,再通过 `onConversationChanged` 或重新查询校准最后一条消息、摘要和未读状态。 +成功回调后,会话入口仍然保留,但当前账号下的消息会被清除。需要更新会话列表时,可重新查询会话或通过 `onConversationChanged` 接收变化。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx index 6989af75e3..d3909620d1 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx @@ -1,10 +1,10 @@ --- title: '重置群聊 @ 状态' -description: '使用 resetConversationGroupAtType() 将 Android 指定会话的群聊 @ 状态重置为普通状态。' +description: '使用 resetConversationGroupAtType() 将指定会话的群聊 @ 状态重置为普通状态。' sourcePath: '/sdk/android/conversation/managing-conversations/clear-group-mentions' --- -用户处理完群聊中的 @ 消息后,调用 `resetConversationGroupAtType()` 将 `groupAtType` 重置为普通状态。 +群聊消息中有人 @ 当前用户或 @ 全体成员时,`groupAtType` 用于标记会话列表中的提醒状态。当前用户阅读相关消息后,调用 `resetConversationGroupAtType()` 清除该会话 `groupAtType` 的 @ 提醒状态,并更新会话列表 UI。 ```java OpenIMClient.getInstance().conversationManager.resetConversationGroupAtType( @@ -23,6 +23,4 @@ OpenIMClient.getInstance().conversationManager.resetConversationGroupAtType( ); ``` -本操作只负责重置为普通状态,不应用于主动写入 `atMe`、`atAll` 等状态。群聊 @ 状态与消息已读状态不同。 - -成功 callback 后通过 `onConversationChanged` 按 `conversationID` 合并该会话;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 +会话列表中的状态变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx index 9e9f3c5c36..7789ef123a 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx @@ -1,10 +1,10 @@ --- title: '删除会话及消息' -description: '使用 deleteConversationAndDeleteAllMsg() 删除 Android 指定会话及其全部消息。' +description: '使用 deleteConversationAndDeleteAllMsg() 删除指定会话及其全部消息。' sourcePath: '/sdk/android/conversation/managing-conversations/delete-conversation-with-messages' --- -产品语义为“删除此聊天”时,调用 `deleteConversationAndDeleteAllMsg()`。 +`deleteConversationAndDeleteAllMsg()` 删除指定会话及其全部消息。 ```java OpenIMClient.getInstance().conversationManager.deleteConversationAndDeleteAllMsg( @@ -24,6 +24,6 @@ OpenIMClient.getInstance().conversationManager.deleteConversationAndDeleteAllMsg ); ``` -成功 callback 后清理当前消息列表和会话行。该操作不删除好友关系,也不退出或解散群组;聊天目标仍存在时,会话可能由新消息或同步重新生成。 +成功回调后清理当前消息列表和会话行。该操作不删除好友关系,也不退出或解散群组;聊天目标仍存在时,会话可能由新消息或同步重新生成。 -后续通过 `onConversationChanged` 或重新查询校准会话列表,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 +需要更新会话列表时,可重新查询会话或通过 `onConversationChanged` 接收变化,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx index c189d9265c..1760a1394d 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx @@ -1,10 +1,10 @@ --- title: '获取消息总未读数' -description: '使用 getTotalUnreadMsgCount() 获取 Android 当前账号的总未读数。' +description: '使用 getTotalUnreadMsgCount() 获取当前账号的总未读数。' sourcePath: '/sdk/android/conversation/managing-conversations/get-total-unread-count' --- -`getTotalUnreadMsgCount()` 返回当前账号所有会话的总未读快照,不要把当前已加载分页中的 `unreadCount` 简单相加。 +`getTotalUnreadMsgCount()` 返回当前账号所有会话的总未读数。 ```java OpenIMClient.getInstance().conversationManager.getTotalUnreadMsgCount( @@ -23,6 +23,6 @@ OpenIMClient.getInstance().conversationManager.getTotalUnreadMsgCount( ); ``` -回调值是 `String`,解析失败时应按业务错误处理,不能将其默认为会话列表分页的局部总数。查询本身不触发 callback。 +回调值是 `String`,解析后即可用于显示总未读数。 -本页归属 `OnConversationListener.onTotalUnreadMessageCountChanged(int count)`。在应用唯一的 `OnConversationListener` 中按该值更新应用角标;会话 listener 的集中设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 +总未读数发生变化时,可以通过 `OnConversationListener.onTotalUnreadMessageCountChanged(int count)` 接收更新;监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx index 488aa5fad4..2a04591a94 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx @@ -1,6 +1,6 @@ --- title: '隐藏会话' -description: '使用 hideConversation() 从 Android 当前账号的会话列表隐藏入口。' +description: '使用 hideConversation() 从当前账号的会话列表隐藏入口。' sourcePath: '/sdk/android/conversation/managing-conversations/hide-a-conversation' --- @@ -25,4 +25,4 @@ OpenIMClient.getInstance().conversationManager.hideConversation( 该方法适合临时从聊天列表移除入口。收到新消息或重新同步后,隐藏的会话可能再次出现。 -成功 callback 表示隐藏请求已完成,调用端可以从当前列表移除该 `conversationID`。后续收到 `onConversationChanged` 时仍应按 `conversationID` 幂等合并;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 +成功回调表示隐藏请求已完成,调用端可以从当前列表移除该 `conversationID`。会话列表后续发生变化时,可通过 `onConversationChanged` 接收更新,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx index a126331ecf..4e58b324a9 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx @@ -1,10 +1,10 @@ --- title: '标记会话已读' -description: '使用 messageManager.markConversationMessageAsRead() 将 Android 指定会话的消息标记为已读。' +description: '使用 messageManager.markConversationMessageAsRead() 将指定会话的消息标记为已读。' sourcePath: '/sdk/android/conversation/managing-conversations/mark-conversation-read' --- -用户打开会话并阅读完当前可见消息后,调用 `messageManager.markConversationMessageAsRead()`。不要在仅预览通知或后台收到消息时提前标记。 +用户打开会话并阅读完当前可见消息后,调用 `messageManager.markConversationMessageAsRead()` 标记会话已读。不要在仅预览通知或后台收到消息时提前标记。 ```java OpenIMClient.getInstance().messageManager.markConversationMessageAsRead( @@ -23,6 +23,6 @@ OpenIMClient.getInstance().messageManager.markConversationMessageAsRead( ); ``` -成功 callback 表示请求完成,不等于 `onConversationChanged` 已到达。随后按 `conversationID` 合并最新 `ConversationInfo`;需要立即确认时重新查询该会话。 +成功回调表示标记请求已完成。需要更新会话列表时,可重新查询会话或通过 `onConversationChanged` 接收变化。 -对于单聊,当前用户标记会话已读后,对端可通过 `OnAdvanceMsgListener.onRecvC2CReadReceipt` 收到已读回执。对每个 `C2CReadReceiptInfo` 先验证 `sessionType == ConversationType.SINGLE_CHAT` 和非空 `userID`,再按 `msgIDList` 更新对应消息的已读状态。`MessageManager` 同样只保存一个高级消息 listener,应在应用级消息状态层统一设置。 +对于单聊,可以通过 `OnAdvanceMsgListener.onRecvC2CReadReceipt` 监听对端发来的已读回执。消息监听器的设置方式见[接收消息](/sdk/android/message/receiving-messages/receive-messages),消息回调和已读回执字段见[消息概览](/sdk/android/message/overview-message)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx index 310288bcfc..b372663417 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx @@ -1,6 +1,6 @@ --- title: '置顶或取消置顶会话' -description: '使用 pinConversation() 设置 Android 指定会话的置顶状态。' +description: '使用 pinConversation() 设置指定会话的置顶状态。' sourcePath: '/sdk/android/conversation/managing-conversations/pin-conversation' --- @@ -22,6 +22,6 @@ OpenIMClient.getInstance().conversationManager.pinConversation( ); ``` -最后一个参数为 `true` 时置顶,传 `false` 时取消置顶。该状态只影响当前账号的会话列表。 +最后一个参数为 `true` 时置顶,传 `false` 时取消置顶。 -成功 callback 不等于 `onConversationChanged` 已经到达。后续按 `conversationID` 合并最新会话,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 +会话列表发生变化时,可通过 `onConversationChanged` 接收更新,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx index db690ccb80..93f7bb7b09 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx @@ -1,6 +1,6 @@ --- title: '设置阅后即焚时长' -description: '使用 setConversationBurnDuration() 设置 Android 阅后即焚模式的消息保留时长。' +description: '使用 setConversationBurnDuration() 设置阅后即焚模式的消息保留时长。' sourcePath: '/sdk/android/conversation/managing-conversations/set-burn-duration' --- @@ -24,4 +24,4 @@ OpenIMClient.getInstance().conversationManager.setConversationBurnDuration( `burnDuration` 的单位为秒。启用或关闭阅后即焚需要设置 `isPrivateChat`,见[开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat)。不要把它与服务端消息定期删除周期 `msgDestructTime` 混用。 -成功 callback 后,通过 `onConversationChanged` 合并最新 `burnDuration`;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 +会话列表中的时长变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx index 29b1051927..fd6f97c5c4 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx @@ -1,6 +1,6 @@ --- title: '设置会话草稿' -description: '使用 setConversationDraft() 保存 Android 会话草稿。' +description: '使用 setConversationDraft() 保存会话草稿。' sourcePath: '/sdk/android/conversation/managing-conversations/set-conversation-draft' --- @@ -24,4 +24,4 @@ OpenIMClient.getInstance().conversationManager.setConversationDraft( ); ``` -清空草稿时传空字符串。成功 callback 只表示保存请求已经完成,不等同于会话变化回调已经到达;SDK 后续通过 `onConversationChanged` 同步 `draftText` 和 `draftTextTime`,需要校准时重新查询会话。退出登录或切换账号时清理编辑器内存状态。 +清空草稿时传空字符串。会话列表中的草稿变化可通过 `onConversationChanged` 接收。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx index a04da9cd63..c77e24771d 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx @@ -1,10 +1,10 @@ --- title: '设置会话扩展字段' -description: '使用 setConversationEx() 设置 Android 指定会话的业务扩展字符串。' +description: '使用 setConversationEx() 设置指定会话的业务扩展字符串。' sourcePath: '/sdk/android/conversation/managing-conversations/set-conversation-extension' --- -`ex` 是完整字符串,SDK 不会自动合并 JSON。更新前应读取旧值并保留其他业务模块的命名空间。 +`ex` 是用于保存会话扩展信息的字符串,可以传入 JSON 字符串或其他业务约定格式的字符串。 ```java OpenIMClient.getInstance().conversationManager.setConversationEx( @@ -20,8 +20,8 @@ OpenIMClient.getInstance().conversationManager.setConversationEx( } }, conversationID, - mergedExtensionJSON + extensionJSON ); ``` -成功 callback 表示设置请求完成。通过 `onConversationChanged` 按 `conversationID` 合并最新会话;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 +成功回调表示设置请求已完成。会话列表中的扩展字段变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx index 9b4cc1a3d4..c0bf2b2b0a 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx @@ -1,6 +1,6 @@ --- title: '定期删除服务端消息' -description: '使用 setConversation() 启用、关闭并配置 Android 会话的服务端消息定期删除策略。' +description: '使用 setConversation() 启用、关闭并配置会话的服务端消息定期删除策略。' sourcePath: '/sdk/android/conversation/managing-conversations/set-message-destruct' --- @@ -30,4 +30,4 @@ OpenIMClient.getInstance().conversationManager.setConversation( `msgDestructTime` 的单位为秒。关闭时只传 `request.setMsgDestruct(false)`;该能力用于定期删除服务端消息,不是阅后即焚。 -成功 callback 表示设置请求完成。最新开关和周期通过 `onConversationChanged` 按 `conversationID` 合并,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 +会话列表中的设置变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx index df9fe47afe..1f9cd9c73c 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx @@ -1,6 +1,6 @@ --- title: '设置会话消息接收方式' -description: '使用 setConversationRecvMessageOpt() 设置 Android 单个会话的消息接收与通知方式。' +description: '使用 setConversationRecvMessageOpt() 设置单个会话的消息接收与通知方式。' sourcePath: '/sdk/android/conversation/managing-conversations/set-message-receive-option' --- @@ -28,4 +28,4 @@ OpenIMClient.getInstance().conversationManager.setConversationRecvMessageOpt( | `1` | 不接收该会话消息,也不通知。 | | `2` | 接收该会话消息,但不通知。 | -账号级默认策略见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。成功 callback 后通过 `onConversationChanged` 按 `conversationID` 合并最新会话。 +账号级默认策略见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。会话列表中的接收方式变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx index 8e6096e451..812e53c15c 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx @@ -1,6 +1,6 @@ --- title: '开启或关闭阅后即焚' -description: '使用 setOneConversationPrivateChat() 设置 Android 会话的阅后即焚模式。' +description: '使用 setOneConversationPrivateChat() 设置会话的阅后即焚模式。' sourcePath: '/sdk/android/conversation/managing-conversations/set-private-chat' --- @@ -24,4 +24,4 @@ OpenIMClient.getInstance().conversationManager.setOneConversationPrivateChat( 传入 `false` 关闭阅后即焚。具体保留时长由 `burnDuration` 单独设置,见[设置阅后即焚时长](/sdk/android/conversation/managing-conversations/set-burn-duration)。该能力与定期删除服务端消息不同。 -成功 callback 只表示设置请求完成;最新状态通过 `onConversationChanged` 按 `conversationID` 合并,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 +会话列表中的阅后即焚状态变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/overview-conversation.mdx b/content/zh/docs/chat/sdk/android/conversation/overview-conversation.mdx index ab61713832..a2ddb74481 100644 --- a/content/zh/docs/chat/sdk/android/conversation/overview-conversation.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/overview-conversation.mdx @@ -4,7 +4,7 @@ description: '了解 Android SDK 中 ConversationInfo、conversationID、会话 sourcePath: '/sdk/android/conversation/overview-conversation' --- -会话是当前登录用户围绕一次单聊或群聊维护的聊天列表状态,由一条 `ConversationInfo` 记录表示。它保存未读数、最后一条消息、置顶、草稿、消息接收方式和扩展字段。`conversationID` 用于定位当前账号的会话状态;单聊目标使用对方 `userID`,群聊目标使用 `groupID`。 +会话是当前登录用户围绕一次单聊或群聊维护的聊天列表状态,由一条 `ConversationInfo` 记录表示。它保存未读数、最后一条消息、置顶、草稿、消息接收方式和扩展字段。`conversationID` 是会话的唯一标识,用于查询会话信息和设置会话状态;单聊目标使用对方 `userID`,群聊目标使用 `groupID`。 群资料、成员关系和群权限属于群组能力。群聊页面使用 `groupID` 调用群组 API,使用 `conversationID` 处理会话设置、未读数、草稿和消息清理。 @@ -17,47 +17,49 @@ sourcePath: '/sdk/android/conversation/overview-conversation' | `groupID` | 群聊对应的群组 ID,也是群组 API 的目标标识。 | | `sourceId` | 按会话类型查询或生成 ID 时传入的聊天目标:单聊为 `userID`,群聊为 `groupID`。 | -单聊使用 `ConversationType.SINGLE_CHAT`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`;不要在应用层自行拼接 `conversationID`。 - -## ConversationInfo - -| 字段 | 说明 | -| ----------------------------------- | ------------------------------------ | -| `conversationID` | 会话 ID。 | -| `conversationType` | 会话类型。 | -| `userID` / `groupID` | 单聊目标用户或群聊目标群组。 | -| `showName` / `faceURL` | 会话列表显示名称和头像。 | -| `unreadCount` | 当前会话未读数。 | -| `latestMsg` / `latestMsgSendTime` | 最后一条消息 JSON 字符串及发送时间。 | -| `recvMsgOpt` | 当前会话消息接收方式。 | -| `groupAtType` | 群聊 @ 提醒状态。 | -| `draftText` / `draftTextTime` | 会话草稿及更新时间。 | -| `isPinned` | 是否置顶。 | -| `isPrivateChat` / `burnDuration` | 阅后即焚开关和保留时长。 | -| `isMsgDestruct` / `msgDestructTime` | 服务端消息定期删除设置。 | -| `ex` | 业务约定的会话扩展字符串。 | - -## 查询和设置 - -- [查询指定会话](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target) -- [生成会话 ID](/sdk/android/conversation/retrieving-conversations/get-conversation-id) -- [按 ID 批量获取会话](/sdk/android/conversation/retrieving-conversations/get-conversations-by-id) -- [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) -- [置顶或取消置顶会话](/sdk/android/conversation/managing-conversations/pin-conversation) -- [设置会话扩展字段](/sdk/android/conversation/managing-conversations/set-conversation-extension) -- [设置会话草稿](/sdk/android/conversation/managing-conversations/set-conversation-draft) -- [设置会话消息接收方式](/sdk/android/conversation/managing-conversations/set-message-receive-option) -- [重置群聊 @ 状态](/sdk/android/conversation/managing-conversations/clear-group-mentions) -- [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) -- [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) -- [开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat) -- [定期删除服务端消息](/sdk/android/conversation/managing-conversations/set-message-destruct) +## 会话数据 + +| 字段 | 说明 | +| --- | --- | +| `conversationID` | 会话 ID。 | +| `conversationType` | 会话类型:单聊为 `ConversationType.SINGLE_CHAT`;群聊为 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。 | +| `userID` / `groupID` | 单聊使用 `userID` 表示目标用户,群聊使用 `groupID` 表示目标群组;两者仅有一个生效。 | +| `showName` | 会话名称,单聊为目标用户昵称或备注,群聊为群聊名称或备注。 | +| `faceURL` | 会话头像URL。 | +| `unreadCount` | 当前会话未读数。 | +| `latestMsg` | 最后一条消息的 JSON 字符串。 | +| `latestMsgSendTime` | 最后一条消息的发送时间。 | +| `recvMsgOpt` | 当前会话消息接收方式。 | +| `groupAtType` | 群聊 @ 提醒状态。 | +| `draftText` | 会话草稿。 | +| `draftTextTime` | 草稿更新时间。 | +| `isPinned` | 是否置顶。 | +| `isPrivateChat` | 是否开启阅后即焚。 | +| `burnDuration` | 阅后即焚消息的阅读时长,单位为秒。 | +| `isMsgDestruct` | 是否开启服务端消息定期删除。 | +| `msgDestructTime` | 服务端消息定期删除时间。 | +| `ext` | 预留的会话扩展字符串。 | +| `ex` | 业务约定的会话扩展字符串。 | +| `isNotInGroup` | 当前用户是否已不在该群组中。 | + +## 按任务查找页面 + +| 任务 | 页面 | +| --- | --- | +| 查询单个、多个或分页会话 | [查询指定会话](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target)、[按 ID 批量获取会话](/sdk/android/conversation/retrieving-conversations/get-conversations-by-id)、[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) | +| 生成会话 ID | [生成会话 ID](/sdk/android/conversation/retrieving-conversations/get-conversation-id) | +| 整理会话列表 | [置顶或取消置顶会话](/sdk/android/conversation/managing-conversations/pin-conversation)、[隐藏会话](/sdk/android/conversation/managing-conversations/hide-a-conversation) | +| 维护草稿和业务扩展 | [设置会话草稿](/sdk/android/conversation/managing-conversations/set-conversation-draft)、[设置会话扩展字段](/sdk/android/conversation/managing-conversations/set-conversation-extension) | +| 设置消息接收和存储策略 | [设置会话消息接收方式](/sdk/android/conversation/managing-conversations/set-message-receive-option)、[开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat)、[设置阅后即焚时长](/sdk/android/conversation/managing-conversations/set-burn-duration)、[定期删除服务端消息](/sdk/android/conversation/managing-conversations/set-message-destruct) | +| 处理未读数和群聊 @ 提醒 | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read)、[获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count)、[重置群聊 @ 状态](/sdk/android/conversation/managing-conversations/clear-group-mentions) | +| 删除或清理会话数据 | [删除会话及消息](/sdk/android/conversation/managing-conversations/delete-conversation-with-messages)、[清空会话消息](/sdk/android/conversation/managing-conversations/clear-conversation-messages) | ## 状态更新 -查询方法建立会话快照,事件负责合并后续增量: +设置 `OnConversationListener` 后,可以接收会话列表和总未读数的变化。监听器的完整设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list#保持列表同步): -- 新会话和会话属性变化由[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)归属的 `onNewConversation` 与 `onConversationChanged` 处理。 -- 当前账号总未读数由[获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count)归属的 `onTotalUnreadMessageCountChanged` 处理。 +- `onNewConversation`:接收新增的会话。 +- `onConversationChanged`:接收会话属性变化,例如未读数、置顶状态和草稿。 +- `onTotalUnreadMessageCountChanged`:接收当前账号消息总未读数的变化。 -`ConversationManager` 只保存一个 `OnConversationListener`,`setOnConversationListener()` 会替换当前 listener。应用应在统一状态层组合所有 callback 并设置一次;请求成功、事件到达和重新查询校准是三个独立阶段。 +再次调用 `setOnConversationListener()` 会替换已设置的 listener。 diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx index dc69577130..d2465a21c4 100644 --- a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx @@ -1,10 +1,10 @@ --- title: '查询指定会话' -description: '使用 getOneConversation() 按用户或群组获取一个 Android 会话。' +description: '使用 getOneConversation() 按用户或群组获取一个会话。' sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversation-by-target' --- -从通讯录、用户资料或群资料进入聊天页时,使用 `getOneConversation()`。单聊传对方用户 ID,群聊传群组 ID;即使还没有消息,也不要自行构造 `ConversationInfo`。 +`getOneConversation()` 按用户或群组获取一个会话信息,适用于从通讯录、用户资料或群资料进入聊天页的场景。单聊传对方用户 ID,群聊传群组 ID。 ```java OpenIMClient.getInstance().conversationManager.getOneConversation( @@ -19,11 +19,11 @@ OpenIMClient.getInstance().conversationManager.getOneConversation( recordConversationOpenFailure(code, error); } }, - targetUserID, + sourceId, ConversationType.SINGLE_CHAT ); ``` 参数 `sourceId` 在单聊中是对方 `userID`,在群聊中是 `groupID`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。 -成功 callback 返回 `ConversationInfo`。查询本身不触发会话 listener;后续变化由[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)统一按 `conversationID` 合并。 +成功回调返回 `ConversationInfo`。如果需要接收会话列表的新增或变化,请参考[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)设置 `OnConversationListener`。 diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx index d71b5e879e..37858ffe2b 100644 --- a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx @@ -1,19 +1,19 @@ --- title: '生成会话 ID' -description: '使用 getConversationIDBySessionType() 按聊天目标计算 Android 会话 ID。' +description: '使用 getConversationIDBySessionType() 按聊天目标计算会话 ID。' sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversation-id' --- -只需要会话 ID 时,调用 `getConversationIDBySessionType()`,不要在应用层自行拼接。 +`getConversationIDBySessionType()` 根据聊天目标 `sourceId` 和会话类型 `sessionType` 获取 `conversationID`。 ```java String conversationID = OpenIMClient.getInstance().conversationManager .getConversationIDBySessionType( - targetUserID, + sourceId, ConversationType.SINGLE_CHAT ); ``` `sourceId` 在单聊中是对方 `userID`,在群聊中是 `groupID`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。 -该方法同步返回 `String` 类型的 `conversationID`,不返回完整 `ConversationInfo`,也不触发会话 listener。需要会话资料时调用[查询指定会话](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target)。 +返回值是 `String` 类型的 `conversationID`。需要会话资料时调用[查询指定会话](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx index c5230cbe99..074f48dcd6 100644 --- a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx @@ -1,10 +1,10 @@ --- title: '按 ID 批量获取会话' -description: '使用 getMultipleConversation() 按 conversationID 批量获取 Android 会话。' +description: '使用 getMultipleConversation() 按 conversationID 批量获取会话。' sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversations-by-id' --- -已经持有一组 `conversationID` 时,使用 `getMultipleConversation()` 读取最新会话快照。 +使用 `getMultipleConversation()` 根据 `conversationIDs` 查询多个会话。`conversationIDs` 是待查询的会话 ID 列表。 ```java OpenIMClient.getInstance().conversationManager.getMultipleConversation( @@ -25,6 +25,4 @@ OpenIMClient.getInstance().conversationManager.getMultipleConversation( ); ``` -调用前去除空值和重复 ID。成功 callback 返回 `List`;某个 ID 没有结果时按缺失记录处理,不要依赖响应与请求列表的位置完全一一对应。 - -查询本身不触发会话 listener。会话列表的持续同步见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 +成功回调返回 `List`。 diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx index 1bc528f9b7..fab6ae14ce 100644 --- a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx @@ -1,10 +1,10 @@ --- title: '获取会话列表' -description: '使用 getConversationListSplit() 分页获取当前 Android 账号的会话列表。' +description: '使用 getConversationListSplit() 分页获取当前账号的会话列表。' sourcePath: '/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list' --- -会话列表属于当前登录用户。每条 `ConversationInfo` 包含会话标识、未读数、最后一条消息、置顶和草稿等状态。使用分页接口读取会话,不使用一次加载完整列表的 `getAllConversationList()`。 +会话列表属于当前登录用户。每条 `ConversationInfo` 包含会话标识、未读数、最后一条消息、置顶和草稿等状态。 ## 分页获取会话 @@ -31,22 +31,28 @@ OpenIMClient.getInstance().conversationManager.getConversationListSplit( | `offset` | `long` | 从 `0` 开始的分页偏移量;刷新时重置为 `0`。 | | `count` | `long` | 本页期望返回的会话数量。 | -成功 callback 返回当前页 `List`。继续加载时按已经请求的条目数量推进 `offset`,并按 `conversationID` 去重;返回数量小于 `count` 时通常表示到达末页。主动刷新时清空分页状态后从 `0` 重载。 +成功回调返回当前页 `List`。继续加载时按已经请求的条目数量推进 `offset`;返回数量小于 `count` 时通常表示到达末页。 ## 保持列表同步 -`getConversationListSplit()` 只建立快照,不触发会话 callback。以下 callback 应组合进应用唯一的 `OnConversationListener`: +会话列表发生新增或变化时,可以通过 `OnConversationListener` 接收以下 callback: ```java -@Override -public void onNewConversation(List conversations) { - mergeConversations(conversations); -} - -@Override -public void onConversationChanged(List conversations) { - mergeConversations(conversations); -} +OnConversationListener conversationListener = new OnConversationListener() { + @Override + public void onNewConversation(List conversations) { + mergeConversations(conversations); + } + + @Override + public void onConversationChanged(List conversations) { + mergeConversations(conversations); + } +}; + +OpenIMClient.getInstance().conversationManager.setOnConversationListener( + conversationListener +); ``` -两个事件都携带 `List`,按 `conversationID` 幂等合并。`setOnConversationListener()` 采用替换语义,应由应用级状态层设置一次。用户加入群组但尚未产生消息时不一定有会话;退出群组后也可能保留历史会话记录,不能用已加入群组列表替代会话列表。 +两个事件都携带 `List`,可按 `conversationID` 更新列表中的对应会话。`setOnConversationListener()` 设置后即可接收会话变化。 diff --git a/data/structure/android-content-audit.json b/data/structure/android-content-audit.json index 9c6b92ab8a..4e11e33b91 100644 --- a/data/structure/android-content-audit.json +++ b/data/structure/android-content-audit.json @@ -2647,7 +2647,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "not-applicable", "evidence": [], @@ -2657,7 +2657,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "not-applicable", "evidence": [], diff --git a/src/generated/android-sdk-zh-content.json b/src/generated/android-sdk-zh-content.json index 9667c7aca3..139aee3c33 100644 --- a/src/generated/android-sdk-zh-content.json +++ b/src/generated/android-sdk-zh-content.json @@ -986,7 +986,7 @@ "title": "取消拉黑用户" }, "/sdk/android/conversation/overview-conversation": { - "body": "会话是当前登录用户围绕一次单聊或群聊维护的聊天列表状态,由一条 `ConversationInfo` 记录表示。它保存未读数、最后一条消息、置顶、草稿、消息接收方式和扩展字段。`conversationID` 用于定位当前账号的会话状态;单聊目标使用对方 `userID`,群聊目标使用 `groupID`。\n\n群资料、成员关系和群权限属于群组能力。群聊页面使用 `groupID` 调用群组 API,使用 `conversationID` 处理会话设置、未读数、草稿和消息清理。\n\n## 会话标识\n\n| 标识 | 用途 |\n| ---------------- | ----------------------------------------------------------------------------- |\n| `conversationID` | 当前账号的会话记录 ID,用于会话设置、未读状态和消息历史。 |\n| `userID` | 单聊对方的用户 ID。 |\n| `groupID` | 群聊对应的群组 ID,也是群组 API 的目标标识。 |\n| `sourceId` | 按会话类型查询或生成 ID 时传入的聊天目标:单聊为 `userID`,群聊为 `groupID`。 |\n\n单聊使用 `ConversationType.SINGLE_CHAT`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`;不要在应用层自行拼接 `conversationID`。\n\n## ConversationInfo\n\n| 字段 | 说明 |\n| ----------------------------------- | ------------------------------------ |\n| `conversationID` | 会话 ID。 |\n| `conversationType` | 会话类型。 |\n| `userID` / `groupID` | 单聊目标用户或群聊目标群组。 |\n| `showName` / `faceURL` | 会话列表显示名称和头像。 |\n| `unreadCount` | 当前会话未读数。 |\n| `latestMsg` / `latestMsgSendTime` | 最后一条消息 JSON 字符串及发送时间。 |\n| `recvMsgOpt` | 当前会话消息接收方式。 |\n| `groupAtType` | 群聊 @ 提醒状态。 |\n| `draftText` / `draftTextTime` | 会话草稿及更新时间。 |\n| `isPinned` | 是否置顶。 |\n| `isPrivateChat` / `burnDuration` | 阅后即焚开关和保留时长。 |\n| `isMsgDestruct` / `msgDestructTime` | 服务端消息定期删除设置。 |\n| `ex` | 业务约定的会话扩展字符串。 |\n\n## 查询和设置\n\n- [查询指定会话](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target)\n- [生成会话 ID](/sdk/android/conversation/retrieving-conversations/get-conversation-id)\n- [按 ID 批量获取会话](/sdk/android/conversation/retrieving-conversations/get-conversations-by-id)\n- [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)\n- [置顶或取消置顶会话](/sdk/android/conversation/managing-conversations/pin-conversation)\n- [设置会话扩展字段](/sdk/android/conversation/managing-conversations/set-conversation-extension)\n- [设置会话草稿](/sdk/android/conversation/managing-conversations/set-conversation-draft)\n- [设置会话消息接收方式](/sdk/android/conversation/managing-conversations/set-message-receive-option)\n- [重置群聊 @ 状态](/sdk/android/conversation/managing-conversations/clear-group-mentions)\n- [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read)\n- [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count)\n- [开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat)\n- [定期删除服务端消息](/sdk/android/conversation/managing-conversations/set-message-destruct)\n\n## 状态更新\n\n查询方法建立会话快照,事件负责合并后续增量:\n\n- 新会话和会话属性变化由[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)归属的 `onNewConversation` 与 `onConversationChanged` 处理。\n- 当前账号总未读数由[获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count)归属的 `onTotalUnreadMessageCountChanged` 处理。\n\n`ConversationManager` 只保存一个 `OnConversationListener`,`setOnConversationListener()` 会替换当前 listener。应用应在统一状态层组合所有 callback 并设置一次;请求成功、事件到达和重新查询校准是三个独立阶段。", + "body": "会话是当前登录用户围绕一次单聊或群聊维护的聊天列表状态,由一条 `ConversationInfo` 记录表示。它保存未读数、最后一条消息、置顶、草稿、消息接收方式和扩展字段。`conversationID` 是会话的唯一标识,用于查询会话信息和设置会话状态;单聊目标使用对方 `userID`,群聊目标使用 `groupID`。\n\n群资料、成员关系和群权限属于群组能力。群聊页面使用 `groupID` 调用群组 API,使用 `conversationID` 处理会话设置、未读数、草稿和消息清理。\n\n## 会话标识\n\n| 标识 | 用途 |\n| ---------------- | ----------------------------------------------------------------------------- |\n| `conversationID` | 当前账号的会话记录 ID,用于会话设置、未读状态和消息历史。 |\n| `userID` | 单聊对方的用户 ID。 |\n| `groupID` | 群聊对应的群组 ID,也是群组 API 的目标标识。 |\n| `sourceId` | 按会话类型查询或生成 ID 时传入的聊天目标:单聊为 `userID`,群聊为 `groupID`。 |\n\n## 会话数据\n\n| 字段 | 说明 |\n| --- | --- |\n| `conversationID` | 会话 ID。 |\n| `conversationType` | 会话类型:单聊为 `ConversationType.SINGLE_CHAT`;群聊为 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。 |\n| `userID` / `groupID` | 单聊使用 `userID` 表示目标用户,群聊使用 `groupID` 表示目标群组;两者仅有一个生效。 |\n| `showName` | 会话名称,单聊为目标用户昵称或备注,群聊为群聊名称或备注。 |\n| `faceURL` | 会话头像URL。 |\n| `unreadCount` | 当前会话未读数。 |\n| `latestMsg` | 最后一条消息的 JSON 字符串。 |\n| `latestMsgSendTime` | 最后一条消息的发送时间。 |\n| `recvMsgOpt` | 当前会话消息接收方式。 |\n| `groupAtType` | 群聊 @ 提醒状态。 |\n| `draftText` | 会话草稿。 |\n| `draftTextTime` | 草稿更新时间。 |\n| `isPinned` | 是否置顶。 |\n| `isPrivateChat` | 是否开启阅后即焚。 |\n| `burnDuration` | 阅后即焚消息的阅读时长,单位为秒。 |\n| `isMsgDestruct` | 是否开启服务端消息定期删除。 |\n| `msgDestructTime` | 服务端消息定期删除时间。 |\n| `ext` | 预留的会话扩展字符串。 |\n| `ex` | 业务约定的会话扩展字符串。 |\n| `isNotInGroup` | 当前用户是否已不在该群组中。 |\n\n## 按任务查找页面\n\n| 任务 | 页面 |\n| --- | --- |\n| 查询单个、多个或分页会话 | [查询指定会话](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target)、[按 ID 批量获取会话](/sdk/android/conversation/retrieving-conversations/get-conversations-by-id)、[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) |\n| 生成会话 ID | [生成会话 ID](/sdk/android/conversation/retrieving-conversations/get-conversation-id) |\n| 整理会话列表 | [置顶或取消置顶会话](/sdk/android/conversation/managing-conversations/pin-conversation)、[隐藏会话](/sdk/android/conversation/managing-conversations/hide-a-conversation) |\n| 维护草稿和业务扩展 | [设置会话草稿](/sdk/android/conversation/managing-conversations/set-conversation-draft)、[设置会话扩展字段](/sdk/android/conversation/managing-conversations/set-conversation-extension) |\n| 设置消息接收和存储策略 | [设置会话消息接收方式](/sdk/android/conversation/managing-conversations/set-message-receive-option)、[开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat)、[设置阅后即焚时长](/sdk/android/conversation/managing-conversations/set-burn-duration)、[定期删除服务端消息](/sdk/android/conversation/managing-conversations/set-message-destruct) |\n| 处理未读数和群聊 @ 提醒 | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read)、[获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count)、[重置群聊 @ 状态](/sdk/android/conversation/managing-conversations/clear-group-mentions) |\n| 删除或清理会话数据 | [删除会话及消息](/sdk/android/conversation/managing-conversations/delete-conversation-with-messages)、[清空会话消息](/sdk/android/conversation/managing-conversations/clear-conversation-messages) |\n\n## 状态更新\n\n设置 `OnConversationListener` 后,可以接收会话列表和总未读数的变化。监听器的完整设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list#保持列表同步):\n\n- `onNewConversation`:接收新增的会话。\n- `onConversationChanged`:接收会话属性变化,例如未读数、置顶状态和草稿。\n- `onTotalUnreadMessageCountChanged`:接收当前账号消息总未读数的变化。\n\n再次调用 `setOnConversationListener()` 会替换已设置的 listener。", "description": "了解 Android SDK 中 ConversationInfo、conversationID、会话设置和会话事件的职责。", "headings": [ { @@ -996,13 +996,13 @@ }, { "depth": 2, - "title": "ConversationInfo", - "url": "#conversationinfo" + "title": "会话数据", + "url": "#会话数据" }, { "depth": 2, - "title": "查询和设置", - "url": "#查询和设置" + "title": "按任务查找页面", + "url": "#按任务查找页面" }, { "depth": 2, @@ -1014,29 +1014,29 @@ "title": "会话概览" }, "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target": { - "body": "从通讯录、用户资料或群资料进入聊天页时,使用 `getOneConversation()`。单聊传对方用户 ID,群聊传群组 ID;即使还没有消息,也不要自行构造 `ConversationInfo`。\n\n```java\nOpenIMClient.getInstance().conversationManager.getOneConversation(\n new OnBase() {\n @Override\n public void onSuccess(ConversationInfo conversation) {\n openChatPage(conversation);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationOpenFailure(code, error);\n }\n },\n targetUserID,\n ConversationType.SINGLE_CHAT\n);\n```\n\n参数 `sourceId` 在单聊中是对方 `userID`,在群聊中是 `groupID`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。\n\n成功 callback 返回 `ConversationInfo`。查询本身不触发会话 listener;后续变化由[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)统一按 `conversationID` 合并。", - "description": "使用 getOneConversation() 按用户或群组获取一个 Android 会话。", + "body": "`getOneConversation()` 按用户或群组获取一个会话信息,适用于从通讯录、用户资料或群资料进入聊天页的场景。单聊传对方用户 ID,群聊传群组 ID。\n\n```java\nOpenIMClient.getInstance().conversationManager.getOneConversation(\n new OnBase() {\n @Override\n public void onSuccess(ConversationInfo conversation) {\n openChatPage(conversation);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationOpenFailure(code, error);\n }\n },\n sourceId,\n ConversationType.SINGLE_CHAT\n);\n```\n\n参数 `sourceId` 在单聊中是对方 `userID`,在群聊中是 `groupID`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。\n\n成功回调返回 `ConversationInfo`。如果需要接收会话列表的新增或变化,请参考[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)设置 `OnConversationListener`。", + "description": "使用 getOneConversation() 按用户或群组获取一个会话。", "headings": [], "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", "title": "查询指定会话" }, "/sdk/android/conversation/retrieving-conversations/get-conversation-id": { - "body": "只需要会话 ID 时,调用 `getConversationIDBySessionType()`,不要在应用层自行拼接。\n\n```java\nString conversationID = OpenIMClient.getInstance().conversationManager\n .getConversationIDBySessionType(\n targetUserID,\n ConversationType.SINGLE_CHAT\n );\n```\n\n`sourceId` 在单聊中是对方 `userID`,在群聊中是 `groupID`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。\n\n该方法同步返回 `String` 类型的 `conversationID`,不返回完整 `ConversationInfo`,也不触发会话 listener。需要会话资料时调用[查询指定会话](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target)。", - "description": "使用 getConversationIDBySessionType() 按聊天目标计算 Android 会话 ID。", + "body": "`getConversationIDBySessionType()` 根据聊天目标 `sourceId` 和会话类型 `sessionType` 获取 `conversationID`。\n\n```java\nString conversationID = OpenIMClient.getInstance().conversationManager\n .getConversationIDBySessionType(\n sourceId,\n ConversationType.SINGLE_CHAT\n );\n```\n\n`sourceId` 在单聊中是对方 `userID`,在群聊中是 `groupID`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。\n\n返回值是 `String` 类型的 `conversationID`。需要会话资料时调用[查询指定会话](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target)。", + "description": "使用 getConversationIDBySessionType() 按聊天目标计算会话 ID。", "headings": [], "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", "title": "生成会话 ID" }, "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id": { - "body": "已经持有一组 `conversationID` 时,使用 `getMultipleConversation()` 读取最新会话快照。\n\n```java\nOpenIMClient.getInstance().conversationManager.getMultipleConversation(\n new OnBase>() {\n @Override\n public void onSuccess(List conversations) {\n for (ConversationInfo item : conversations) {\n conversationStore.put(item.getConversationID(), item);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationQueryFailure(code, error);\n }\n },\n conversationIDs\n);\n```\n\n调用前去除空值和重复 ID。成功 callback 返回 `List`;某个 ID 没有结果时按缺失记录处理,不要依赖响应与请求列表的位置完全一一对应。\n\n查询本身不触发会话 listener。会话列表的持续同步见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", - "description": "使用 getMultipleConversation() 按 conversationID 批量获取 Android 会话。", + "body": "使用 `getMultipleConversation()` 根据 `conversationIDs` 查询多个会话。`conversationIDs` 是待查询的会话 ID 列表。\n\n```java\nOpenIMClient.getInstance().conversationManager.getMultipleConversation(\n new OnBase>() {\n @Override\n public void onSuccess(List conversations) {\n for (ConversationInfo item : conversations) {\n conversationStore.put(item.getConversationID(), item);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationQueryFailure(code, error);\n }\n },\n conversationIDs\n);\n```\n\n成功回调返回 `List`。", + "description": "使用 getMultipleConversation() 按 conversationID 批量获取会话。", "headings": [], "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", "title": "按 ID 批量获取会话" }, "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list": { - "body": "会话列表属于当前登录用户。每条 `ConversationInfo` 包含会话标识、未读数、最后一条消息、置顶和草稿等状态。使用分页接口读取会话,不使用一次加载完整列表的 `getAllConversationList()`。\n\n## 分页获取会话\n\n```java\nOpenIMClient.getInstance().conversationManager.getConversationListSplit(\n new OnBase>() {\n @Override\n public void onSuccess(List conversations) {\n mergeConversations(conversations);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationListFailure(code, error);\n }\n },\n 0,\n 50\n);\n```\n\n| 参数 | 类型 | 说明 |\n| -------- | ------ | ------------------------------------------- |\n| `offset` | `long` | 从 `0` 开始的分页偏移量;刷新时重置为 `0`。 |\n| `count` | `long` | 本页期望返回的会话数量。 |\n\n成功 callback 返回当前页 `List`。继续加载时按已经请求的条目数量推进 `offset`,并按 `conversationID` 去重;返回数量小于 `count` 时通常表示到达末页。主动刷新时清空分页状态后从 `0` 重载。\n\n## 保持列表同步\n\n`getConversationListSplit()` 只建立快照,不触发会话 callback。以下 callback 应组合进应用唯一的 `OnConversationListener`:\n\n```java\n@Override\npublic void onNewConversation(List conversations) {\n mergeConversations(conversations);\n}\n\n@Override\npublic void onConversationChanged(List conversations) {\n mergeConversations(conversations);\n}\n```\n\n两个事件都携带 `List`,按 `conversationID` 幂等合并。`setOnConversationListener()` 采用替换语义,应由应用级状态层设置一次。用户加入群组但尚未产生消息时不一定有会话;退出群组后也可能保留历史会话记录,不能用已加入群组列表替代会话列表。", - "description": "使用 getConversationListSplit() 分页获取当前 Android 账号的会话列表。", + "body": "会话列表属于当前登录用户。每条 `ConversationInfo` 包含会话标识、未读数、最后一条消息、置顶和草稿等状态。\n\n## 分页获取会话\n\n```java\nOpenIMClient.getInstance().conversationManager.getConversationListSplit(\n new OnBase>() {\n @Override\n public void onSuccess(List conversations) {\n mergeConversations(conversations);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationListFailure(code, error);\n }\n },\n 0,\n 50\n);\n```\n\n| 参数 | 类型 | 说明 |\n| -------- | ------ | ------------------------------------------- |\n| `offset` | `long` | 从 `0` 开始的分页偏移量;刷新时重置为 `0`。 |\n| `count` | `long` | 本页期望返回的会话数量。 |\n\n成功回调返回当前页 `List`。继续加载时按已经请求的条目数量推进 `offset`;返回数量小于 `count` 时通常表示到达末页。\n\n## 保持列表同步\n\n会话列表发生新增或变化时,可以通过 `OnConversationListener` 接收以下 callback:\n\n```java\nOnConversationListener conversationListener = new OnConversationListener() {\n @Override\n public void onNewConversation(List conversations) {\n mergeConversations(conversations);\n }\n\n @Override\n public void onConversationChanged(List conversations) {\n mergeConversations(conversations);\n }\n};\n\nOpenIMClient.getInstance().conversationManager.setOnConversationListener(\n conversationListener\n);\n```\n\n两个事件都携带 `List`,可按 `conversationID` 更新列表中的对应会话。`setOnConversationListener()` 设置后即可接收会话变化。", + "description": "使用 getConversationListSplit() 分页获取当前账号的会话列表。", "headings": [ { "depth": 2, @@ -1053,92 +1053,92 @@ "title": "获取会话列表" }, "/sdk/android/conversation/managing-conversations/pin-conversation": { - "body": "```java\nOpenIMClient.getInstance().conversationManager.pinConversation(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markPinRequestSubmitted(conversationID, true);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationPinFailure(code, error);\n }\n },\n conversationID,\n true\n);\n```\n\n最后一个参数为 `true` 时置顶,传 `false` 时取消置顶。该状态只影响当前账号的会话列表。\n\n成功 callback 不等于 `onConversationChanged` 已经到达。后续按 `conversationID` 合并最新会话,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", - "description": "使用 pinConversation() 设置 Android 指定会话的置顶状态。", + "body": "```java\nOpenIMClient.getInstance().conversationManager.pinConversation(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markPinRequestSubmitted(conversationID, true);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationPinFailure(code, error);\n }\n },\n conversationID,\n true\n);\n```\n\n最后一个参数为 `true` 时置顶,传 `false` 时取消置顶。\n\n会话列表发生变化时,可通过 `onConversationChanged` 接收更新,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 pinConversation() 设置指定会话的置顶状态。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/pin-conversation", "title": "置顶或取消置顶会话" }, "/sdk/android/conversation/managing-conversations/set-conversation-extension": { - "body": "`ex` 是完整字符串,SDK 不会自动合并 JSON。更新前应读取旧值并保留其他业务模块的命名空间。\n\n```java\nOpenIMClient.getInstance().conversationManager.setConversationEx(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markConversationExtensionSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationExtensionFailure(code, error);\n }\n },\n conversationID,\n mergedExtensionJSON\n);\n```\n\n成功 callback 表示设置请求完成。通过 `onConversationChanged` 按 `conversationID` 合并最新会话;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", - "description": "使用 setConversationEx() 设置 Android 指定会话的业务扩展字符串。", + "body": "`ex` 是用于保存会话扩展信息的字符串,可以传入 JSON 字符串或其他业务约定格式的字符串。\n\n```java\nOpenIMClient.getInstance().conversationManager.setConversationEx(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markConversationExtensionSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationExtensionFailure(code, error);\n }\n },\n conversationID,\n extensionJSON\n);\n```\n\n成功回调表示设置请求已完成。会话列表中的扩展字段变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 setConversationEx() 设置指定会话的业务扩展字符串。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", "title": "设置会话扩展字段" }, "/sdk/android/conversation/managing-conversations/set-conversation-draft": { - "body": "用户离开聊天页、切换会话或输入框内容变化时,可以使用 `setConversationDraft()` 保存草稿。输入过程中先维护编辑器状态并对保存调用做防抖;离开页面前再提交一次最新文本。\n\n```java\nOpenIMClient.getInstance().conversationManager.setConversationDraft(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markDraftSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordDraftSaveFailure(code, error);\n }\n },\n conversationID,\n editorValue\n);\n```\n\n清空草稿时传空字符串。成功 callback 只表示保存请求已经完成,不等同于会话变化回调已经到达;SDK 后续通过 `onConversationChanged` 同步 `draftText` 和 `draftTextTime`,需要校准时重新查询会话。退出登录或切换账号时清理编辑器内存状态。", - "description": "使用 setConversationDraft() 保存 Android 会话草稿。", + "body": "用户离开聊天页、切换会话或输入框内容变化时,可以使用 `setConversationDraft()` 保存草稿。输入过程中先维护编辑器状态并对保存调用做防抖;离开页面前再提交一次最新文本。\n\n```java\nOpenIMClient.getInstance().conversationManager.setConversationDraft(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markDraftSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordDraftSaveFailure(code, error);\n }\n },\n conversationID,\n editorValue\n);\n```\n\n清空草稿时传空字符串。会话列表中的草稿变化可通过 `onConversationChanged` 接收。", + "description": "使用 setConversationDraft() 保存会话草稿。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", "title": "设置会话草稿" }, "/sdk/android/conversation/managing-conversations/set-message-receive-option": { - "body": "```java\nOpenIMClient.getInstance().conversationManager.setConversationRecvMessageOpt(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markReceiveOptionSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordReceiveOptionFailure(code, error);\n }\n },\n conversationID,\n 2\n);\n```\n\n| 数值 | 含义 |\n| ---- | ---------------------------- |\n| `0` | 正常接收消息并允许通知。 |\n| `1` | 不接收该会话消息,也不通知。 |\n| `2` | 接收该会话消息,但不通知。 |\n\n账号级默认策略见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。成功 callback 后通过 `onConversationChanged` 按 `conversationID` 合并最新会话。", - "description": "使用 setConversationRecvMessageOpt() 设置 Android 单个会话的消息接收与通知方式。", + "body": "```java\nOpenIMClient.getInstance().conversationManager.setConversationRecvMessageOpt(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markReceiveOptionSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordReceiveOptionFailure(code, error);\n }\n },\n conversationID,\n 2\n);\n```\n\n| 数值 | 含义 |\n| ---- | ---------------------------- |\n| `0` | 正常接收消息并允许通知。 |\n| `1` | 不接收该会话消息,也不通知。 |\n| `2` | 接收该会话消息,但不通知。 |\n\n账号级默认策略见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。会话列表中的接收方式变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 setConversationRecvMessageOpt() 设置单个会话的消息接收与通知方式。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", "title": "设置会话消息接收方式" }, "/sdk/android/conversation/managing-conversations/clear-group-mentions": { - "body": "用户处理完群聊中的 @ 消息后,调用 `resetConversationGroupAtType()` 将 `groupAtType` 重置为普通状态。\n\n```java\nOpenIMClient.getInstance().conversationManager.resetConversationGroupAtType(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markGroupMentionStateReset(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordGroupMentionResetFailure(code, error);\n }\n },\n conversationID\n);\n```\n\n本操作只负责重置为普通状态,不应用于主动写入 `atMe`、`atAll` 等状态。群聊 @ 状态与消息已读状态不同。\n\n成功 callback 后通过 `onConversationChanged` 按 `conversationID` 合并该会话;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", - "description": "使用 resetConversationGroupAtType() 将 Android 指定会话的群聊 @ 状态重置为普通状态。", + "body": "群聊消息中有人 @ 当前用户或 @ 全体成员时,`groupAtType` 用于标记会话列表中的提醒状态。当前用户阅读相关消息后,调用 `resetConversationGroupAtType()` 清除该会话 `groupAtType` 的 @ 提醒状态,并更新会话列表 UI。\n\n```java\nOpenIMClient.getInstance().conversationManager.resetConversationGroupAtType(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markGroupMentionStateReset(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordGroupMentionResetFailure(code, error);\n }\n },\n conversationID\n);\n```\n\n会话列表中的状态变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 resetConversationGroupAtType() 将指定会话的群聊 @ 状态重置为普通状态。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", "title": "重置群聊 @ 状态" }, "/sdk/android/conversation/managing-conversations/mark-conversation-read": { - "body": "用户打开会话并阅读完当前可见消息后,调用 `messageManager.markConversationMessageAsRead()`。不要在仅预览通知或后台收到消息时提前标记。\n\n```java\nOpenIMClient.getInstance().messageManager.markConversationMessageAsRead(\n conversationID,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markConversationReadSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordMarkReadFailure(code, error);\n }\n }\n);\n```\n\n成功 callback 表示请求完成,不等于 `onConversationChanged` 已到达。随后按 `conversationID` 合并最新 `ConversationInfo`;需要立即确认时重新查询该会话。\n\n对于单聊,当前用户标记会话已读后,对端可通过 `OnAdvanceMsgListener.onRecvC2CReadReceipt` 收到已读回执。对每个 `C2CReadReceiptInfo` 先验证 `sessionType == ConversationType.SINGLE_CHAT` 和非空 `userID`,再按 `msgIDList` 更新对应消息的已读状态。`MessageManager` 同样只保存一个高级消息 listener,应在应用级消息状态层统一设置。", - "description": "使用 messageManager.markConversationMessageAsRead() 将 Android 指定会话的消息标记为已读。", + "body": "用户打开会话并阅读完当前可见消息后,调用 `messageManager.markConversationMessageAsRead()` 标记会话已读。不要在仅预览通知或后台收到消息时提前标记。\n\n```java\nOpenIMClient.getInstance().messageManager.markConversationMessageAsRead(\n conversationID,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markConversationReadSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordMarkReadFailure(code, error);\n }\n }\n);\n```\n\n成功回调表示标记请求已完成。需要更新会话列表时,可重新查询会话或通过 `onConversationChanged` 接收变化。\n\n对于单聊,可以通过 `OnAdvanceMsgListener.onRecvC2CReadReceipt` 监听对端发来的已读回执。消息监听器的设置方式见[接收消息](/sdk/android/message/receiving-messages/receive-messages),消息回调和已读回执字段见[消息概览](/sdk/android/message/overview-message)。", + "description": "使用 messageManager.markConversationMessageAsRead() 将指定会话的消息标记为已读。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", "title": "标记会话已读" }, "/sdk/android/conversation/managing-conversations/get-total-unread-count": { - "body": "`getTotalUnreadMsgCount()` 返回当前账号所有会话的总未读快照,不要把当前已加载分页中的 `unreadCount` 简单相加。\n\n```java\nOpenIMClient.getInstance().conversationManager.getTotalUnreadMsgCount(\n new OnBase() {\n @Override\n public void onSuccess(String value) {\n int totalUnread = Integer.parseInt(value);\n updateApplicationBadge(totalUnread);\n }\n\n @Override\n public void onError(int code, String error) {\n recordTotalUnreadFailure(code, error);\n }\n }\n);\n```\n\n回调值是 `String`,解析失败时应按业务错误处理,不能将其默认为会话列表分页的局部总数。查询本身不触发 callback。\n\n本页归属 `OnConversationListener.onTotalUnreadMessageCountChanged(int count)`。在应用唯一的 `OnConversationListener` 中按该值更新应用角标;会话 listener 的集中设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", - "description": "使用 getTotalUnreadMsgCount() 获取 Android 当前账号的总未读数。", + "body": "`getTotalUnreadMsgCount()` 返回当前账号所有会话的总未读数。\n\n```java\nOpenIMClient.getInstance().conversationManager.getTotalUnreadMsgCount(\n new OnBase() {\n @Override\n public void onSuccess(String value) {\n int totalUnread = Integer.parseInt(value);\n updateApplicationBadge(totalUnread);\n }\n\n @Override\n public void onError(int code, String error) {\n recordTotalUnreadFailure(code, error);\n }\n }\n);\n```\n\n回调值是 `String`,解析后即可用于显示总未读数。\n\n总未读数发生变化时,可以通过 `OnConversationListener.onTotalUnreadMessageCountChanged(int count)` 接收更新;监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 getTotalUnreadMsgCount() 获取当前账号的总未读数。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", "title": "获取消息总未读数" }, "/sdk/android/conversation/managing-conversations/set-private-chat": { - "body": "```java\nOpenIMClient.getInstance().conversationManager.setOneConversationPrivateChat(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markPrivateChatSubmitted(conversationID, true);\n }\n\n @Override\n public void onError(int code, String error) {\n recordPrivateChatFailure(code, error);\n }\n },\n conversationID,\n true\n);\n```\n\n传入 `false` 关闭阅后即焚。具体保留时长由 `burnDuration` 单独设置,见[设置阅后即焚时长](/sdk/android/conversation/managing-conversations/set-burn-duration)。该能力与定期删除服务端消息不同。\n\n成功 callback 只表示设置请求完成;最新状态通过 `onConversationChanged` 按 `conversationID` 合并,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", - "description": "使用 setOneConversationPrivateChat() 设置 Android 会话的阅后即焚模式。", + "body": "```java\nOpenIMClient.getInstance().conversationManager.setOneConversationPrivateChat(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markPrivateChatSubmitted(conversationID, true);\n }\n\n @Override\n public void onError(int code, String error) {\n recordPrivateChatFailure(code, error);\n }\n },\n conversationID,\n true\n);\n```\n\n传入 `false` 关闭阅后即焚。具体保留时长由 `burnDuration` 单独设置,见[设置阅后即焚时长](/sdk/android/conversation/managing-conversations/set-burn-duration)。该能力与定期删除服务端消息不同。\n\n会话列表中的阅后即焚状态变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 setOneConversationPrivateChat() 设置会话的阅后即焚模式。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/set-private-chat", "title": "开启或关闭阅后即焚" }, "/sdk/android/conversation/managing-conversations/set-burn-duration": { - "body": "```java\nOpenIMClient.getInstance().conversationManager.setConversationBurnDuration(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markBurnDurationSubmitted(conversationID, 30);\n }\n\n @Override\n public void onError(int code, String error) {\n recordBurnDurationFailure(code, error);\n }\n },\n conversationID,\n 30\n);\n```\n\n`burnDuration` 的单位为秒。启用或关闭阅后即焚需要设置 `isPrivateChat`,见[开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat)。不要把它与服务端消息定期删除周期 `msgDestructTime` 混用。\n\n成功 callback 后,通过 `onConversationChanged` 合并最新 `burnDuration`;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", - "description": "使用 setConversationBurnDuration() 设置 Android 阅后即焚模式的消息保留时长。", + "body": "```java\nOpenIMClient.getInstance().conversationManager.setConversationBurnDuration(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markBurnDurationSubmitted(conversationID, 30);\n }\n\n @Override\n public void onError(int code, String error) {\n recordBurnDurationFailure(code, error);\n }\n },\n conversationID,\n 30\n);\n```\n\n`burnDuration` 的单位为秒。启用或关闭阅后即焚需要设置 `isPrivateChat`,见[开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat)。不要把它与服务端消息定期删除周期 `msgDestructTime` 混用。\n\n会话列表中的时长变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 setConversationBurnDuration() 设置阅后即焚模式的消息保留时长。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/set-burn-duration", "title": "设置阅后即焚时长" }, "/sdk/android/conversation/managing-conversations/set-message-destruct": { - "body": "`isMsgDestruct` 与 `msgDestructTime` 共同构成服务端消息定期删除设置,可以在一次 `ConversationReq` 中提交。\n\n```java\nConversationReq request = new ConversationReq();\nrequest.setMsgDestruct(true);\nrequest.setMsgDestructTime(3600);\n\nOpenIMClient.getInstance().conversationManager.setConversation(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markMessageDestructSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordMessageDestructFailure(code, error);\n }\n },\n conversationID,\n request\n);\n```\n\n`msgDestructTime` 的单位为秒。关闭时只传 `request.setMsgDestruct(false)`;该能力用于定期删除服务端消息,不是阅后即焚。\n\n成功 callback 表示设置请求完成。最新开关和周期通过 `onConversationChanged` 按 `conversationID` 合并,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", - "description": "使用 setConversation() 启用、关闭并配置 Android 会话的服务端消息定期删除策略。", + "body": "`isMsgDestruct` 与 `msgDestructTime` 共同构成服务端消息定期删除设置,可以在一次 `ConversationReq` 中提交。\n\n```java\nConversationReq request = new ConversationReq();\nrequest.setMsgDestruct(true);\nrequest.setMsgDestructTime(3600);\n\nOpenIMClient.getInstance().conversationManager.setConversation(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markMessageDestructSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordMessageDestructFailure(code, error);\n }\n },\n conversationID,\n request\n);\n```\n\n`msgDestructTime` 的单位为秒。关闭时只传 `request.setMsgDestruct(false)`;该能力用于定期删除服务端消息,不是阅后即焚。\n\n会话列表中的设置变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 setConversation() 启用、关闭并配置会话的服务端消息定期删除策略。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-destruct", "title": "定期删除服务端消息" }, "/sdk/android/conversation/managing-conversations/hide-a-conversation": { - "body": "`hideConversation()` 只隐藏当前登录用户的会话入口,不会删除单聊关系、退出群组或影响其他用户。\n\n```java\nOpenIMClient.getInstance().conversationManager.hideConversation(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n conversationStore.remove(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationHideFailure(code, error);\n }\n },\n conversationID\n);\n```\n\n该方法适合临时从聊天列表移除入口。收到新消息或重新同步后,隐藏的会话可能再次出现。\n\n成功 callback 表示隐藏请求已完成,调用端可以从当前列表移除该 `conversationID`。后续收到 `onConversationChanged` 时仍应按 `conversationID` 幂等合并;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", - "description": "使用 hideConversation() 从 Android 当前账号的会话列表隐藏入口。", + "body": "`hideConversation()` 只隐藏当前登录用户的会话入口,不会删除单聊关系、退出群组或影响其他用户。\n\n```java\nOpenIMClient.getInstance().conversationManager.hideConversation(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n conversationStore.remove(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationHideFailure(code, error);\n }\n },\n conversationID\n);\n```\n\n该方法适合临时从聊天列表移除入口。收到新消息或重新同步后,隐藏的会话可能再次出现。\n\n成功回调表示隐藏请求已完成,调用端可以从当前列表移除该 `conversationID`。会话列表后续发生变化时,可通过 `onConversationChanged` 接收更新,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 hideConversation() 从当前账号的会话列表隐藏入口。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", "title": "隐藏会话" }, "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages": { - "body": "产品语义为“删除此聊天”时,调用 `deleteConversationAndDeleteAllMsg()`。\n\n```java\nOpenIMClient.getInstance().conversationManager.deleteConversationAndDeleteAllMsg(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n messageStore.clearConversation(conversationID);\n conversationStore.remove(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationDeleteFailure(code, error);\n }\n },\n conversationID\n);\n```\n\n成功 callback 后清理当前消息列表和会话行。该操作不删除好友关系,也不退出或解散群组;聊天目标仍存在时,会话可能由新消息或同步重新生成。\n\n后续通过 `onConversationChanged` 或重新查询校准会话列表,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", - "description": "使用 deleteConversationAndDeleteAllMsg() 删除 Android 指定会话及其全部消息。", + "body": "`deleteConversationAndDeleteAllMsg()` 删除指定会话及其全部消息。\n\n```java\nOpenIMClient.getInstance().conversationManager.deleteConversationAndDeleteAllMsg(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n messageStore.clearConversation(conversationID);\n conversationStore.remove(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationDeleteFailure(code, error);\n }\n },\n conversationID\n);\n```\n\n成功回调后清理当前消息列表和会话行。该操作不删除好友关系,也不退出或解散群组;聊天目标仍存在时,会话可能由新消息或同步重新生成。\n\n需要更新会话列表时,可重新查询会话或通过 `onConversationChanged` 接收变化,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "description": "使用 deleteConversationAndDeleteAllMsg() 删除指定会话及其全部消息。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", "title": "删除会话及消息" }, "/sdk/android/conversation/managing-conversations/clear-conversation-messages": { - "body": "产品语义为“清空聊天记录”时,调用 `messageManager.clearConversationAndDeleteAllMsg()`。\n\n```java\nOpenIMClient.getInstance().messageManager.clearConversationAndDeleteAllMsg(\n conversationID,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n messageStore.clearConversation(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationClearFailure(code, error);\n }\n }\n);\n```\n\n成功 callback 后保留会话入口,但清除当前账号下的消息和摘要状态。立即清理当前消息列表,再通过 `onConversationChanged` 或重新查询校准最后一条消息、摘要和未读状态。", - "description": "使用 messageManager.clearConversationAndDeleteAllMsg() 保留 Android 会话入口并清空其消息。", + "body": "`messageManager.clearConversationAndDeleteAllMsg()` 清空指定会话的消息并保留会话入口。\n\n```java\nOpenIMClient.getInstance().messageManager.clearConversationAndDeleteAllMsg(\n conversationID,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n messageStore.clearConversation(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationClearFailure(code, error);\n }\n }\n);\n```\n\n成功回调后,会话入口仍然保留,但当前账号下的消息会被清除。需要更新会话列表时,可重新查询会话或通过 `onConversationChanged` 接收变化。", + "description": "使用 messageManager.clearConversationAndDeleteAllMsg() 保留会话入口并清空其消息。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", "title": "清空会话消息" diff --git a/src/generated/search-index-zh.json b/src/generated/search-index-zh.json index a28deb6c35..f7ac63762e 100644 --- a/src/generated/search-index-zh.json +++ b/src/generated/search-index-zh.json @@ -2133,143 +2133,143 @@ "description": "了解 Android SDK 中 ConversationInfo、conversationID、会话设置和会话事件的职责。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation overview-conversation", - "content": "会话是当前登录用户围绕一次单聊或群聊维护的聊天列表状态,由一条 ConversationInfo 记录表示。它保存未读数、最后一条消息、置顶、草稿、消息接收方式和扩展字段。 conversationID 用于定位当前账号的会话状态;单聊目标使用对方 userID ,群聊目标使用 groupID 。 群资料、成员关系和群权限属于群组能力。群聊页面使用 groupID 调用群组 API,使用 conversationID 处理会话设置、未读数、草稿和消息清理。 会话标识 | 标识 | 用途 | | | | | conversationID | 当前账号的会话记录 ID,用于会话设置、未读状态和消息历史。 | | userID | 单聊对方的用户 ID。 | | groupID | 群聊对应的群组 ID,也是群组 API 的目标标识。 | | sourceId | 按会话类型查询或生成 ID 时传入的聊天目标:单聊为 userID ,群聊为 groupID 。 | 单聊使用 ConversationType.SINGLE CHAT 。群聊根据群类型使用 ConversationType.GROUP CHAT 或 ConversationType.SUPER GROUP CHAT ;不要在应用层自行拼接 conversationID 。 ConversationInfo | 字段 | 说明 | | | | | conversationID | 会话 ID。 | | conversationType | 会话类型。 | | userID / groupID | 单聊目标用户或群聊目标群组。 | | showName / faceURL | 会话列表显示名称和头像。 | | unreadCount | 当前会话未读数。 | | latestMsg / latestMsgSendTime | 最后一条消息 JSON 字符串及发送时间。 | | recvMsgOpt | 当前会话消息接收方式。 | | groupAtType | 群聊 @ 提醒状态。 | | draftText / draftTextTime | 会话草稿及更新时间。 | | isPinned | 是否置顶。 | | isPrivateChat / burnDuration | 阅后即焚开关和保留时长。 | | isMsgDestruct / msgDestructTime | 服务端消息定期删除设置。 | | ex | 业务约定的会话扩展字符串。 | 查询和设置 查询指定会话 /sdk/android/conversation/retrieving conversations/get conversation by target 生成会话 ID /sdk/android/conversation/retrieving conversations/get conversation id 按 ID 批量获取会话 /sdk/android/conversation/retrieving conversations/get conversations by id 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 置顶或取消置顶会话 /sdk/android/conversation/managing conversations/pin conversation 设置会话扩展字段 /sdk/android/conversation/managing conversations/set conversation extension 设置会话草稿 /sdk/android/conversation/managing conversations/set conversation draft 设置会话消息接收方式 /sdk/android/conversation/managing conversations/set message receive option 重置群聊 @ 状态 /sdk/android/conversation/managing conversations/clear group mentions 标记会话已读 /sdk/android/conversation/managing conversations/mark conversation read 获取消息总未读数 /sdk/android/conversation/managing conversations/get total unread count 开启或关闭阅后即焚 /sdk/android/conversation/managing conversations/set private chat 定期删除服务端消息 /sdk/android/conversation/managing conversations/set message destruct 状态更新 查询方法建立会话快照,事件负责合并后续增量: 新会话和会话属性变化由 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 归属的 onNewConversation 与 onConversationChanged 处理。 当前账号总未读数由 获取消息总未读数 /sdk/android/conversation/managing conversations/get total unread count 归属的 onTotalUnreadMessageCountChanged 处理。 ConversationManager 只保存一个 OnConversationListener , setOnConversationListener 会替换当前 listener。应用应在统一状态层组合所有 callback 并设置一次;请求成功、事件到达和重新查询校准是三个独立阶段。" + "content": "会话是当前登录用户围绕一次单聊或群聊维护的聊天列表状态,由一条 ConversationInfo 记录表示。它保存未读数、最后一条消息、置顶、草稿、消息接收方式和扩展字段。 conversationID 是会话的唯一标识,用于查询会话信息和设置会话状态;单聊目标使用对方 userID ,群聊目标使用 groupID 。 群资料、成员关系和群权限属于群组能力。群聊页面使用 groupID 调用群组 API,使用 conversationID 处理会话设置、未读数、草稿和消息清理。 会话标识 | 标识 | 用途 | | | | | conversationID | 当前账号的会话记录 ID,用于会话设置、未读状态和消息历史。 | | userID | 单聊对方的用户 ID。 | | groupID | 群聊对应的群组 ID,也是群组 API 的目标标识。 | | sourceId | 按会话类型查询或生成 ID 时传入的聊天目标:单聊为 userID ,群聊为 groupID 。 | 会话数据 | 字段 | 说明 | | | | | conversationID | 会话 ID。 | | conversationType | 会话类型:单聊为 ConversationType.SINGLE CHAT ;群聊为 ConversationType.GROUP CHAT 或 ConversationType.SUPER GROUP CHAT 。 | | userID / groupID | 单聊使用 userID 表示目标用户,群聊使用 groupID 表示目标群组;两者仅有一个生效。 | | showName | 会话名称,单聊为目标用户昵称或备注,群聊为群聊名称或备注。 | | faceURL | 会话头像URL。 | | unreadCount | 当前会话未读数。 | | latestMsg | 最后一条消息的 JSON 字符串。 | | latestMsgSendTime | 最后一条消息的发送时间。 | | recvMsgOpt | 当前会话消息接收方式。 | | groupAtType | 群聊 @ 提醒状态。 | | draftText | 会话草稿。 | | draftTextTime | 草稿更新时间。 | | isPinned | 是否置顶。 | | isPrivateChat | 是否开启阅后即焚。 | | burnDuration | 阅后即焚消息的阅读时长,单位为秒。 | | isMsgDestruct | 是否开启服务端消息定期删除。 | | msgDestructTime | 服务端消息定期删除时间。 | | ext | 预留的会话扩展字符串。 | | ex | 业务约定的会话扩展字符串。 | | isNotInGroup | 当前用户是否已不在该群组中。 | 按任务查找页面 | 任务 | 页面 | | | | | 查询单个、多个或分页会话 | 查询指定会话 /sdk/android/conversation/retrieving conversations/get conversation by target 、 按 ID 批量获取会话 /sdk/android/conversation/retrieving conversations/get conversations by id 、 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list | | 生成会话 ID | 生成会话 ID /sdk/android/conversation/retrieving conversations/get conversation id | | 整理会话列表 | 置顶或取消置顶会话 /sdk/android/conversation/managing conversations/pin conversation 、 隐藏会话 /sdk/android/conversation/managing conversations/hide a conversation | | 维护草稿和业务扩展 | 设置会话草稿 /sdk/android/conversation/managing conversations/set conversation draft 、 设置会话扩展字段 /sdk/android/conversation/managing conversations/set conversation extension | | 设置消息接收和存储策略 | 设置会话消息接收方式 /sdk/android/conversation/managing conversations/set message receive option 、 开启或关闭阅后即焚 /sdk/android/conversation/managing conversations/set private chat 、 设置阅后即焚时长 /sdk/android/conversation/managing conversations/set burn duration 、 定期删除服务端消息 /sdk/android/conversation/managing conversations/set message destruct | | 处理未读数和群聊 @ 提醒 | 标记会话已读 /sdk/android/conversation/managing conversations/mark conversation read 、 获取消息总未读数 /sdk/android/conversation/managing conversations/get total unread count 、 重置群聊 @ 状态 /sdk/android/conversation/managing conversations/clear group mentions | | 删除或清理会话数据 | 删除会话及消息 /sdk/android/conversation/managing conversations/delete conversation with messages 、 清空会话消息 /sdk/android/conversation/managing conversations/clear conversation messages | 状态更新 设置 OnConversationListener 后,可以接收会话列表和总未读数的变化。监听器的完整设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 保持列表同步 : onNewConversation :接收新增的会话。 onConversationChanged :接收会话属性变化,例如未读数、置顶状态和草稿。 onTotalUnreadMessageCountChanged :接收当前账号消息总未读数的变化。 再次调用 setOnConversationListener 会替换已设置的 listener。" }, { "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", "title": "查询指定会话", - "description": "使用 getOneConversation() 按用户或群组获取一个 Android 会话。", + "description": "使用 getOneConversation() 按用户或群组获取一个会话。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversation-by-target", - "content": "从通讯录、用户资料或群资料进入聊天页时,使用 getOneConversation 。单聊传对方用户 ID,群聊传群组 ID;即使还没有消息,也不要自行构造 ConversationInfo 。 OpenIMClient.getInstance .conversationManager.getOneConversation new OnBase @Override public void onSuccess ConversationInfo conversation openChatPage conversation ; @Override public void onError int code, String error recordConversationOpenFailure code, error ; , targetUserID, ConversationType.SINGLE CHAT ; 参数 sourceId 在单聊中是对方 userID ,在群聊中是 groupID 。群聊根据群类型使用 ConversationType.GROUP CHAT 或 ConversationType.SUPER GROUP CHAT 。 成功 callback 返回 ConversationInfo 。查询本身不触发会话 listener;后续变化由 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 统一按 conversationID 合并。" + "content": "getOneConversation 按用户或群组获取一个会话信息,适用于从通讯录、用户资料或群资料进入聊天页的场景。单聊传对方用户 ID,群聊传群组 ID。 OpenIMClient.getInstance .conversationManager.getOneConversation new OnBase @Override public void onSuccess ConversationInfo conversation openChatPage conversation ; @Override public void onError int code, String error recordConversationOpenFailure code, error ; , sourceId, ConversationType.SINGLE CHAT ; 参数 sourceId 在单聊中是对方 userID ,在群聊中是 groupID 。群聊根据群类型使用 ConversationType.GROUP CHAT 或 ConversationType.SUPER GROUP CHAT 。 成功回调返回 ConversationInfo 。如果需要接收会话列表的新增或变化,请参考 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 设置 OnConversationListener 。" }, { "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", "title": "生成会话 ID", - "description": "使用 getConversationIDBySessionType() 按聊天目标计算 Android 会话 ID。", + "description": "使用 getConversationIDBySessionType() 按聊天目标计算会话 ID。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversation-id", - "content": "只需要会话 ID 时,调用 getConversationIDBySessionType ,不要在应用层自行拼接。 String conversationID = OpenIMClient.getInstance .conversationManager .getConversationIDBySessionType targetUserID, ConversationType.SINGLE CHAT ; sourceId 在单聊中是对方 userID ,在群聊中是 groupID 。群聊根据群类型使用 ConversationType.GROUP CHAT 或 ConversationType.SUPER GROUP CHAT 。 该方法同步返回 String 类型的 conversationID ,不返回完整 ConversationInfo ,也不触发会话 listener。需要会话资料时调用 查询指定会话 /sdk/android/conversation/retrieving conversations/get conversation by target 。" + "content": "getConversationIDBySessionType 根据聊天目标 sourceId 和会话类型 sessionType 获取 conversationID 。 String conversationID = OpenIMClient.getInstance .conversationManager .getConversationIDBySessionType sourceId, ConversationType.SINGLE CHAT ; sourceId 在单聊中是对方 userID ,在群聊中是 groupID 。群聊根据群类型使用 ConversationType.GROUP CHAT 或 ConversationType.SUPER GROUP CHAT 。 返回值是 String 类型的 conversationID 。需要会话资料时调用 查询指定会话 /sdk/android/conversation/retrieving conversations/get conversation by target 。" }, { "path": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", "title": "按 ID 批量获取会话", - "description": "使用 getMultipleConversation() 按 conversationID 批量获取 Android 会话。", + "description": "使用 getMultipleConversation() 按 conversationID 批量获取会话。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversations-by-id", - "content": "已经持有一组 conversationID 时,使用 getMultipleConversation 读取最新会话快照。 OpenIMClient.getInstance .conversationManager.getMultipleConversation new OnBase @Override public void onSuccess List conversations for ConversationInfo item : conversations conversationStore.put item.getConversationID , item ; @Override public void onError int code, String error recordConversationQueryFailure code, error ; , conversationIDs ; 调用前去除空值和重复 ID。成功 callback 返回 List ;某个 ID 没有结果时按缺失记录处理,不要依赖响应与请求列表的位置完全一一对应。 查询本身不触发会话 listener。会话列表的持续同步见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "使用 getMultipleConversation 根据 conversationIDs 查询多个会话。 conversationIDs 是待查询的会话 ID 列表。 OpenIMClient.getInstance .conversationManager.getMultipleConversation new OnBase @Override public void onSuccess List conversations for ConversationInfo item : conversations conversationStore.put item.getConversationID , item ; @Override public void onError int code, String error recordConversationQueryFailure code, error ; , conversationIDs ; 成功回调返回 List 。" }, { "path": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", "title": "获取会话列表", - "description": "使用 getConversationListSplit() 分页获取当前 Android 账号的会话列表。", + "description": "使用 getConversationListSplit() 分页获取当前账号的会话列表。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation retrieving-conversations retrieve-conversation-list", - "content": "会话列表属于当前登录用户。每条 ConversationInfo 包含会话标识、未读数、最后一条消息、置顶和草稿等状态。使用分页接口读取会话,不使用一次加载完整列表的 getAllConversationList 。 分页获取会话 OpenIMClient.getInstance .conversationManager.getConversationListSplit new OnBase @Override public void onSuccess List conversations mergeConversations conversations ; @Override public void onError int code, String error recordConversationListFailure code, error ; , 0, 50 ; | 参数 | 类型 | 说明 | | | | | | offset | long | 从 0 开始的分页偏移量;刷新时重置为 0 。 | | count | long | 本页期望返回的会话数量。 | 成功 callback 返回当前页 List 。继续加载时按已经请求的条目数量推进 offset ,并按 conversationID 去重;返回数量小于 count 时通常表示到达末页。主动刷新时清空分页状态后从 0 重载。 保持列表同步 getConversationListSplit 只建立快照,不触发会话 callback。以下 callback 应组合进应用唯一的 OnConversationListener : @Override public void onNewConversation List conversations mergeConversations conversations ; @Override public void onConversationChanged List conversations mergeConversations conversations ; 两个事件都携带 List ,按 conversationID 幂等合并。 setOnConversationListener 采用替换语义,应由应用级状态层设置一次。用户加入群组但尚未产生消息时不一定有会话;退出群组后也可能保留历史会话记录,不能用已加入群组列表替代会话列表。" + "content": "会话列表属于当前登录用户。每条 ConversationInfo 包含会话标识、未读数、最后一条消息、置顶和草稿等状态。 分页获取会话 OpenIMClient.getInstance .conversationManager.getConversationListSplit new OnBase @Override public void onSuccess List conversations mergeConversations conversations ; @Override public void onError int code, String error recordConversationListFailure code, error ; , 0, 50 ; | 参数 | 类型 | 说明 | | | | | | offset | long | 从 0 开始的分页偏移量;刷新时重置为 0 。 | | count | long | 本页期望返回的会话数量。 | 成功回调返回当前页 List 。继续加载时按已经请求的条目数量推进 offset ;返回数量小于 count 时通常表示到达末页。 保持列表同步 会话列表发生新增或变化时,可以通过 OnConversationListener 接收以下 callback: OnConversationListener conversationListener = new OnConversationListener @Override public void onNewConversation List conversations mergeConversations conversations ; @Override public void onConversationChanged List conversations mergeConversations conversations ; ; OpenIMClient.getInstance .conversationManager.setOnConversationListener conversationListener ; 两个事件都携带 List ,可按 conversationID 更新列表中的对应会话。 setOnConversationListener 设置后即可接收会话变化。" }, { "path": "/sdk/android/conversation/managing-conversations/pin-conversation", "title": "置顶或取消置顶会话", - "description": "使用 pinConversation() 设置 Android 指定会话的置顶状态。", + "description": "使用 pinConversation() 设置指定会话的置顶状态。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations pin-conversation", - "content": "OpenIMClient.getInstance .conversationManager.pinConversation new OnBase @Override public void onSuccess String data markPinRequestSubmitted conversationID, true ; @Override public void onError int code, String error recordConversationPinFailure code, error ; , conversationID, true ; 最后一个参数为 true 时置顶,传 false 时取消置顶。该状态只影响当前账号的会话列表。 成功 callback 不等于 onConversationChanged 已经到达。后续按 conversationID 合并最新会话,完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "OpenIMClient.getInstance .conversationManager.pinConversation new OnBase @Override public void onSuccess String data markPinRequestSubmitted conversationID, true ; @Override public void onError int code, String error recordConversationPinFailure code, error ; , conversationID, true ; 最后一个参数为 true 时置顶,传 false 时取消置顶。 会话列表发生变化时,可通过 onConversationChanged 接收更新,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/set-conversation-extension", "title": "设置会话扩展字段", - "description": "使用 setConversationEx() 设置 Android 指定会话的业务扩展字符串。", + "description": "使用 setConversationEx() 设置指定会话的业务扩展字符串。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-conversation-extension", - "content": "ex 是完整字符串,SDK 不会自动合并 JSON。更新前应读取旧值并保留其他业务模块的命名空间。 OpenIMClient.getInstance .conversationManager.setConversationEx new OnBase @Override public void onSuccess String data markConversationExtensionSubmitted conversationID ; @Override public void onError int code, String error recordConversationExtensionFailure code, error ; , conversationID, mergedExtensionJSON ; 成功 callback 表示设置请求完成。通过 onConversationChanged 按 conversationID 合并最新会话;完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "ex 是用于保存会话扩展信息的字符串,可以传入 JSON 字符串或其他业务约定格式的字符串。 OpenIMClient.getInstance .conversationManager.setConversationEx new OnBase @Override public void onSuccess String data markConversationExtensionSubmitted conversationID ; @Override public void onError int code, String error recordConversationExtensionFailure code, error ; , conversationID, extensionJSON ; 成功回调表示设置请求已完成。会话列表中的扩展字段变化可通过 onConversationChanged 接收,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/set-conversation-draft", "title": "设置会话草稿", - "description": "使用 setConversationDraft() 保存 Android 会话草稿。", + "description": "使用 setConversationDraft() 保存会话草稿。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-conversation-draft", - "content": "用户离开聊天页、切换会话或输入框内容变化时,可以使用 setConversationDraft 保存草稿。输入过程中先维护编辑器状态并对保存调用做防抖;离开页面前再提交一次最新文本。 OpenIMClient.getInstance .conversationManager.setConversationDraft new OnBase @Override public void onSuccess String data markDraftSubmitted conversationID ; @Override public void onError int code, String error recordDraftSaveFailure code, error ; , conversationID, editorValue ; 清空草稿时传空字符串。成功 callback 只表示保存请求已经完成,不等同于会话变化回调已经到达;SDK 后续通过 onConversationChanged 同步 draftText 和 draftTextTime ,需要校准时重新查询会话。退出登录或切换账号时清理编辑器内存状态。" + "content": "用户离开聊天页、切换会话或输入框内容变化时,可以使用 setConversationDraft 保存草稿。输入过程中先维护编辑器状态并对保存调用做防抖;离开页面前再提交一次最新文本。 OpenIMClient.getInstance .conversationManager.setConversationDraft new OnBase @Override public void onSuccess String data markDraftSubmitted conversationID ; @Override public void onError int code, String error recordDraftSaveFailure code, error ; , conversationID, editorValue ; 清空草稿时传空字符串。会话列表中的草稿变化可通过 onConversationChanged 接收。" }, { "path": "/sdk/android/conversation/managing-conversations/set-message-receive-option", "title": "设置会话消息接收方式", - "description": "使用 setConversationRecvMessageOpt() 设置 Android 单个会话的消息接收与通知方式。", + "description": "使用 setConversationRecvMessageOpt() 设置单个会话的消息接收与通知方式。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-message-receive-option", - "content": "OpenIMClient.getInstance .conversationManager.setConversationRecvMessageOpt new OnBase @Override public void onSuccess String data markReceiveOptionSubmitted conversationID ; @Override public void onError int code, String error recordReceiveOptionFailure code, error ; , conversationID, 2 ; | 数值 | 含义 | | | | | 0 | 正常接收消息并允许通知。 | | 1 | 不接收该会话消息,也不通知。 | | 2 | 接收该会话消息,但不通知。 | 账号级默认策略见 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception 。成功 callback 后通过 onConversationChanged 按 conversationID 合并最新会话。" + "content": "OpenIMClient.getInstance .conversationManager.setConversationRecvMessageOpt new OnBase @Override public void onSuccess String data markReceiveOptionSubmitted conversationID ; @Override public void onError int code, String error recordReceiveOptionFailure code, error ; , conversationID, 2 ; | 数值 | 含义 | | | | | 0 | 正常接收消息并允许通知。 | | 1 | 不接收该会话消息,也不通知。 | | 2 | 接收该会话消息,但不通知。 | 账号级默认策略见 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception 。会话列表中的接收方式变化可通过 onConversationChanged 接收,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/clear-group-mentions", "title": "重置群聊 @ 状态", - "description": "使用 resetConversationGroupAtType() 将 Android 指定会话的群聊 @ 状态重置为普通状态。", + "description": "使用 resetConversationGroupAtType() 将指定会话的群聊 @ 状态重置为普通状态。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations clear-group-mentions", - "content": "用户处理完群聊中的 @ 消息后,调用 resetConversationGroupAtType 将 groupAtType 重置为普通状态。 OpenIMClient.getInstance .conversationManager.resetConversationGroupAtType new OnBase @Override public void onSuccess String data markGroupMentionStateReset conversationID ; @Override public void onError int code, String error recordGroupMentionResetFailure code, error ; , conversationID ; 本操作只负责重置为普通状态,不应用于主动写入 atMe 、 atAll 等状态。群聊 @ 状态与消息已读状态不同。 成功 callback 后通过 onConversationChanged 按 conversationID 合并该会话;完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "群聊消息中有人 @ 当前用户或 @ 全体成员时, groupAtType 用于标记会话列表中的提醒状态。当前用户阅读相关消息后,调用 resetConversationGroupAtType 清除该会话 groupAtType 的 @ 提醒状态,并更新会话列表 UI。 OpenIMClient.getInstance .conversationManager.resetConversationGroupAtType new OnBase @Override public void onSuccess String data markGroupMentionStateReset conversationID ; @Override public void onError int code, String error recordGroupMentionResetFailure code, error ; , conversationID ; 会话列表中的状态变化可通过 onConversationChanged 接收,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/mark-conversation-read", "title": "标记会话已读", - "description": "使用 messageManager.markConversationMessageAsRead() 将 Android 指定会话的消息标记为已读。", + "description": "使用 messageManager.markConversationMessageAsRead() 将指定会话的消息标记为已读。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations mark-conversation-read", - "content": "用户打开会话并阅读完当前可见消息后,调用 messageManager.markConversationMessageAsRead 。不要在仅预览通知或后台收到消息时提前标记。 OpenIMClient.getInstance .messageManager.markConversationMessageAsRead conversationID, new OnBase @Override public void onSuccess String data markConversationReadSubmitted conversationID ; @Override public void onError int code, String error recordMarkReadFailure code, error ; ; 成功 callback 表示请求完成,不等于 onConversationChanged 已到达。随后按 conversationID 合并最新 ConversationInfo ;需要立即确认时重新查询该会话。 对于单聊,当前用户标记会话已读后,对端可通过 OnAdvanceMsgListener.onRecvC2CReadReceipt 收到已读回执。对每个 C2CReadReceiptInfo 先验证 sessionType == ConversationType.SINGLE CHAT 和非空 userID ,再按 msgIDList 更新对应消息的已读状态。 MessageManager 同样只保存一个高级消息 listener,应在应用级消息状态层统一设置。" + "content": "用户打开会话并阅读完当前可见消息后,调用 messageManager.markConversationMessageAsRead 标记会话已读。不要在仅预览通知或后台收到消息时提前标记。 OpenIMClient.getInstance .messageManager.markConversationMessageAsRead conversationID, new OnBase @Override public void onSuccess String data markConversationReadSubmitted conversationID ; @Override public void onError int code, String error recordMarkReadFailure code, error ; ; 成功回调表示标记请求已完成。需要更新会话列表时,可重新查询会话或通过 onConversationChanged 接收变化。 对于单聊,可以通过 OnAdvanceMsgListener.onRecvC2CReadReceipt 监听对端发来的已读回执。消息监听器的设置方式见 接收消息 /sdk/android/message/receiving messages/receive messages ,消息回调和已读回执字段见 消息概览 /sdk/android/message/overview message 。" }, { "path": "/sdk/android/conversation/managing-conversations/get-total-unread-count", "title": "获取消息总未读数", - "description": "使用 getTotalUnreadMsgCount() 获取 Android 当前账号的总未读数。", + "description": "使用 getTotalUnreadMsgCount() 获取当前账号的总未读数。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations get-total-unread-count", - "content": "getTotalUnreadMsgCount 返回当前账号所有会话的总未读快照,不要把当前已加载分页中的 unreadCount 简单相加。 OpenIMClient.getInstance .conversationManager.getTotalUnreadMsgCount new OnBase @Override public void onSuccess String value int totalUnread = Integer.parseInt value ; updateApplicationBadge totalUnread ; @Override public void onError int code, String error recordTotalUnreadFailure code, error ; ; 回调值是 String ,解析失败时应按业务错误处理,不能将其默认为会话列表分页的局部总数。查询本身不触发 callback。 本页归属 OnConversationListener.onTotalUnreadMessageCountChanged int count 。在应用唯一的 OnConversationListener 中按该值更新应用角标;会话 listener 的集中设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "getTotalUnreadMsgCount 返回当前账号所有会话的总未读数。 OpenIMClient.getInstance .conversationManager.getTotalUnreadMsgCount new OnBase @Override public void onSuccess String value int totalUnread = Integer.parseInt value ; updateApplicationBadge totalUnread ; @Override public void onError int code, String error recordTotalUnreadFailure code, error ; ; 回调值是 String ,解析后即可用于显示总未读数。 总未读数发生变化时,可以通过 OnConversationListener.onTotalUnreadMessageCountChanged int count 接收更新;监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/set-private-chat", "title": "开启或关闭阅后即焚", - "description": "使用 setOneConversationPrivateChat() 设置 Android 会话的阅后即焚模式。", + "description": "使用 setOneConversationPrivateChat() 设置会话的阅后即焚模式。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-private-chat", - "content": "OpenIMClient.getInstance .conversationManager.setOneConversationPrivateChat new OnBase @Override public void onSuccess String data markPrivateChatSubmitted conversationID, true ; @Override public void onError int code, String error recordPrivateChatFailure code, error ; , conversationID, true ; 传入 false 关闭阅后即焚。具体保留时长由 burnDuration 单独设置,见 设置阅后即焚时长 /sdk/android/conversation/managing conversations/set burn duration 。该能力与定期删除服务端消息不同。 成功 callback 只表示设置请求完成;最新状态通过 onConversationChanged 按 conversationID 合并,完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "OpenIMClient.getInstance .conversationManager.setOneConversationPrivateChat new OnBase @Override public void onSuccess String data markPrivateChatSubmitted conversationID, true ; @Override public void onError int code, String error recordPrivateChatFailure code, error ; , conversationID, true ; 传入 false 关闭阅后即焚。具体保留时长由 burnDuration 单独设置,见 设置阅后即焚时长 /sdk/android/conversation/managing conversations/set burn duration 。该能力与定期删除服务端消息不同。 会话列表中的阅后即焚状态变化可通过 onConversationChanged 接收,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/set-burn-duration", "title": "设置阅后即焚时长", - "description": "使用 setConversationBurnDuration() 设置 Android 阅后即焚模式的消息保留时长。", + "description": "使用 setConversationBurnDuration() 设置阅后即焚模式的消息保留时长。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-burn-duration", - "content": "OpenIMClient.getInstance .conversationManager.setConversationBurnDuration new OnBase @Override public void onSuccess String data markBurnDurationSubmitted conversationID, 30 ; @Override public void onError int code, String error recordBurnDurationFailure code, error ; , conversationID, 30 ; burnDuration 的单位为秒。启用或关闭阅后即焚需要设置 isPrivateChat ,见 开启或关闭阅后即焚 /sdk/android/conversation/managing conversations/set private chat 。不要把它与服务端消息定期删除周期 msgDestructTime 混用。 成功 callback 后,通过 onConversationChanged 合并最新 burnDuration ;完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "OpenIMClient.getInstance .conversationManager.setConversationBurnDuration new OnBase @Override public void onSuccess String data markBurnDurationSubmitted conversationID, 30 ; @Override public void onError int code, String error recordBurnDurationFailure code, error ; , conversationID, 30 ; burnDuration 的单位为秒。启用或关闭阅后即焚需要设置 isPrivateChat ,见 开启或关闭阅后即焚 /sdk/android/conversation/managing conversations/set private chat 。不要把它与服务端消息定期删除周期 msgDestructTime 混用。 会话列表中的时长变化可通过 onConversationChanged 接收,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/set-message-destruct", "title": "定期删除服务端消息", - "description": "使用 setConversation() 启用、关闭并配置 Android 会话的服务端消息定期删除策略。", + "description": "使用 setConversation() 启用、关闭并配置会话的服务端消息定期删除策略。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-message-destruct", - "content": "isMsgDestruct 与 msgDestructTime 共同构成服务端消息定期删除设置,可以在一次 ConversationReq 中提交。 ConversationReq request = new ConversationReq ; request.setMsgDestruct true ; request.setMsgDestructTime 3600 ; OpenIMClient.getInstance .conversationManager.setConversation new OnBase @Override public void onSuccess String data markMessageDestructSubmitted conversationID ; @Override public void onError int code, String error recordMessageDestructFailure code, error ; , conversationID, request ; msgDestructTime 的单位为秒。关闭时只传 request.setMsgDestruct false ;该能力用于定期删除服务端消息,不是阅后即焚。 成功 callback 表示设置请求完成。最新开关和周期通过 onConversationChanged 按 conversationID 合并,完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "isMsgDestruct 与 msgDestructTime 共同构成服务端消息定期删除设置,可以在一次 ConversationReq 中提交。 ConversationReq request = new ConversationReq ; request.setMsgDestruct true ; request.setMsgDestructTime 3600 ; OpenIMClient.getInstance .conversationManager.setConversation new OnBase @Override public void onSuccess String data markMessageDestructSubmitted conversationID ; @Override public void onError int code, String error recordMessageDestructFailure code, error ; , conversationID, request ; msgDestructTime 的单位为秒。关闭时只传 request.setMsgDestruct false ;该能力用于定期删除服务端消息,不是阅后即焚。 会话列表中的设置变化可通过 onConversationChanged 接收,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/hide-a-conversation", "title": "隐藏会话", - "description": "使用 hideConversation() 从 Android 当前账号的会话列表隐藏入口。", + "description": "使用 hideConversation() 从当前账号的会话列表隐藏入口。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations hide-a-conversation", - "content": "hideConversation 只隐藏当前登录用户的会话入口,不会删除单聊关系、退出群组或影响其他用户。 OpenIMClient.getInstance .conversationManager.hideConversation new OnBase @Override public void onSuccess String data conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationHideFailure code, error ; , conversationID ; 该方法适合临时从聊天列表移除入口。收到新消息或重新同步后,隐藏的会话可能再次出现。 成功 callback 表示隐藏请求已完成,调用端可以从当前列表移除该 conversationID 。后续收到 onConversationChanged 时仍应按 conversationID 幂等合并;完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "hideConversation 只隐藏当前登录用户的会话入口,不会删除单聊关系、退出群组或影响其他用户。 OpenIMClient.getInstance .conversationManager.hideConversation new OnBase @Override public void onSuccess String data conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationHideFailure code, error ; , conversationID ; 该方法适合临时从聊天列表移除入口。收到新消息或重新同步后,隐藏的会话可能再次出现。 成功回调表示隐藏请求已完成,调用端可以从当前列表移除该 conversationID 。会话列表后续发生变化时,可通过 onConversationChanged 接收更新,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", "title": "删除会话及消息", - "description": "使用 deleteConversationAndDeleteAllMsg() 删除 Android 指定会话及其全部消息。", + "description": "使用 deleteConversationAndDeleteAllMsg() 删除指定会话及其全部消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations delete-conversation-with-messages", - "content": "产品语义为“删除此聊天”时,调用 deleteConversationAndDeleteAllMsg 。 OpenIMClient.getInstance .conversationManager.deleteConversationAndDeleteAllMsg new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationDeleteFailure code, error ; , conversationID ; 成功 callback 后清理当前消息列表和会话行。该操作不删除好友关系,也不退出或解散群组;聊天目标仍存在时,会话可能由新消息或同步重新生成。 后续通过 onConversationChanged 或重新查询校准会话列表,完整 listener 见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "deleteConversationAndDeleteAllMsg 删除指定会话及其全部消息。 OpenIMClient.getInstance .conversationManager.deleteConversationAndDeleteAllMsg new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationDeleteFailure code, error ; , conversationID ; 成功回调后清理当前消息列表和会话行。该操作不删除好友关系,也不退出或解散群组;聊天目标仍存在时,会话可能由新消息或同步重新生成。 需要更新会话列表时,可重新查询会话或通过 onConversationChanged 接收变化,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", "title": "清空会话消息", - "description": "使用 messageManager.clearConversationAndDeleteAllMsg() 保留 Android 会话入口并清空其消息。", + "description": "使用 messageManager.clearConversationAndDeleteAllMsg() 保留会话入口并清空其消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations clear-conversation-messages", - "content": "产品语义为“清空聊天记录”时,调用 messageManager.clearConversationAndDeleteAllMsg 。 OpenIMClient.getInstance .messageManager.clearConversationAndDeleteAllMsg conversationID, new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; @Override public void onError int code, String error recordConversationClearFailure code, error ; ; 成功 callback 后保留会话入口,但清除当前账号下的消息和摘要状态。立即清理当前消息列表,再通过 onConversationChanged 或重新查询校准最后一条消息、摘要和未读状态。" + "content": "messageManager.clearConversationAndDeleteAllMsg 清空指定会话的消息并保留会话入口。 OpenIMClient.getInstance .messageManager.clearConversationAndDeleteAllMsg conversationID, new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; @Override public void onError int code, String error recordConversationClearFailure code, error ; ; 成功回调后,会话入口仍然保留,但当前账号下的消息会被清除。需要更新会话列表时,可重新查询会话或通过 onConversationChanged 接收变化。" }, { "path": "/sdk/android/group/overview-group", diff --git a/src/generated/search-index.json b/src/generated/search-index.json index ddcbbabd19..81c9a4666e 100644 --- a/src/generated/search-index.json +++ b/src/generated/search-index.json @@ -2133,143 +2133,143 @@ "description": "Learn about ConversationInfo, conversationID, conversation settings, and conversation events in the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation overview-conversation", - "content": "A conversation is the chat list state maintained by the signed in account for a one to one or group chat. A ConversationInfo record contains unread count, latest message, pinning, draft, message reception, and extension data. conversationID identifies the account's conversation state; the chat target is the peer userID for a one to one chat or the groupID for a group chat. Group profile, membership, and permissions belong to Group APIs. Use groupID for group operations and conversationID for conversation settings, unread state, drafts, and message cleanup. Conversation identifiers | Identifier | Purpose | | | | | conversationID | Conversation record ID for settings, unread state, and message history. | | userID | Peer user ID in a one to one chat. | | groupID | Group ID for a group chat and Group API target. | | sourceId | Chat target passed to queries and ID resolution: userID for a one to one chat, groupID for a group chat. | Use ConversationType.SINGLE CHAT for one to one chats. For a group chat, use ConversationType.GROUP CHAT or ConversationType.SUPER GROUP CHAT according to the group type. Do not construct a conversationID in application code. ConversationInfo | Field | Description | | | | | conversationID / conversationType | Conversation ID and type. | | userID / groupID | Peer user or target group. | | showName / faceURL | Conversation list display name and avatar. | | unreadCount | Unread count for the conversation. | | latestMsg / latestMsgSendTime | Latest message JSON and send time. | | recvMsgOpt / groupAtType | Reception option and group mention state. | | draftText / draftTextTime | Draft and draft update time. | | isPinned | Whether the conversation is pinned. | | isPrivateChat / burnDuration | Burn after reading setting and duration. | | isMsgDestruct / msgDestructTime | Server message destruction configuration. | | ex | Application defined conversation extension string. | State updates Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list owns onNewConversation and onConversationChanged . Track the total unread count /sdk/android/conversation/managing conversations/get total unread count owns onTotalUnreadMessageCountChanged . ConversationManager retains one OnConversationListener ; setOnConversationListener replaces it. Set a composed listener once in a shared state layer. Request completion, event arrival, and snapshot reconciliation are separate stages." + "content": "A conversation is the chat list state maintained by the signed in account for a one to one or group chat. A ConversationInfo record contains unread count, latest message, pinning, draft, message reception, and extension data. conversationID uniquely identifies a conversation and is used to query conversation information and set conversation state; the chat target is the peer userID for a one to one chat or the groupID for a group chat. Group profile, membership, and permissions belong to Group APIs. Use groupID for group operations and conversationID for conversation settings, unread state, drafts, and message cleanup. Conversation identifiers | Identifier | Purpose | | | | | conversationID | Conversation record ID for settings, unread state, and message history. | | userID | Peer user ID in a one to one chat. | | groupID | Group ID for a group chat and Group API target. | | sourceId | Chat target passed to queries and ID resolution: userID for a one to one chat, groupID for a group chat. | ConversationInfo | Field | Description | | | | | conversationID | Conversation ID. | | conversationType | Conversation type: ConversationType.SINGLE CHAT for one to one chats; ConversationType.GROUP CHAT or ConversationType.SUPER GROUP CHAT for group chats. | | userID / groupID | userID identifies the peer user in a one to one chat, while groupID identifies the target group in a group chat. Only one applies. | | showName | Conversation name: the target user's nickname or remark for a one to one chat, and the group name or remark for a group chat. | | faceURL | Conversation avatar URL. | | unreadCount | Unread count for the conversation. | | latestMsg | JSON string for the latest message. | | latestMsgSendTime | Send time of the latest message. | | recvMsgOpt | Message reception option for the conversation. | | groupAtType | Group mention reminder state. | | draftText | Conversation draft. | | draftTextTime | Draft update time. | | isPinned | Whether the conversation is pinned. | | isPrivateChat | Whether burn after reading is enabled. | | burnDuration | Reading duration for burn after reading messages, in seconds. | | isMsgDestruct | Whether scheduled server message deletion is enabled. | | msgDestructTime | Scheduled server message deletion time. | | ext | Reserved conversation extension string. | | ex | Application defined conversation extension string. | | isNotInGroup | Whether the current user is no longer in the group. | Find pages by task | Task | Pages | | | | | Query one, several, or a paginated list of conversations | Get a conversation by target /sdk/android/conversation/retrieving conversations/get conversation by target , Get conversations by ID /sdk/android/conversation/retrieving conversations/get conversations by id , Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list | | Generate a conversation ID | Generate a conversation ID /sdk/android/conversation/retrieving conversations/get conversation id | | Organize the conversation list | Pin or unpin a conversation /sdk/android/conversation/managing conversations/pin conversation , Hide a conversation /sdk/android/conversation/managing conversations/hide a conversation | | Maintain drafts and extension data | Set a conversation draft /sdk/android/conversation/managing conversations/set conversation draft , Set conversation extension data /sdk/android/conversation/managing conversations/set conversation extension | | Set message reception and retention policy | Set conversation message reception /sdk/android/conversation/managing conversations/set message receive option , Enable or disable burn after reading /sdk/android/conversation/managing conversations/set private chat , Set burn after reading duration /sdk/android/conversation/managing conversations/set burn duration , Schedule server message deletion /sdk/android/conversation/managing conversations/set message destruct | | Handle unread counts and group mention reminders | Mark a conversation as read /sdk/android/conversation/managing conversations/mark conversation read , Get the total unread count /sdk/android/conversation/managing conversations/get total unread count , Reset group mention status /sdk/android/conversation/managing conversations/clear group mentions | | Delete or clear conversation data | Delete a conversation and its messages /sdk/android/conversation/managing conversations/delete conversation with messages , Clear messages in a conversation /sdk/android/conversation/managing conversations/clear conversation messages | State updates After you set an OnConversationListener , you can receive changes to the conversation list and total unread count. See Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list keep the list synchronized for complete listener setup: onNewConversation : Receives newly created conversations. onConversationChanged : Receives conversation property changes, such as unread count, pinning, and drafts. onTotalUnreadMessageCountChanged : Receives changes to the signed in account's total unread message count. Each call to setOnConversationListener replaces the previously set listener." }, { "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", "title": "Open a conversation", - "description": "Use getOneConversation() to retrieve one Android conversation by user or group.", + "description": "Use getOneConversation() to retrieve one conversation by user or group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversation-by-target", - "content": "Use getOneConversation when opening a chat from a contact, user profile, or group profile. Pass the peer user ID for a one to one chat and the group ID for a group chat; do not construct ConversationInfo locally when no messages exist yet. OpenIMClient.getInstance .conversationManager.getOneConversation new OnBase @Override public void onSuccess ConversationInfo conversation openChatPage conversation ; @Override public void onError int code, String error recordConversationOpenFailure code, error ; , targetUserID, ConversationType.SINGLE CHAT ; sourceId is the peer userID for a one to one chat and groupID for a group chat. Use ConversationType.GROUP CHAT or ConversationType.SUPER GROUP CHAT for a group according to its type. The callback returns ConversationInfo . This query does not trigger a conversation listener; Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list merges later changes by conversationID ." + "content": "getOneConversation retrieves one conversation by user or group and is suitable when opening a chat from a contact, user profile, or group profile. Pass the peer user ID for a one to one chat and the group ID for a group chat. OpenIMClient.getInstance .conversationManager.getOneConversation new OnBase @Override public void onSuccess ConversationInfo conversation openChatPage conversation ; @Override public void onError int code, String error recordConversationOpenFailure code, error ; , sourceId, ConversationType.SINGLE CHAT ; sourceId is the peer userID for a one to one chat and groupID for a group chat. Use ConversationType.GROUP CHAT or ConversationType.SUPER GROUP CHAT for a group according to its type. The callback returns ConversationInfo . To receive newly added or changed conversations, see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for how to set OnConversationListener ." }, { "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", "title": "Resolve a conversation ID", - "description": "Use getConversationIDBySessionType() to resolve an Android conversation ID from a chat target.", + "description": "Use getConversationIDBySessionType() to resolve a conversation ID from a chat target.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversation-id", - "content": "When only the conversation ID is needed, call getConversationIDBySessionType rather than constructing it in application code. String conversationID = OpenIMClient.getInstance .conversationManager .getConversationIDBySessionType targetUserID, ConversationType.SINGLE CHAT ; sourceId is the peer userID for a one to one chat and groupID for a group chat. Use the group conversation type that matches the target group. This Android API synchronously returns a String conversationID . It does not return ConversationInfo or trigger a conversation listener. Use Open a conversation /sdk/android/conversation/retrieving conversations/get conversation by target when profile data is required." + "content": "getConversationIDBySessionType returns a conversationID from the chat target sourceId and conversation type sessionType . String conversationID = OpenIMClient.getInstance .conversationManager .getConversationIDBySessionType sourceId, ConversationType.SINGLE CHAT ; sourceId is the peer userID for a one to one chat and groupID for a group chat. Use the group conversation type that matches the target group. The return value is a String conversationID . Use Open a conversation /sdk/android/conversation/retrieving conversations/get conversation by target when conversation information is required." }, { "path": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", "title": "Get conversations by ID", - "description": "Use getMultipleConversation() to retrieve Android conversations by conversationID.", + "description": "Use getMultipleConversation() to retrieve conversations by conversationID.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversations-by-id", - "content": "Use getMultipleConversation when a set of conversationID values is already available and the latest conversation snapshot is needed. OpenIMClient.getInstance .conversationManager.getMultipleConversation new OnBase @Override public void onSuccess List conversations for ConversationInfo item : conversations conversationStore.put item.getConversationID , item ; @Override public void onError int code, String error recordConversationQueryFailure code, error ; , conversationIDs ; Remove empty and duplicate IDs before calling. The callback returns List . Treat an ID with no returned item as missing; do not assume response order exactly matches request order. This query does not trigger a conversation listener." + "content": "Use getMultipleConversation to retrieve multiple conversations by conversationIDs . conversationIDs is the list of conversation IDs to query. OpenIMClient.getInstance .conversationManager.getMultipleConversation new OnBase @Override public void onSuccess List conversations for ConversationInfo item : conversations conversationStore.put item.getConversationID , item ; @Override public void onError int code, String error recordConversationQueryFailure code, error ; , conversationIDs ; The callback returns List ." }, { "path": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", "title": "Get the conversation list", - "description": "Use getConversationListSplit() to retrieve the current Android account conversation list by page.", + "description": "Use getConversationListSplit() to retrieve the signed-in account conversation list by page.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation retrieving-conversations retrieve-conversation-list", - "content": "The conversation list belongs to the signed in account. Each ConversationInfo contains list state such as unread count, latest message, pinning, and draft. Use the paged API instead of the non paged getAllConversationList . Retrieve a page OpenIMClient.getInstance .conversationManager.getConversationListSplit new OnBase @Override public void onSuccess List conversations mergeConversations conversations ; @Override public void onError int code, String error recordConversationListFailure code, error ; , 0, 50 ; | Parameter | Type | Description | | | | | | offset | long | Zero based paging offset; reset it to 0 on refresh. | | count | long | Requested number of conversations. | The callback returns the current List page. Advance offset by the requested item count and deduplicate by conversationID . A page smaller than count normally indicates the end; clear paging state and reload from 0 on refresh. Keep the list synchronized getConversationListSplit only creates a snapshot. Combine these callbacks in the application's single OnConversationListener : @Override public void onNewConversation List conversations mergeConversations conversations ; @Override public void onConversationChanged List conversations mergeConversations conversations ; Both callbacks carry List and must merge idempotently by conversationID . A user can join a group without an existing conversation, and a historical conversation can remain after leaving a group, so do not substitute the joined group list for the conversation list." + "content": "The conversation list belongs to the signed in account. Each ConversationInfo contains list state such as unread count, latest message, pinning, and draft. Retrieve a page OpenIMClient.getInstance .conversationManager.getConversationListSplit new OnBase @Override public void onSuccess List conversations mergeConversations conversations ; @Override public void onError int code, String error recordConversationListFailure code, error ; , 0, 50 ; | Parameter | Type | Description | | | | | | offset | long | Zero based paging offset; reset it to 0 on refresh. | | count | long | Requested number of conversations. | The callback returns the current List page. Advance offset by the requested item count. A page smaller than count normally indicates the end. Keep the list synchronized Use OnConversationListener to receive the following callbacks when conversations are added or changed: OnConversationListener conversationListener = new OnConversationListener @Override public void onNewConversation List conversations mergeConversations conversations ; @Override public void onConversationChanged List conversations mergeConversations conversations ; ; OpenIMClient.getInstance .conversationManager.setOnConversationListener conversationListener ; Both callbacks carry List ; update the corresponding conversation by conversationID . Once set, setOnConversationListener receives conversation changes." }, { "path": "/sdk/android/conversation/managing-conversations/pin-conversation", "title": "Pin or unpin a conversation", - "description": "Use pinConversation() to set the pinned state of an Android conversation.", + "description": "Use pinConversation() to set the pinned state of a conversation.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations pin-conversation", - "content": "OpenIMClient.getInstance .conversationManager.pinConversation new OnBase @Override public void onSuccess String data markPinRequestSubmitted conversationID, true ; @Override public void onError int code, String error recordConversationPinFailure code, error ; , conversationID, true ; Pass true to pin and false to unpin. The setting affects only the current account's conversation list. A successful callback does not mean onConversationChanged has arrived; merge the later conversation increment by conversationID ." + "content": "OpenIMClient.getInstance .conversationManager.pinConversation new OnBase @Override public void onSuccess String data markPinRequestSubmitted conversationID, true ; @Override public void onError int code, String error recordConversationPinFailure code, error ; , conversationID, true ; Pass true to pin and false to unpin. Conversation list changes can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/set-conversation-extension", "title": "Set conversation extra data", - "description": "Use setConversationEx() to set an Android conversation extension string.", + "description": "Use setConversationEx() to set a conversation extension string.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-conversation-extension", - "content": "ex is a complete string. The SDK does not merge JSON, so read the prior value and retain namespaces owned by other application modules. OpenIMClient.getInstance .conversationManager.setConversationEx new OnBase @Override public void onSuccess String data markConversationExtensionSubmitted conversationID ; @Override public void onError int code, String error recordConversationExtensionFailure code, error ; , conversationID, mergedExtensionJSON ; Reconcile the result through onConversationChanged by conversationID ; listener ownership is documented in Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list ." + "content": "ex is a string for storing conversation extension data. You can pass a JSON string or another string format defined by your application. OpenIMClient.getInstance .conversationManager.setConversationEx new OnBase @Override public void onSuccess String data markConversationExtensionSubmitted conversationID ; @Override public void onError int code, String error recordConversationExtensionFailure code, error ; , conversationID, extensionJSON ; Conversation list changes for the extension field can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/set-conversation-draft", "title": "Set a conversation draft", - "description": "Use setConversationDraft() to save an Android conversation draft.", + "description": "Use setConversationDraft() to save a conversation draft.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-conversation-draft", - "content": "Save the draft when a chat is left, the conversation changes, or editor content changes. Maintain editor state locally and debounce intermediate saves; submit the newest value before leaving the page. OpenIMClient.getInstance .conversationManager.setConversationDraft new OnBase @Override public void onSuccess String data markDraftSubmitted conversationID ; @Override public void onError int code, String error recordDraftSaveFailure code, error ; , conversationID, editorValue ; Pass an empty string to clear the draft. Request completion and the later onConversationChanged update are separate; merge draftText and draftTextTime by conversationID , and clear in memory editor state after logout or an account switch." + "content": "Save the draft when a chat is left, the conversation changes, or editor content changes. Maintain editor state locally and debounce intermediate saves; submit the newest value before leaving the page. OpenIMClient.getInstance .conversationManager.setConversationDraft new OnBase @Override public void onSuccess String data markDraftSubmitted conversationID ; @Override public void onError int code, String error recordDraftSaveFailure code, error ; , conversationID, editorValue ; Pass an empty string to clear the draft. Conversation list changes can be received through onConversationChanged ." }, { "path": "/sdk/android/conversation/managing-conversations/set-message-receive-option", "title": "Set conversation message reception", - "description": "Use setConversationRecvMessageOpt() to set message reception and notification behavior for one Android conversation.", + "description": "Use setConversationRecvMessageOpt() to set message reception and notification behavior for one conversation.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-message-receive-option", - "content": "OpenIMClient.getInstance .conversationManager.setConversationRecvMessageOpt new OnBase @Override public void onSuccess String data markReceiveOptionSubmitted conversationID ; @Override public void onError int code, String error recordReceiveOptionFailure code, error ; , conversationID, 2 ; | Value | Meaning | | | | | 0 | Receive messages and allow notifications. | | 1 | Do not receive messages from this conversation or notify. | | 2 | Receive messages from this conversation without notification. | The account default is documented in Set global message reception /sdk/android/user/user profile/set global message reception . Merge the later onConversationChanged result by conversationID ." + "content": "OpenIMClient.getInstance .conversationManager.setConversationRecvMessageOpt new OnBase @Override public void onSuccess String data markReceiveOptionSubmitted conversationID ; @Override public void onError int code, String error recordReceiveOptionFailure code, error ; , conversationID, 2 ; | Value | Meaning | | | | | 0 | Receive messages and allow notifications. | | 1 | Do not receive messages from this conversation or notify. | | 2 | Receive messages from this conversation without notification. | The account default is documented in Set global message reception /sdk/android/user/user profile/set global message reception . Conversation list changes for this setting can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/clear-group-mentions", "title": "Reset group mention status", - "description": "Use resetConversationGroupAtType() to reset an Android conversation group mention state.", + "description": "Use resetConversationGroupAtType() to reset a group mention state for a conversation.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations clear-group-mentions", - "content": "After handling group messages that mention the current user, call resetConversationGroupAtType to reset groupAtType to the normal state. OpenIMClient.getInstance .conversationManager.resetConversationGroupAtType new OnBase @Override public void onSuccess String data markGroupMentionStateReset conversationID ; @Override public void onError int code, String error recordGroupMentionResetFailure code, error ; , conversationID ; This operation only resets the state and must not be used to set atMe or atAll . Group mention state is distinct from message read state. Reconcile the conversation through onConversationChanged ." + "content": "When a group message mentions the current user or all group members, groupAtType marks the reminder state in the conversation list. After reading the relevant message, call resetConversationGroupAtType to clear the @ reminder from groupAtType for that conversation and update the conversation list UI. OpenIMClient.getInstance .conversationManager.resetConversationGroupAtType new OnBase @Override public void onSuccess String data markGroupMentionStateReset conversationID ; @Override public void onError int code, String error recordGroupMentionResetFailure code, error ; , conversationID ; Conversation list changes can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/mark-conversation-read", "title": "Mark a conversation as read", - "description": "Use messageManager.markConversationMessageAsRead() to mark Android conversation messages as read.", + "description": "Use messageManager.markConversationMessageAsRead() to mark conversation messages as read.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations mark-conversation-read", - "content": "Call messageManager.markConversationMessageAsRead after the user has opened and read visible messages. Do not mark a conversation read merely because a notification was previewed or a message arrived in the background. OpenIMClient.getInstance .messageManager.markConversationMessageAsRead conversationID, new OnBase @Override public void onSuccess String data markConversationReadSubmitted conversationID ; @Override public void onError int code, String error recordMarkReadFailure code, error ; ; Request completion does not guarantee onConversationChanged has arrived. Merge the current ConversationInfo by conversationID , or re query it when immediate confirmation is required. For one to one chats, the peer can receive OnAdvanceMsgListener.onRecvC2CReadReceipt . Validate sessionType == ConversationType.SINGLE CHAT and a non empty userID , then update message read state from msgIDList . MessageManager retains one advanced message listener and should be configured once in a shared message state layer." + "content": "After the user has opened and read visible messages, call messageManager.markConversationMessageAsRead to mark the conversation as read. Do not mark a conversation read merely because a notification was previewed or a message arrived in the background. OpenIMClient.getInstance .messageManager.markConversationMessageAsRead conversationID, new OnBase @Override public void onSuccess String data markConversationReadSubmitted conversationID ; @Override public void onError int code, String error recordMarkReadFailure code, error ; ; The callback indicates that the mark as read request has completed. To update the conversation list, query conversations again or receive changes through onConversationChanged . For one to one chats, listen for read receipts from the peer through OnAdvanceMsgListener.onRecvC2CReadReceipt . See Receive messages /sdk/android/message/receiving messages/receive messages for the message listener setup and Message overview /sdk/android/message/overview message for message callbacks and read receipt fields." }, { "path": "/sdk/android/conversation/managing-conversations/get-total-unread-count", "title": "Track the total unread count", - "description": "Use getTotalUnreadMsgCount() to retrieve the total unread count for the current Android account.", + "description": "Use getTotalUnreadMsgCount() to retrieve the total unread count for the signed-in account.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations get-total-unread-count", - "content": "getTotalUnreadMsgCount returns the complete unread snapshot for the signed in account. Do not sum unreadCount values from only the currently loaded conversation pages. OpenIMClient.getInstance .conversationManager.getTotalUnreadMsgCount new OnBase @Override public void onSuccess String value int totalUnread = Integer.parseInt value ; updateApplicationBadge totalUnread ; @Override public void onError int code, String error recordTotalUnreadFailure code, error ; ; The callback value is a String ; handle parse failures as an application error rather than treating it as a partial list total. This page owns OnConversationListener.onTotalUnreadMessageCountChanged int count , which updates the application badge after the initial query." + "content": "getTotalUnreadMsgCount returns the total unread count for the signed in account. OpenIMClient.getInstance .conversationManager.getTotalUnreadMsgCount new OnBase @Override public void onSuccess String value int totalUnread = Integer.parseInt value ; updateApplicationBadge totalUnread ; @Override public void onError int code, String error recordTotalUnreadFailure code, error ; ; The callback value is a String and can be parsed for display. When the total unread count changes, receive the update through OnConversationListener.onTotalUnreadMessageCountChanged int count ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/set-private-chat", "title": "Enable or disable burn after reading", - "description": "Use setOneConversationPrivateChat() to configure burn-after-reading mode for an Android conversation.", + "description": "Use setOneConversationPrivateChat() to configure burn-after-reading mode for a conversation.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-private-chat", - "content": "OpenIMClient.getInstance .conversationManager.setOneConversationPrivateChat new OnBase @Override public void onSuccess String data markPrivateChatSubmitted conversationID, true ; @Override public void onError int code, String error recordPrivateChatFailure code, error ; , conversationID, true ; Pass false to disable burn after reading. Set the duration separately with burnDuration ; see Set the burn duration /sdk/android/conversation/managing conversations/set burn duration . This is distinct from scheduled server message deletion. Reconcile the final state through onConversationChanged ." + "content": "OpenIMClient.getInstance .conversationManager.setOneConversationPrivateChat new OnBase @Override public void onSuccess String data markPrivateChatSubmitted conversationID, true ; @Override public void onError int code, String error recordPrivateChatFailure code, error ; , conversationID, true ; Pass false to disable burn after reading. Set the duration separately with burnDuration ; see Set the burn duration /sdk/android/conversation/managing conversations/set burn duration . This is distinct from scheduled server message deletion. Conversation list changes can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/set-burn-duration", "title": "Set the burn duration", - "description": "Use setConversationBurnDuration() to set the Android burn-after-reading retention duration.", + "description": "Use setConversationBurnDuration() to set the burn-after-reading retention duration.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-burn-duration", - "content": "OpenIMClient.getInstance .conversationManager.setConversationBurnDuration new OnBase @Override public void onSuccess String data markBurnDurationSubmitted conversationID, 30 ; @Override public void onError int code, String error recordBurnDurationFailure code, error ; , conversationID, 30 ; burnDuration is measured in seconds. Enable or disable burn after reading with isPrivateChat ; do not confuse this value with the scheduled server deletion period msgDestructTime . Merge the updated duration from onConversationChanged ." + "content": "OpenIMClient.getInstance .conversationManager.setConversationBurnDuration new OnBase @Override public void onSuccess String data markBurnDurationSubmitted conversationID, 30 ; @Override public void onError int code, String error recordBurnDurationFailure code, error ; , conversationID, 30 ; burnDuration is measured in seconds. Enable or disable burn after reading with isPrivateChat ; do not confuse this value with the scheduled server deletion period msgDestructTime . Conversation list changes can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/set-message-destruct", "title": "Schedule server message deletion", - "description": "Use setConversation() to configure scheduled server message deletion for an Android conversation.", + "description": "Use setConversation() to configure scheduled server message deletion for a conversation.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-message-destruct", - "content": "isMsgDestruct and msgDestructTime together configure scheduled server message deletion and can be sent in one ConversationReq . ConversationReq request = new ConversationReq ; request.setMsgDestruct true ; request.setMsgDestructTime 3600 ; OpenIMClient.getInstance .conversationManager.setConversation new OnBase @Override public void onSuccess String data markMessageDestructSubmitted conversationID ; @Override public void onError int code, String error recordMessageDestructFailure code, error ; , conversationID, request ; msgDestructTime is measured in seconds. Set request.setMsgDestruct false to disable the policy. This capability is distinct from burn after reading. Reconcile the latest switch and period through onConversationChanged ." + "content": "isMsgDestruct and msgDestructTime together configure scheduled server message deletion and can be sent in one ConversationReq . ConversationReq request = new ConversationReq ; request.setMsgDestruct true ; request.setMsgDestructTime 3600 ; OpenIMClient.getInstance .conversationManager.setConversation new OnBase @Override public void onSuccess String data markMessageDestructSubmitted conversationID ; @Override public void onError int code, String error recordMessageDestructFailure code, error ; , conversationID, request ; msgDestructTime is measured in seconds. Set request.setMsgDestruct false to disable the policy. This capability is distinct from burn after reading. Conversation list changes can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/hide-a-conversation", "title": "Hide a conversation", - "description": "Use hideConversation() to hide a conversation entry from the current Android account.", + "description": "Use hideConversation() to hide a conversation entry from the current account.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations hide-a-conversation", - "content": "hideConversation hides only the current account's conversation entry. It does not delete a one to one relationship, leave a group, or affect another account. OpenIMClient.getInstance .conversationManager.hideConversation new OnBase @Override public void onSuccess String data conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationHideFailure code, error ; , conversationID ; A hidden conversation can appear again after a new message or resynchronization. Remove it optimistically after success, then merge later onConversationChanged events idempotently by conversationID ." + "content": "hideConversation hides only the current account's conversation entry. It does not delete a one to one relationship, leave a group, or affect another account. OpenIMClient.getInstance .conversationManager.hideConversation new OnBase @Override public void onSuccess String data conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationHideFailure code, error ; , conversationID ; A hidden conversation can appear again after a new message or resynchronization. Remove it from the current list after success. Conversation list changes can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", "title": "Delete a conversation and its messages", - "description": "Use deleteConversationAndDeleteAllMsg() to delete an Android conversation and its messages.", + "description": "Use deleteConversationAndDeleteAllMsg() to delete a conversation and its messages.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations delete-conversation-with-messages", - "content": "Use deleteConversationAndDeleteAllMsg for a product action such as “delete this chat”. OpenIMClient.getInstance .conversationManager.deleteConversationAndDeleteAllMsg new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationDeleteFailure code, error ; , conversationID ; After success, clear the current message list and conversation row. This does not delete a friend relationship or leave or dismiss a group. A conversation can be regenerated by a new message or synchronization while the chat target still exists; reconcile through onConversationChanged or a fresh query." + "content": "deleteConversationAndDeleteAllMsg deletes a conversation and all of its messages. OpenIMClient.getInstance .conversationManager.deleteConversationAndDeleteAllMsg new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationDeleteFailure code, error ; , conversationID ; After success, clear the current message list and conversation row. This does not delete a friend relationship or leave or dismiss a group. A conversation can be regenerated by a new message or synchronization while the chat target still exists. To update the conversation list, query conversations again or receive changes through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", "title": "Clear messages in a conversation", - "description": "Use messageManager.clearConversationAndDeleteAllMsg() to keep an Android conversation entry while clearing its messages.", + "description": "Use messageManager.clearConversationAndDeleteAllMsg() to keep a conversation entry while clearing its messages.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations clear-conversation-messages", - "content": "Use messageManager.clearConversationAndDeleteAllMsg for a product action such as “clear chat history”. OpenIMClient.getInstance .messageManager.clearConversationAndDeleteAllMsg conversationID, new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; @Override public void onError int code, String error recordConversationClearFailure code, error ; ; The conversation entry remains while the current account's messages and summary state are cleared. Clear the visible message list immediately, then reconcile the latest message, summary, and unread state from onConversationChanged or a fresh query." + "content": "messageManager.clearConversationAndDeleteAllMsg clears the messages in a conversation while keeping its entry. OpenIMClient.getInstance .messageManager.clearConversationAndDeleteAllMsg conversationID, new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; @Override public void onError int code, String error recordConversationClearFailure code, error ; ; The conversation entry remains, while the current account's messages are cleared. To update the conversation list, query conversations again or receive changes through onConversationChanged ." }, { "path": "/sdk/android/group/overview-group", From 91546462e8f13ff5e7703ce72b8c48a68a75eb32 Mon Sep 17 00:00:00 2001 From: chan <1499188352@qq.com> Date: Wed, 19 Aug 2026 18:56:02 +0800 Subject: [PATCH 09/12] fix(android): fix pnpm check audit and sidebar validation - Correct Android audit metadata for overview and environment pages. - Allow sibling overview pages in relationship sidebar assertions while preserving folder checks. --- data/structure/android-content-audit.json | 27 ++++++------------- scripts/__tests__/client-sdk-sidebar.test.mjs | 8 ++++-- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/data/structure/android-content-audit.json b/data/structure/android-content-audit.json index 4e11e33b91..5d6530ec3b 100644 --- a/data/structure/android-content-audit.json +++ b/data/structure/android-content-audit.json @@ -1467,9 +1467,7 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/tree/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java" ], - "sdkMethods": [ - "OpenIMClient.getInstance" - ], + "sdkMethods": [], "sdkEvents": [], "locales": { "zh": { @@ -1477,11 +1475,9 @@ "reviewer": "Codex", "reviewedAt": "2026-08-06", "exampleVerification": { - "status": "verified", - "evidence": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java" - ], - "reason": null + "status": "not-applicable", + "evidence": [], + "reason": "本页仅提供 Android SDK 能力导航,不包含独立 API 调用示例;具体调用和验证证据在对应任务页维护。" } }, "en": { @@ -1489,11 +1485,9 @@ "reviewer": "Codex", "reviewedAt": "2026-08-06", "exampleVerification": { - "status": "verified", - "evidence": [ - "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java" - ], - "reason": "Manually translated from the reviewed Chinese page and verified against the pinned Android SDK source." + "status": "not-applicable", + "evidence": [], + "reason": "This page is an Android SDK navigation overview and contains no standalone API call example; implementation examples and verification evidence are maintained on the relevant task pages." } } }, @@ -1557,12 +1551,7 @@ "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" ], - "sdkMethods": [ - "initSDK", - "networkChanged", - "logout", - "unInit" - ], + "sdkMethods": [], "sdkEvents": [], "locales": { "zh": { diff --git a/scripts/__tests__/client-sdk-sidebar.test.mjs b/scripts/__tests__/client-sdk-sidebar.test.mjs index 9d40d1b91c..5b2bab00e7 100644 --- a/scripts/__tests__/client-sdk-sidebar.test.mjs +++ b/scripts/__tests__/client-sdk-sidebar.test.mjs @@ -105,7 +105,9 @@ test('keeps relationships beside users and account settings beside user profiles assert.ok(onlineStatus, platform); assert.equal(relationships.title, 'Relationships', platform); assert.deepEqual( - relationships.children.map((node) => node.id), + relationships.children + .filter((node) => typeof node !== 'string' && Array.isArray(node.children)) + .map((node) => node.id), ['user/friends', 'user/blacklist'], platform, ); @@ -146,7 +148,9 @@ test('keeps relationships beside users and account settings beside user profiles const runtimeProfile = runtimeUser.children.find((node) => node.id === 'user/user-profile'); assert.deepEqual( - runtimeRelationships.children.map((node) => node.id), + runtimeRelationships.children + .filter((node) => node.type === 'folder') + .map((node) => node.id), ['user/friends', 'user/blacklist'], `${platform}: generated navigation should expose the relationship groups`, ); From b78ddc658e3ea7f907b81fa0ee03f6b100586bf4 Mon Sep 17 00:00:00 2001 From: chan <1499188352@qq.com> Date: Wed, 19 Aug 2026 20:17:33 +0800 Subject: [PATCH 10/12] docs(android): publish Android SDK getting-started documentation --- .../authenticate-and-manage-session.mdx | 36 ++++++------- .../environment-specific-implementation.mdx | 4 +- .../getting-started/send-first-message.mdx | 3 +- .../authenticate-and-manage-session.mdx | 52 ++++++++----------- .../getting-started/before-you-start.mdx | 2 +- .../environment-specific-implementation.mdx | 4 +- .../getting-started/send-first-message.mdx | 5 +- data/structure/android-content-audit.json | 36 +++++++++---- src/generated/android-sdk-zh-content.json | 10 ++-- src/generated/search-index-zh.json | 10 ++-- src/generated/search-index.json | 6 +-- 11 files changed, 84 insertions(+), 84 deletions(-) diff --git a/content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx b/content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx index 29856453bf..b1f2156e59 100644 --- a/content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx +++ b/content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx @@ -54,36 +54,32 @@ config.isLogStandardOutput = false; OnConnListener connectionListener = new OnConnListener() { @Override public void onConnecting() { - sessionState.setConnectionState("connecting"); + // The connection is being established. } @Override public void onConnectSuccess() { - sessionState.setConnectionState("connected"); - sessionState.enableConnectedOperations(); + // Continue with operations that require a connection. } @Override public void onConnectFailed(long code, String error) { - sessionState.setConnectionState("failed"); - recordConnectionFailure(code, error); + // Handle the connection failure using code and error. } @Override public void onKickedOffline() { - sessionState.clearCurrentAccount(); - showSignedInElsewhereScreen(); + // Clear the current account state and prompt the user to sign in again. } @Override public void onUserTokenExpired() { - requestNewTokenAndRelogin(); + // Obtain a new token and sign in again. } @Override public void onUserTokenInvalid(String reason) { - sessionState.clearCurrentAccount(); - showSignInScreen(reason); + // Clear the current account state and prompt the user to sign in again. } }; @@ -107,13 +103,13 @@ A `true` return value means that the local SDK runtime initialized successfully. | `wsAddr` | `String` | OpenIMServer WebSocket endpoint. | | `dataDirectory` | `File` | Application-private persistent directory for the SDK database and logs. | | `config.logLevel` | `int` | A `LogLevel` constant; reduce the logging level explicitly in production. | -| `isLogStandardOutput` | `boolean` | Whether OpenIM Core logs are emitted to the standard log stream. | +| `isLogStandardOutput` | `boolean` | Whether SDK logs are emitted to the standard log stream. | -Initialize the SDK only once in `Application` or an application-level session component. The Java wrapper exposes `networkChanged()` to ask Core to re-evaluate network connectivity; call it only when the application already has one centralized system-network observer, not from multiple screens. +Initialize the SDK only once in `Application` or an application-level session component. `networkChanged()` asks the SDK to re-evaluate network connectivity; call it only when the application already has one centralized system-network observer, not from multiple screens. ## Register business listeners before login -Listener registration uses set semantics, so a later call replaces the previous listener. Create stable listener instances in an application-level event dispatcher and forward events to screen state. See [Send your first message](/sdk/android/getting-started/send-first-message) for the complete message-listener registration and incremental merge example. User, relationship, conversation, group, and call-signaling listeners follow the same ownership rule. +Listener registration uses set semantics, so a later call replaces the previous listener. Create stable listener instances in an application-level event dispatcher and forward events to screen state. For centralized listener registration, replacement behavior, and lifecycle guidance, see [Event overview](/sdk/android/events/overview-events). The SDK does not expose remove or unset methods. During sign-out or account switching, the application event dispatcher must stop delivering callbacks to state owned by the previous account and replace the complete listener set before the next login. @@ -123,14 +119,12 @@ The SDK does not expose remove or unset methods. During sign-out or account swit OpenIMClient.getInstance().login(new OnBase() { @Override public void onError(int code, String error) { - sessionState.setLoginState("failed"); - recordLoginFailure(code, error); + // Handle the login failure using code and error. } @Override public void onSuccess(String data) { - sessionState.setLoginState("logged"); - sessionState.setCurrentUserID(userID); + // The login call has completed. } }, userID, token); ``` @@ -144,7 +138,7 @@ int loginStatus = OpenIMClient.getInstance().getLoginStatus(); if (loginStatus == LoginStatus.Logged) { String currentUserID = OpenIMClient.getInstance().getLoginUserID(); - restoreSessionFor(currentUserID); + // currentUserID is the current logged-in user ID. } ``` @@ -160,7 +154,7 @@ if (loginStatus == LoginStatus.Logged) { After `onUserTokenExpired()` or `onUserTokenInvalid()`, obtain new credentials for the current user from a trusted backend, then reauthenticate or return to the sign-in flow according to product policy. After `onKickedOffline()`, clear conversations, message views, unread counts, and other state owned by the current account. Do not treat forced logout as an explicit user sign-out. -These callbacks do not have a business-entity merge key. Isolate them by the current `OpenIMClient` singleton and logged-in user. Stop asynchronous work and screen subscriptions owned by the previous account before starting a new login. +These callbacks apply to the current logged-in account. Before switching accounts, stop asynchronous work and screen subscriptions for the previous account, then clear its state. ## Sign out and release the SDK @@ -168,12 +162,12 @@ These callbacks do not have a business-entity merge key. Isolate them by the cur OpenIMClient.getInstance().logout(new OnBase() { @Override public void onError(int code, String error) { - recordLogoutFailure(code, error); + // Handle the sign-out failure using code and error. } @Override public void onSuccess(String data) { - sessionState.clearCurrentAccount(); + // The login session has signed out. } }); ``` diff --git a/content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx b/content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx index aa6ac6db23..2047842058 100644 --- a/content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx +++ b/content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx @@ -19,8 +19,8 @@ Add the dependencies to the application module's `build.gradle`: ```groovy dependencies { - implementation 'io.openim:android-sdk:latest@aar' - implementation 'io.openim:core-sdk:latest@aar' + implementation 'io.openim:android-sdk:3.8.3@aar' + implementation 'io.openim:core-sdk:3.8.3-patch15@aar' implementation 'com.google.code.gson:gson:2.9.0' } ``` diff --git a/content/docs/chat/sdk/android/getting-started/send-first-message.mdx b/content/docs/chat/sdk/android/getting-started/send-first-message.mdx index e0d5c79bea..9238fcf170 100644 --- a/content/docs/chat/sdk/android/getting-started/send-first-message.mdx +++ b/content/docs/chat/sdk/android/getting-started/send-first-message.mdx @@ -101,9 +101,8 @@ Set either `userID` or `groupID` in a single call, never both. ## Verify success -- The sender enters `onSuccess()`. +- The sender's `sendMessage()` call triggers the `onSuccess()` callback. - The receiver enters `onRecvNewMessage()` and sees the text message. -- A one-to-one message sets only the receiver's `userID`; a group message sets only `groupID`. ## Next steps diff --git a/content/zh/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx b/content/zh/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx index a0d74ec748..101796ca85 100644 --- a/content/zh/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx +++ b/content/zh/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx @@ -1,6 +1,6 @@ --- title: '认证与管理登录会话' -description: '使用 OpenIM Android SDK 初始化、登录、查询登录状态、处理连接 callback 并退出当前账号。' +description: '使用 OpenIM Android SDK 初始化、登录、查询登录状态、处理连接回调并退出当前账号。' sourcePath: '/sdk/android/getting-started/authenticate-and-manage-session' --- @@ -12,14 +12,14 @@ OpenIM Android SDK 使用 `initSDK()` 初始化本机运行环境,再使用 `l 2. 调用 `initSDK()` 并确认返回 `true`。 3. 在登录前设置消息、用户、好友、会话、群组和通话信令 listener。 4. 从可信后端取得对应的 `userID` 与 Token,然后调用 `login()`。 -5. 分别等待登录 callback 成功与 `onConnectSuccess()`,再开放依赖连接的业务操作。 +5. 分别等待登录回调成功与 `onConnectSuccess()`,再开放依赖连接的业务操作。 6. 主动退出或切换账号时调用 `logout()`,完成后清理当前账号的应用状态。 下文中的 `apiAddr`、`wsAddr`、`userID` 和 `token` 均由可信后端提供。 ## 初始化并处理连接生命周期 -在 `Application` 生命周期内创建数据目录、初始化 SDK,并传入连接 listener。应用应保存连接状态,但不要在 callback 中记录 Token 或完整服务凭据。 +在 `Application` 生命周期内创建数据目录、初始化 SDK,并传入连接 listener。应用应保存连接状态,但不要在回调中记录 Token 或完整服务凭据。 ```java import android.app.Application; @@ -47,36 +47,32 @@ config.isLogStandardOutput = false; OnConnListener connectionListener = new OnConnListener() { @Override public void onConnecting() { - sessionState.setConnectionState("connecting"); + // 连接建立中。 } @Override public void onConnectSuccess() { - sessionState.setConnectionState("connected"); - sessionState.enableConnectedOperations(); + // 连接可用后,继续执行依赖连接的操作。 } @Override public void onConnectFailed(long code, String error) { - sessionState.setConnectionState("failed"); - recordConnectionFailure(code, error); + // 根据 code 和 error 处理连接失败。 } @Override public void onKickedOffline() { - sessionState.clearCurrentAccount(); - showSignedInElsewhereScreen(); + // 清理当前账号状态并提示重新登录。 } @Override public void onUserTokenExpired() { - requestNewTokenAndRelogin(); + // 获取新 Token 后重新登录。 } @Override public void onUserTokenInvalid(String reason) { - sessionState.clearCurrentAccount(); - showSignInScreen(reason); + // 清理当前账号状态并提示重新登录。 } }; @@ -91,7 +87,7 @@ if (!initialized) { } ``` -`initSDK()` 返回 `true` 表示 SDK 本地运行环境初始化成功。`OnConnListener` 的连接 callback 在调用 `login()` 后开始反映长连接状态。 +`initSDK()` 返回 `true` 表示 SDK 本地运行环境初始化成功。`OnConnListener` 的连接回调在调用 `login()` 后开始反映长连接状态。 | 字段 | 类型 | 说明 | | --------------------- | ------------- | ---------------------------------------------------------- | @@ -100,15 +96,15 @@ if (!initialized) { | `wsAddr` | `String` | OpenIMServer WebSocket 地址。 | | `dataDirectory` | `File` | SDK 数据库和日志使用的应用私有持久化目录。 | | `config.logLevel` | `int` | 使用 `LogLevel` 常量;正式环境应主动收敛日志级别。 | -| `isLogStandardOutput` | `boolean` | 是否把 SDK Core 日志输出到标准日志流。 | +| `isLogStandardOutput` | `boolean` | 是否把 SDK 日志输出到标准日志流。 | -SDK 只应在 `Application` 或应用级会话组件中初始化一次。当前 Java wrapper 公开 `networkChanged()`,用于通知 Core 重新检查网络;只有在应用已经统一监听系统网络变化时才调用,不能由多个页面重复注册网络 callback。 +SDK 只应在 `Application` 或应用级会话组件中初始化一次。`networkChanged()` 用于通知 SDK 重新检查网络;只有在应用已经统一监听系统网络变化时才调用,不能由多个页面重复注册网络回调。 ## 在登录前设置业务 listener -SDK 的 listener 注册方法采用 set 语义,后一次设置会替换前一次设置。应由应用级事件中心创建稳定 listener,再把事件分发给页面状态层。消息 listener 的完整注册与增量合并示例见[发送第一条消息](/sdk/android/getting-started/send-first-message);用户、好友、会话、群组和通话信令 listener 采用相同的集中注册原则。 +SDK 的 listener 注册方法采用 set 语义,后一次设置会替换前一次设置。应由应用级事件中心创建稳定 listener,再把事件分发给页面状态层。各类 listener 的集中注册、覆盖行为和生命周期见[事件概览](/sdk/android/events/overview-events)。 -SDK 没有公开的 remove/unset 方法。退出或切换账号时,应用事件中心应停止向旧账号页面分发 callback,并在下次登录前用新账号对应的完整 listener 组合覆盖设置。 +SDK 没有公开的 remove/unset 方法。退出或切换账号时,应用事件中心应停止向旧账号页面分发回调,并在下次登录前用新账号对应的完整 listener 组合覆盖设置。 ## 登录当前用户 @@ -116,19 +112,17 @@ SDK 没有公开的 remove/unset 方法。退出或切换账号时,应用事 OpenIMClient.getInstance().login(new OnBase() { @Override public void onError(int code, String error) { - sessionState.setLoginState("failed"); - recordLoginFailure(code, error); + // 根据 code 和 error 处理登录失败。 } @Override public void onSuccess(String data) { - sessionState.setLoginState("logged"); - sessionState.setCurrentUserID(userID); + // 登录调用完成。 } }, userID, token); ``` -`login()` 的成功 callback 表示当前登录调用完成;`OnConnListener.onConnectSuccess()` 表示长连接可用。这两个阶段必须分别处理。不要并发调用 `login()`,也不要仅凭某一个 callback 同时推断登录与连接状态。 +`login()` 的成功回调表示当前登录调用完成;`OnConnListener.onConnectSuccess()` 表示长连接可用。这两个阶段必须分别处理。不要并发调用 `login()`,也不要仅凭某一个回调同时推断登录与连接状态。 ## 查询登录状态 @@ -137,7 +131,7 @@ int loginStatus = OpenIMClient.getInstance().getLoginStatus(); if (loginStatus == LoginStatus.Logged) { String currentUserID = OpenIMClient.getInstance().getLoginUserID(); - restoreSessionFor(currentUserID); + // currentUserID 是当前登录用户 ID。 } ``` @@ -147,13 +141,13 @@ if (loginStatus == LoginStatus.Logged) { | `LoginStatus.Logging` | 登录正在进行,不应再次发起并行登录。 | | `LoginStatus.Logged` | SDK 已登录;网络是否连接仍以 `OnConnListener` 为准。 | -`getLoginStatus()` 和 `getLoginUserID()` 返回本地 SDK 状态快照,不会触发连接 callback。切换账号时应先退出旧账号,而不是直接用新参数覆盖当前登录。 +`getLoginStatus()` 和 `getLoginUserID()` 返回本地 SDK 状态快照,不会触发连接回调。切换账号时应先退出旧账号,而不是直接用新参数覆盖当前登录。 ## 处理 Token 和强制下线 收到 `onUserTokenExpired()` 或 `onUserTokenInvalid()` 后,应重新向可信后端取得当前用户凭据,再按产品策略重新登录或返回登录页。收到 `onKickedOffline()` 时,应清理当前用户的会话列表、消息视图、未读数和其他业务状态,不能把它当作用户主动退出。 -这些 callback 没有业务实体合并键,应按当前 `OpenIMClient` 单例和登录用户隔离状态。旧账号的异步任务和页面订阅必须在新账号登录前停止。 +这些是当前登录账号级别的回调。切换账号前必须停止旧账号的异步任务和页面订阅,并清理旧账号状态。 ## 主动退出与释放 SDK @@ -161,17 +155,17 @@ if (loginStatus == LoginStatus.Logged) { OpenIMClient.getInstance().logout(new OnBase() { @Override public void onError(int code, String error) { - recordLogoutFailure(code, error); + // 根据 code 和 error 处理退出失败。 } @Override public void onSuccess(String data) { - sessionState.clearCurrentAccount(); + // 登录会话已退出。 } }); ``` -`logout()` 成功表示当前 SDK 登录会话已退出。应用状态清理应在成功 callback 后执行;切换账号时,等待旧账号退出完成后再调用新账号的 `login()`。 +`logout()` 成功表示当前 SDK 登录会话已退出。应用状态清理应在成功回调后执行;切换账号时,等待旧账号退出完成后再调用新账号的 `login()`。 应用最终不再使用 SDK 时可以调用: diff --git a/content/zh/docs/chat/sdk/android/getting-started/before-you-start.mdx b/content/zh/docs/chat/sdk/android/getting-started/before-you-start.mdx index 6a015cdf88..5d6855fa37 100644 --- a/content/zh/docs/chat/sdk/android/getting-started/before-you-start.mdx +++ b/content/zh/docs/chat/sdk/android/getting-started/before-you-start.mdx @@ -54,4 +54,4 @@ adb reverse tcp:10001 tcp:10001 ## 继续接入 -准备完成后,先完成[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。确认登录 callback 成功且 `OnConnListener.onConnectSuccess()` 已到达,再按照[发送第一条消息](/sdk/android/getting-started/send-first-message)验证消息链路。 +准备完成后,先完成[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。确认登录回调成功且 `OnConnListener.onConnectSuccess()` 已到达,再按照[发送第一条消息](/sdk/android/getting-started/send-first-message)验证消息链路。 diff --git a/content/zh/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx b/content/zh/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx index 3d27fc3bbe..84c03d92b4 100644 --- a/content/zh/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx +++ b/content/zh/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx @@ -12,8 +12,8 @@ sourcePath: '/sdk/android/getting-started/environment-specific-implementation' ```groovy dependencies { - implementation 'io.openim:android-sdk:latest@aar' - implementation 'io.openim:core-sdk:latest@aar' + implementation 'io.openim:android-sdk:3.8.3@aar' + implementation 'io.openim:core-sdk:3.8.3-patch15@aar' implementation 'com.google.code.gson:gson:2.9.0' } ``` diff --git a/content/zh/docs/chat/sdk/android/getting-started/send-first-message.mdx b/content/zh/docs/chat/sdk/android/getting-started/send-first-message.mdx index 05af8e0166..604bbe7487 100644 --- a/content/zh/docs/chat/sdk/android/getting-started/send-first-message.mdx +++ b/content/zh/docs/chat/sdk/android/getting-started/send-first-message.mdx @@ -29,7 +29,7 @@ OpenIMClient.getInstance() ## 第 2 步:确认可以发送 -两个账号登录后,发送方的登录 callback 成功且 `OnConnListener.onConnectSuccess()` 已到达,即可发送消息。接收方也应保持连接,以便收到新消息。连接尚未成功时,先等待连接恢复,不要重复调用 `login()`。 +两个账号登录后,发送方的登录回调成功且 `OnConnListener.onConnectSuccess()` 已到达,即可发送消息。接收方也应保持连接,以便收到新消息。连接尚未成功时,先等待连接恢复,不要重复调用 `login()`。 ## 第 3 步:发送文本消息 @@ -94,9 +94,8 @@ OpenIMClient.getInstance().messageManager.sendMessage( ## 验证成功 -- 发送方进入 `onSuccess()`。 +- 发送方调用 `sendMessage()` 后触发 `onSuccess()` 回调。 - 接收方进入 `onRecvNewMessage()`,并看到文本消息。 -- 单聊只填写接收方 `userID`;群聊只填写 `groupID`。 ## 下一步 diff --git a/data/structure/android-content-audit.json b/data/structure/android-content-audit.json index 5d6530ec3b..a4fc1e6672 100644 --- a/data/structure/android-content-audit.json +++ b/data/structure/android-content-audit.json @@ -1473,7 +1473,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "not-applicable", "evidence": [], @@ -1483,7 +1483,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "not-applicable", "evidence": [], @@ -1537,7 +1537,9 @@ }, "redirectTo": null, "notes": [ - "2026-08-06:逐页核对服务地址、可信 Token 来源、Android 构建版本、数据目录和 ABI 准备项。" + "2026-08-06:逐页核对服务地址、可信 Token 来源、Android 构建版本、数据目录和 ABI 准备项。", + "2026-08-19:中文正文将登录回调术语统一为“回调”。", + "2026-08-19:英文正文同步中文的回调术语与接入流程说明。" ] }, { @@ -1557,7 +1559,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -1571,7 +1573,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -1585,7 +1587,9 @@ }, "redirectTo": null, "notes": [ - "2026-08-06:逐页核对源码 module、Core AAR、Manifest、混淆、InitConfig 和应用生命周期边界;未沿用旧文档中不可验证的 latest@aar 坐标。" + "2026-08-06:逐页核对源码 module、Core AAR、Manifest、混淆、InitConfig 和应用生命周期边界;未沿用旧文档中不可验证的 latest@aar 坐标。", + "2026-08-19:根据 Maven Central 元数据将依赖固定为 android-sdk 3.8.3 与 core-sdk 3.8.3-patch15。", + "2026-08-19:英文正文同步固定的 Maven Central 依赖版本。" ] }, { @@ -1632,7 +1636,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -1646,7 +1650,13 @@ }, "redirectTo": null, "notes": [ - "2026-08-06:逐页核对初始化、登录状态、连接 callback、Token 失效、强制下线、退出与释放边界。" + "2026-08-06:逐页核对初始化、登录状态、连接回调、Token 失效、强制下线、退出与释放边界。", + "2026-08-19:中文正文将回调术语统一为“回调”。", + "2026-08-19:将账号级回调说明改为直接描述切换账号时的状态清理要求。", + "2026-08-19:将 listener 集中注册说明链接至事件概览。", + "2026-08-19:移除 Java wrapper 和 Core 等内部实现表述。", + "2026-08-19:精简快速开始示例,移除应用状态、页面和日志处理调用。", + "2026-08-19:英文正文同步精简后的回调示例、事件概览链接和账号状态说明。" ] }, { @@ -1673,7 +1683,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -1687,7 +1697,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-06", + "reviewedAt": "2026-08-19", "exampleVerification": { "status": "verified", "evidence": [ @@ -1701,7 +1711,11 @@ }, "redirectTo": null, "notes": [ - "2026-08-06:逐页核对文本消息创建、单聊与群聊目标、离线推送信息、发送 callback、接收 listener 和 clientMsgID 合并规则。" + "2026-08-06:逐页核对文本消息创建、单聊与群聊目标、离线推送信息、发送回调、接收 listener 和 clientMsgID 合并规则。", + "2026-08-19:中文正文将登录回调术语统一为“回调”。", + "2026-08-19:删除验证成功列表中与前文重复的单聊和群聊参数说明。", + "2026-08-19:明确发送验证项对应 sendMessage() 的成功回调。", + "2026-08-19:英文正文同步精简后的验证项。" ] }, { diff --git a/src/generated/android-sdk-zh-content.json b/src/generated/android-sdk-zh-content.json index 139aee3c33..c3a527c295 100644 --- a/src/generated/android-sdk-zh-content.json +++ b/src/generated/android-sdk-zh-content.json @@ -577,7 +577,7 @@ "title": "OpenIM Android SDK 概览" }, "/sdk/android/getting-started/before-you-start": { - "body": "在原生 Android 应用中接入 OpenIMClientSDK 前,需要准备可访问的 OpenIMServer、可信的用户认证流程,以及满足 SDK 构建要求的 Android 工程。这些条件同时适用于[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)和[发送第一条消息](/sdk/android/getting-started/send-first-message)。\n\n## 准备 OpenIMServer\n\n如果还没有可用的 OpenIMServer,先按 [Docker 部署指南](/docs/guides/quick-deployment/docker)完成部署,并确认 Android 真机和模拟器均可访问以下地址:\n\n| 字段 | 说明 |\n| --------- | ------------------------------------------------------ |\n| `apiAddr` | OpenIMServer HTTP API 地址,用于登录、同步和资源请求。 |\n| `wsAddr` | OpenIMServer WebSocket 地址,用于长连接和实时事件。 |\n\n不要只在开发电脑上验证地址。Android 模拟器中的 `localhost` 指向模拟器自身,不能直接访问开发电脑上的本地服务。如果 OpenIMServer 运行在开发电脑上,先将 API 和 WebSocket 端口映射到模拟器:\n\n```bash\nadb reverse tcp:10002 tcp:10002\nadb reverse tcp:10001 tcp:10001\n```\n\n映射后,模拟器中的应用可以使用 `http://127.0.0.1:10002` 作为 `apiAddr`,使用 `ws://127.0.0.1:10001` 作为 `wsAddr`。端口号应替换为开发电脑上实际监听的端口;执行命令前确认 `adb` 已连接到目标模拟器。生产环境应使用 HTTPS 与 WSS,并从真机检查 DNS、TLS 证书、防火墙、反向代理和 WebSocket 升级。\n\n## 准备用户和 Token\n\n`userID` 标识 OpenIMSDK 用户,Token 用于认证该用户。创建或绑定用户、签发 Token 和校验业务权限都应由可信后端完成。Android 应用不能保存管理员 Token、secret 或其他服务端凭据。\n\n后端接入 OpenIMServer REST API 前,可阅读[准备使用 Platform API](/platform-api/prepare-to-use-api)和[签发会话 Token](/platform-api/user/managing-session-tokens/issue-a-session-token)。业务后端完成自身账号认证后,只向客户端返回 SDK 登录所需的以下数据:\n\n| 数据 | 说明 |\n| --- | --- |\n| `userID` | 当前登录用户的 OpenIM 用户 ID。 |\n| `token` | 与该用户对应的登录 Token。 |\n| `apiAddr` | OpenIMServer HTTP API 地址。 |\n| `wsAddr` | OpenIMServer WebSocket 地址。 |\n\n`userID` 必须与 Token 对应。客户端不得接受任意用户 ID 后自行签发、拼装或交换管理员 Token。\n\n## 准备 Android 工程\n\n接入前,确认 Android 工程具备以下条件:\n\n- 应用的 `minSdk` 不低于 `21`,使用 Java 8 编译选项,并将 `compileSdk` 设置为 `36` 或更高。\n- 应用 Manifest 声明 `android.permission.INTERNET`,并允许 SDK 读取网络状态。\n- 已准备应用私有且可持久化的数据目录,例如 `Application.getFilesDir()` 下的独立子目录;不要把 SDK 数据库放在临时缓存或共享存储中。\n- 真机能够访问 `apiAddr`、`wsAddr` 以及消息媒体资源域名。\n- 发布包覆盖目标设备 ABI;接入交付包时应核对实际包含的 native ABI。\n- 产品已经定义断网恢复、前后台切换、Token 失效、账号被踢下线和多端登录的处理方式。\n\n具体依赖和 Manifest 配置见[按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation);SDK 初始化和认证流程见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。\n\n## 继续接入\n\n准备完成后,先完成[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。确认登录 callback 成功且 `OnConnListener.onConnectSuccess()` 已到达,再按照[发送第一条消息](/sdk/android/getting-started/send-first-message)验证消息链路。", + "body": "在原生 Android 应用中接入 OpenIMClientSDK 前,需要准备可访问的 OpenIMServer、可信的用户认证流程,以及满足 SDK 构建要求的 Android 工程。这些条件同时适用于[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)和[发送第一条消息](/sdk/android/getting-started/send-first-message)。\n\n## 准备 OpenIMServer\n\n如果还没有可用的 OpenIMServer,先按 [Docker 部署指南](/docs/guides/quick-deployment/docker)完成部署,并确认 Android 真机和模拟器均可访问以下地址:\n\n| 字段 | 说明 |\n| --------- | ------------------------------------------------------ |\n| `apiAddr` | OpenIMServer HTTP API 地址,用于登录、同步和资源请求。 |\n| `wsAddr` | OpenIMServer WebSocket 地址,用于长连接和实时事件。 |\n\n不要只在开发电脑上验证地址。Android 模拟器中的 `localhost` 指向模拟器自身,不能直接访问开发电脑上的本地服务。如果 OpenIMServer 运行在开发电脑上,先将 API 和 WebSocket 端口映射到模拟器:\n\n```bash\nadb reverse tcp:10002 tcp:10002\nadb reverse tcp:10001 tcp:10001\n```\n\n映射后,模拟器中的应用可以使用 `http://127.0.0.1:10002` 作为 `apiAddr`,使用 `ws://127.0.0.1:10001` 作为 `wsAddr`。端口号应替换为开发电脑上实际监听的端口;执行命令前确认 `adb` 已连接到目标模拟器。生产环境应使用 HTTPS 与 WSS,并从真机检查 DNS、TLS 证书、防火墙、反向代理和 WebSocket 升级。\n\n## 准备用户和 Token\n\n`userID` 标识 OpenIMSDK 用户,Token 用于认证该用户。创建或绑定用户、签发 Token 和校验业务权限都应由可信后端完成。Android 应用不能保存管理员 Token、secret 或其他服务端凭据。\n\n后端接入 OpenIMServer REST API 前,可阅读[准备使用 Platform API](/platform-api/prepare-to-use-api)和[签发会话 Token](/platform-api/user/managing-session-tokens/issue-a-session-token)。业务后端完成自身账号认证后,只向客户端返回 SDK 登录所需的以下数据:\n\n| 数据 | 说明 |\n| --- | --- |\n| `userID` | 当前登录用户的 OpenIM 用户 ID。 |\n| `token` | 与该用户对应的登录 Token。 |\n| `apiAddr` | OpenIMServer HTTP API 地址。 |\n| `wsAddr` | OpenIMServer WebSocket 地址。 |\n\n`userID` 必须与 Token 对应。客户端不得接受任意用户 ID 后自行签发、拼装或交换管理员 Token。\n\n## 准备 Android 工程\n\n接入前,确认 Android 工程具备以下条件:\n\n- 应用的 `minSdk` 不低于 `21`,使用 Java 8 编译选项,并将 `compileSdk` 设置为 `36` 或更高。\n- 应用 Manifest 声明 `android.permission.INTERNET`,并允许 SDK 读取网络状态。\n- 已准备应用私有且可持久化的数据目录,例如 `Application.getFilesDir()` 下的独立子目录;不要把 SDK 数据库放在临时缓存或共享存储中。\n- 真机能够访问 `apiAddr`、`wsAddr` 以及消息媒体资源域名。\n- 发布包覆盖目标设备 ABI;接入交付包时应核对实际包含的 native ABI。\n- 产品已经定义断网恢复、前后台切换、Token 失效、账号被踢下线和多端登录的处理方式。\n\n具体依赖和 Manifest 配置见[按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation);SDK 初始化和认证流程见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。\n\n## 继续接入\n\n准备完成后,先完成[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。确认登录回调成功且 `OnConnListener.onConnectSuccess()` 已到达,再按照[发送第一条消息](/sdk/android/getting-started/send-first-message)验证消息链路。", "description": "准备 OpenIMServer、用户登录信息和 Android 工程环境,再开始初始化、认证或发送消息。", "headings": [ { @@ -605,7 +605,7 @@ "title": "开始之前" }, "/sdk/android/getting-started/environment-specific-implementation": { - "body": "本页只说明 Android 工程的依赖和权限配置。SDK 初始化、连接监听和登录流程见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。\n\n## 添加 SDK 依赖\n\n在应用 module 的 `build.gradle` 中添加依赖:\n\n```groovy\ndependencies {\n implementation 'io.openim:android-sdk:latest@aar'\n implementation 'io.openim:core-sdk:latest@aar'\n implementation 'com.google.code.gson:gson:2.9.0'\n}\n```\n\n## 配置 Manifest\n\n应用需要网络访问权限:\n\n```xml\n\n\n```\n\n## 下一步\n\n- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)\n- [发送第一条消息](/sdk/android/getting-started/send-first-message)", + "body": "本页只说明 Android 工程的依赖和权限配置。SDK 初始化、连接监听和登录流程见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。\n\n## 添加 SDK 依赖\n\n在应用 module 的 `build.gradle` 中添加依赖:\n\n```groovy\ndependencies {\n implementation 'io.openim:android-sdk:3.8.3@aar'\n implementation 'io.openim:core-sdk:3.8.3-patch15@aar'\n implementation 'com.google.code.gson:gson:2.9.0'\n}\n```\n\n## 配置 Manifest\n\n应用需要网络访问权限:\n\n```xml\n\n\n```\n\n## 下一步\n\n- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)\n- [发送第一条消息](/sdk/android/getting-started/send-first-message)", "description": "在 Android 工程中添加 OpenIM Android SDK 依赖并配置网络权限。", "headings": [ { @@ -628,8 +628,8 @@ "title": "按 Android 环境接入" }, "/sdk/android/getting-started/authenticate-and-manage-session": { - "body": "OpenIM Android SDK 使用 `initSDK()` 初始化本机运行环境,再使用 `login()` 建立当前用户的登录会话。开始认证前,应先完成[开始之前](/sdk/android/getting-started/before-you-start)列出的服务、用户和 Token 准备,并按[按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation)添加依赖和权限。\n\n完整流程如下:\n\n1. 在应用级会话组件中创建稳定的 `OnConnListener`。\n2. 调用 `initSDK()` 并确认返回 `true`。\n3. 在登录前设置消息、用户、好友、会话、群组和通话信令 listener。\n4. 从可信后端取得对应的 `userID` 与 Token,然后调用 `login()`。\n5. 分别等待登录 callback 成功与 `onConnectSuccess()`,再开放依赖连接的业务操作。\n6. 主动退出或切换账号时调用 `logout()`,完成后清理当前账号的应用状态。\n\n下文中的 `apiAddr`、`wsAddr`、`userID` 和 `token` 均由可信后端提供。\n\n## 初始化并处理连接生命周期\n\n在 `Application` 生命周期内创建数据目录、初始化 SDK,并传入连接 listener。应用应保存连接状态,但不要在 callback 中记录 Token 或完整服务凭据。\n\n```java\nimport android.app.Application;\n\nimport java.io.File;\n\nimport io.openim.android.sdk.OpenIMClient;\nimport io.openim.android.sdk.enums.LogLevel;\nimport io.openim.android.sdk.listener.OnConnListener;\nimport io.openim.android.sdk.models.InitConfig;\n\nFile dataDirectory = new File(application.getFilesDir(), \"openim\");\nif (!dataDirectory.exists() && !dataDirectory.mkdirs()) {\n throw new IllegalStateException(\"Cannot create the OpenIM data directory.\");\n}\n\nInitConfig config = new InitConfig(\n apiAddr,\n wsAddr,\n dataDirectory.getAbsolutePath()\n);\nconfig.logLevel = LogLevel.Info;\nconfig.isLogStandardOutput = false;\n\nOnConnListener connectionListener = new OnConnListener() {\n @Override\n public void onConnecting() {\n sessionState.setConnectionState(\"connecting\");\n }\n\n @Override\n public void onConnectSuccess() {\n sessionState.setConnectionState(\"connected\");\n sessionState.enableConnectedOperations();\n }\n\n @Override\n public void onConnectFailed(long code, String error) {\n sessionState.setConnectionState(\"failed\");\n recordConnectionFailure(code, error);\n }\n\n @Override\n public void onKickedOffline() {\n sessionState.clearCurrentAccount();\n showSignedInElsewhereScreen();\n }\n\n @Override\n public void onUserTokenExpired() {\n requestNewTokenAndRelogin();\n }\n\n @Override\n public void onUserTokenInvalid(String reason) {\n sessionState.clearCurrentAccount();\n showSignInScreen(reason);\n }\n};\n\nboolean initialized = OpenIMClient.getInstance().initSDK(\n application,\n config,\n connectionListener\n);\n\nif (!initialized) {\n throw new IllegalStateException(\"OpenIMClientSDK initialization failed.\");\n}\n```\n\n`initSDK()` 返回 `true` 表示 SDK 本地运行环境初始化成功。`OnConnListener` 的连接 callback 在调用 `login()` 后开始反映长连接状态。\n\n| 字段 | 类型 | 说明 |\n| --------------------- | ------------- | ---------------------------------------------------------- |\n| `application` | `Application` | 应用级 Context,用于持有 SDK 生命周期。 |\n| `apiAddr` | `String` | OpenIMServer HTTP API 地址。 |\n| `wsAddr` | `String` | OpenIMServer WebSocket 地址。 |\n| `dataDirectory` | `File` | SDK 数据库和日志使用的应用私有持久化目录。 |\n| `config.logLevel` | `int` | 使用 `LogLevel` 常量;正式环境应主动收敛日志级别。 |\n| `isLogStandardOutput` | `boolean` | 是否把 SDK Core 日志输出到标准日志流。 |\n\nSDK 只应在 `Application` 或应用级会话组件中初始化一次。当前 Java wrapper 公开 `networkChanged()`,用于通知 Core 重新检查网络;只有在应用已经统一监听系统网络变化时才调用,不能由多个页面重复注册网络 callback。\n\n## 在登录前设置业务 listener\n\nSDK 的 listener 注册方法采用 set 语义,后一次设置会替换前一次设置。应由应用级事件中心创建稳定 listener,再把事件分发给页面状态层。消息 listener 的完整注册与增量合并示例见[发送第一条消息](/sdk/android/getting-started/send-first-message);用户、好友、会话、群组和通话信令 listener 采用相同的集中注册原则。\n\nSDK 没有公开的 remove/unset 方法。退出或切换账号时,应用事件中心应停止向旧账号页面分发 callback,并在下次登录前用新账号对应的完整 listener 组合覆盖设置。\n\n## 登录当前用户\n\n```java\nOpenIMClient.getInstance().login(new OnBase() {\n @Override\n public void onError(int code, String error) {\n sessionState.setLoginState(\"failed\");\n recordLoginFailure(code, error);\n }\n\n @Override\n public void onSuccess(String data) {\n sessionState.setLoginState(\"logged\");\n sessionState.setCurrentUserID(userID);\n }\n}, userID, token);\n```\n\n`login()` 的成功 callback 表示当前登录调用完成;`OnConnListener.onConnectSuccess()` 表示长连接可用。这两个阶段必须分别处理。不要并发调用 `login()`,也不要仅凭某一个 callback 同时推断登录与连接状态。\n\n## 查询登录状态\n\n```java\nint loginStatus = OpenIMClient.getInstance().getLoginStatus();\n\nif (loginStatus == LoginStatus.Logged) {\n String currentUserID = OpenIMClient.getInstance().getLoginUserID();\n restoreSessionFor(currentUserID);\n}\n```\n\n| 状态 | 说明 |\n| --------------------- | ---------------------------------------------------- |\n| `LoginStatus.Logout` | SDK 当前未登录。 |\n| `LoginStatus.Logging` | 登录正在进行,不应再次发起并行登录。 |\n| `LoginStatus.Logged` | SDK 已登录;网络是否连接仍以 `OnConnListener` 为准。 |\n\n`getLoginStatus()` 和 `getLoginUserID()` 返回本地 SDK 状态快照,不会触发连接 callback。切换账号时应先退出旧账号,而不是直接用新参数覆盖当前登录。\n\n## 处理 Token 和强制下线\n\n收到 `onUserTokenExpired()` 或 `onUserTokenInvalid()` 后,应重新向可信后端取得当前用户凭据,再按产品策略重新登录或返回登录页。收到 `onKickedOffline()` 时,应清理当前用户的会话列表、消息视图、未读数和其他业务状态,不能把它当作用户主动退出。\n\n这些 callback 没有业务实体合并键,应按当前 `OpenIMClient` 单例和登录用户隔离状态。旧账号的异步任务和页面订阅必须在新账号登录前停止。\n\n## 主动退出与释放 SDK\n\n```java\nOpenIMClient.getInstance().logout(new OnBase() {\n @Override\n public void onError(int code, String error) {\n recordLogoutFailure(code, error);\n }\n\n @Override\n public void onSuccess(String data) {\n sessionState.clearCurrentAccount();\n }\n});\n```\n\n`logout()` 成功表示当前 SDK 登录会话已退出。应用状态清理应在成功 callback 后执行;切换账号时,等待旧账号退出完成后再调用新账号的 `login()`。\n\n应用最终不再使用 SDK 时可以调用:\n\n```java\nOpenIMClient.getInstance().unInit();\n```\n\n`unInit()` 用于释放 SDK 运行环境,不是 `logout()` 的替代品,也不应在普通页面销毁时调用。\n\n## 下一步\n\n- [开始之前](/sdk/android/getting-started/before-you-start)\n- [按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation)\n- [发送第一条消息](/sdk/android/getting-started/send-first-message)", - "description": "使用 OpenIM Android SDK 初始化、登录、查询登录状态、处理连接 callback 并退出当前账号。", + "body": "OpenIM Android SDK 使用 `initSDK()` 初始化本机运行环境,再使用 `login()` 建立当前用户的登录会话。开始认证前,应先完成[开始之前](/sdk/android/getting-started/before-you-start)列出的服务、用户和 Token 准备,并按[按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation)添加依赖和权限。\n\n完整流程如下:\n\n1. 在应用级会话组件中创建稳定的 `OnConnListener`。\n2. 调用 `initSDK()` 并确认返回 `true`。\n3. 在登录前设置消息、用户、好友、会话、群组和通话信令 listener。\n4. 从可信后端取得对应的 `userID` 与 Token,然后调用 `login()`。\n5. 分别等待登录回调成功与 `onConnectSuccess()`,再开放依赖连接的业务操作。\n6. 主动退出或切换账号时调用 `logout()`,完成后清理当前账号的应用状态。\n\n下文中的 `apiAddr`、`wsAddr`、`userID` 和 `token` 均由可信后端提供。\n\n## 初始化并处理连接生命周期\n\n在 `Application` 生命周期内创建数据目录、初始化 SDK,并传入连接 listener。应用应保存连接状态,但不要在回调中记录 Token 或完整服务凭据。\n\n```java\nimport android.app.Application;\n\nimport java.io.File;\n\nimport io.openim.android.sdk.OpenIMClient;\nimport io.openim.android.sdk.enums.LogLevel;\nimport io.openim.android.sdk.listener.OnConnListener;\nimport io.openim.android.sdk.models.InitConfig;\n\nFile dataDirectory = new File(application.getFilesDir(), \"openim\");\nif (!dataDirectory.exists() && !dataDirectory.mkdirs()) {\n throw new IllegalStateException(\"Cannot create the OpenIM data directory.\");\n}\n\nInitConfig config = new InitConfig(\n apiAddr,\n wsAddr,\n dataDirectory.getAbsolutePath()\n);\nconfig.logLevel = LogLevel.Info;\nconfig.isLogStandardOutput = false;\n\nOnConnListener connectionListener = new OnConnListener() {\n @Override\n public void onConnecting() {\n // 连接建立中。\n }\n\n @Override\n public void onConnectSuccess() {\n // 连接可用后,继续执行依赖连接的操作。\n }\n\n @Override\n public void onConnectFailed(long code, String error) {\n // 根据 code 和 error 处理连接失败。\n }\n\n @Override\n public void onKickedOffline() {\n // 清理当前账号状态并提示重新登录。\n }\n\n @Override\n public void onUserTokenExpired() {\n // 获取新 Token 后重新登录。\n }\n\n @Override\n public void onUserTokenInvalid(String reason) {\n // 清理当前账号状态并提示重新登录。\n }\n};\n\nboolean initialized = OpenIMClient.getInstance().initSDK(\n application,\n config,\n connectionListener\n);\n\nif (!initialized) {\n throw new IllegalStateException(\"OpenIMClientSDK initialization failed.\");\n}\n```\n\n`initSDK()` 返回 `true` 表示 SDK 本地运行环境初始化成功。`OnConnListener` 的连接回调在调用 `login()` 后开始反映长连接状态。\n\n| 字段 | 类型 | 说明 |\n| --------------------- | ------------- | ---------------------------------------------------------- |\n| `application` | `Application` | 应用级 Context,用于持有 SDK 生命周期。 |\n| `apiAddr` | `String` | OpenIMServer HTTP API 地址。 |\n| `wsAddr` | `String` | OpenIMServer WebSocket 地址。 |\n| `dataDirectory` | `File` | SDK 数据库和日志使用的应用私有持久化目录。 |\n| `config.logLevel` | `int` | 使用 `LogLevel` 常量;正式环境应主动收敛日志级别。 |\n| `isLogStandardOutput` | `boolean` | 是否把 SDK 日志输出到标准日志流。 |\n\nSDK 只应在 `Application` 或应用级会话组件中初始化一次。`networkChanged()` 用于通知 SDK 重新检查网络;只有在应用已经统一监听系统网络变化时才调用,不能由多个页面重复注册网络回调。\n\n## 在登录前设置业务 listener\n\nSDK 的 listener 注册方法采用 set 语义,后一次设置会替换前一次设置。应由应用级事件中心创建稳定 listener,再把事件分发给页面状态层。各类 listener 的集中注册、覆盖行为和生命周期见[事件概览](/sdk/android/events/overview-events)。\n\nSDK 没有公开的 remove/unset 方法。退出或切换账号时,应用事件中心应停止向旧账号页面分发回调,并在下次登录前用新账号对应的完整 listener 组合覆盖设置。\n\n## 登录当前用户\n\n```java\nOpenIMClient.getInstance().login(new OnBase() {\n @Override\n public void onError(int code, String error) {\n // 根据 code 和 error 处理登录失败。\n }\n\n @Override\n public void onSuccess(String data) {\n // 登录调用完成。\n }\n}, userID, token);\n```\n\n`login()` 的成功回调表示当前登录调用完成;`OnConnListener.onConnectSuccess()` 表示长连接可用。这两个阶段必须分别处理。不要并发调用 `login()`,也不要仅凭某一个回调同时推断登录与连接状态。\n\n## 查询登录状态\n\n```java\nint loginStatus = OpenIMClient.getInstance().getLoginStatus();\n\nif (loginStatus == LoginStatus.Logged) {\n String currentUserID = OpenIMClient.getInstance().getLoginUserID();\n // currentUserID 是当前登录用户 ID。\n}\n```\n\n| 状态 | 说明 |\n| --------------------- | ---------------------------------------------------- |\n| `LoginStatus.Logout` | SDK 当前未登录。 |\n| `LoginStatus.Logging` | 登录正在进行,不应再次发起并行登录。 |\n| `LoginStatus.Logged` | SDK 已登录;网络是否连接仍以 `OnConnListener` 为准。 |\n\n`getLoginStatus()` 和 `getLoginUserID()` 返回本地 SDK 状态快照,不会触发连接回调。切换账号时应先退出旧账号,而不是直接用新参数覆盖当前登录。\n\n## 处理 Token 和强制下线\n\n收到 `onUserTokenExpired()` 或 `onUserTokenInvalid()` 后,应重新向可信后端取得当前用户凭据,再按产品策略重新登录或返回登录页。收到 `onKickedOffline()` 时,应清理当前用户的会话列表、消息视图、未读数和其他业务状态,不能把它当作用户主动退出。\n\n这些是当前登录账号级别的回调。切换账号前必须停止旧账号的异步任务和页面订阅,并清理旧账号状态。\n\n## 主动退出与释放 SDK\n\n```java\nOpenIMClient.getInstance().logout(new OnBase() {\n @Override\n public void onError(int code, String error) {\n // 根据 code 和 error 处理退出失败。\n }\n\n @Override\n public void onSuccess(String data) {\n // 登录会话已退出。\n }\n});\n```\n\n`logout()` 成功表示当前 SDK 登录会话已退出。应用状态清理应在成功回调后执行;切换账号时,等待旧账号退出完成后再调用新账号的 `login()`。\n\n应用最终不再使用 SDK 时可以调用:\n\n```java\nOpenIMClient.getInstance().unInit();\n```\n\n`unInit()` 用于释放 SDK 运行环境,不是 `logout()` 的替代品,也不应在普通页面销毁时调用。\n\n## 下一步\n\n- [开始之前](/sdk/android/getting-started/before-you-start)\n- [按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation)\n- [发送第一条消息](/sdk/android/getting-started/send-first-message)", + "description": "使用 OpenIM Android SDK 初始化、登录、查询登录状态、处理连接回调并退出当前账号。", "headings": [ { "depth": 2, @@ -671,7 +671,7 @@ "title": "认证与管理登录会话" }, "/sdk/android/getting-started/send-first-message": { - "body": "本页用一条单聊文本消息验证 OpenIM 已接入成功。开始前,先按[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)完成 SDK 初始化和登录。\n\n## 开始前准备\n\n- 为发送方和接收方各准备一个测试账号。\n- 两个账号都需要按[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)完成 SDK 初始化;接收方需要在登录前设置下面的消息 listener。\n- 将示例中的 `user_b` 替换为接收方的真实 `userID`。\n\n## 第 1 步:让接收方监听新消息\n\n接收方在登录前设置消息 listener。收到消息后,将它加入页面消息列表或刷新界面即可。\n\n```java\nOpenIMClient.getInstance()\n .messageManager\n .setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override\n public void onRecvNewMessage(Message message) {\n // 将 message 显示在聊天界面中。\n }\n });\n```\n\n## 第 2 步:确认可以发送\n\n两个账号登录后,发送方的登录 callback 成功且 `OnConnListener.onConnectSuccess()` 已到达,即可发送消息。接收方也应保持连接,以便收到新消息。连接尚未成功时,先等待连接恢复,不要重复调用 `login()`。\n\n## 第 3 步:发送文本消息\n\n### 发送单聊文本消息\n\n先创建消息,再发送它。第三个目标参数填写接收方 `userID`,群组目标参数保持空字符串。\n\n```java\nMessage message = OpenIMClient.getInstance()\n .messageManager\n .createTextMessage(\"你好,OpenIMSDK\");\n\nOnMsgSendCallback sendCallback = new OnMsgSendCallback() {\n @Override\n public void onProgress(long progress) {\n // 文本消息通常不需要处理进度。\n }\n\n @Override\n public void onError(int code, String error) {\n // 提示发送失败,并允许用户重试。\n }\n\n @Override\n public void onSuccess(Message sentMessage) {\n // 将 sentMessage 更新到发送方的聊天界面。\n }\n};\n\nOpenIMClient.getInstance().messageManager.sendMessage(\n sendCallback,\n message,\n \"user_b\",\n \"\",\n new OfflinePushInfo()\n);\n```\n\n`OfflinePushInfo` 用于配置离线推送内容。首次验证时可以传入空对象,后续再按产品需要设置标题、摘要和扩展数据。\n\n`onSuccess()` 表示发送方已成功发送消息;接收方的 `onRecvNewMessage()` 表示另一端已收到消息。这两个回调都会到达,才说明这次单聊验证完成。\n\n### 发送群聊文本消息\n\n发送群消息时,将接收方 `userID` 改为空字符串,并填写群组的 `groupID`:\n\n```java\nMessage groupMessage = OpenIMClient.getInstance()\n .messageManager\n .createTextMessage(\"大家好,OpenIMSDK\");\n\nOpenIMClient.getInstance().messageManager.sendMessage(\n sendCallback,\n groupMessage,\n \"\",\n \"group_123\",\n new OfflinePushInfo()\n);\n```\n\n一次调用只能填写 `userID` 或 `groupID` 其中之一。\n\n## 验证成功\n\n- 发送方进入 `onSuccess()`。\n- 接收方进入 `onRecvNewMessage()`,并看到文本消息。\n- 单聊只填写接收方 `userID`;群聊只填写 `groupID`。\n\n## 下一步\n\n- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)\n- [OpenIM Android SDK 概览](/sdk/android/overview)", + "body": "本页用一条单聊文本消息验证 OpenIM 已接入成功。开始前,先按[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)完成 SDK 初始化和登录。\n\n## 开始前准备\n\n- 为发送方和接收方各准备一个测试账号。\n- 两个账号都需要按[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)完成 SDK 初始化;接收方需要在登录前设置下面的消息 listener。\n- 将示例中的 `user_b` 替换为接收方的真实 `userID`。\n\n## 第 1 步:让接收方监听新消息\n\n接收方在登录前设置消息 listener。收到消息后,将它加入页面消息列表或刷新界面即可。\n\n```java\nOpenIMClient.getInstance()\n .messageManager\n .setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override\n public void onRecvNewMessage(Message message) {\n // 将 message 显示在聊天界面中。\n }\n });\n```\n\n## 第 2 步:确认可以发送\n\n两个账号登录后,发送方的登录回调成功且 `OnConnListener.onConnectSuccess()` 已到达,即可发送消息。接收方也应保持连接,以便收到新消息。连接尚未成功时,先等待连接恢复,不要重复调用 `login()`。\n\n## 第 3 步:发送文本消息\n\n### 发送单聊文本消息\n\n先创建消息,再发送它。第三个目标参数填写接收方 `userID`,群组目标参数保持空字符串。\n\n```java\nMessage message = OpenIMClient.getInstance()\n .messageManager\n .createTextMessage(\"你好,OpenIMSDK\");\n\nOnMsgSendCallback sendCallback = new OnMsgSendCallback() {\n @Override\n public void onProgress(long progress) {\n // 文本消息通常不需要处理进度。\n }\n\n @Override\n public void onError(int code, String error) {\n // 提示发送失败,并允许用户重试。\n }\n\n @Override\n public void onSuccess(Message sentMessage) {\n // 将 sentMessage 更新到发送方的聊天界面。\n }\n};\n\nOpenIMClient.getInstance().messageManager.sendMessage(\n sendCallback,\n message,\n \"user_b\",\n \"\",\n new OfflinePushInfo()\n);\n```\n\n`OfflinePushInfo` 用于配置离线推送内容。首次验证时可以传入空对象,后续再按产品需要设置标题、摘要和扩展数据。\n\n`onSuccess()` 表示发送方已成功发送消息;接收方的 `onRecvNewMessage()` 表示另一端已收到消息。这两个回调都会到达,才说明这次单聊验证完成。\n\n### 发送群聊文本消息\n\n发送群消息时,将接收方 `userID` 改为空字符串,并填写群组的 `groupID`:\n\n```java\nMessage groupMessage = OpenIMClient.getInstance()\n .messageManager\n .createTextMessage(\"大家好,OpenIMSDK\");\n\nOpenIMClient.getInstance().messageManager.sendMessage(\n sendCallback,\n groupMessage,\n \"\",\n \"group_123\",\n new OfflinePushInfo()\n);\n```\n\n一次调用只能填写 `userID` 或 `groupID` 其中之一。\n\n## 验证成功\n\n- 发送方调用 `sendMessage()` 后触发 `onSuccess()` 回调。\n- 接收方进入 `onRecvNewMessage()`,并看到文本消息。\n\n## 下一步\n\n- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)\n- [OpenIM Android SDK 概览](/sdk/android/overview)", "description": "在 Android 应用中发送并验证第一条单聊文本消息。", "headings": [ { diff --git a/src/generated/search-index-zh.json b/src/generated/search-index-zh.json index f7ac63762e..26c84bd8c2 100644 --- a/src/generated/search-index-zh.json +++ b/src/generated/search-index-zh.json @@ -1909,7 +1909,7 @@ "description": "准备 OpenIMServer、用户登录信息和 Android 工程环境,再开始初始化、认证或发送消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android getting-started before-you-start", - "content": "在原生 Android 应用中接入 OpenIMClientSDK 前,需要准备可访问的 OpenIMServer、可信的用户认证流程,以及满足 SDK 构建要求的 Android 工程。这些条件同时适用于 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 和 发送第一条消息 /sdk/android/getting started/send first message 。 准备 OpenIMServer 如果还没有可用的 OpenIMServer,先按 Docker 部署指南 /docs/guides/quick deployment/docker 完成部署,并确认 Android 真机和模拟器均可访问以下地址: | 字段 | 说明 | | | | | apiAddr | OpenIMServer HTTP API 地址,用于登录、同步和资源请求。 | | wsAddr | OpenIMServer WebSocket 地址,用于长连接和实时事件。 | 不要只在开发电脑上验证地址。Android 模拟器中的 localhost 指向模拟器自身,不能直接访问开发电脑上的本地服务。如果 OpenIMServer 运行在开发电脑上,先将 API 和 WebSocket 端口映射到模拟器: adb reverse tcp:10002 tcp:10002 adb reverse tcp:10001 tcp:10001 映射后,模拟器中的应用可以使用 http://127.0.0.1:10002 作为 apiAddr ,使用 ws://127.0.0.1:10001 作为 wsAddr 。端口号应替换为开发电脑上实际监听的端口;执行命令前确认 adb 已连接到目标模拟器。生产环境应使用 HTTPS 与 WSS,并从真机检查 DNS、TLS 证书、防火墙、反向代理和 WebSocket 升级。 准备用户和 Token userID 标识 OpenIMSDK 用户,Token 用于认证该用户。创建或绑定用户、签发 Token 和校验业务权限都应由可信后端完成。Android 应用不能保存管理员 Token、secret 或其他服务端凭据。 后端接入 OpenIMServer REST API 前,可阅读 准备使用 Platform API /platform api/prepare to use api 和 签发会话 Token /platform api/user/managing session tokens/issue a session token 。业务后端完成自身账号认证后,只向客户端返回 SDK 登录所需的以下数据: | 数据 | 说明 | | | | | userID | 当前登录用户的 OpenIM 用户 ID。 | | token | 与该用户对应的登录 Token。 | | apiAddr | OpenIMServer HTTP API 地址。 | | wsAddr | OpenIMServer WebSocket 地址。 | userID 必须与 Token 对应。客户端不得接受任意用户 ID 后自行签发、拼装或交换管理员 Token。 准备 Android 工程 接入前,确认 Android 工程具备以下条件: 应用的 minSdk 不低于 21 ,使用 Java 8 编译选项,并将 compileSdk 设置为 36 或更高。 应用 Manifest 声明 android.permission.INTERNET ,并允许 SDK 读取网络状态。 已准备应用私有且可持久化的数据目录,例如 Application.getFilesDir 下的独立子目录;不要把 SDK 数据库放在临时缓存或共享存储中。 真机能够访问 apiAddr 、 wsAddr 以及消息媒体资源域名。 发布包覆盖目标设备 ABI;接入交付包时应核对实际包含的 native ABI。 产品已经定义断网恢复、前后台切换、Token 失效、账号被踢下线和多端登录的处理方式。 具体依赖和 Manifest 配置见 按 Android 环境接入 /sdk/android/getting started/environment specific implementation ;SDK 初始化和认证流程见 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。 继续接入 准备完成后,先完成 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。确认登录 callback 成功且 OnConnListener.onConnectSuccess 已到达,再按照 发送第一条消息 /sdk/android/getting started/send first message 验证消息链路。" + "content": "在原生 Android 应用中接入 OpenIMClientSDK 前,需要准备可访问的 OpenIMServer、可信的用户认证流程,以及满足 SDK 构建要求的 Android 工程。这些条件同时适用于 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 和 发送第一条消息 /sdk/android/getting started/send first message 。 准备 OpenIMServer 如果还没有可用的 OpenIMServer,先按 Docker 部署指南 /docs/guides/quick deployment/docker 完成部署,并确认 Android 真机和模拟器均可访问以下地址: | 字段 | 说明 | | | | | apiAddr | OpenIMServer HTTP API 地址,用于登录、同步和资源请求。 | | wsAddr | OpenIMServer WebSocket 地址,用于长连接和实时事件。 | 不要只在开发电脑上验证地址。Android 模拟器中的 localhost 指向模拟器自身,不能直接访问开发电脑上的本地服务。如果 OpenIMServer 运行在开发电脑上,先将 API 和 WebSocket 端口映射到模拟器: adb reverse tcp:10002 tcp:10002 adb reverse tcp:10001 tcp:10001 映射后,模拟器中的应用可以使用 http://127.0.0.1:10002 作为 apiAddr ,使用 ws://127.0.0.1:10001 作为 wsAddr 。端口号应替换为开发电脑上实际监听的端口;执行命令前确认 adb 已连接到目标模拟器。生产环境应使用 HTTPS 与 WSS,并从真机检查 DNS、TLS 证书、防火墙、反向代理和 WebSocket 升级。 准备用户和 Token userID 标识 OpenIMSDK 用户,Token 用于认证该用户。创建或绑定用户、签发 Token 和校验业务权限都应由可信后端完成。Android 应用不能保存管理员 Token、secret 或其他服务端凭据。 后端接入 OpenIMServer REST API 前,可阅读 准备使用 Platform API /platform api/prepare to use api 和 签发会话 Token /platform api/user/managing session tokens/issue a session token 。业务后端完成自身账号认证后,只向客户端返回 SDK 登录所需的以下数据: | 数据 | 说明 | | | | | userID | 当前登录用户的 OpenIM 用户 ID。 | | token | 与该用户对应的登录 Token。 | | apiAddr | OpenIMServer HTTP API 地址。 | | wsAddr | OpenIMServer WebSocket 地址。 | userID 必须与 Token 对应。客户端不得接受任意用户 ID 后自行签发、拼装或交换管理员 Token。 准备 Android 工程 接入前,确认 Android 工程具备以下条件: 应用的 minSdk 不低于 21 ,使用 Java 8 编译选项,并将 compileSdk 设置为 36 或更高。 应用 Manifest 声明 android.permission.INTERNET ,并允许 SDK 读取网络状态。 已准备应用私有且可持久化的数据目录,例如 Application.getFilesDir 下的独立子目录;不要把 SDK 数据库放在临时缓存或共享存储中。 真机能够访问 apiAddr 、 wsAddr 以及消息媒体资源域名。 发布包覆盖目标设备 ABI;接入交付包时应核对实际包含的 native ABI。 产品已经定义断网恢复、前后台切换、Token 失效、账号被踢下线和多端登录的处理方式。 具体依赖和 Manifest 配置见 按 Android 环境接入 /sdk/android/getting started/environment specific implementation ;SDK 初始化和认证流程见 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。 继续接入 准备完成后,先完成 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。确认登录回调成功且 OnConnListener.onConnectSuccess 已到达,再按照 发送第一条消息 /sdk/android/getting started/send first message 验证消息链路。" }, { "path": "/sdk/android/getting-started/environment-specific-implementation", @@ -1917,15 +1917,15 @@ "description": "在 Android 工程中添加 OpenIM Android SDK 依赖并配置网络权限。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android getting-started environment-specific-implementation", - "content": "本页只说明 Android 工程的依赖和权限配置。SDK 初始化、连接监听和登录流程见 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。 添加 SDK 依赖 在应用 module 的 build.gradle 中添加依赖: dependencies implementation 'io.openim:android sdk:latest@aar' implementation 'io.openim:core sdk:latest@aar' implementation 'com.google.code.gson:gson:2.9.0' 配置 Manifest 应用需要网络访问权限: 下一步 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 发送第一条消息 /sdk/android/getting started/send first message" + "content": "本页只说明 Android 工程的依赖和权限配置。SDK 初始化、连接监听和登录流程见 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 。 添加 SDK 依赖 在应用 module 的 build.gradle 中添加依赖: dependencies implementation 'io.openim:android sdk:3.8.3@aar' implementation 'io.openim:core sdk:3.8.3 patch15@aar' implementation 'com.google.code.gson:gson:2.9.0' 配置 Manifest 应用需要网络访问权限: 下一步 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 发送第一条消息 /sdk/android/getting started/send first message" }, { "path": "/sdk/android/getting-started/authenticate-and-manage-session", "title": "认证与管理登录会话", - "description": "使用 OpenIM Android SDK 初始化、登录、查询登录状态、处理连接 callback 并退出当前账号。", + "description": "使用 OpenIM Android SDK 初始化、登录、查询登录状态、处理连接回调并退出当前账号。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android getting-started authenticate-and-manage-session", - "content": "OpenIM Android SDK 使用 initSDK 初始化本机运行环境,再使用 login 建立当前用户的登录会话。开始认证前,应先完成 开始之前 /sdk/android/getting started/before you start 列出的服务、用户和 Token 准备,并按 按 Android 环境接入 /sdk/android/getting started/environment specific implementation 添加依赖和权限。 完整流程如下: 1. 在应用级会话组件中创建稳定的 OnConnListener 。 2. 调用 initSDK 并确认返回 true 。 3. 在登录前设置消息、用户、好友、会话、群组和通话信令 listener。 4. 从可信后端取得对应的 userID 与 Token,然后调用 login 。 5. 分别等待登录 callback 成功与 onConnectSuccess ,再开放依赖连接的业务操作。 6. 主动退出或切换账号时调用 logout ,完成后清理当前账号的应用状态。 下文中的 apiAddr 、 wsAddr 、 userID 和 token 均由可信后端提供。 初始化并处理连接生命周期 在 Application 生命周期内创建数据目录、初始化 SDK,并传入连接 listener。应用应保存连接状态,但不要在 callback 中记录 Token 或完整服务凭据。 import android.app.Application; import java.io.File; import io.openim.android.sdk.OpenIMClient; import io.openim.android.sdk.enums.LogLevel; import io.openim.android.sdk.listener.OnConnListener; import io.openim.android.sdk.models.InitConfig; File dataDirectory = new File application.getFilesDir , \"openim\" ; if dataDirectory.exists && dataDirectory.mkdirs throw new IllegalStateException \"Cannot create the OpenIM data directory.\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = LogLevel.Info; config.isLogStandardOutput = false; OnConnListener connectionListener = new OnConnListener @Override public void onConnecting sessionState.setConnectionState \"connecting\" ; @Override public void onConnectSuccess sessionState.setConnectionState \"connected\" ; sessionState.enableConnectedOperations ; @Override public void onConnectFailed long code, String error sessionState.setConnectionState \"failed\" ; recordConnectionFailure code, error ; @Override public void onKickedOffline sessionState.clearCurrentAccount ; showSignedInElsewhereScreen ; @Override public void onUserTokenExpired requestNewTokenAndRelogin ; @Override public void onUserTokenInvalid String reason sessionState.clearCurrentAccount ; showSignInScreen reason ; ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; if initialized throw new IllegalStateException \"OpenIMClientSDK initialization failed.\" ; initSDK 返回 true 表示 SDK 本地运行环境初始化成功。 OnConnListener 的连接 callback 在调用 login 后开始反映长连接状态。 | 字段 | 类型 | 说明 | | | | | | application | Application | 应用级 Context,用于持有 SDK 生命周期。 | | apiAddr | String | OpenIMServer HTTP API 地址。 | | wsAddr | String | OpenIMServer WebSocket 地址。 | | dataDirectory | File | SDK 数据库和日志使用的应用私有持久化目录。 | | config.logLevel | int | 使用 LogLevel 常量;正式环境应主动收敛日志级别。 | | isLogStandardOutput | boolean | 是否把 SDK Core 日志输出到标准日志流。 | SDK 只应在 Application 或应用级会话组件中初始化一次。当前 Java wrapper 公开 networkChanged ,用于通知 Core 重新检查网络;只有在应用已经统一监听系统网络变化时才调用,不能由多个页面重复注册网络 callback。 在登录前设置业务 listener SDK 的 listener 注册方法采用 set 语义,后一次设置会替换前一次设置。应由应用级事件中心创建稳定 listener,再把事件分发给页面状态层。消息 listener 的完整注册与增量合并示例见 发送第一条消息 /sdk/android/getting started/send first message ;用户、好友、会话、群组和通话信令 listener 采用相同的集中注册原则。 SDK 没有公开的 remove/unset 方法。退出或切换账号时,应用事件中心应停止向旧账号页面分发 callback,并在下次登录前用新账号对应的完整 listener 组合覆盖设置。 登录当前用户 OpenIMClient.getInstance .login new OnBase @Override public void onError int code, String error sessionState.setLoginState \"failed\" ; recordLoginFailure code, error ; @Override public void onSuccess String data sessionState.setLoginState \"logged\" ; sessionState.setCurrentUserID userID ; , userID, token ; login 的成功 callback 表示当前登录调用完成; OnConnListener.onConnectSuccess 表示长连接可用。这两个阶段必须分别处理。不要并发调用 login ,也不要仅凭某一个 callback 同时推断登录与连接状态。 查询登录状态 int loginStatus = OpenIMClient.getInstance .getLoginStatus ; if loginStatus == LoginStatus.Logged String currentUserID = OpenIMClient.getInstance .getLoginUserID ; restoreSessionFor currentUserID ; | 状态 | 说明 | | | | | LoginStatus.Logout | SDK 当前未登录。 | | LoginStatus.Logging | 登录正在进行,不应再次发起并行登录。 | | LoginStatus.Logged | SDK 已登录;网络是否连接仍以 OnConnListener 为准。 | getLoginStatus 和 getLoginUserID 返回本地 SDK 状态快照,不会触发连接 callback。切换账号时应先退出旧账号,而不是直接用新参数覆盖当前登录。 处理 Token 和强制下线 收到 onUserTokenExpired 或 onUserTokenInvalid 后,应重新向可信后端取得当前用户凭据,再按产品策略重新登录或返回登录页。收到 onKickedOffline 时,应清理当前用户的会话列表、消息视图、未读数和其他业务状态,不能把它当作用户主动退出。 这些 callback 没有业务实体合并键,应按当前 OpenIMClient 单例和登录用户隔离状态。旧账号的异步任务和页面订阅必须在新账号登录前停止。 主动退出与释放 SDK OpenIMClient.getInstance .logout new OnBase @Override public void onError int code, String error recordLogoutFailure code, error ; @Override public void onSuccess String data sessionState.clearCurrentAccount ; ; logout 成功表示当前 SDK 登录会话已退出。应用状态清理应在成功 callback 后执行;切换账号时,等待旧账号退出完成后再调用新账号的 login 。 应用最终不再使用 SDK 时可以调用: OpenIMClient.getInstance .unInit ; unInit 用于释放 SDK 运行环境,不是 logout 的替代品,也不应在普通页面销毁时调用。 下一步 开始之前 /sdk/android/getting started/before you start 按 Android 环境接入 /sdk/android/getting started/environment specific implementation 发送第一条消息 /sdk/android/getting started/send first message" + "content": "OpenIM Android SDK 使用 initSDK 初始化本机运行环境,再使用 login 建立当前用户的登录会话。开始认证前,应先完成 开始之前 /sdk/android/getting started/before you start 列出的服务、用户和 Token 准备,并按 按 Android 环境接入 /sdk/android/getting started/environment specific implementation 添加依赖和权限。 完整流程如下: 1. 在应用级会话组件中创建稳定的 OnConnListener 。 2. 调用 initSDK 并确认返回 true 。 3. 在登录前设置消息、用户、好友、会话、群组和通话信令 listener。 4. 从可信后端取得对应的 userID 与 Token,然后调用 login 。 5. 分别等待登录回调成功与 onConnectSuccess ,再开放依赖连接的业务操作。 6. 主动退出或切换账号时调用 logout ,完成后清理当前账号的应用状态。 下文中的 apiAddr 、 wsAddr 、 userID 和 token 均由可信后端提供。 初始化并处理连接生命周期 在 Application 生命周期内创建数据目录、初始化 SDK,并传入连接 listener。应用应保存连接状态,但不要在回调中记录 Token 或完整服务凭据。 import android.app.Application; import java.io.File; import io.openim.android.sdk.OpenIMClient; import io.openim.android.sdk.enums.LogLevel; import io.openim.android.sdk.listener.OnConnListener; import io.openim.android.sdk.models.InitConfig; File dataDirectory = new File application.getFilesDir , \"openim\" ; if dataDirectory.exists && dataDirectory.mkdirs throw new IllegalStateException \"Cannot create the OpenIM data directory.\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = LogLevel.Info; config.isLogStandardOutput = false; OnConnListener connectionListener = new OnConnListener @Override public void onConnecting // 连接建立中。 @Override public void onConnectSuccess // 连接可用后,继续执行依赖连接的操作。 @Override public void onConnectFailed long code, String error // 根据 code 和 error 处理连接失败。 @Override public void onKickedOffline // 清理当前账号状态并提示重新登录。 @Override public void onUserTokenExpired // 获取新 Token 后重新登录。 @Override public void onUserTokenInvalid String reason // 清理当前账号状态并提示重新登录。 ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; if initialized throw new IllegalStateException \"OpenIMClientSDK initialization failed.\" ; initSDK 返回 true 表示 SDK 本地运行环境初始化成功。 OnConnListener 的连接回调在调用 login 后开始反映长连接状态。 | 字段 | 类型 | 说明 | | | | | | application | Application | 应用级 Context,用于持有 SDK 生命周期。 | | apiAddr | String | OpenIMServer HTTP API 地址。 | | wsAddr | String | OpenIMServer WebSocket 地址。 | | dataDirectory | File | SDK 数据库和日志使用的应用私有持久化目录。 | | config.logLevel | int | 使用 LogLevel 常量;正式环境应主动收敛日志级别。 | | isLogStandardOutput | boolean | 是否把 SDK 日志输出到标准日志流。 | SDK 只应在 Application 或应用级会话组件中初始化一次。 networkChanged 用于通知 SDK 重新检查网络;只有在应用已经统一监听系统网络变化时才调用,不能由多个页面重复注册网络回调。 在登录前设置业务 listener SDK 的 listener 注册方法采用 set 语义,后一次设置会替换前一次设置。应由应用级事件中心创建稳定 listener,再把事件分发给页面状态层。各类 listener 的集中注册、覆盖行为和生命周期见 事件概览 /sdk/android/events/overview events 。 SDK 没有公开的 remove/unset 方法。退出或切换账号时,应用事件中心应停止向旧账号页面分发回调,并在下次登录前用新账号对应的完整 listener 组合覆盖设置。 登录当前用户 OpenIMClient.getInstance .login new OnBase @Override public void onError int code, String error // 根据 code 和 error 处理登录失败。 @Override public void onSuccess String data // 登录调用完成。 , userID, token ; login 的成功回调表示当前登录调用完成; OnConnListener.onConnectSuccess 表示长连接可用。这两个阶段必须分别处理。不要并发调用 login ,也不要仅凭某一个回调同时推断登录与连接状态。 查询登录状态 int loginStatus = OpenIMClient.getInstance .getLoginStatus ; if loginStatus == LoginStatus.Logged String currentUserID = OpenIMClient.getInstance .getLoginUserID ; // currentUserID 是当前登录用户 ID。 | 状态 | 说明 | | | | | LoginStatus.Logout | SDK 当前未登录。 | | LoginStatus.Logging | 登录正在进行,不应再次发起并行登录。 | | LoginStatus.Logged | SDK 已登录;网络是否连接仍以 OnConnListener 为准。 | getLoginStatus 和 getLoginUserID 返回本地 SDK 状态快照,不会触发连接回调。切换账号时应先退出旧账号,而不是直接用新参数覆盖当前登录。 处理 Token 和强制下线 收到 onUserTokenExpired 或 onUserTokenInvalid 后,应重新向可信后端取得当前用户凭据,再按产品策略重新登录或返回登录页。收到 onKickedOffline 时,应清理当前用户的会话列表、消息视图、未读数和其他业务状态,不能把它当作用户主动退出。 这些是当前登录账号级别的回调。切换账号前必须停止旧账号的异步任务和页面订阅,并清理旧账号状态。 主动退出与释放 SDK OpenIMClient.getInstance .logout new OnBase @Override public void onError int code, String error // 根据 code 和 error 处理退出失败。 @Override public void onSuccess String data // 登录会话已退出。 ; logout 成功表示当前 SDK 登录会话已退出。应用状态清理应在成功回调后执行;切换账号时,等待旧账号退出完成后再调用新账号的 login 。 应用最终不再使用 SDK 时可以调用: OpenIMClient.getInstance .unInit ; unInit 用于释放 SDK 运行环境,不是 logout 的替代品,也不应在普通页面销毁时调用。 下一步 开始之前 /sdk/android/getting started/before you start 按 Android 环境接入 /sdk/android/getting started/environment specific implementation 发送第一条消息 /sdk/android/getting started/send first message" }, { "path": "/sdk/android/getting-started/send-first-message", @@ -1933,7 +1933,7 @@ "description": "在 Android 应用中发送并验证第一条单聊文本消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android getting-started send-first-message", - "content": "本页用一条单聊文本消息验证 OpenIM 已接入成功。开始前,先按 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 完成 SDK 初始化和登录。 开始前准备 为发送方和接收方各准备一个测试账号。 两个账号都需要按 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 完成 SDK 初始化;接收方需要在登录前设置下面的消息 listener。 将示例中的 user b 替换为接收方的真实 userID 。 第 1 步:让接收方监听新消息 接收方在登录前设置消息 listener。收到消息后,将它加入页面消息列表或刷新界面即可。 OpenIMClient.getInstance .messageManager .setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message // 将 message 显示在聊天界面中。 ; 第 2 步:确认可以发送 两个账号登录后,发送方的登录 callback 成功且 OnConnListener.onConnectSuccess 已到达,即可发送消息。接收方也应保持连接,以便收到新消息。连接尚未成功时,先等待连接恢复,不要重复调用 login 。 第 3 步:发送文本消息 发送单聊文本消息 先创建消息,再发送它。第三个目标参数填写接收方 userID ,群组目标参数保持空字符串。 Message message = OpenIMClient.getInstance .messageManager .createTextMessage \"你好,OpenIMSDK\" ; OnMsgSendCallback sendCallback = new OnMsgSendCallback @Override public void onProgress long progress // 文本消息通常不需要处理进度。 @Override public void onError int code, String error // 提示发送失败,并允许用户重试。 @Override public void onSuccess Message sentMessage // 将 sentMessage 更新到发送方的聊天界面。 ; OpenIMClient.getInstance .messageManager.sendMessage sendCallback, message, \"user b\", \"\", new OfflinePushInfo ; OfflinePushInfo 用于配置离线推送内容。首次验证时可以传入空对象,后续再按产品需要设置标题、摘要和扩展数据。 onSuccess 表示发送方已成功发送消息;接收方的 onRecvNewMessage 表示另一端已收到消息。这两个回调都会到达,才说明这次单聊验证完成。 发送群聊文本消息 发送群消息时,将接收方 userID 改为空字符串,并填写群组的 groupID : Message groupMessage = OpenIMClient.getInstance .messageManager .createTextMessage \"大家好,OpenIMSDK\" ; OpenIMClient.getInstance .messageManager.sendMessage sendCallback, groupMessage, \"\", \"group 123\", new OfflinePushInfo ; 一次调用只能填写 userID 或 groupID 其中之一。 验证成功 发送方进入 onSuccess 。 接收方进入 onRecvNewMessage ,并看到文本消息。 单聊只填写接收方 userID ;群聊只填写 groupID 。 下一步 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session OpenIM Android SDK 概览 /sdk/android/overview" + "content": "本页用一条单聊文本消息验证 OpenIM 已接入成功。开始前,先按 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 完成 SDK 初始化和登录。 开始前准备 为发送方和接收方各准备一个测试账号。 两个账号都需要按 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 完成 SDK 初始化;接收方需要在登录前设置下面的消息 listener。 将示例中的 user b 替换为接收方的真实 userID 。 第 1 步:让接收方监听新消息 接收方在登录前设置消息 listener。收到消息后,将它加入页面消息列表或刷新界面即可。 OpenIMClient.getInstance .messageManager .setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message // 将 message 显示在聊天界面中。 ; 第 2 步:确认可以发送 两个账号登录后,发送方的登录回调成功且 OnConnListener.onConnectSuccess 已到达,即可发送消息。接收方也应保持连接,以便收到新消息。连接尚未成功时,先等待连接恢复,不要重复调用 login 。 第 3 步:发送文本消息 发送单聊文本消息 先创建消息,再发送它。第三个目标参数填写接收方 userID ,群组目标参数保持空字符串。 Message message = OpenIMClient.getInstance .messageManager .createTextMessage \"你好,OpenIMSDK\" ; OnMsgSendCallback sendCallback = new OnMsgSendCallback @Override public void onProgress long progress // 文本消息通常不需要处理进度。 @Override public void onError int code, String error // 提示发送失败,并允许用户重试。 @Override public void onSuccess Message sentMessage // 将 sentMessage 更新到发送方的聊天界面。 ; OpenIMClient.getInstance .messageManager.sendMessage sendCallback, message, \"user b\", \"\", new OfflinePushInfo ; OfflinePushInfo 用于配置离线推送内容。首次验证时可以传入空对象,后续再按产品需要设置标题、摘要和扩展数据。 onSuccess 表示发送方已成功发送消息;接收方的 onRecvNewMessage 表示另一端已收到消息。这两个回调都会到达,才说明这次单聊验证完成。 发送群聊文本消息 发送群消息时,将接收方 userID 改为空字符串,并填写群组的 groupID : Message groupMessage = OpenIMClient.getInstance .messageManager .createTextMessage \"大家好,OpenIMSDK\" ; OpenIMClient.getInstance .messageManager.sendMessage sendCallback, groupMessage, \"\", \"group 123\", new OfflinePushInfo ; 一次调用只能填写 userID 或 groupID 其中之一。 验证成功 发送方调用 sendMessage 后触发 onSuccess 回调。 接收方进入 onRecvNewMessage ,并看到文本消息。 下一步 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session OpenIM Android SDK 概览 /sdk/android/overview" }, { "path": "/sdk/android/user/overview-user", diff --git a/src/generated/search-index.json b/src/generated/search-index.json index 81c9a4666e..da40f78f63 100644 --- a/src/generated/search-index.json +++ b/src/generated/search-index.json @@ -1917,7 +1917,7 @@ "description": "Add OpenIM Android SDK dependencies and network permissions to an Android project.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android getting-started environment-specific-implementation", - "content": "This page covers Android project dependencies and permissions only. For SDK initialization, connection listeners, and sign in, see Authenticate and manage a session /sdk/android/getting started/authenticate and manage session . Add SDK dependencies Add the dependencies to the application module's build.gradle : dependencies implementation 'io.openim:android sdk:latest@aar' implementation 'io.openim:core sdk:latest@aar' implementation 'com.google.code.gson:gson:2.9.0' Configure the manifest The application needs network access: Next steps Authenticate and manage a session /sdk/android/getting started/authenticate and manage session Send your first message /sdk/android/getting started/send first message" + "content": "This page covers Android project dependencies and permissions only. For SDK initialization, connection listeners, and sign in, see Authenticate and manage a session /sdk/android/getting started/authenticate and manage session . Add SDK dependencies Add the dependencies to the application module's build.gradle : dependencies implementation 'io.openim:android sdk:3.8.3@aar' implementation 'io.openim:core sdk:3.8.3 patch15@aar' implementation 'com.google.code.gson:gson:2.9.0' Configure the manifest The application needs network access: Next steps Authenticate and manage a session /sdk/android/getting started/authenticate and manage session Send your first message /sdk/android/getting started/send first message" }, { "path": "/sdk/android/getting-started/authenticate-and-manage-session", @@ -1925,7 +1925,7 @@ "description": "Initialize OpenIM Android SDK, log in, inspect login state, handle connection callbacks, and sign out the current account.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android getting-started authenticate-and-manage-session", - "content": "OpenIM Android SDK uses initSDK to initialize the local runtime and login to establish the current user's session. Complete the service, user, and token preparation in Before you start /sdk/android/getting started/before you start , then add dependencies and permissions as described in Integrate for Android /sdk/android/getting started/environment specific implementation . The complete flow is: 1. Create a stable OnConnListener in an application level session component. 2. Call initSDK and confirm that it returns true . 3. Register message, user, relationship, conversation, group, and call signaling listeners before login. 4. Obtain the matching userID and token from a trusted backend, then call login . 5. Wait separately for login success and onConnectSuccess before enabling operations that require the persistent connection. 6. On sign out or account switching, call logout and then clear application state owned by the current account. The apiAddr , wsAddr , userID , and token used below are all provided by a trusted backend. Initialize and handle the connection lifecycle During the Application lifecycle, create the data directory, initialize the SDK, and provide the connection listener. Store connection state without recording tokens or complete service credentials in callback logs. import android.app.Application; import java.io.File; import io.openim.android.sdk.OpenIMClient; import io.openim.android.sdk.enums.LogLevel; import io.openim.android.sdk.listener.OnConnListener; import io.openim.android.sdk.models.InitConfig; File dataDirectory = new File application.getFilesDir , \"openim\" ; if dataDirectory.exists && dataDirectory.mkdirs throw new IllegalStateException \"Cannot create the OpenIM data directory.\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = LogLevel.Info; config.isLogStandardOutput = false; OnConnListener connectionListener = new OnConnListener @Override public void onConnecting sessionState.setConnectionState \"connecting\" ; @Override public void onConnectSuccess sessionState.setConnectionState \"connected\" ; sessionState.enableConnectedOperations ; @Override public void onConnectFailed long code, String error sessionState.setConnectionState \"failed\" ; recordConnectionFailure code, error ; @Override public void onKickedOffline sessionState.clearCurrentAccount ; showSignedInElsewhereScreen ; @Override public void onUserTokenExpired requestNewTokenAndRelogin ; @Override public void onUserTokenInvalid String reason sessionState.clearCurrentAccount ; showSignInScreen reason ; ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; if initialized throw new IllegalStateException \"OpenIMClientSDK initialization failed.\" ; A true return value means that the local SDK runtime initialized successfully. OnConnListener starts reporting persistent connection state after login is called. | Field | Type | Description | | | | | | application | Application | Application level context that owns the SDK lifecycle. | | apiAddr | String | OpenIMServer HTTP API endpoint. | | wsAddr | String | OpenIMServer WebSocket endpoint. | | dataDirectory | File | Application private persistent directory for the SDK database and logs. | | config.logLevel | int | A LogLevel constant; reduce the logging level explicitly in production. | | isLogStandardOutput | boolean | Whether OpenIM Core logs are emitted to the standard log stream. | Initialize the SDK only once in Application or an application level session component. The Java wrapper exposes networkChanged to ask Core to re evaluate network connectivity; call it only when the application already has one centralized system network observer, not from multiple screens. Register business listeners before login Listener registration uses set semantics, so a later call replaces the previous listener. Create stable listener instances in an application level event dispatcher and forward events to screen state. See Send your first message /sdk/android/getting started/send first message for the complete message listener registration and incremental merge example. User, relationship, conversation, group, and call signaling listeners follow the same ownership rule. The SDK does not expose remove or unset methods. During sign out or account switching, the application event dispatcher must stop delivering callbacks to state owned by the previous account and replace the complete listener set before the next login. Log in the current user OpenIMClient.getInstance .login new OnBase @Override public void onError int code, String error sessionState.setLoginState \"failed\" ; recordLoginFailure code, error ; @Override public void onSuccess String data sessionState.setLoginState \"logged\" ; sessionState.setCurrentUserID userID ; , userID, token ; The successful login callback means that the current login call completed. OnConnListener.onConnectSuccess means that the persistent connection is available. Handle these as separate stages. Do not call login concurrently or infer both states from only one callback. Inspect login state int loginStatus = OpenIMClient.getInstance .getLoginStatus ; if loginStatus == LoginStatus.Logged String currentUserID = OpenIMClient.getInstance .getLoginUserID ; restoreSessionFor currentUserID ; | State | Description | | | | | LoginStatus.Logout | The SDK is not logged in. | | LoginStatus.Logging | Login is in progress; do not start another login concurrently. | | LoginStatus.Logged | The SDK is logged in. Persistent connection state still comes from OnConnListener . | getLoginStatus and getLoginUserID return local SDK snapshots and do not trigger connection callbacks. Sign out the previous account before logging in with a different account. Handle token failure and forced logout After onUserTokenExpired or onUserTokenInvalid , obtain new credentials for the current user from a trusted backend, then reauthenticate or return to the sign in flow according to product policy. After onKickedOffline , clear conversations, message views, unread counts, and other state owned by the current account. Do not treat forced logout as an explicit user sign out. These callbacks do not have a business entity merge key. Isolate them by the current OpenIMClient singleton and logged in user. Stop asynchronous work and screen subscriptions owned by the previous account before starting a new login. Sign out and release the SDK OpenIMClient.getInstance .logout new OnBase @Override public void onError int code, String error recordLogoutFailure code, error ; @Override public void onSuccess String data sessionState.clearCurrentAccount ; ; Successful completion means that the current SDK login session has signed out. Clear application state after the success callback. For account switching, wait for the previous logout before calling login for the next account. When the application will no longer use the SDK, release the runtime with: OpenIMClient.getInstance .unInit ; unInit is not a replacement for logout and must not run when an ordinary screen is destroyed. Next steps Before you start /sdk/android/getting started/before you start Integrate for Android /sdk/android/getting started/environment specific implementation Send your first message /sdk/android/getting started/send first message" + "content": "OpenIM Android SDK uses initSDK to initialize the local runtime and login to establish the current user's session. Complete the service, user, and token preparation in Before you start /sdk/android/getting started/before you start , then add dependencies and permissions as described in Integrate for Android /sdk/android/getting started/environment specific implementation . The complete flow is: 1. Create a stable OnConnListener in an application level session component. 2. Call initSDK and confirm that it returns true . 3. Register message, user, relationship, conversation, group, and call signaling listeners before login. 4. Obtain the matching userID and token from a trusted backend, then call login . 5. Wait separately for login success and onConnectSuccess before enabling operations that require the persistent connection. 6. On sign out or account switching, call logout and then clear application state owned by the current account. The apiAddr , wsAddr , userID , and token used below are all provided by a trusted backend. Initialize and handle the connection lifecycle During the Application lifecycle, create the data directory, initialize the SDK, and provide the connection listener. Store connection state without recording tokens or complete service credentials in callback logs. import android.app.Application; import java.io.File; import io.openim.android.sdk.OpenIMClient; import io.openim.android.sdk.enums.LogLevel; import io.openim.android.sdk.listener.OnConnListener; import io.openim.android.sdk.models.InitConfig; File dataDirectory = new File application.getFilesDir , \"openim\" ; if dataDirectory.exists && dataDirectory.mkdirs throw new IllegalStateException \"Cannot create the OpenIM data directory.\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = LogLevel.Info; config.isLogStandardOutput = false; OnConnListener connectionListener = new OnConnListener @Override public void onConnecting // The connection is being established. @Override public void onConnectSuccess // Continue with operations that require a connection. @Override public void onConnectFailed long code, String error // Handle the connection failure using code and error. @Override public void onKickedOffline // Clear the current account state and prompt the user to sign in again. @Override public void onUserTokenExpired // Obtain a new token and sign in again. @Override public void onUserTokenInvalid String reason // Clear the current account state and prompt the user to sign in again. ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; if initialized throw new IllegalStateException \"OpenIMClientSDK initialization failed.\" ; A true return value means that the local SDK runtime initialized successfully. OnConnListener starts reporting persistent connection state after login is called. | Field | Type | Description | | | | | | application | Application | Application level context that owns the SDK lifecycle. | | apiAddr | String | OpenIMServer HTTP API endpoint. | | wsAddr | String | OpenIMServer WebSocket endpoint. | | dataDirectory | File | Application private persistent directory for the SDK database and logs. | | config.logLevel | int | A LogLevel constant; reduce the logging level explicitly in production. | | isLogStandardOutput | boolean | Whether SDK logs are emitted to the standard log stream. | Initialize the SDK only once in Application or an application level session component. networkChanged asks the SDK to re evaluate network connectivity; call it only when the application already has one centralized system network observer, not from multiple screens. Register business listeners before login Listener registration uses set semantics, so a later call replaces the previous listener. Create stable listener instances in an application level event dispatcher and forward events to screen state. For centralized listener registration, replacement behavior, and lifecycle guidance, see Event overview /sdk/android/events/overview events . The SDK does not expose remove or unset methods. During sign out or account switching, the application event dispatcher must stop delivering callbacks to state owned by the previous account and replace the complete listener set before the next login. Log in the current user OpenIMClient.getInstance .login new OnBase @Override public void onError int code, String error // Handle the login failure using code and error. @Override public void onSuccess String data // The login call has completed. , userID, token ; The successful login callback means that the current login call completed. OnConnListener.onConnectSuccess means that the persistent connection is available. Handle these as separate stages. Do not call login concurrently or infer both states from only one callback. Inspect login state int loginStatus = OpenIMClient.getInstance .getLoginStatus ; if loginStatus == LoginStatus.Logged String currentUserID = OpenIMClient.getInstance .getLoginUserID ; // currentUserID is the current logged in user ID. | State | Description | | | | | LoginStatus.Logout | The SDK is not logged in. | | LoginStatus.Logging | Login is in progress; do not start another login concurrently. | | LoginStatus.Logged | The SDK is logged in. Persistent connection state still comes from OnConnListener . | getLoginStatus and getLoginUserID return local SDK snapshots and do not trigger connection callbacks. Sign out the previous account before logging in with a different account. Handle token failure and forced logout After onUserTokenExpired or onUserTokenInvalid , obtain new credentials for the current user from a trusted backend, then reauthenticate or return to the sign in flow according to product policy. After onKickedOffline , clear conversations, message views, unread counts, and other state owned by the current account. Do not treat forced logout as an explicit user sign out. These callbacks apply to the current logged in account. Before switching accounts, stop asynchronous work and screen subscriptions for the previous account, then clear its state. Sign out and release the SDK OpenIMClient.getInstance .logout new OnBase @Override public void onError int code, String error // Handle the sign out failure using code and error. @Override public void onSuccess String data // The login session has signed out. ; Successful completion means that the current SDK login session has signed out. Clear application state after the success callback. For account switching, wait for the previous logout before calling login for the next account. When the application will no longer use the SDK, release the runtime with: OpenIMClient.getInstance .unInit ; unInit is not a replacement for logout and must not run when an ordinary screen is destroyed. Next steps Before you start /sdk/android/getting started/before you start Integrate for Android /sdk/android/getting started/environment specific implementation Send your first message /sdk/android/getting started/send first message" }, { "path": "/sdk/android/getting-started/send-first-message", @@ -1933,7 +1933,7 @@ "description": "Send and verify the first one-to-one text message in an Android application.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android getting-started send-first-message", - "content": "Use one to one text messaging to confirm that OpenIM is integrated correctly. Before starting, complete SDK initialization and sign in in Authenticate and manage a session /sdk/android/getting started/authenticate and manage session . Before you start Prepare a test account for the sender and another for the receiver. Initialize the SDK for both accounts as described in Authenticate and manage a session /sdk/android/getting started/authenticate and manage session . Register the following listener on the receiver before it signs in. Replace user b in the example with the receiver's actual userID . Step 1: Listen for incoming messages on the receiver Register the message listener on the receiver before sign in. When a message arrives, add it to the chat list or refresh the UI. OpenIMClient.getInstance .messageManager .setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message // Display message in the chat UI. ; Step 2: Confirm that sending is available After both accounts sign in, the sender can send only after its login callback succeeds and OnConnListener.onConnectSuccess arrives. Keep the receiver connected so it can receive the new message. If a connection is not ready, wait for it to recover instead of calling login again. Step 3: Send a text message Send a one to one text message Create the message, then send it. Put the receiver's userID in the user destination and leave the group destination empty. Message message = OpenIMClient.getInstance .messageManager .createTextMessage \"Hello, OpenIMSDK\" ; OnMsgSendCallback sendCallback = new OnMsgSendCallback @Override public void onProgress long progress // Text messages usually do not need progress handling. @Override public void onError int code, String error // Tell the user that sending failed and allow a retry. @Override public void onSuccess Message sentMessage // Update the sender's chat UI with sentMessage. ; OpenIMClient.getInstance .messageManager.sendMessage sendCallback, message, \"user b\", \"\", new OfflinePushInfo ; OfflinePushInfo configures offline push content. For this first test, pass an empty object and add a title, summary, or extra data later if needed. onSuccess means the sender has sent the message successfully. onRecvNewMessage on the receiver means the other side received it. Both callbacks should arrive before considering this one to one test complete. Send a group text message To send a group message, leave the receiver userID empty and provide the group's groupID : Message groupMessage = OpenIMClient.getInstance .messageManager .createTextMessage \"Hello, OpenIMSDK\" ; OpenIMClient.getInstance .messageManager.sendMessage sendCallback, groupMessage, \"\", \"group 123\", new OfflinePushInfo ; Set either userID or groupID in a single call, never both. Verify success The sender enters onSuccess . The receiver enters onRecvNewMessage and sees the text message. A one to one message sets only the receiver's userID ; a group message sets only groupID . Next steps Authenticate and manage a session /sdk/android/getting started/authenticate and manage session OpenIM Android SDK overview /sdk/android/overview" + "content": "Use one to one text messaging to confirm that OpenIM is integrated correctly. Before starting, complete SDK initialization and sign in in Authenticate and manage a session /sdk/android/getting started/authenticate and manage session . Before you start Prepare a test account for the sender and another for the receiver. Initialize the SDK for both accounts as described in Authenticate and manage a session /sdk/android/getting started/authenticate and manage session . Register the following listener on the receiver before it signs in. Replace user b in the example with the receiver's actual userID . Step 1: Listen for incoming messages on the receiver Register the message listener on the receiver before sign in. When a message arrives, add it to the chat list or refresh the UI. OpenIMClient.getInstance .messageManager .setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message // Display message in the chat UI. ; Step 2: Confirm that sending is available After both accounts sign in, the sender can send only after its login callback succeeds and OnConnListener.onConnectSuccess arrives. Keep the receiver connected so it can receive the new message. If a connection is not ready, wait for it to recover instead of calling login again. Step 3: Send a text message Send a one to one text message Create the message, then send it. Put the receiver's userID in the user destination and leave the group destination empty. Message message = OpenIMClient.getInstance .messageManager .createTextMessage \"Hello, OpenIMSDK\" ; OnMsgSendCallback sendCallback = new OnMsgSendCallback @Override public void onProgress long progress // Text messages usually do not need progress handling. @Override public void onError int code, String error // Tell the user that sending failed and allow a retry. @Override public void onSuccess Message sentMessage // Update the sender's chat UI with sentMessage. ; OpenIMClient.getInstance .messageManager.sendMessage sendCallback, message, \"user b\", \"\", new OfflinePushInfo ; OfflinePushInfo configures offline push content. For this first test, pass an empty object and add a title, summary, or extra data later if needed. onSuccess means the sender has sent the message successfully. onRecvNewMessage on the receiver means the other side received it. Both callbacks should arrive before considering this one to one test complete. Send a group text message To send a group message, leave the receiver userID empty and provide the group's groupID : Message groupMessage = OpenIMClient.getInstance .messageManager .createTextMessage \"Hello, OpenIMSDK\" ; OpenIMClient.getInstance .messageManager.sendMessage sendCallback, groupMessage, \"\", \"group 123\", new OfflinePushInfo ; Set either userID or groupID in a single call, never both. Verify success The sender's sendMessage call triggers the onSuccess callback. The receiver enters onRecvNewMessage and sees the text message. Next steps Authenticate and manage a session /sdk/android/getting started/authenticate and manage session OpenIM Android SDK overview /sdk/android/overview" }, { "path": "/sdk/android/user/overview-user", From 31dcdebc89dee6c975406afe59e794c121850fe3 Mon Sep 17 00:00:00 2001 From: chan <1499188352@qq.com> Date: Thu, 20 Aug 2026 11:24:21 +0800 Subject: [PATCH 11/12] docs(android): remove redundant code from SDK API examples - Remove app-specific UI, store, and business helper calls from Android SDK callbacks. - Align Chinese and English examples with SDK-observable results and error parameters. - Regenerate Android content, audit metadata, and search indexes. --- .../calling/managing-calls/accept-call.mdx | 8 +- .../calling/managing-calls/cancel-call.mdx | 4 +- .../managing-calls/handle-call-events.mdx | 22 +- .../calling/managing-calls/hang-up-call.mdx | 4 +- .../calling/managing-calls/reject-call.mdx | 4 +- .../managing-calls/start-group-call.mdx | 4 +- .../managing-calls/start-single-call.mdx | 8 +- .../get-room-by-group-id.mdx | 8 +- .../get-token-by-room-id.mdx | 11 +- .../restore-pending-invitation.mdx | 9 +- .../send-a-custom-signal.mdx | 15 +- .../clear-conversation-messages.mdx | 4 +- .../clear-group-mentions.mdx | 4 +- .../delete-conversation-with-messages.mdx | 5 +- .../get-total-unread-count.mdx | 4 +- .../hide-a-conversation.mdx | 4 +- .../mark-conversation-read.mdx | 4 +- .../pin-conversation.mdx | 4 +- .../set-burn-duration.mdx | 4 +- .../set-conversation-draft.mdx | 4 +- .../set-conversation-extension.mdx | 4 +- .../set-message-destruct.mdx | 4 +- .../set-message-receive-option.mdx | 4 +- .../set-private-chat.mdx | 4 +- .../get-conversation-by-target.mdx | 4 +- .../get-conversations-by-id.mdx | 6 +- .../retrieve-conversation-list.mdx | 8 +- .../sdk/android/file-uploads/upload-file.mdx | 12 +- .../sdk/android/group/change-group-mute.mdx | 4 +- .../chat/sdk/android/group/create-group.mdx | 4 +- .../chat/sdk/android/group/dismiss-group.mdx | 4 +- .../accept-group-application.mdx | 4 +- .../delete-group-requests.mdx | 4 +- ...et-group-application-list-as-applicant.mdx | 4 +- ...et-group-application-list-as-recipient.mdx | 4 +- .../refuse-group-application.mdx | 4 +- .../chat/sdk/android/group/join-group.mdx | 4 +- .../change-group-member-mute.mdx | 4 +- .../invite-user-to-group.mdx | 4 +- .../kick-group-member.mdx | 4 +- .../set-group-member-avatar.mdx | 4 +- .../set-group-member-extension.mdx | 4 +- .../set-group-member-nickname.mdx | 4 +- .../set-group-member-role-level.mdx | 4 +- .../transfer-group-owner.mdx | 4 +- .../chat/sdk/android/group/quit-group.mdx | 4 +- .../get-group-member-list.mdx | 4 +- .../get-group-member-owner-and-admin.mdx | 4 +- .../get-specified-group-members-info.mdx | 4 +- .../get-users-in-group.mdx | 4 +- .../search-group-members.mdx | 4 +- .../get-joined-group-list-page.mdx | 4 +- .../get-specified-groups-info.mdx | 4 +- .../group/retrieving-groups/is-join-group.mdx | 4 +- .../group/retrieving-groups/search-groups.mdx | 4 +- .../android/group/set-group-announcement.mdx | 4 +- .../sdk/android/group/set-group-extension.mdx | 4 +- .../group/set-group-join-verification.mdx | 4 +- .../set-group-member-friend-permission.mdx | 4 +- .../group/set-group-member-profile-access.mdx | 4 +- .../android/group/update-group-profile.mdx | 4 +- content/docs/chat/sdk/android/logger.mdx | 6 +- .../composing-messages/get-typing-status.mdx | 4 +- .../update-typing-status.mdx | 8 +- .../delete-saved-messages.mdx | 2 +- .../delete-user-messages.mdx | 2 +- .../managing-messages/get-pinned-messages.mdx | 4 +- .../managing-messages/modify-a-message.mdx | 2 +- .../managing-messages/revoke-a-message.mdx | 2 +- .../managing-messages/set-message-pinned.mdx | 2 +- .../get-group-message-readers.mdx | 2 +- .../send-group-read-receipts.mdx | 2 +- .../sdk/android/message/overview-message.mdx | 8 +- .../receive-custom-business-messages.mdx | 2 +- .../receiving-messages/receive-messages.mdx | 4 +- .../find-messages-by-id.mdx | 4 +- .../load-message-context.mdx | 2 +- .../message/sending-messages/send-message.mdx | 4 +- .../set-msg-send-progress-listener.mdx | 6 +- .../calling/managing-calls/accept-call.mdx | 8 +- .../calling/managing-calls/cancel-call.mdx | 4 +- .../managing-calls/handle-call-events.mdx | 22 +- .../calling/managing-calls/hang-up-call.mdx | 4 +- .../calling/managing-calls/reject-call.mdx | 4 +- .../managing-calls/start-group-call.mdx | 4 +- .../managing-calls/start-single-call.mdx | 8 +- .../get-room-by-group-id.mdx | 8 +- .../get-token-by-room-id.mdx | 11 +- .../restore-pending-invitation.mdx | 9 +- .../send-a-custom-signal.mdx | 15 +- .../clear-conversation-messages.mdx | 4 +- .../clear-group-mentions.mdx | 4 +- .../delete-conversation-with-messages.mdx | 5 +- .../get-total-unread-count.mdx | 4 +- .../hide-a-conversation.mdx | 4 +- .../mark-conversation-read.mdx | 4 +- .../pin-conversation.mdx | 4 +- .../set-burn-duration.mdx | 4 +- .../set-conversation-draft.mdx | 4 +- .../set-conversation-extension.mdx | 4 +- .../set-message-destruct.mdx | 4 +- .../set-message-receive-option.mdx | 4 +- .../set-private-chat.mdx | 4 +- .../get-conversation-by-target.mdx | 4 +- .../get-conversations-by-id.mdx | 6 +- .../retrieve-conversation-list.mdx | 8 +- .../sdk/android/file-uploads/upload-file.mdx | 12 +- .../sdk/android/group/change-group-mute.mdx | 4 +- .../chat/sdk/android/group/create-group.mdx | 4 +- .../chat/sdk/android/group/dismiss-group.mdx | 4 +- .../accept-group-application.mdx | 4 +- .../delete-group-requests.mdx | 4 +- ...et-group-application-list-as-applicant.mdx | 4 +- ...et-group-application-list-as-recipient.mdx | 4 +- .../refuse-group-application.mdx | 4 +- .../chat/sdk/android/group/join-group.mdx | 4 +- .../change-group-member-mute.mdx | 4 +- .../invite-user-to-group.mdx | 4 +- .../kick-group-member.mdx | 4 +- .../set-group-member-avatar.mdx | 4 +- .../set-group-member-extension.mdx | 4 +- .../set-group-member-nickname.mdx | 4 +- .../set-group-member-role-level.mdx | 4 +- .../transfer-group-owner.mdx | 4 +- .../chat/sdk/android/group/quit-group.mdx | 4 +- .../get-group-member-list.mdx | 4 +- .../get-group-member-owner-and-admin.mdx | 4 +- .../get-specified-group-members-info.mdx | 4 +- .../get-users-in-group.mdx | 4 +- .../search-group-members.mdx | 4 +- .../get-joined-group-list-page.mdx | 4 +- .../get-specified-groups-info.mdx | 4 +- .../group/retrieving-groups/is-join-group.mdx | 4 +- .../group/retrieving-groups/search-groups.mdx | 4 +- .../android/group/set-group-announcement.mdx | 4 +- .../sdk/android/group/set-group-extension.mdx | 4 +- .../group/set-group-join-verification.mdx | 4 +- .../set-group-member-friend-permission.mdx | 4 +- .../group/set-group-member-profile-access.mdx | 4 +- .../android/group/update-group-profile.mdx | 4 +- content/zh/docs/chat/sdk/android/logger.mdx | 6 +- .../composing-messages/get-typing-status.mdx | 4 +- .../update-typing-status.mdx | 8 +- .../delete-saved-messages.mdx | 2 +- .../delete-user-messages.mdx | 2 +- .../managing-messages/get-pinned-messages.mdx | 4 +- .../managing-messages/modify-a-message.mdx | 2 +- .../managing-messages/revoke-a-message.mdx | 2 +- .../managing-messages/set-message-pinned.mdx | 2 +- .../get-group-message-readers.mdx | 2 +- .../send-group-read-receipts.mdx | 2 +- .../sdk/android/message/overview-message.mdx | 8 +- .../receive-custom-business-messages.mdx | 2 +- .../receiving-messages/receive-messages.mdx | 4 +- .../find-messages-by-id.mdx | 4 +- .../load-message-context.mdx | 2 +- .../message/sending-messages/send-message.mdx | 4 +- .../set-msg-send-progress-listener.mdx | 6 +- data/structure/android-content-audit.json | 316 +++++++++--------- src/generated/android-sdk-zh-content.json | 158 ++++----- src/generated/search-index-zh.json | 158 ++++----- src/generated/search-index.json | 158 ++++----- 162 files changed, 735 insertions(+), 811 deletions(-) diff --git a/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx index 75b82cc295..b057a03176 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx @@ -18,16 +18,12 @@ OpenIMClient.getInstance().signalingManager.signalingAccept( new OnBase() { @Override public void onSuccess(SignalingCertificate credentials) { - joinMediaRoom( - credentials.getRoomID(), - credentials.getToken(), - credentials.getLiveURL() - ); + // credentials provides the roomID, token, and liveURL for joining a media room. } @Override public void onError(int code, String error) { - showAcceptError(code, error); + // code and error describe the failure. } }, receivedInfo diff --git a/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx index c2690f2437..cb20fc06dd 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx @@ -18,12 +18,12 @@ OpenIMClient.getInstance().signalingManager.signalingCancel( new OnBase() { @Override public void onSuccess(String result) { - stopWaitingForAnswer(activeInfo.getInvitation().getRoomID()); + // The signaling request completed. } @Override public void onError(int code, String error) { - showCancelError(code, error); + // code and error describe the failure. } }, activeInfo diff --git a/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx b/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx index ee733eecd2..9bbff00310 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx @@ -20,57 +20,57 @@ OpenIMClient.getInstance().signalingManager.setSignalingListener( new OnSignalingListener() { @Override public void onReceiveNewInvitation(SignalingInfo info) { - showIncomingCall(info); + // info contains the incoming call invitation. } @Override public void onInviteeAccepted(SignalingInfo info) { - updateCallStatus(info, "accepted"); + // info indicates that the call was accepted. } @Override public void onInviteeRejected(SignalingInfo info) { - updateCallStatus(info, "rejected"); + // info indicates that the call was rejected. } @Override public void onInvitationCancelled(SignalingInfo info) { - endCall(info); + // info indicates that the invitation was cancelled. } @Override public void onInvitationTimeout(SignalingInfo info) { - endCall(info); + // info indicates that the invitation timed out. } @Override public void onInviteeAcceptedByOtherDevice(SignalingInfo info) { - endCall(info); + // info indicates that another device accepted the call. } @Override public void onInviteeRejectedByOtherDevice(SignalingInfo info) { - endCall(info); + // info indicates that another device rejected the call. } @Override public void onHangup(SignalingInfo info) { - endCall(info); + // info indicates that the call ended. } @Override public void onRoomParticipantConnected(RoomCallingInfo room) { - updateParticipantStatus(room, true); + // room contains the participant that joined. } @Override public void onRoomParticipantDisconnected(RoomCallingInfo room) { - updateParticipantStatus(room, false); + // room contains the participant that left. } @Override public void onStreamChange(String streamInfo) { - handleStreamChange(streamInfo); + // streamInfo describes the media stream change. } } ); diff --git a/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx index cd884a07bc..f45e7e4d8d 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx @@ -18,12 +18,12 @@ OpenIMClient.getInstance().signalingManager.signalingHungUp( new OnBase() { @Override public void onSuccess(String result) { - releaseCallResources(signalingInfo.getInvitation().getRoomID()); + // The signaling request completed. } @Override public void onError(int code, String error) { - showHangUpError(code, error); + // code and error describe the failure. } }, signalingInfo diff --git a/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx index 633c2925b3..3ab7676e5b 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx @@ -18,12 +18,12 @@ OpenIMClient.getInstance().signalingManager.signalingReject( new OnBase() { @Override public void onSuccess(String result) { - closeIncomingCallUI(); + // The reject signaling request completed. } @Override public void onError(int code, String error) { - showRejectError(code, error); + // code and error describe the failure. } }, signalingInfo diff --git a/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx index d8ead8f727..2df5982d7d 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx @@ -35,12 +35,12 @@ OpenIMClient.getInstance().signalingManager.signalingInviteInGroup( new OnBase() { @Override public void onSuccess(SignalingCertificate credentials) { - startGroupCall(credentials); + // credentials contains the media room credentials. } @Override public void onError(int code, String error) { - showCallError(code, error); + // code and error describe the failure. } }, info diff --git a/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx index 72b272fe5c..b2fc68df1f 100644 --- a/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx +++ b/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx @@ -63,16 +63,12 @@ OpenIMClient.getInstance().signalingManager.signalingInvite( new OnBase() { @Override public void onSuccess(SignalingCertificate credentials) { - joinMediaRoom( - credentials.getRoomID(), - credentials.getToken(), - credentials.getLiveURL() - ); + // credentials provides the roomID, token, and liveURL for joining a media room. } @Override public void onError(int code, String error) { - showCallError(code, error); + // code and error describe the failure. } }, info diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx index ee49466e79..e1446175d0 100644 --- a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx @@ -18,14 +18,12 @@ OpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID( new OnBase() { @Override public void onSuccess(RoomCallingInfo room) { - if (room.getRoomID() != null && !room.getRoomID().isEmpty()) { - renderParticipants(room.getParticipant()); - } + // room contains a snapshot of the room, invitation, and current participants. } @Override public void onError(int code, String error) { - showNoActiveGroupCall(); + // code and error describe why the query failed. } }, groupID @@ -34,4 +32,4 @@ OpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID( The success callback returns a `RoomCallingInfo` snapshot containing the room ID, original invitation, participants, group ID, token, and connection address. -If there is no active call in the group, the API can return an error or an empty room. Clear locally saved call state and room credentials, and do not attempt to join the old room. +When a successful result has no valid `roomID`, no usable room information was returned. The `code` and `error` in an error callback only describe the query failure; they do not establish that the group has no active call. diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx index 5f1f52ac10..bfb730d17a 100644 --- a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx @@ -18,19 +18,12 @@ OpenIMClient.getInstance().signalingManager.signalingGetTokenByRoomID( new OnBase() { @Override public void onSuccess(SignalingCertificate credentials) { - if (credentials.getToken() != null - && credentials.getRoomID() != null) { - joinMediaRoom( - credentials.getRoomID(), - credentials.getToken(), - credentials.getLiveURL() - ); - } + // credentials provides the roomID, token, and liveURL for joining a media room. } @Override public void onError(int code, String error) { - showCredentialError(code, error); + // code and error describe the failure. } }, roomID diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx index c78e432f11..e89a6159ce 100644 --- a/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx @@ -18,17 +18,12 @@ OpenIMClient.getInstance().signalingManager.getSignalingInvitationInfoStartApp( new OnBase() { @Override public void onSuccess(SignalingInfo info) { - if (info != null - && info.getInvitation() != null - && info.getInvitation().getRoomID() != null - && !info.getInvitation().getRoomID().isEmpty()) { - restoreIncomingCall(info); - } + // Validate the invitation and roomID in info before using it. } @Override public void onError(int code, String error) { - clearExpiredIncomingCall(); + // code and error describe why the query failed. } } ); diff --git a/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx b/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx index 6a18bcd95f..5679711cb1 100644 --- a/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx +++ b/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx @@ -29,12 +29,12 @@ OpenIMClient.getInstance().signalingManager.signalingSendCustomSignal( new OnBase() { @Override public void onSuccess(String result) { - markSignalSent(eventID); + // The signaling request completed. } @Override public void onError(int code, String error) { - showSignalError(code, error); + // code and error describe the failure. } }, roomID, @@ -51,16 +51,7 @@ When a custom signal arrives, `OnSignalingListener.onReceiveCustomSignal` receiv ```java @Override public void onReceiveCustomSignal(CustomSignalingInfo info) { - if (info == null || !activeRoomID.equals(info.getRoomID())) { - return; - } - - CallSignal signal = parseAndValidateCallSignal(info.getCustomInfo()); - String mergeID = info.getRoomID() + ":" + signal.getEventID(); - if (hasAppliedSignal(mergeID)) { - return; - } - applyCallSignal(signal); + // Check info.getRoomID(), then parse info.getCustomInfo() using your application protocol. } ``` diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx index 7a895a54fe..80a6016489 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx @@ -19,12 +19,12 @@ OpenIMClient.getInstance().messageManager.clearConversationAndDeleteAllMsg( new OnBase() { @Override public void onSuccess(String data) { - messageStore.clearConversation(conversationID); + // The request completed and the messages were cleared. } @Override public void onError(int code, String error) { - recordConversationClearFailure(code, error); + // code and error describe the failure. } } ); diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx index c668ac57d8..bd6af0269d 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx @@ -18,12 +18,12 @@ OpenIMClient.getInstance().conversationManager.resetConversationGroupAtType( new OnBase() { @Override public void onSuccess(String data) { - markGroupMentionStateReset(conversationID); + // The request completed. } @Override public void onError(int code, String error) { - recordGroupMentionResetFailure(code, error); + // code and error describe the failure. } }, conversationID diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx index 85670b2ff0..d552948c84 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx @@ -18,13 +18,12 @@ OpenIMClient.getInstance().conversationManager.deleteConversationAndDeleteAllMsg new OnBase() { @Override public void onSuccess(String data) { - messageStore.clearConversation(conversationID); - conversationStore.remove(conversationID); + // The request completed and the conversation and messages were deleted. } @Override public void onError(int code, String error) { - recordConversationDeleteFailure(code, error); + // code and error describe the failure. } }, conversationID diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx index b52a334016..347f21b0ac 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx @@ -19,12 +19,12 @@ OpenIMClient.getInstance().conversationManager.getTotalUnreadMsgCount( @Override public void onSuccess(String value) { int totalUnread = Integer.parseInt(value); - updateApplicationBadge(totalUnread); + // totalUnread is the account's total unread count. } @Override public void onError(int code, String error) { - recordTotalUnreadFailure(code, error); + // code and error describe the failure. } } ); diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx index a42e4fa664..a71f2ab8b3 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx @@ -18,12 +18,12 @@ OpenIMClient.getInstance().conversationManager.hideConversation( new OnBase() { @Override public void onSuccess(String data) { - conversationStore.remove(conversationID); + // The request completed and the conversation was hidden. } @Override public void onError(int code, String error) { - recordConversationHideFailure(code, error); + // code and error describe the failure. } }, conversationID diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx index 0ec021db16..ab5071a438 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx @@ -19,12 +19,12 @@ OpenIMClient.getInstance().messageManager.markConversationMessageAsRead( new OnBase() { @Override public void onSuccess(String data) { - markConversationReadSubmitted(conversationID); + // The request completed. } @Override public void onError(int code, String error) { - recordMarkReadFailure(code, error); + // code and error describe the failure. } } ); diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx index 4596020129..de9a148456 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx @@ -16,12 +16,12 @@ OpenIMClient.getInstance().conversationManager.pinConversation( new OnBase() { @Override public void onSuccess(String data) { - markPinRequestSubmitted(conversationID, true); + // The request completed. } @Override public void onError(int code, String error) { - recordConversationPinFailure(code, error); + // code and error describe the failure. } }, conversationID, diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx index a1fc1884bb..ef25b0c797 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx @@ -16,12 +16,12 @@ OpenIMClient.getInstance().conversationManager.setConversationBurnDuration( new OnBase() { @Override public void onSuccess(String data) { - markBurnDurationSubmitted(conversationID, 30); + // The request completed. } @Override public void onError(int code, String error) { - recordBurnDurationFailure(code, error); + // code and error describe the failure. } }, conversationID, diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx index 2da6820239..fc4af7e8a1 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx @@ -18,12 +18,12 @@ OpenIMClient.getInstance().conversationManager.setConversationDraft( new OnBase() { @Override public void onSuccess(String data) { - markDraftSubmitted(conversationID); + // The request completed. } @Override public void onError(int code, String error) { - recordDraftSaveFailure(code, error); + // code and error describe the failure. } }, conversationID, diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx index fc072cb13a..2e1fb2845c 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx @@ -18,12 +18,12 @@ OpenIMClient.getInstance().conversationManager.setConversationEx( new OnBase() { @Override public void onSuccess(String data) { - markConversationExtensionSubmitted(conversationID); + // The request completed. } @Override public void onError(int code, String error) { - recordConversationExtensionFailure(code, error); + // code and error describe the failure. } }, conversationID, diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx index 55587e2b5b..e9cc7d7cbd 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx @@ -22,12 +22,12 @@ OpenIMClient.getInstance().conversationManager.setConversation( new OnBase() { @Override public void onSuccess(String data) { - markMessageDestructSubmitted(conversationID); + // The request completed. } @Override public void onError(int code, String error) { - recordMessageDestructFailure(code, error); + // code and error describe the failure. } }, conversationID, diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx index 85d04b8fea..95d4a315f7 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx @@ -16,12 +16,12 @@ OpenIMClient.getInstance().conversationManager.setConversationRecvMessageOpt( new OnBase() { @Override public void onSuccess(String data) { - markReceiveOptionSubmitted(conversationID); + // The request completed. } @Override public void onError(int code, String error) { - recordReceiveOptionFailure(code, error); + // code and error describe the failure. } }, conversationID, diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx index 26906cc6aa..a67ca96cbc 100644 --- a/content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx @@ -16,12 +16,12 @@ OpenIMClient.getInstance().conversationManager.setOneConversationPrivateChat( new OnBase() { @Override public void onSuccess(String data) { - markPrivateChatSubmitted(conversationID, true); + // The request completed. } @Override public void onError(int code, String error) { - recordPrivateChatFailure(code, error); + // code and error describe the failure. } }, conversationID, diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx index ff79159810..d8bb2c3628 100644 --- a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx @@ -18,12 +18,12 @@ OpenIMClient.getInstance().conversationManager.getOneConversation( new OnBase() { @Override public void onSuccess(ConversationInfo conversation) { - openChatPage(conversation); + // conversation contains the target conversation profile. } @Override public void onError(int code, String error) { - recordConversationOpenFailure(code, error); + // code and error describe the failure. } }, sourceId, diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx index 1d67127636..4d7ae4394d 100644 --- a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx @@ -18,14 +18,12 @@ OpenIMClient.getInstance().conversationManager.getMultipleConversation( new OnBase>() { @Override public void onSuccess(List conversations) { - for (ConversationInfo item : conversations) { - conversationStore.put(item.getConversationID(), item); - } + // conversations contains snapshots for the requested conversationIDs. } @Override public void onError(int code, String error) { - recordConversationQueryFailure(code, error); + // code and error describe the failure. } }, conversationIDs diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx index 7bab857da0..c21e08842f 100644 --- a/content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx @@ -20,12 +20,12 @@ OpenIMClient.getInstance().conversationManager.getConversationListSplit( new OnBase>() { @Override public void onSuccess(List conversations) { - mergeConversations(conversations); + // conversations contains the current page. } @Override public void onError(int code, String error) { - recordConversationListFailure(code, error); + // code and error describe the failure. } }, 0, @@ -48,12 +48,12 @@ Use `OnConversationListener` to receive the following callbacks when conversatio OnConversationListener conversationListener = new OnConversationListener() { @Override public void onNewConversation(List conversations) { - mergeConversations(conversations); + // conversations contains newly added conversations. } @Override public void onConversationChanged(List conversations) { - mergeConversations(conversations); + // conversations contains changed conversations. } }; diff --git a/content/docs/chat/sdk/android/file-uploads/upload-file.mdx b/content/docs/chat/sdk/android/file-uploads/upload-file.mdx index 531e2a5ef9..0f982276b8 100644 --- a/content/docs/chat/sdk/android/file-uploads/upload-file.mdx +++ b/content/docs/chat/sdk/android/file-uploads/upload-file.mdx @@ -33,33 +33,33 @@ OpenIMClient.getInstance().uploadFile( new OnBase() { @Override public void onSuccess(String result) { - finishUploadRequest(result); + // result is the final upload request result. } @Override public void onError(int code, String error) { - showUploadError(code, error); + // code and error describe the failure. } }, new OnPutFileListener() { @Override public void open(long size) { - initializeUpload(uploadTaskID, size); + // size is the size of the file to upload. } @Override public void uploadID(String id) { - bindSdkUploadID(uploadTaskID, id); + // id is the upload identifier generated by the SDK. } @Override public void uploadComplete(long fileSize, long streamSize, long storageSize) { - recordUploadSizes(uploadTaskID, fileSize, streamSize, storageSize); + // File, stream, and storage sizes are now available. } @Override public void complete(long size, String url, long type) { - completeUpload(uploadTaskID, size, url, type); + // url is the remote URL of the uploaded resource. } }, args diff --git a/content/docs/chat/sdk/android/group/change-group-mute.mdx b/content/docs/chat/sdk/android/group/change-group-mute.mdx index 5d8824dba4..fd6083dc82 100644 --- a/content/docs/chat/sdk/android/group/change-group-mute.mdx +++ b/content/docs/chat/sdk/android/group/change-group-mute.mdx @@ -15,7 +15,7 @@ Use `changeGroupMute()` to toggle mute-all mode. Pass `true` to enable it or `fa ```java OpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() { - @Override public void onSuccess(String data) { markGroupMuteSubmitted(groupID, true); } - @Override public void onError(int code, String error) { showGroupMuteError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, groupID, true); ``` diff --git a/content/docs/chat/sdk/android/group/create-group.mdx b/content/docs/chat/sdk/android/group/create-group.mdx index f5bc920b48..7a78473783 100644 --- a/content/docs/chat/sdk/android/group/create-group.mdx +++ b/content/docs/chat/sdk/android/group/create-group.mdx @@ -21,8 +21,8 @@ info.setIntroduction("For project members only"); OpenIMClient.getInstance().groupManager.createGroup( memberUserIDs, adminUserIDs, info, ownerUserID, new OnBase() { - @Override public void onSuccess(GroupInfo group) { openGroup(group.getGroupID()); } - @Override public void onError(int code, String error) { showCreateError(error); } + @Override public void onSuccess(GroupInfo group) { /* group contains the new group profile. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } } ); ``` diff --git a/content/docs/chat/sdk/android/group/dismiss-group.mdx b/content/docs/chat/sdk/android/group/dismiss-group.mdx index 7f7184b82d..5c20442b0d 100644 --- a/content/docs/chat/sdk/android/group/dismiss-group.mdx +++ b/content/docs/chat/sdk/android/group/dismiss-group.mdx @@ -15,8 +15,8 @@ sourcePath: '/sdk/android/group/dismiss-group' ```java OpenIMClient.getInstance().groupManager.dismissGroup(new OnBase() { - @Override public void onSuccess(String data) { markDismissSubmitted(groupID); } - @Override public void onError(int code, String error) { showDismissError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, groupID); ``` diff --git a/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx b/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx index feedd62dc2..3b125342ad 100644 --- a/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx @@ -15,8 +15,8 @@ Pass the application's `groupID`, the applicant's `userID`, and a handling messa ```java OpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() { - @Override public void onSuccess(String data) { markApplicationHandled(groupID, applicantUserID); } - @Override public void onError(int code, String error) { showHandleError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, groupID, applicantUserID, "Welcome to the group"); ``` diff --git a/content/docs/chat/sdk/android/group/group-applications/delete-group-requests.mdx b/content/docs/chat/sdk/android/group/group-applications/delete-group-requests.mdx index 1dacfc7457..5fa230d153 100644 --- a/content/docs/chat/sdk/android/group/group-applications/delete-group-requests.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/delete-group-requests.mdx @@ -21,8 +21,8 @@ SimpleGroupRequests[] groupRequests = { DeleteGroupRequestsReq request = new DeleteGroupRequestsReq(groupRequests); OpenIMClient.getInstance().groupManager.deleteGroupRequests(new OnBase() { - @Override public void onSuccess(String data) { showDeleteSuccess(); } - @Override public void onError(int code, String error) { showDeleteError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, request); ``` diff --git a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx index c991e9846e..77d88a11b1 100644 --- a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx @@ -17,8 +17,8 @@ Configure pagination and filters in `GetGroupApplicationListAsApplicantReq`, the GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq(0, 20); OpenIMClient.getInstance().groupManager.getSendGroupApplicationList( new OnBase>() { - @Override public void onSuccess(List items) { mergeSentApplications(items); } - @Override public void onError(int code, String error) { showApplicationError(error); } + @Override public void onSuccess(List items) { /* items contains the current page. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, request); ``` diff --git a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx index aee97e2124..8913e2670c 100644 --- a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx @@ -17,7 +17,7 @@ Pass `GetGroupApplicationListAsRecipientReq` to set pagination and filters. You GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq(0, 20); OpenIMClient.getInstance().groupManager.getRecvGroupApplicationList( new OnBase>() { - @Override public void onSuccess(List items) { mergeReceivedApplications(items); } - @Override public void onError(int code, String error) { showApplicationError(error); } + @Override public void onSuccess(List items) { /* items contains the current page. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, request); ``` diff --git a/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx b/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx index 18f06a1f0b..9b7a7e7d02 100644 --- a/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx +++ b/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx @@ -15,8 +15,8 @@ The reject operation also takes the application's `groupID`, the applicant's `us ```java OpenIMClient.getInstance().groupManager.refuseGroupApplication(new OnBase() { - @Override public void onSuccess(String data) { markApplicationRejected(groupID, applicantUserID); } - @Override public void onError(int code, String error) { showHandleError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, groupID, applicantUserID, "The group is currently full"); ``` diff --git a/content/docs/chat/sdk/android/group/join-group.mdx b/content/docs/chat/sdk/android/group/join-group.mdx index 48373c939a..cfc924d017 100644 --- a/content/docs/chat/sdk/android/group/join-group.mdx +++ b/content/docs/chat/sdk/android/group/join-group.mdx @@ -15,8 +15,8 @@ Use `joinGroup()` to submit a request to join a group. `joinSource` identifies h ```java OpenIMClient.getInstance().groupManager.joinGroup(new OnBase() { - @Override public void onSuccess(String data) { markJoinSubmitted(groupID); } - @Override public void onError(int code, String error) { showJoinError(error); } + @Override public void onSuccess(String data) { /* The request was submitted. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, groupID, "I would like to join the project discussion", 3, "{\"from\":\"search\"}"); ``` diff --git a/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx b/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx index 1dc44d25a0..45784625c4 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx @@ -15,7 +15,7 @@ sourcePath: '/sdk/android/group/managing-group-members/change-group-member-mute' ```java OpenIMClient.getInstance().groupManager.changeGroupMemberMute(new OnBase() { - @Override public void onSuccess(String data) { markMemberMuteSubmitted(groupID, userID); } - @Override public void onError(int code, String error) { showMemberMuteError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, groupID, userID, 3600L); ``` diff --git a/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx b/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx index 527bbf6f88..a9a434bb4b 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx @@ -15,7 +15,7 @@ Pass the group ID, the list of invited user IDs, and an invitation message. A su ```java OpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() { - @Override public void onSuccess(String data) { markInviteSubmitted(groupID); } - @Override public void onError(int code, String error) { showInviteError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, groupID, inviteeUserIDs, "Join the project discussion"); ``` diff --git a/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx b/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx index ec005b603b..75594b113e 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx @@ -15,8 +15,8 @@ sourcePath: '/sdk/android/group/managing-group-members/kick-group-member' ```java OpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() { - @Override public void onSuccess(String data) { markRemovalSubmitted(groupID); } - @Override public void onError(int code, String error) { showRemovalError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, groupID, memberUserIDs, "No longer participating in this project"); ``` diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx index eff6e0ae52..64a32d60ab 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx @@ -20,8 +20,8 @@ update.setUserID(userID); update.setFaceURL(avatarURL); OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { - @Override public void onSuccess(String data) { markAvatarSubmitted(groupID, userID); } - @Override public void onError(int code, String error) { showMemberUpdateError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }); ``` diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx index b19b75284e..2010f86800 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx @@ -20,7 +20,7 @@ update.setUserID(userID); update.setEx("{\"duty\":\"reviewer\"}"); OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { - @Override public void onSuccess(String data) { markMemberExtensionSubmitted(groupID, userID); } - @Override public void onError(int code, String error) { showMemberUpdateError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }); ``` diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx index 6e29137580..640b46230e 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx @@ -20,8 +20,8 @@ update.setUserID(userID); update.setNickname("Lin"); OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { - @Override public void onSuccess(String data) { markNicknameSubmitted(groupID, userID); } - @Override public void onError(int code, String error) { showMemberUpdateError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }); ``` diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx index f016c32d9c..bc85b9135b 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx @@ -20,8 +20,8 @@ update.setUserID(userID); update.setRoleLevel(GroupRole.ADMIN); OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { - @Override public void onSuccess(String data) { markRoleSubmitted(groupID, userID); } - @Override public void onError(int code, String error) { showRoleError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }); ``` diff --git a/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx b/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx index 00aa828d8c..6c760180bf 100644 --- a/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx +++ b/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx @@ -15,8 +15,8 @@ sourcePath: '/sdk/android/group/managing-group-members/transfer-group-owner' ```java OpenIMClient.getInstance().groupManager.transferGroupOwner(new OnBase() { - @Override public void onSuccess(String data) { markOwnershipTransferSubmitted(groupID); } - @Override public void onError(int code, String error) { showTransferError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, groupID, newOwnerUserID); ``` diff --git a/content/docs/chat/sdk/android/group/quit-group.mdx b/content/docs/chat/sdk/android/group/quit-group.mdx index 461fa8a360..ac751d0e2d 100644 --- a/content/docs/chat/sdk/android/group/quit-group.mdx +++ b/content/docs/chat/sdk/android/group/quit-group.mdx @@ -15,8 +15,8 @@ sourcePath: '/sdk/android/group/quit-group' ```java OpenIMClient.getInstance().groupManager.quitGroup(new OnBase() { - @Override public void onSuccess(String data) { removeJoinedGroup(groupID); } - @Override public void onError(int code, String error) { showQuitError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, groupID); ``` diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx index 81a926a794..ccc5c15bb4 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx @@ -16,7 +16,7 @@ Set `filter` to `0` for all members, `1` for regular members, `2` for the owner, ```java OpenIMClient.getInstance().groupManager.getGroupMemberList( new OnBase>() { - @Override public void onSuccess(List members) { appendMembers(members); } - @Override public void onError(int code, String error) { showMemberQueryError(error); } + @Override public void onSuccess(List members) { /* members contains the current page. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, groupID, 0, offset, 50); ``` diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx index 63d0ca3ead..f831753cbc 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx @@ -16,8 +16,8 @@ Use `getGroupMemberOwnerAndAdmin()` when you need to display or check members wi ```java OpenIMClient.getInstance().groupManager.getGroupMemberOwnerAndAdmin( new OnBase>() { - @Override public void onSuccess(List members) { showModerators(members); } - @Override public void onError(int code, String error) { showMemberQueryError(error); } + @Override public void onSuccess(List members) { /* members contains owner and admin profiles. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, groupID); ``` diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx index ad28bc7de7..a9e4d79a54 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx @@ -16,7 +16,7 @@ sourcePath: '/sdk/android/group/retrieving-group-members/get-specified-group-mem ```java OpenIMClient.getInstance().groupManager.getGroupMembersInfo( new OnBase>() { - @Override public void onSuccess(List members) { mergeMembers(members); } - @Override public void onError(int code, String error) { showMemberQueryError(error); } + @Override public void onSuccess(List members) { /* members contains the requested profiles. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, groupID, userIDs); ``` diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx index f59730ae5f..318acae5c0 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx @@ -15,8 +15,8 @@ sourcePath: '/sdk/android/group/retrieving-group-members/get-users-in-group' ```java OpenIMClient.getInstance().groupManager.getUsersInGroup(new OnBase>() { - @Override public void onSuccess(List joinedUserIDs) { updateMembership(joinedUserIDs); } - @Override public void onError(int code, String error) { showMembershipError(error); } + @Override public void onSuccess(List joinedUserIDs) { /* joinedUserIDs contains group member IDs. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, groupID, candidateUserIDs); ``` diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx index 73a100ac9e..9f3138c6e3 100644 --- a/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx @@ -16,8 +16,8 @@ Provide a keyword list, switches for user ID and group nickname matching, and pa ```java OpenIMClient.getInstance().groupManager.searchGroupMembers( new OnBase>() { - @Override public void onSuccess(List members) { showMemberSearch(members); } - @Override public void onError(int code, String error) { showSearchError(error); } + @Override public void onSuccess(List members) { /* members contains the matches. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, groupID, Collections.singletonList(keyword), true, true, 0, 20); ``` diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx index 28e23fe8e6..0bf9762fca 100644 --- a/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx @@ -15,8 +15,8 @@ Start `offset` at `0`, then advance it by the number of items returned in the pr ```java OpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() { - @Override public void onSuccess(List groups) { appendJoinedGroups(groups); } - @Override public void onError(int code, String error) { showPageError(error); } + @Override public void onSuccess(List groups) { /* groups contains the current page. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, offset, 20); ``` diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx index f7dc661163..790133dd69 100644 --- a/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx @@ -15,7 +15,7 @@ The `groupIDs` parameter of `getGroupsInfo()` is the list of group IDs to query. ```java OpenIMClient.getInstance().groupManager.getGroupsInfo(new OnBase>() { - @Override public void onSuccess(List groups) { showGroups(groups); } - @Override public void onError(int code, String error) { showGroupQueryError(error); } + @Override public void onSuccess(List groups) { /* groups contains the requested group profiles. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, groupIDs); ``` diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx index ff95dcb46f..551b32aea2 100644 --- a/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx @@ -15,7 +15,7 @@ sourcePath: '/sdk/android/group/retrieving-groups/is-join-group' ```java OpenIMClient.getInstance().groupManager.isJoinGroup(groupID, new OnBase() { - @Override public void onSuccess(Boolean joined) { updateJoinAction(Boolean.TRUE.equals(joined)); } - @Override public void onError(int code, String error) { showMembershipError(error); } + @Override public void onSuccess(Boolean joined) { /* joined indicates whether the user is a member. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }); ``` diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx index ea6279af9d..4f0b47e6e0 100644 --- a/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx +++ b/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx @@ -15,8 +15,8 @@ sourcePath: '/sdk/android/group/retrieving-groups/search-groups' ```java OpenIMClient.getInstance().groupManager.searchGroups(new OnBase>() { - @Override public void onSuccess(List groups) { showSearchResults(groups); } - @Override public void onError(int code, String error) { showSearchError(error); } + @Override public void onSuccess(List groups) { /* groups contains the matches. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, Collections.singletonList(keyword), true, true); ``` diff --git a/content/docs/chat/sdk/android/group/set-group-announcement.mdx b/content/docs/chat/sdk/android/group/set-group-announcement.mdx index b72fda2dd1..b6ece380fc 100644 --- a/content/docs/chat/sdk/android/group/set-group-announcement.mdx +++ b/content/docs/chat/sdk/android/group/set-group-announcement.mdx @@ -19,8 +19,8 @@ update.setGroupID(groupID); update.setNotification("Release review starts at 20:00 tonight."); OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { - @Override public void onSuccess(String data) { refreshAnnouncement(groupID); } - @Override public void onError(int code, String error) { showAnnouncementError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }); ``` diff --git a/content/docs/chat/sdk/android/group/set-group-extension.mdx b/content/docs/chat/sdk/android/group/set-group-extension.mdx index 4b5406e509..88a5baac90 100644 --- a/content/docs/chat/sdk/android/group/set-group-extension.mdx +++ b/content/docs/chat/sdk/android/group/set-group-extension.mdx @@ -19,7 +19,7 @@ update.setGroupID(groupID); update.setEx("{\"projectCode\":\"mobile\",\"archived\":false}"); OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { - @Override public void onSuccess(String data) { markExtensionSubmitted(groupID); } - @Override public void onError(int code, String error) { showExtensionError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }); ``` diff --git a/content/docs/chat/sdk/android/group/set-group-join-verification.mdx b/content/docs/chat/sdk/android/group/set-group-join-verification.mdx index 6a55069a17..bab2deac1f 100644 --- a/content/docs/chat/sdk/android/group/set-group-join-verification.mdx +++ b/content/docs/chat/sdk/android/group/set-group-join-verification.mdx @@ -19,8 +19,8 @@ update.setGroupID(groupID); update.setNeedVerification(GroupVerification.ALL_NEED_VERIFICATION); OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { - @Override public void onSuccess(String data) { markVerificationSubmitted(groupID); } - @Override public void onError(int code, String error) { showVerificationError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }); ``` diff --git a/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx b/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx index 2360080843..1778db16f9 100644 --- a/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx +++ b/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx @@ -19,7 +19,7 @@ update.setGroupID(groupID); update.setApplyMemberFriend(0); OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { - @Override public void onSuccess(String data) { markFriendPermissionSubmitted(groupID); } - @Override public void onError(int code, String error) { showPermissionError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }); ``` diff --git a/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx b/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx index 76fabb39e8..3d85875a97 100644 --- a/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx +++ b/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx @@ -19,8 +19,8 @@ update.setGroupID(groupID); update.setLookMemberInfo(1); OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { - @Override public void onSuccess(String data) { markMemberInfoAccessSubmitted(groupID); } - @Override public void onError(int code, String error) { showPermissionError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }); ``` diff --git a/content/docs/chat/sdk/android/group/update-group-profile.mdx b/content/docs/chat/sdk/android/group/update-group-profile.mdx index 409fe08188..b81a530b27 100644 --- a/content/docs/chat/sdk/android/group/update-group-profile.mdx +++ b/content/docs/chat/sdk/android/group/update-group-profile.mdx @@ -20,8 +20,8 @@ update.setGroupName("Mobile project team"); update.setIntroduction("Android and iOS collaboration group"); OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { - @Override public void onSuccess(String data) { markGroupUpdateSubmitted(groupID); } - @Override public void onError(int code, String error) { showGroupUpdateError(error); } + @Override public void onSuccess(String data) { /* The request completed. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }); ``` diff --git a/content/docs/chat/sdk/android/logger.mdx b/content/docs/chat/sdk/android/logger.mdx index 43a89db390..ee847ce5ac 100644 --- a/content/docs/chat/sdk/android/logger.mdx +++ b/content/docs/chat/sdk/android/logger.mdx @@ -76,12 +76,12 @@ OpenIMClient.getInstance().uploadLogs( new OnBase() { @Override public void onSuccess(String data) { - showLogUploadCompleted(); + // The log upload request completed. } @Override public void onError(int code, String error) { - showLogUploadError(code, error); + // code and error describe the failure. } }, new ArrayList<>(), @@ -91,7 +91,7 @@ OpenIMClient.getInstance().uploadLogs( new UploadLogProgress() { @Override public void onProgress(long current, long total) { - updateLogUploadProgress(current, total); + // current and total indicate upload progress. } } ); diff --git a/content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx b/content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx index b917b49f26..1017150980 100644 --- a/content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx +++ b/content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx @@ -19,12 +19,12 @@ OpenIMClient.getInstance().conversationManager.getInputState( @Override public void onSuccess(List platformIDs) { boolean typing = platformIDs != null && !platformIDs.isEmpty(); - updateTypingState(conversationID, userID, typing); + // typing indicates the user's current typing status. } @Override public void onError(int code, String error) { - recordTypingStatusQueryFailure(code, error); + // code and error describe the failure. } }, conversationID, diff --git a/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx b/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx index df8cac9c53..350e84de9e 100644 --- a/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx +++ b/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx @@ -23,7 +23,7 @@ conversationManager.changeInputState( @Override public void onError(int code, String error) { - // Handle the failure + // code and error describe why the report failed. } }, conversationID, @@ -51,11 +51,7 @@ public void onConversationUserInputStatusChanged(String payload) { if (state == null || state.getConversationID() == null) { return; } - updateTypingState( - state.getConversationID(), - state.getUserID(), - state.getPlatformIDs() - ); + // state contains the conversation, user, and active typing platforms. } ``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx index 0244f3b587..a6c66032b8 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx @@ -48,6 +48,6 @@ When synchronization is enabled, other clients can receive the deleted message t ```java @Override public void onMsgDeleted(Message message) { - handleDeletedMessage(message); + // message is the deleted message. } ``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx index 1ef37403ee..a2249c6591 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx @@ -36,6 +36,6 @@ Other clients receive the deletion notification through `OnAdvanceMsgListener.on ```java @Override public void onDeleteUserAllMsgsInConv(DeleteUserAllMsgsListenerMsg event) { - handleUserMessagesDeleted(event.getConversationID(), event.getUserID()); + // event identifies the affected conversation and user. } ``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx index 6764cb9f50..217a1ad77a 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx @@ -15,7 +15,7 @@ The success callback returns the messages currently pinned in the specified conv ```java messageManager.getConversationPinnedMsgs(new OnBase>() { - @Override public void onSuccess(List messages) { showPinned(messages); } - @Override public void onError(int code, String error) { showPinnedError(error); } + @Override public void onSuccess(List messages) { /* messages contains pinned messages. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, conversationID); ``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx index 6cca59d3f1..030e50312e 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx @@ -24,7 +24,7 @@ After a message is modified, other clients receive the complete modified `Messag ```java @Override public void onMessageModified(Message message) { - handleModifiedMessage(message); + // message is the modified message. } ``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx index b94bd82c30..5a23139796 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx @@ -24,7 +24,7 @@ The success callback means that the revocation request completed. Other clients ```java @Override public void onRecvMessageRevokedV2(RevokedInfo info) { - handleRevokedMessage(info); + // info identifies the revoked message. } ``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx b/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx index bf37fecfa2..1092150c6b 100644 --- a/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx +++ b/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx @@ -29,7 +29,7 @@ When pinned messages change, `OnAdvanceMsgListener.onChangedPinnedMsg` returns t ```java @Override public void onChangedPinnedMsg(ChangedPinnedMsg event) { - handlePinnedMessagesChanged(event.getConversationID(), event.getMsgs()); + // event.getMsgs() contains messages whose pinned state changed. } ``` diff --git a/content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx b/content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx index 3d92c57d68..0ca2f465cc 100644 --- a/content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx +++ b/content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx @@ -31,7 +31,7 @@ messageManager.getGroupMessageReaderList( new OnBase>() { @Override public void onSuccess(List members) { - renderMembers(members); + // members contains the profiles of members who read the message. } @Override diff --git a/content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx b/content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx index 57c7733234..6399741753 100644 --- a/content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx +++ b/content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx @@ -36,7 +36,7 @@ Other clients receive group-message read receipts through `OnAdvanceMsgListener. ```java @Override public void onRecvGroupMessageReadReceipt(GroupMessageReceipt receipt) { - handleGroupMessageReadReceipt(receipt); + // receipt contains the group message read receipt. } ``` diff --git a/content/docs/chat/sdk/android/message/overview-message.mdx b/content/docs/chat/sdk/android/message/overview-message.mdx index a9310e580a..a91558fa41 100644 --- a/content/docs/chat/sdk/android/message/overview-message.mdx +++ b/content/docs/chat/sdk/android/message/overview-message.mdx @@ -29,22 +29,22 @@ Use `clientMsgID` as the client-side deduplication and update key, together with messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { @Override public void onRecvNewMessage(Message message) { - messageStore.merge(message); + // message is the newly received message. } @Override public void onRecvOfflineNewMessage(List messages) { - messageStore.mergeAll(messages); + // messages contains messages received while offline. } @Override public void onRecvMessageRevokedV2(RevokedInfo info) { - messageStore.markRevoked(info); + // info identifies the revoked message. } @Override public void onMsgDeleted(Message message) { - messageStore.remove(message.getClientMsgID()); + // message is the deleted message. } }); ``` diff --git a/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx b/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx index 586051b37f..eaba350577 100644 --- a/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx +++ b/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx @@ -15,6 +15,6 @@ The custom business callback carries a string payload. Parse it according to you ```java messageManager.setCustomBusinessListener(new OnCustomBusinessListener() { - @Override public void onRecvCustomBusinessMessage(String payload) { handleBusiness(payload); } + @Override public void onRecvCustomBusinessMessage(String payload) { /* payload contains the custom business data. */ } }); ``` diff --git a/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx b/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx index a457313916..18bb9381a9 100644 --- a/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx +++ b/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx @@ -15,7 +15,7 @@ After calling `setAdvancedMsgListener()`, `onRecvNewMessage` receives real-time ```java messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { - @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); } - @Override public void onRecvOfflineNewMessage(List messages) { messageStore.mergeAll(messages); } + @Override public void onRecvNewMessage(Message message) { /* message is the newly received message. */ } + @Override public void onRecvOfflineNewMessage(List messages) { /* messages contains offline messages. */ } }); ``` diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx index c2c9e15cd1..25527d29a1 100644 --- a/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx +++ b/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx @@ -15,7 +15,7 @@ Create a list of `SearchParams` for the messages you need. ```java messageManager.findMessageList(new OnBase() { - @Override public void onSuccess(SearchResult result) { showFoundMessages(result); } - @Override public void onError(int code, String error) { showQueryError(error); } + @Override public void onSuccess(SearchResult result) { /* result contains the matches. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, searchParams); ``` diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx index b66b1d3ba7..38da1d3b69 100644 --- a/content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx +++ b/content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx @@ -29,7 +29,7 @@ messageManager.fetchSurroundingMessages( @Override public void onSuccess(Messages messages) { List surrounding = messages.getData(); - renderMessages(surrounding); + // surrounding contains the target message and its context. } @Override diff --git a/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx b/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx index 7647163d67..76bc9e15a9 100644 --- a/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx +++ b/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx @@ -15,7 +15,7 @@ For a one-to-one message, set `recvUid`. For a group message, set `recvGid`. `On ```java messageManager.sendMessage(new OnMsgSendCallback() { - @Override public void onSuccess(Message sentMessage) { mergeSentMessage(sentMessage); } - @Override public void onError(int code, String error) { showSendError(error); } + @Override public void onSuccess(Message sentMessage) { /* sentMessage is the successfully sent message. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, message, peerUserID, null, offlinePushInfo); ``` diff --git a/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx b/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx index 6e4246c9e5..68aa02ed59 100644 --- a/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx +++ b/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx @@ -15,8 +15,8 @@ Use `OnMsgSendCallback.onProgress()` to receive progress updates for the current ```java messageManager.sendMessage(new OnMsgSendCallback() { - @Override public void onProgress(long progress) { updateProgress(progress); } - @Override public void onSuccess(Message sentMessage) { finishProgress(); } - @Override public void onError(int code, String error) { failProgress(error); } + @Override public void onProgress(long progress) { /* progress is the send progress. */ } + @Override public void onSuccess(Message sentMessage) { /* sentMessage is the successfully sent message. */ } + @Override public void onError(int code, String error) { /* code and error describe the failure. */ } }, message, peerUserID, null, offlinePushInfo); ``` diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx index fec5afe26e..5b9627bfce 100644 --- a/content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx @@ -11,16 +11,12 @@ OpenIMClient.getInstance().signalingManager.signalingAccept( new OnBase() { @Override public void onSuccess(SignalingCertificate credentials) { - joinMediaRoom( - credentials.getRoomID(), - credentials.getToken(), - credentials.getLiveURL() - ); + // credentials 提供 roomID、token 和 liveURL,用于接入媒体房间。 } @Override public void onError(int code, String error) { - showAcceptError(code, error); + // code 和 error 说明失败原因。 } }, receivedInfo diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx index 0f8a9af2e8..3a1bb193e3 100644 --- a/content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx @@ -11,12 +11,12 @@ OpenIMClient.getInstance().signalingManager.signalingCancel( new OnBase() { @Override public void onSuccess(String result) { - stopWaitingForAnswer(activeInfo.getInvitation().getRoomID()); + // 信令操作已完成。 } @Override public void onError(int code, String error) { - showCancelError(code, error); + // code 和 error 说明失败原因。 } }, activeInfo diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx index fecdb61dc7..f38367a353 100644 --- a/content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx @@ -13,57 +13,57 @@ OpenIMClient.getInstance().signalingManager.setSignalingListener( new OnSignalingListener() { @Override public void onReceiveNewInvitation(SignalingInfo info) { - showIncomingCall(info); + // info 包含来电邀请信息。 } @Override public void onInviteeAccepted(SignalingInfo info) { - updateCallStatus(info, "accepted"); + // info 表示通话已接受。 } @Override public void onInviteeRejected(SignalingInfo info) { - updateCallStatus(info, "rejected"); + // info 表示通话已拒绝。 } @Override public void onInvitationCancelled(SignalingInfo info) { - endCall(info); + // info 表示邀请已取消。 } @Override public void onInvitationTimeout(SignalingInfo info) { - endCall(info); + // info 表示邀请已超时。 } @Override public void onInviteeAcceptedByOtherDevice(SignalingInfo info) { - endCall(info); + // info 表示其他设备已接听。 } @Override public void onInviteeRejectedByOtherDevice(SignalingInfo info) { - endCall(info); + // info 表示其他设备已拒绝。 } @Override public void onHangup(SignalingInfo info) { - endCall(info); + // info 表示通话已挂断。 } @Override public void onRoomParticipantConnected(RoomCallingInfo room) { - updateParticipantStatus(room, true); + // room 包含加入后的参与者信息。 } @Override public void onRoomParticipantDisconnected(RoomCallingInfo room) { - updateParticipantStatus(room, false); + // room 包含离开后的参与者信息。 } @Override public void onStreamChange(String streamInfo) { - handleStreamChange(streamInfo); + // streamInfo 包含媒体流变化。 } } ); diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx index 1021466879..717d26082b 100644 --- a/content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx @@ -11,12 +11,12 @@ OpenIMClient.getInstance().signalingManager.signalingHungUp( new OnBase() { @Override public void onSuccess(String result) { - releaseCallResources(signalingInfo.getInvitation().getRoomID()); + // 信令操作已完成。 } @Override public void onError(int code, String error) { - showHangUpError(code, error); + // code 和 error 说明失败原因。 } }, signalingInfo diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx index ce860f6ef2..39d902dd4b 100644 --- a/content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx @@ -11,12 +11,12 @@ OpenIMClient.getInstance().signalingManager.signalingReject( new OnBase() { @Override public void onSuccess(String result) { - closeIncomingCallUI(); + // 拒绝信令请求已完成。 } @Override public void onError(int code, String error) { - showRejectError(code, error); + // code 和 error 说明失败原因。 } }, signalingInfo diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx index f6fb2ddec1..c1ed966cf9 100644 --- a/content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx @@ -28,12 +28,12 @@ OpenIMClient.getInstance().signalingManager.signalingInviteInGroup( new OnBase() { @Override public void onSuccess(SignalingCertificate credentials) { - startGroupCall(credentials); + // credentials 包含加入媒体房间所需凭据。 } @Override public void onError(int code, String error) { - showCallError(code, error); + // code 和 error 说明失败原因。 } }, info diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx index 20a1a84a5d..21aae71ce3 100644 --- a/content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx @@ -56,16 +56,12 @@ OpenIMClient.getInstance().signalingManager.signalingInvite( new OnBase() { @Override public void onSuccess(SignalingCertificate credentials) { - joinMediaRoom( - credentials.getRoomID(), - credentials.getToken(), - credentials.getLiveURL() - ); + // credentials 提供 roomID、token 和 liveURL,用于接入媒体房间。 } @Override public void onError(int code, String error) { - showCallError(code, error); + // code 和 error 说明失败原因。 } }, info diff --git a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx index c0e18c3199..b7de4c5455 100644 --- a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx +++ b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx @@ -11,14 +11,12 @@ OpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID( new OnBase() { @Override public void onSuccess(RoomCallingInfo room) { - if (room.getRoomID() != null && !room.getRoomID().isEmpty()) { - renderParticipants(room.getParticipant()); - } + // room 包含房间、邀请和当前参与者快照。 } @Override public void onError(int code, String error) { - showNoActiveGroupCall(); + // code 和 error 说明查询失败原因。 } }, groupID @@ -27,4 +25,4 @@ OpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID( 成功回调返回 `RoomCallingInfo` 快照,其中包含房间 ID、原始邀请、参与者、群组 ID、Token 和连接地址。 -如果当前群组没有进行中的通话,接口可能返回错误或空房间。此时应清除本地保存的通话状态和房间凭据,不要继续尝试加入旧房间。 +成功结果没有有效 `roomID` 时,表示未取得可用的房间信息。错误回调中的 `code` 和 `error` 只说明查询失败原因,不能据此判断群组没有进行中的通话。 diff --git a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx index 3aa19bee41..a91a9b4008 100644 --- a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx +++ b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx @@ -11,19 +11,12 @@ OpenIMClient.getInstance().signalingManager.signalingGetTokenByRoomID( new OnBase() { @Override public void onSuccess(SignalingCertificate credentials) { - if (credentials.getToken() != null - && credentials.getRoomID() != null) { - joinMediaRoom( - credentials.getRoomID(), - credentials.getToken(), - credentials.getLiveURL() - ); - } + // credentials 提供 roomID、token 和 liveURL,用于接入媒体房间。 } @Override public void onError(int code, String error) { - showCredentialError(code, error); + // code 和 error 说明失败原因。 } }, roomID diff --git a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx index 3f2adc7781..0497310575 100644 --- a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx +++ b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx @@ -11,17 +11,12 @@ OpenIMClient.getInstance().signalingManager.getSignalingInvitationInfoStartApp( new OnBase() { @Override public void onSuccess(SignalingInfo info) { - if (info != null - && info.getInvitation() != null - && info.getInvitation().getRoomID() != null - && !info.getInvitation().getRoomID().isEmpty()) { - restoreIncomingCall(info); - } + // 使用前校验 info 中 invitation 和 roomID 是否有效。 } @Override public void onError(int code, String error) { - clearExpiredIncomingCall(); + // code 和 error 说明查询失败原因。 } } ); diff --git a/content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx b/content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx index 8eda5fecab..6d33e53556 100644 --- a/content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx +++ b/content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx @@ -22,12 +22,12 @@ OpenIMClient.getInstance().signalingManager.signalingSendCustomSignal( new OnBase() { @Override public void onSuccess(String result) { - markSignalSent(eventID); + // 信令发送请求已完成。 } @Override public void onError(int code, String error) { - showSignalError(code, error); + // code 和 error 说明失败原因。 } }, roomID, @@ -44,16 +44,7 @@ OpenIMClient.getInstance().signalingManager.signalingSendCustomSignal( ```java @Override public void onReceiveCustomSignal(CustomSignalingInfo info) { - if (info == null || !activeRoomID.equals(info.getRoomID())) { - return; - } - - CallSignal signal = parseAndValidateCallSignal(info.getCustomInfo()); - String mergeID = info.getRoomID() + ":" + signal.getEventID(); - if (hasAppliedSignal(mergeID)) { - return; - } - applyCallSignal(signal); + // 先检查 info.getRoomID(),再按业务协议解析 info.getCustomInfo()。 } ``` diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx index 15fcac5df1..c17874dd5c 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx @@ -12,12 +12,12 @@ OpenIMClient.getInstance().messageManager.clearConversationAndDeleteAllMsg( new OnBase() { @Override public void onSuccess(String data) { - messageStore.clearConversation(conversationID); + // 请求已完成,消息已清空。 } @Override public void onError(int code, String error) { - recordConversationClearFailure(code, error); + // code 和 error 说明失败原因。 } } ); diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx index d3909620d1..2b1d774d92 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx @@ -11,12 +11,12 @@ OpenIMClient.getInstance().conversationManager.resetConversationGroupAtType( new OnBase() { @Override public void onSuccess(String data) { - markGroupMentionStateReset(conversationID); + // 请求已完成。 } @Override public void onError(int code, String error) { - recordGroupMentionResetFailure(code, error); + // code 和 error 说明失败原因。 } }, conversationID diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx index 7789ef123a..d48cd24c17 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx @@ -11,13 +11,12 @@ OpenIMClient.getInstance().conversationManager.deleteConversationAndDeleteAllMsg new OnBase() { @Override public void onSuccess(String data) { - messageStore.clearConversation(conversationID); - conversationStore.remove(conversationID); + // 请求已完成,会话及其消息已删除。 } @Override public void onError(int code, String error) { - recordConversationDeleteFailure(code, error); + // code 和 error 说明失败原因。 } }, conversationID diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx index 1760a1394d..4ca7d475bf 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx @@ -12,12 +12,12 @@ OpenIMClient.getInstance().conversationManager.getTotalUnreadMsgCount( @Override public void onSuccess(String value) { int totalUnread = Integer.parseInt(value); - updateApplicationBadge(totalUnread); + // totalUnread 是当前账号的未读消息总数。 } @Override public void onError(int code, String error) { - recordTotalUnreadFailure(code, error); + // code 和 error 说明失败原因。 } } ); diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx index 2a04591a94..0e73b7c1f2 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx @@ -11,12 +11,12 @@ OpenIMClient.getInstance().conversationManager.hideConversation( new OnBase() { @Override public void onSuccess(String data) { - conversationStore.remove(conversationID); + // 请求已完成,会话已隐藏。 } @Override public void onError(int code, String error) { - recordConversationHideFailure(code, error); + // code 和 error 说明失败原因。 } }, conversationID diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx index 4e58b324a9..25fb7a0af4 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx @@ -12,12 +12,12 @@ OpenIMClient.getInstance().messageManager.markConversationMessageAsRead( new OnBase() { @Override public void onSuccess(String data) { - markConversationReadSubmitted(conversationID); + // 请求已完成。 } @Override public void onError(int code, String error) { - recordMarkReadFailure(code, error); + // code 和 error 说明失败原因。 } } ); diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx index b372663417..3977f9a9e0 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx @@ -9,12 +9,12 @@ OpenIMClient.getInstance().conversationManager.pinConversation( new OnBase() { @Override public void onSuccess(String data) { - markPinRequestSubmitted(conversationID, true); + // 请求已完成。 } @Override public void onError(int code, String error) { - recordConversationPinFailure(code, error); + // code 和 error 说明失败原因。 } }, conversationID, diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx index 93f7bb7b09..2018155250 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx @@ -9,12 +9,12 @@ OpenIMClient.getInstance().conversationManager.setConversationBurnDuration( new OnBase() { @Override public void onSuccess(String data) { - markBurnDurationSubmitted(conversationID, 30); + // 请求已完成。 } @Override public void onError(int code, String error) { - recordBurnDurationFailure(code, error); + // code 和 error 说明失败原因。 } }, conversationID, diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx index fd6f97c5c4..68be86e62d 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx @@ -11,12 +11,12 @@ OpenIMClient.getInstance().conversationManager.setConversationDraft( new OnBase() { @Override public void onSuccess(String data) { - markDraftSubmitted(conversationID); + // 请求已完成。 } @Override public void onError(int code, String error) { - recordDraftSaveFailure(code, error); + // code 和 error 说明失败原因。 } }, conversationID, diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx index c77e24771d..96b30a70e8 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx @@ -11,12 +11,12 @@ OpenIMClient.getInstance().conversationManager.setConversationEx( new OnBase() { @Override public void onSuccess(String data) { - markConversationExtensionSubmitted(conversationID); + // 请求已完成。 } @Override public void onError(int code, String error) { - recordConversationExtensionFailure(code, error); + // code 和 error 说明失败原因。 } }, conversationID, diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx index c0bf2b2b0a..a153598fab 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx @@ -15,12 +15,12 @@ OpenIMClient.getInstance().conversationManager.setConversation( new OnBase() { @Override public void onSuccess(String data) { - markMessageDestructSubmitted(conversationID); + // 请求已完成。 } @Override public void onError(int code, String error) { - recordMessageDestructFailure(code, error); + // code 和 error 说明失败原因。 } }, conversationID, diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx index 1f9cd9c73c..4e0de26696 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx @@ -9,12 +9,12 @@ OpenIMClient.getInstance().conversationManager.setConversationRecvMessageOpt( new OnBase() { @Override public void onSuccess(String data) { - markReceiveOptionSubmitted(conversationID); + // 请求已完成。 } @Override public void onError(int code, String error) { - recordReceiveOptionFailure(code, error); + // code 和 error 说明失败原因。 } }, conversationID, diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx index 812e53c15c..23ab5b2bef 100644 --- a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx @@ -9,12 +9,12 @@ OpenIMClient.getInstance().conversationManager.setOneConversationPrivateChat( new OnBase() { @Override public void onSuccess(String data) { - markPrivateChatSubmitted(conversationID, true); + // 请求已完成。 } @Override public void onError(int code, String error) { - recordPrivateChatFailure(code, error); + // code 和 error 说明失败原因。 } }, conversationID, diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx index d2465a21c4..65e3f3d9f8 100644 --- a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx @@ -11,12 +11,12 @@ OpenIMClient.getInstance().conversationManager.getOneConversation( new OnBase() { @Override public void onSuccess(ConversationInfo conversation) { - openChatPage(conversation); + // conversation 是目标会话资料。 } @Override public void onError(int code, String error) { - recordConversationOpenFailure(code, error); + // code 和 error 说明失败原因。 } }, sourceId, diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx index 074f48dcd6..357f7d05a6 100644 --- a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx @@ -11,14 +11,12 @@ OpenIMClient.getInstance().conversationManager.getMultipleConversation( new OnBase>() { @Override public void onSuccess(List conversations) { - for (ConversationInfo item : conversations) { - conversationStore.put(item.getConversationID(), item); - } + // conversations 是按 conversationIDs 查询到的会话快照。 } @Override public void onError(int code, String error) { - recordConversationQueryFailure(code, error); + // code 和 error 说明失败原因。 } }, conversationIDs diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx index fab6ae14ce..e8cd75de07 100644 --- a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx @@ -13,12 +13,12 @@ OpenIMClient.getInstance().conversationManager.getConversationListSplit( new OnBase>() { @Override public void onSuccess(List conversations) { - mergeConversations(conversations); + // conversations 是当前页会话列表。 } @Override public void onError(int code, String error) { - recordConversationListFailure(code, error); + // code 和 error 说明失败原因。 } }, 0, @@ -41,12 +41,12 @@ OpenIMClient.getInstance().conversationManager.getConversationListSplit( OnConversationListener conversationListener = new OnConversationListener() { @Override public void onNewConversation(List conversations) { - mergeConversations(conversations); + // conversations 是新增会话。 } @Override public void onConversationChanged(List conversations) { - mergeConversations(conversations); + // conversations 是发生变化的会话。 } }; diff --git a/content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx b/content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx index 10a925a3e1..ee439a6438 100644 --- a/content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx +++ b/content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx @@ -26,33 +26,33 @@ OpenIMClient.getInstance().uploadFile( new OnBase() { @Override public void onSuccess(String result) { - finishUploadRequest(result); + // result 是上传请求的最终结果。 } @Override public void onError(int code, String error) { - showUploadError(code, error); + // code 和 error 说明失败原因。 } }, new OnPutFileListener() { @Override public void open(long size) { - initializeUpload(uploadTaskID, size); + // size 是待上传文件的大小。 } @Override public void uploadID(String id) { - bindSdkUploadID(uploadTaskID, id); + // id 是 SDK 生成的上传标识。 } @Override public void uploadComplete(long fileSize, long streamSize, long storageSize) { - recordUploadSizes(uploadTaskID, fileSize, streamSize, storageSize); + // 文件、流和存储大小均已可用。 } @Override public void complete(long size, String url, long type) { - completeUpload(uploadTaskID, size, url, type); + // url 是已上传资源的远端地址。 } }, args diff --git a/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx b/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx index 50ce81070c..b5c807f503 100644 --- a/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx +++ b/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx @@ -8,7 +8,7 @@ sourcePath: '/sdk/android/group/change-group-mute' ```java OpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() { - @Override public void onSuccess(String data) { markGroupMuteSubmitted(groupID, true); } - @Override public void onError(int code, String error) { showGroupMuteError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, groupID, true); ``` diff --git a/content/zh/docs/chat/sdk/android/group/create-group.mdx b/content/zh/docs/chat/sdk/android/group/create-group.mdx index 1c1433f268..238068cd67 100644 --- a/content/zh/docs/chat/sdk/android/group/create-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/create-group.mdx @@ -14,8 +14,8 @@ info.setIntroduction("仅限项目成员"); OpenIMClient.getInstance().groupManager.createGroup( memberUserIDs, adminUserIDs, info, ownerUserID, new OnBase() { - @Override public void onSuccess(GroupInfo group) { openGroup(group.getGroupID()); } - @Override public void onError(int code, String error) { showCreateError(error); } + @Override public void onSuccess(GroupInfo group) { /* group 包含新群组信息。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } } ); ``` diff --git a/content/zh/docs/chat/sdk/android/group/dismiss-group.mdx b/content/zh/docs/chat/sdk/android/group/dismiss-group.mdx index 394c57f57b..32c538ae0b 100644 --- a/content/zh/docs/chat/sdk/android/group/dismiss-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/dismiss-group.mdx @@ -8,8 +8,8 @@ sourcePath: '/sdk/android/group/dismiss-group' ```java OpenIMClient.getInstance().groupManager.dismissGroup(new OnBase() { - @Override public void onSuccess(String data) { markDismissSubmitted(groupID); } - @Override public void onError(int code, String error) { showDismissError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, groupID); ``` diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx index 9a9588e87f..252bfbc24e 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx @@ -8,8 +8,8 @@ sourcePath: '/sdk/android/group/group-applications/accept-group-application' ```java OpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() { - @Override public void onSuccess(String data) { markApplicationHandled(groupID, applicantUserID); } - @Override public void onError(int code, String error) { showHandleError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, groupID, applicantUserID, "欢迎加入"); ``` diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/delete-group-requests.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/delete-group-requests.mdx index ccb027a4e3..67e9aaafff 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/delete-group-requests.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/delete-group-requests.mdx @@ -14,8 +14,8 @@ SimpleGroupRequests[] groupRequests = { DeleteGroupRequestsReq request = new DeleteGroupRequestsReq(groupRequests); OpenIMClient.getInstance().groupManager.deleteGroupRequests(new OnBase() { - @Override public void onSuccess(String data) { showDeleteSuccess(); } - @Override public void onError(int code, String error) { showDeleteError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, request); ``` diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx index 06fdbc2d25..6a65a6c501 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx @@ -10,8 +10,8 @@ sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq(0, 20); OpenIMClient.getInstance().groupManager.getSendGroupApplicationList( new OnBase>() { - @Override public void onSuccess(List items) { mergeSentApplications(items); } - @Override public void onError(int code, String error) { showApplicationError(error); } + @Override public void onSuccess(List items) { /* items 是当前页申请记录。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, request); ``` diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx index 8603f63c40..38870c29f6 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx @@ -10,7 +10,7 @@ sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq(0, 20); OpenIMClient.getInstance().groupManager.getRecvGroupApplicationList( new OnBase>() { - @Override public void onSuccess(List items) { mergeReceivedApplications(items); } - @Override public void onError(int code, String error) { showApplicationError(error); } + @Override public void onSuccess(List items) { /* items 是当前页申请记录。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, request); ``` diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx index ab05a581df..1b8ef8f83a 100644 --- a/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx +++ b/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx @@ -8,8 +8,8 @@ sourcePath: '/sdk/android/group/group-applications/refuse-group-application' ```java OpenIMClient.getInstance().groupManager.refuseGroupApplication(new OnBase() { - @Override public void onSuccess(String data) { markApplicationRejected(groupID, applicantUserID); } - @Override public void onError(int code, String error) { showHandleError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, groupID, applicantUserID, "当前群组人数已满"); ``` diff --git a/content/zh/docs/chat/sdk/android/group/join-group.mdx b/content/zh/docs/chat/sdk/android/group/join-group.mdx index 26cdf5f95e..78e0fb8d9c 100644 --- a/content/zh/docs/chat/sdk/android/group/join-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/join-group.mdx @@ -8,8 +8,8 @@ sourcePath: '/sdk/android/group/join-group' ```java OpenIMClient.getInstance().groupManager.joinGroup(new OnBase() { - @Override public void onSuccess(String data) { markJoinSubmitted(groupID); } - @Override public void onError(int code, String error) { showJoinError(error); } + @Override public void onSuccess(String data) { /* 请求已提交。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, groupID, "希望加入项目讨论", 3, "{\"from\":\"search\"}"); ``` diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx index 63c2838a47..4b162bbdc8 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx @@ -8,7 +8,7 @@ sourcePath: '/sdk/android/group/managing-group-members/change-group-member-mute' ```java OpenIMClient.getInstance().groupManager.changeGroupMemberMute(new OnBase() { - @Override public void onSuccess(String data) { markMemberMuteSubmitted(groupID, userID); } - @Override public void onError(int code, String error) { showMemberMuteError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, groupID, userID, 3600L); ``` diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx index b8b83eb574..5baa8dac9c 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx @@ -8,7 +8,7 @@ sourcePath: '/sdk/android/group/managing-group-members/invite-user-to-group' ```java OpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() { - @Override public void onSuccess(String data) { markInviteSubmitted(groupID); } - @Override public void onError(int code, String error) { showInviteError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, groupID, inviteeUserIDs, "邀请加入项目讨论"); ``` diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx index c176e8fe13..c7bb5b8a43 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx @@ -8,8 +8,8 @@ sourcePath: '/sdk/android/group/managing-group-members/kick-group-member' ```java OpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() { - @Override public void onSuccess(String data) { markRemovalSubmitted(groupID); } - @Override public void onError(int code, String error) { showRemovalError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, groupID, memberUserIDs, "已不再参与该项目"); ``` diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx index 34100d95e2..155a745e9a 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx @@ -13,8 +13,8 @@ update.setUserID(userID); update.setFaceURL(avatarURL); OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { - @Override public void onSuccess(String data) { markAvatarSubmitted(groupID, userID); } - @Override public void onError(int code, String error) { showMemberUpdateError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }); ``` diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx index 69a1a27fbd..85a98db672 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx @@ -13,7 +13,7 @@ update.setUserID(userID); update.setEx("{\"duty\":\"reviewer\"}"); OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { - @Override public void onSuccess(String data) { markMemberExtensionSubmitted(groupID, userID); } - @Override public void onError(int code, String error) { showMemberUpdateError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }); ``` diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx index b42c8267aa..8659860c89 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx @@ -13,8 +13,8 @@ update.setUserID(userID); update.setNickname("小林"); OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { - @Override public void onSuccess(String data) { markNicknameSubmitted(groupID, userID); } - @Override public void onError(int code, String error) { showMemberUpdateError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }); ``` diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx index b506cff66e..52b02664c0 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx @@ -13,8 +13,8 @@ update.setUserID(userID); update.setRoleLevel(GroupRole.ADMIN); OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { - @Override public void onSuccess(String data) { markRoleSubmitted(groupID, userID); } - @Override public void onError(int code, String error) { showRoleError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }); ``` diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx index c8004f42a3..da192770c1 100644 --- a/content/zh/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx @@ -8,8 +8,8 @@ sourcePath: '/sdk/android/group/managing-group-members/transfer-group-owner' ```java OpenIMClient.getInstance().groupManager.transferGroupOwner(new OnBase() { - @Override public void onSuccess(String data) { markOwnershipTransferSubmitted(groupID); } - @Override public void onError(int code, String error) { showTransferError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, groupID, newOwnerUserID); ``` diff --git a/content/zh/docs/chat/sdk/android/group/quit-group.mdx b/content/zh/docs/chat/sdk/android/group/quit-group.mdx index c741ffd6ee..d066b7dc1e 100644 --- a/content/zh/docs/chat/sdk/android/group/quit-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/quit-group.mdx @@ -8,8 +8,8 @@ sourcePath: '/sdk/android/group/quit-group' ```java OpenIMClient.getInstance().groupManager.quitGroup(new OnBase() { - @Override public void onSuccess(String data) { removeJoinedGroup(groupID); } - @Override public void onError(int code, String error) { showQuitError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, groupID); ``` diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx index bc060fbaae..27e88ce289 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx @@ -9,7 +9,7 @@ sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-list' ```java OpenIMClient.getInstance().groupManager.getGroupMemberList( new OnBase>() { - @Override public void onSuccess(List members) { appendMembers(members); } - @Override public void onError(int code, String error) { showMemberQueryError(error); } + @Override public void onSuccess(List members) { /* members 是当前页成员。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, groupID, 0, offset, 50); ``` diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx index 04615b225b..014f7368ad 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx @@ -9,8 +9,8 @@ sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-owner- ```java OpenIMClient.getInstance().groupManager.getGroupMemberOwnerAndAdmin( new OnBase>() { - @Override public void onSuccess(List members) { showModerators(members); } - @Override public void onError(int code, String error) { showMemberQueryError(error); } + @Override public void onSuccess(List members) { /* members 是查询到的成员资料。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, groupID); ``` diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx index aa57030034..34a5b5dbcf 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx @@ -9,7 +9,7 @@ sourcePath: '/sdk/android/group/retrieving-group-members/get-specified-group-mem ```java OpenIMClient.getInstance().groupManager.getGroupMembersInfo( new OnBase>() { - @Override public void onSuccess(List members) { mergeMembers(members); } - @Override public void onError(int code, String error) { showMemberQueryError(error); } + @Override public void onSuccess(List members) { /* members 是查询到的成员资料。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, groupID, userIDs); ``` diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx index 35c1c08851..779d413231 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx @@ -8,8 +8,8 @@ sourcePath: '/sdk/android/group/retrieving-group-members/get-users-in-group' ```java OpenIMClient.getInstance().groupManager.getUsersInGroup(new OnBase>() { - @Override public void onSuccess(List joinedUserIDs) { updateMembership(joinedUserIDs); } - @Override public void onError(int code, String error) { showMembershipError(error); } + @Override public void onSuccess(List joinedUserIDs) { /* joinedUserIDs 是在群成员 ID。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, groupID, candidateUserIDs); ``` diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx index b85d2d3f91..5554b60717 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx @@ -9,8 +9,8 @@ sourcePath: '/sdk/android/group/retrieving-group-members/search-group-members' ```java OpenIMClient.getInstance().groupManager.searchGroupMembers( new OnBase>() { - @Override public void onSuccess(List members) { showMemberSearch(members); } - @Override public void onError(int code, String error) { showSearchError(error); } + @Override public void onSuccess(List members) { /* members 是查询结果。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, groupID, Collections.singletonList(keyword), true, true, 0, 20); ``` diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx index 4d7ced64f3..9da28c409c 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx @@ -8,8 +8,8 @@ sourcePath: '/sdk/android/group/retrieving-groups/get-joined-group-list-page' ```java OpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() { - @Override public void onSuccess(List groups) { appendJoinedGroups(groups); } - @Override public void onError(int code, String error) { showPageError(error); } + @Override public void onSuccess(List groups) { /* groups 是当前页群组。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, offset, 20); ``` diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx index 5d04ee7ac9..63b3a10b74 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx @@ -8,7 +8,7 @@ sourcePath: '/sdk/android/group/retrieving-groups/get-specified-groups-info' ```java OpenIMClient.getInstance().groupManager.getGroupsInfo(new OnBase>() { - @Override public void onSuccess(List groups) { showGroups(groups); } - @Override public void onError(int code, String error) { showGroupQueryError(error); } + @Override public void onSuccess(List groups) { /* groups 是查询到的群组资料。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, groupIDs); ``` diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx index 3b8eeef047..3770d43528 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx @@ -8,7 +8,7 @@ sourcePath: '/sdk/android/group/retrieving-groups/is-join-group' ```java OpenIMClient.getInstance().groupManager.isJoinGroup(groupID, new OnBase() { - @Override public void onSuccess(Boolean joined) { updateJoinAction(Boolean.TRUE.equals(joined)); } - @Override public void onError(int code, String error) { showMembershipError(error); } + @Override public void onSuccess(Boolean joined) { /* joined 表示当前用户是否已在群内。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }); ``` diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx index 6387371460..711584e69e 100644 --- a/content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx @@ -8,8 +8,8 @@ sourcePath: '/sdk/android/group/retrieving-groups/search-groups' ```java OpenIMClient.getInstance().groupManager.searchGroups(new OnBase>() { - @Override public void onSuccess(List groups) { showSearchResults(groups); } - @Override public void onError(int code, String error) { showSearchError(error); } + @Override public void onSuccess(List groups) { /* groups 是查询结果。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, Collections.singletonList(keyword), true, true); ``` diff --git a/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx b/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx index 620b49f57e..0863cec592 100644 --- a/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx +++ b/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx @@ -12,8 +12,8 @@ update.setGroupID(groupID); update.setNotification("今晚 20:00 进行版本发布确认。"); OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { - @Override public void onSuccess(String data) { refreshAnnouncement(groupID); } - @Override public void onError(int code, String error) { showAnnouncementError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }); ``` diff --git a/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx b/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx index 24f6a878b1..e37eb1816d 100644 --- a/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx +++ b/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx @@ -12,7 +12,7 @@ update.setGroupID(groupID); update.setEx("{\"projectCode\":\"mobile\",\"archived\":false}"); OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { - @Override public void onSuccess(String data) { markExtensionSubmitted(groupID); } - @Override public void onError(int code, String error) { showExtensionError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }); ``` diff --git a/content/zh/docs/chat/sdk/android/group/set-group-join-verification.mdx b/content/zh/docs/chat/sdk/android/group/set-group-join-verification.mdx index 04c67d00a6..593a15445e 100644 --- a/content/zh/docs/chat/sdk/android/group/set-group-join-verification.mdx +++ b/content/zh/docs/chat/sdk/android/group/set-group-join-verification.mdx @@ -12,8 +12,8 @@ update.setGroupID(groupID); update.setNeedVerification(GroupVerification.ALL_NEED_VERIFICATION); OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { - @Override public void onSuccess(String data) { markVerificationSubmitted(groupID); } - @Override public void onError(int code, String error) { showVerificationError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }); ``` diff --git a/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx b/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx index 48d8f0a688..4446cc3fe7 100644 --- a/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx +++ b/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx @@ -12,7 +12,7 @@ update.setGroupID(groupID); update.setApplyMemberFriend(0); OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { - @Override public void onSuccess(String data) { markFriendPermissionSubmitted(groupID); } - @Override public void onError(int code, String error) { showPermissionError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }); ``` diff --git a/content/zh/docs/chat/sdk/android/group/set-group-member-profile-access.mdx b/content/zh/docs/chat/sdk/android/group/set-group-member-profile-access.mdx index 82a448d4b9..80ed04d3c1 100644 --- a/content/zh/docs/chat/sdk/android/group/set-group-member-profile-access.mdx +++ b/content/zh/docs/chat/sdk/android/group/set-group-member-profile-access.mdx @@ -12,8 +12,8 @@ update.setGroupID(groupID); update.setLookMemberInfo(1); OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { - @Override public void onSuccess(String data) { markMemberInfoAccessSubmitted(groupID); } - @Override public void onError(int code, String error) { showPermissionError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }); ``` diff --git a/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx b/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx index 0aee2f5a99..18fa56304b 100644 --- a/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx +++ b/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx @@ -13,8 +13,8 @@ update.setGroupName("移动端项目组"); update.setIntroduction("Android 与 iOS 协作群"); OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { - @Override public void onSuccess(String data) { markGroupUpdateSubmitted(groupID); } - @Override public void onError(int code, String error) { showGroupUpdateError(error); } + @Override public void onSuccess(String data) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }); ``` diff --git a/content/zh/docs/chat/sdk/android/logger.mdx b/content/zh/docs/chat/sdk/android/logger.mdx index f1ff5e38e9..5a41a470c6 100644 --- a/content/zh/docs/chat/sdk/android/logger.mdx +++ b/content/zh/docs/chat/sdk/android/logger.mdx @@ -69,12 +69,12 @@ OpenIMClient.getInstance().uploadLogs( new OnBase() { @Override public void onSuccess(String data) { - showLogUploadCompleted(); + // 日志上传请求已完成。 } @Override public void onError(int code, String error) { - showLogUploadError(code, error); + // code 和 error 说明失败原因。 } }, new ArrayList<>(), @@ -84,7 +84,7 @@ OpenIMClient.getInstance().uploadLogs( new UploadLogProgress() { @Override public void onProgress(long current, long total) { - updateLogUploadProgress(current, total); + // current 和 total 表示上传进度。 } } ); diff --git a/content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx b/content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx index 805d1ab4b7..876c389c15 100644 --- a/content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx +++ b/content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx @@ -12,12 +12,12 @@ OpenIMClient.getInstance().conversationManager.getInputState( @Override public void onSuccess(List platformIDs) { boolean typing = platformIDs != null && !platformIDs.isEmpty(); - updateTypingState(conversationID, userID, typing); + // typing 表示该用户当前输入状态。 } @Override public void onError(int code, String error) { - recordTypingStatusQueryFailure(code, error); + // code 和 error 说明失败原因。 } }, conversationID, diff --git a/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx b/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx index 438680a073..164f46a3c3 100644 --- a/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx +++ b/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx @@ -16,7 +16,7 @@ conversationManager.changeInputState( @Override public void onError(int code, String error) { - // 处理失败 + // code 和 error 说明上报失败原因。 } }, conversationID, @@ -44,11 +44,7 @@ public void onConversationUserInputStatusChanged(String payload) { if (state == null || state.getConversationID() == null) { return; } - updateTypingState( - state.getConversationID(), - state.getUserID(), - state.getPlatformIDs() - ); + // state 包含会话、用户和正在输入的平台。 } ``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx index 5e586f2381..d06bf194b3 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx @@ -41,6 +41,6 @@ messageManager.deleteMessages(request, new OnBase() { ```java @Override public void onMsgDeleted(Message message) { - handleDeletedMessage(message); + // message 是已删除的消息。 } ``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx index 1e929bb17b..3703f43b58 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx @@ -29,6 +29,6 @@ messageManager.deleteUserAllMessagesInConv( ```java @Override public void onDeleteUserAllMsgsInConv(DeleteUserAllMsgsListenerMsg event) { - handleUserMessagesDeleted(event.getConversationID(), event.getUserID()); + // event 包含受影响的会话和用户。 } ``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx index 2117a64206..757e5b193b 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx @@ -8,7 +8,7 @@ sourcePath: '/sdk/android/message/managing-messages/get-pinned-messages' ```java messageManager.getConversationPinnedMsgs(new OnBase>() { - @Override public void onSuccess(List messages) { showPinned(messages); } - @Override public void onError(int code, String error) { showPinnedError(error); } + @Override public void onSuccess(List messages) { /* messages 是置顶消息。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, conversationID); ``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx index 5ca54ee1c2..c30a9b1579 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx @@ -17,7 +17,7 @@ messageManager.modifyMessage(callback, modifyRequest); ```java @Override public void onMessageModified(Message message) { - handleModifiedMessage(message); + // message 是修改后的消息。 } ``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx index e614784ef1..b522330e0d 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx @@ -17,7 +17,7 @@ messageManager.revokeMessageV2(callback, conversationID, clientMsgID); ```java @Override public void onRecvMessageRevokedV2(RevokedInfo info) { - handleRevokedMessage(info); + // info 包含被撤回消息的信息。 } ``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx index 34fa3c24e7..f8dfe734d2 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx @@ -22,7 +22,7 @@ messageManager.setConversationPinnedMsg( ```java @Override public void onChangedPinnedMsg(ChangedPinnedMsg event) { - handlePinnedMessagesChanged(event.getConversationID(), event.getMsgs()); + // event.getMsgs() 是置顶状态发生变化的消息。 } ``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx b/content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx index 69cb232f33..0a0b29d80d 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx @@ -24,7 +24,7 @@ messageManager.getGroupMessageReaderList( new OnBase>() { @Override public void onSuccess(List members) { - renderMembers(members); + // members 是已读该消息的成员资料。 } @Override diff --git a/content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx b/content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx index ad6f6fbdc6..d0230101ca 100644 --- a/content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx +++ b/content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx @@ -29,7 +29,7 @@ messageManager.sendGroupMessageReadReceipt( ```java @Override public void onRecvGroupMessageReadReceipt(GroupMessageReceipt receipt) { - handleGroupMessageReadReceipt(receipt); + // receipt 包含群消息已读回执。 } ``` diff --git a/content/zh/docs/chat/sdk/android/message/overview-message.mdx b/content/zh/docs/chat/sdk/android/message/overview-message.mdx index 7882702afe..65117066cc 100644 --- a/content/zh/docs/chat/sdk/android/message/overview-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/overview-message.mdx @@ -22,22 +22,22 @@ Android SDK 使用 `Message` 表示一条消息。消息创建、发送、接收 messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { @Override public void onRecvNewMessage(Message message) { - messageStore.merge(message); + // message 是新收到的消息。 } @Override public void onRecvOfflineNewMessage(List messages) { - messageStore.mergeAll(messages); + // messages 是离线期间收到的消息。 } @Override public void onRecvMessageRevokedV2(RevokedInfo info) { - messageStore.markRevoked(info); + // info 包含被撤回消息的信息。 } @Override public void onMsgDeleted(Message message) { - messageStore.remove(message.getClientMsgID()); + // message 是已删除的消息。 } }); ``` diff --git a/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx index 778fe7f27a..1105d06bf1 100644 --- a/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx @@ -8,6 +8,6 @@ sourcePath: '/sdk/android/message/receiving-messages/receive-custom-business-mes ```java messageManager.setCustomBusinessListener(new OnCustomBusinessListener() { - @Override public void onRecvCustomBusinessMessage(String payload) { handleBusiness(payload); } + @Override public void onRecvCustomBusinessMessage(String payload) { /* payload 是自定义业务数据。 */ } }); ``` diff --git a/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx index a40a62f25f..c4701ccacb 100644 --- a/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx +++ b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx @@ -8,7 +8,7 @@ sourcePath: '/sdk/android/message/receiving-messages/receive-messages' ```java messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { - @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); } - @Override public void onRecvOfflineNewMessage(List messages) { messageStore.mergeAll(messages); } + @Override public void onRecvNewMessage(Message message) { /* message 是新收到的消息。 */ } + @Override public void onRecvOfflineNewMessage(List messages) { /* messages 是离线消息。 */ } }); ``` diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx index 61e502a207..94c143ea5f 100644 --- a/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx @@ -8,7 +8,7 @@ sourcePath: '/sdk/android/message/retrieving-messages/find-messages-by-id' ```java messageManager.findMessageList(new OnBase() { - @Override public void onSuccess(SearchResult result) { showFoundMessages(result); } - @Override public void onError(int code, String error) { showQueryError(error); } + @Override public void onSuccess(SearchResult result) { /* result 是查询结果。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, searchParams); ``` diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx index a49bef9e50..dc71530a3d 100644 --- a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx @@ -22,7 +22,7 @@ messageManager.fetchSurroundingMessages( @Override public void onSuccess(Messages messages) { List surrounding = messages.getData(); - renderMessages(surrounding); + // surrounding 是目标消息及其上下文。 } @Override diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx index e5238bbe27..6d6cb7aa56 100644 --- a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx @@ -8,7 +8,7 @@ sourcePath: '/sdk/android/message/sending-messages/send-message' ```java messageManager.sendMessage(new OnMsgSendCallback() { - @Override public void onSuccess(Message sentMessage) { mergeSentMessage(sentMessage); } - @Override public void onError(int code, String error) { showSendError(error); } + @Override public void onSuccess(Message sentMessage) { /* sentMessage 是发送成功的消息。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, message, peerUserID, null, offlinePushInfo); ``` diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx index 52469a47f2..6ecbf1cc18 100644 --- a/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx @@ -8,8 +8,8 @@ sourcePath: '/sdk/android/message/sending-messages/set-msg-send-progress-listene ```java messageManager.sendMessage(new OnMsgSendCallback() { - @Override public void onProgress(long progress) { updateProgress(progress); } - @Override public void onSuccess(Message sentMessage) { finishProgress(); } - @Override public void onError(int code, String error) { failProgress(error); } + @Override public void onProgress(long progress) { /* progress 是发送进度。 */ } + @Override public void onSuccess(Message sentMessage) { /* sentMessage 是发送成功的消息。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } }, message, peerUserID, null, offlinePushInfo); ``` diff --git a/data/structure/android-content-audit.json b/data/structure/android-content-audit.json index a4fc1e6672..d815b63702 100644 --- a/data/structure/android-content-audit.json +++ b/data/structure/android-content-audit.json @@ -80,7 +80,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -92,7 +92,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -120,7 +120,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -132,7 +132,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -160,7 +160,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -172,7 +172,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -200,7 +200,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -212,7 +212,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -240,7 +240,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -252,7 +252,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -280,7 +280,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -292,7 +292,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -320,7 +320,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -332,7 +332,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -360,7 +360,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -372,7 +372,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -400,7 +400,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -412,7 +412,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -440,7 +440,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -452,7 +452,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -480,7 +480,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -492,7 +492,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -520,7 +520,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -532,7 +532,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -560,7 +560,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -572,7 +572,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -600,7 +600,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -612,7 +612,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -640,7 +640,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -652,7 +652,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -717,7 +717,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -729,7 +729,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -757,7 +757,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -769,7 +769,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -797,7 +797,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -809,7 +809,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -837,7 +837,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -849,7 +849,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -877,7 +877,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-18", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -889,7 +889,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-18", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -954,7 +954,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -966,7 +966,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -994,7 +994,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1006,7 +1006,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1034,7 +1034,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1046,7 +1046,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1074,7 +1074,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1086,7 +1086,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1114,7 +1114,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1126,7 +1126,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1154,7 +1154,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1166,7 +1166,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1194,7 +1194,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1206,7 +1206,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1234,7 +1234,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1246,7 +1246,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1274,7 +1274,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1286,7 +1286,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1314,7 +1314,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1326,7 +1326,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1354,7 +1354,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1366,7 +1366,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1394,7 +1394,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1406,7 +1406,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1434,7 +1434,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -1446,7 +1446,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -2686,7 +2686,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -2698,7 +2698,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -2766,7 +2766,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -2778,7 +2778,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -2811,7 +2811,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -2823,7 +2823,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -2851,7 +2851,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -2863,7 +2863,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -2891,7 +2891,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -2903,7 +2903,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -2931,7 +2931,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -2943,7 +2943,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -2971,7 +2971,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -2983,7 +2983,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3011,7 +3011,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3023,7 +3023,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3055,7 +3055,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3067,7 +3067,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3098,7 +3098,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3110,7 +3110,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3138,7 +3138,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3150,7 +3150,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3178,7 +3178,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3190,7 +3190,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3218,7 +3218,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3230,7 +3230,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3258,7 +3258,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3270,7 +3270,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3298,7 +3298,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3310,7 +3310,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3338,7 +3338,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3350,7 +3350,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3380,7 +3380,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -3395,7 +3395,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4352,7 +4352,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4364,7 +4364,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4430,7 +4430,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4442,7 +4442,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4471,7 +4471,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4483,7 +4483,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4514,7 +4514,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4527,7 +4527,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4636,7 +4636,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4648,7 +4648,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4677,7 +4677,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4690,7 +4690,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4763,7 +4763,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4776,7 +4776,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4805,7 +4805,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4817,7 +4817,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4887,7 +4887,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4900,7 +4900,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4933,7 +4933,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4946,7 +4946,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4977,7 +4977,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -4990,7 +4990,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5021,7 +5021,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5034,7 +5034,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5063,7 +5063,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5075,7 +5075,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5105,7 +5105,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5118,7 +5118,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5351,7 +5351,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5364,7 +5364,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5394,7 +5394,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5406,7 +5406,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-17", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5436,7 +5436,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5450,7 +5450,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5517,7 +5517,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5530,7 +5530,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5560,7 +5560,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5573,7 +5573,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5602,7 +5602,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5614,7 +5614,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5642,7 +5642,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5654,7 +5654,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5682,7 +5682,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5694,7 +5694,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5722,7 +5722,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5734,7 +5734,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5776,7 +5776,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5789,7 +5789,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5818,7 +5818,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5830,7 +5830,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5859,7 +5859,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5872,7 +5872,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5902,7 +5902,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5915,7 +5915,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5948,7 +5948,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -5961,7 +5961,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -6041,7 +6041,7 @@ "zh": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-07", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ @@ -6056,7 +6056,7 @@ "en": { "reviewStatus": "published", "reviewer": "Codex", - "reviewedAt": "2026-08-10", + "reviewedAt": "2026-08-20", "exampleVerification": { "status": "verified", "evidence": [ diff --git a/src/generated/android-sdk-zh-content.json b/src/generated/android-sdk-zh-content.json index c3a527c295..6124dbf351 100644 --- a/src/generated/android-sdk-zh-content.json +++ b/src/generated/android-sdk-zh-content.json @@ -1014,7 +1014,7 @@ "title": "会话概览" }, "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target": { - "body": "`getOneConversation()` 按用户或群组获取一个会话信息,适用于从通讯录、用户资料或群资料进入聊天页的场景。单聊传对方用户 ID,群聊传群组 ID。\n\n```java\nOpenIMClient.getInstance().conversationManager.getOneConversation(\n new OnBase() {\n @Override\n public void onSuccess(ConversationInfo conversation) {\n openChatPage(conversation);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationOpenFailure(code, error);\n }\n },\n sourceId,\n ConversationType.SINGLE_CHAT\n);\n```\n\n参数 `sourceId` 在单聊中是对方 `userID`,在群聊中是 `groupID`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。\n\n成功回调返回 `ConversationInfo`。如果需要接收会话列表的新增或变化,请参考[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)设置 `OnConversationListener`。", + "body": "`getOneConversation()` 按用户或群组获取一个会话信息,适用于从通讯录、用户资料或群资料进入聊天页的场景。单聊传对方用户 ID,群聊传群组 ID。\n\n```java\nOpenIMClient.getInstance().conversationManager.getOneConversation(\n new OnBase() {\n @Override\n public void onSuccess(ConversationInfo conversation) {\n // conversation 是目标会话资料。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n sourceId,\n ConversationType.SINGLE_CHAT\n);\n```\n\n参数 `sourceId` 在单聊中是对方 `userID`,在群聊中是 `groupID`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。\n\n成功回调返回 `ConversationInfo`。如果需要接收会话列表的新增或变化,请参考[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)设置 `OnConversationListener`。", "description": "使用 getOneConversation() 按用户或群组获取一个会话。", "headings": [], "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", @@ -1028,14 +1028,14 @@ "title": "生成会话 ID" }, "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id": { - "body": "使用 `getMultipleConversation()` 根据 `conversationIDs` 查询多个会话。`conversationIDs` 是待查询的会话 ID 列表。\n\n```java\nOpenIMClient.getInstance().conversationManager.getMultipleConversation(\n new OnBase>() {\n @Override\n public void onSuccess(List conversations) {\n for (ConversationInfo item : conversations) {\n conversationStore.put(item.getConversationID(), item);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationQueryFailure(code, error);\n }\n },\n conversationIDs\n);\n```\n\n成功回调返回 `List`。", + "body": "使用 `getMultipleConversation()` 根据 `conversationIDs` 查询多个会话。`conversationIDs` 是待查询的会话 ID 列表。\n\n```java\nOpenIMClient.getInstance().conversationManager.getMultipleConversation(\n new OnBase>() {\n @Override\n public void onSuccess(List conversations) {\n // conversations 是按 conversationIDs 查询到的会话快照。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n conversationIDs\n);\n```\n\n成功回调返回 `List`。", "description": "使用 getMultipleConversation() 按 conversationID 批量获取会话。", "headings": [], "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", "title": "按 ID 批量获取会话" }, "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list": { - "body": "会话列表属于当前登录用户。每条 `ConversationInfo` 包含会话标识、未读数、最后一条消息、置顶和草稿等状态。\n\n## 分页获取会话\n\n```java\nOpenIMClient.getInstance().conversationManager.getConversationListSplit(\n new OnBase>() {\n @Override\n public void onSuccess(List conversations) {\n mergeConversations(conversations);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationListFailure(code, error);\n }\n },\n 0,\n 50\n);\n```\n\n| 参数 | 类型 | 说明 |\n| -------- | ------ | ------------------------------------------- |\n| `offset` | `long` | 从 `0` 开始的分页偏移量;刷新时重置为 `0`。 |\n| `count` | `long` | 本页期望返回的会话数量。 |\n\n成功回调返回当前页 `List`。继续加载时按已经请求的条目数量推进 `offset`;返回数量小于 `count` 时通常表示到达末页。\n\n## 保持列表同步\n\n会话列表发生新增或变化时,可以通过 `OnConversationListener` 接收以下 callback:\n\n```java\nOnConversationListener conversationListener = new OnConversationListener() {\n @Override\n public void onNewConversation(List conversations) {\n mergeConversations(conversations);\n }\n\n @Override\n public void onConversationChanged(List conversations) {\n mergeConversations(conversations);\n }\n};\n\nOpenIMClient.getInstance().conversationManager.setOnConversationListener(\n conversationListener\n);\n```\n\n两个事件都携带 `List`,可按 `conversationID` 更新列表中的对应会话。`setOnConversationListener()` 设置后即可接收会话变化。", + "body": "会话列表属于当前登录用户。每条 `ConversationInfo` 包含会话标识、未读数、最后一条消息、置顶和草稿等状态。\n\n## 分页获取会话\n\n```java\nOpenIMClient.getInstance().conversationManager.getConversationListSplit(\n new OnBase>() {\n @Override\n public void onSuccess(List conversations) {\n // conversations 是当前页会话列表。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n 0,\n 50\n);\n```\n\n| 参数 | 类型 | 说明 |\n| -------- | ------ | ------------------------------------------- |\n| `offset` | `long` | 从 `0` 开始的分页偏移量;刷新时重置为 `0`。 |\n| `count` | `long` | 本页期望返回的会话数量。 |\n\n成功回调返回当前页 `List`。继续加载时按已经请求的条目数量推进 `offset`;返回数量小于 `count` 时通常表示到达末页。\n\n## 保持列表同步\n\n会话列表发生新增或变化时,可以通过 `OnConversationListener` 接收以下 callback:\n\n```java\nOnConversationListener conversationListener = new OnConversationListener() {\n @Override\n public void onNewConversation(List conversations) {\n // conversations 是新增会话。\n }\n\n @Override\n public void onConversationChanged(List conversations) {\n // conversations 是发生变化的会话。\n }\n};\n\nOpenIMClient.getInstance().conversationManager.setOnConversationListener(\n conversationListener\n);\n```\n\n两个事件都携带 `List`,可按 `conversationID` 更新列表中的对应会话。`setOnConversationListener()` 设置后即可接收会话变化。", "description": "使用 getConversationListSplit() 分页获取当前账号的会话列表。", "headings": [ { @@ -1053,91 +1053,91 @@ "title": "获取会话列表" }, "/sdk/android/conversation/managing-conversations/pin-conversation": { - "body": "```java\nOpenIMClient.getInstance().conversationManager.pinConversation(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markPinRequestSubmitted(conversationID, true);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationPinFailure(code, error);\n }\n },\n conversationID,\n true\n);\n```\n\n最后一个参数为 `true` 时置顶,传 `false` 时取消置顶。\n\n会话列表发生变化时,可通过 `onConversationChanged` 接收更新,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "body": "```java\nOpenIMClient.getInstance().conversationManager.pinConversation(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 请求已完成。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n conversationID,\n true\n);\n```\n\n最后一个参数为 `true` 时置顶,传 `false` 时取消置顶。\n\n会话列表发生变化时,可通过 `onConversationChanged` 接收更新,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", "description": "使用 pinConversation() 设置指定会话的置顶状态。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/pin-conversation", "title": "置顶或取消置顶会话" }, "/sdk/android/conversation/managing-conversations/set-conversation-extension": { - "body": "`ex` 是用于保存会话扩展信息的字符串,可以传入 JSON 字符串或其他业务约定格式的字符串。\n\n```java\nOpenIMClient.getInstance().conversationManager.setConversationEx(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markConversationExtensionSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationExtensionFailure(code, error);\n }\n },\n conversationID,\n extensionJSON\n);\n```\n\n成功回调表示设置请求已完成。会话列表中的扩展字段变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "body": "`ex` 是用于保存会话扩展信息的字符串,可以传入 JSON 字符串或其他业务约定格式的字符串。\n\n```java\nOpenIMClient.getInstance().conversationManager.setConversationEx(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 请求已完成。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n conversationID,\n extensionJSON\n);\n```\n\n成功回调表示设置请求已完成。会话列表中的扩展字段变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", "description": "使用 setConversationEx() 设置指定会话的业务扩展字符串。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", "title": "设置会话扩展字段" }, "/sdk/android/conversation/managing-conversations/set-conversation-draft": { - "body": "用户离开聊天页、切换会话或输入框内容变化时,可以使用 `setConversationDraft()` 保存草稿。输入过程中先维护编辑器状态并对保存调用做防抖;离开页面前再提交一次最新文本。\n\n```java\nOpenIMClient.getInstance().conversationManager.setConversationDraft(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markDraftSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordDraftSaveFailure(code, error);\n }\n },\n conversationID,\n editorValue\n);\n```\n\n清空草稿时传空字符串。会话列表中的草稿变化可通过 `onConversationChanged` 接收。", + "body": "用户离开聊天页、切换会话或输入框内容变化时,可以使用 `setConversationDraft()` 保存草稿。输入过程中先维护编辑器状态并对保存调用做防抖;离开页面前再提交一次最新文本。\n\n```java\nOpenIMClient.getInstance().conversationManager.setConversationDraft(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 请求已完成。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n conversationID,\n editorValue\n);\n```\n\n清空草稿时传空字符串。会话列表中的草稿变化可通过 `onConversationChanged` 接收。", "description": "使用 setConversationDraft() 保存会话草稿。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", "title": "设置会话草稿" }, "/sdk/android/conversation/managing-conversations/set-message-receive-option": { - "body": "```java\nOpenIMClient.getInstance().conversationManager.setConversationRecvMessageOpt(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markReceiveOptionSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordReceiveOptionFailure(code, error);\n }\n },\n conversationID,\n 2\n);\n```\n\n| 数值 | 含义 |\n| ---- | ---------------------------- |\n| `0` | 正常接收消息并允许通知。 |\n| `1` | 不接收该会话消息,也不通知。 |\n| `2` | 接收该会话消息,但不通知。 |\n\n账号级默认策略见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。会话列表中的接收方式变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "body": "```java\nOpenIMClient.getInstance().conversationManager.setConversationRecvMessageOpt(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 请求已完成。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n conversationID,\n 2\n);\n```\n\n| 数值 | 含义 |\n| ---- | ---------------------------- |\n| `0` | 正常接收消息并允许通知。 |\n| `1` | 不接收该会话消息,也不通知。 |\n| `2` | 接收该会话消息,但不通知。 |\n\n账号级默认策略见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。会话列表中的接收方式变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", "description": "使用 setConversationRecvMessageOpt() 设置单个会话的消息接收与通知方式。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", "title": "设置会话消息接收方式" }, "/sdk/android/conversation/managing-conversations/clear-group-mentions": { - "body": "群聊消息中有人 @ 当前用户或 @ 全体成员时,`groupAtType` 用于标记会话列表中的提醒状态。当前用户阅读相关消息后,调用 `resetConversationGroupAtType()` 清除该会话 `groupAtType` 的 @ 提醒状态,并更新会话列表 UI。\n\n```java\nOpenIMClient.getInstance().conversationManager.resetConversationGroupAtType(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markGroupMentionStateReset(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordGroupMentionResetFailure(code, error);\n }\n },\n conversationID\n);\n```\n\n会话列表中的状态变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "body": "群聊消息中有人 @ 当前用户或 @ 全体成员时,`groupAtType` 用于标记会话列表中的提醒状态。当前用户阅读相关消息后,调用 `resetConversationGroupAtType()` 清除该会话 `groupAtType` 的 @ 提醒状态,并更新会话列表 UI。\n\n```java\nOpenIMClient.getInstance().conversationManager.resetConversationGroupAtType(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 请求已完成。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n conversationID\n);\n```\n\n会话列表中的状态变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", "description": "使用 resetConversationGroupAtType() 将指定会话的群聊 @ 状态重置为普通状态。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", "title": "重置群聊 @ 状态" }, "/sdk/android/conversation/managing-conversations/mark-conversation-read": { - "body": "用户打开会话并阅读完当前可见消息后,调用 `messageManager.markConversationMessageAsRead()` 标记会话已读。不要在仅预览通知或后台收到消息时提前标记。\n\n```java\nOpenIMClient.getInstance().messageManager.markConversationMessageAsRead(\n conversationID,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markConversationReadSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordMarkReadFailure(code, error);\n }\n }\n);\n```\n\n成功回调表示标记请求已完成。需要更新会话列表时,可重新查询会话或通过 `onConversationChanged` 接收变化。\n\n对于单聊,可以通过 `OnAdvanceMsgListener.onRecvC2CReadReceipt` 监听对端发来的已读回执。消息监听器的设置方式见[接收消息](/sdk/android/message/receiving-messages/receive-messages),消息回调和已读回执字段见[消息概览](/sdk/android/message/overview-message)。", + "body": "用户打开会话并阅读完当前可见消息后,调用 `messageManager.markConversationMessageAsRead()` 标记会话已读。不要在仅预览通知或后台收到消息时提前标记。\n\n```java\nOpenIMClient.getInstance().messageManager.markConversationMessageAsRead(\n conversationID,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 请求已完成。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n }\n);\n```\n\n成功回调表示标记请求已完成。需要更新会话列表时,可重新查询会话或通过 `onConversationChanged` 接收变化。\n\n对于单聊,可以通过 `OnAdvanceMsgListener.onRecvC2CReadReceipt` 监听对端发来的已读回执。消息监听器的设置方式见[接收消息](/sdk/android/message/receiving-messages/receive-messages),消息回调和已读回执字段见[消息概览](/sdk/android/message/overview-message)。", "description": "使用 messageManager.markConversationMessageAsRead() 将指定会话的消息标记为已读。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", "title": "标记会话已读" }, "/sdk/android/conversation/managing-conversations/get-total-unread-count": { - "body": "`getTotalUnreadMsgCount()` 返回当前账号所有会话的总未读数。\n\n```java\nOpenIMClient.getInstance().conversationManager.getTotalUnreadMsgCount(\n new OnBase() {\n @Override\n public void onSuccess(String value) {\n int totalUnread = Integer.parseInt(value);\n updateApplicationBadge(totalUnread);\n }\n\n @Override\n public void onError(int code, String error) {\n recordTotalUnreadFailure(code, error);\n }\n }\n);\n```\n\n回调值是 `String`,解析后即可用于显示总未读数。\n\n总未读数发生变化时,可以通过 `OnConversationListener.onTotalUnreadMessageCountChanged(int count)` 接收更新;监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "body": "`getTotalUnreadMsgCount()` 返回当前账号所有会话的总未读数。\n\n```java\nOpenIMClient.getInstance().conversationManager.getTotalUnreadMsgCount(\n new OnBase() {\n @Override\n public void onSuccess(String value) {\n int totalUnread = Integer.parseInt(value);\n // totalUnread 是当前账号的未读消息总数。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n }\n);\n```\n\n回调值是 `String`,解析后即可用于显示总未读数。\n\n总未读数发生变化时,可以通过 `OnConversationListener.onTotalUnreadMessageCountChanged(int count)` 接收更新;监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", "description": "使用 getTotalUnreadMsgCount() 获取当前账号的总未读数。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", "title": "获取消息总未读数" }, "/sdk/android/conversation/managing-conversations/set-private-chat": { - "body": "```java\nOpenIMClient.getInstance().conversationManager.setOneConversationPrivateChat(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markPrivateChatSubmitted(conversationID, true);\n }\n\n @Override\n public void onError(int code, String error) {\n recordPrivateChatFailure(code, error);\n }\n },\n conversationID,\n true\n);\n```\n\n传入 `false` 关闭阅后即焚。具体保留时长由 `burnDuration` 单独设置,见[设置阅后即焚时长](/sdk/android/conversation/managing-conversations/set-burn-duration)。该能力与定期删除服务端消息不同。\n\n会话列表中的阅后即焚状态变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "body": "```java\nOpenIMClient.getInstance().conversationManager.setOneConversationPrivateChat(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 请求已完成。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n conversationID,\n true\n);\n```\n\n传入 `false` 关闭阅后即焚。具体保留时长由 `burnDuration` 单独设置,见[设置阅后即焚时长](/sdk/android/conversation/managing-conversations/set-burn-duration)。该能力与定期删除服务端消息不同。\n\n会话列表中的阅后即焚状态变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", "description": "使用 setOneConversationPrivateChat() 设置会话的阅后即焚模式。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/set-private-chat", "title": "开启或关闭阅后即焚" }, "/sdk/android/conversation/managing-conversations/set-burn-duration": { - "body": "```java\nOpenIMClient.getInstance().conversationManager.setConversationBurnDuration(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markBurnDurationSubmitted(conversationID, 30);\n }\n\n @Override\n public void onError(int code, String error) {\n recordBurnDurationFailure(code, error);\n }\n },\n conversationID,\n 30\n);\n```\n\n`burnDuration` 的单位为秒。启用或关闭阅后即焚需要设置 `isPrivateChat`,见[开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat)。不要把它与服务端消息定期删除周期 `msgDestructTime` 混用。\n\n会话列表中的时长变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "body": "```java\nOpenIMClient.getInstance().conversationManager.setConversationBurnDuration(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 请求已完成。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n conversationID,\n 30\n);\n```\n\n`burnDuration` 的单位为秒。启用或关闭阅后即焚需要设置 `isPrivateChat`,见[开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat)。不要把它与服务端消息定期删除周期 `msgDestructTime` 混用。\n\n会话列表中的时长变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", "description": "使用 setConversationBurnDuration() 设置阅后即焚模式的消息保留时长。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/set-burn-duration", "title": "设置阅后即焚时长" }, "/sdk/android/conversation/managing-conversations/set-message-destruct": { - "body": "`isMsgDestruct` 与 `msgDestructTime` 共同构成服务端消息定期删除设置,可以在一次 `ConversationReq` 中提交。\n\n```java\nConversationReq request = new ConversationReq();\nrequest.setMsgDestruct(true);\nrequest.setMsgDestructTime(3600);\n\nOpenIMClient.getInstance().conversationManager.setConversation(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n markMessageDestructSubmitted(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordMessageDestructFailure(code, error);\n }\n },\n conversationID,\n request\n);\n```\n\n`msgDestructTime` 的单位为秒。关闭时只传 `request.setMsgDestruct(false)`;该能力用于定期删除服务端消息,不是阅后即焚。\n\n会话列表中的设置变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "body": "`isMsgDestruct` 与 `msgDestructTime` 共同构成服务端消息定期删除设置,可以在一次 `ConversationReq` 中提交。\n\n```java\nConversationReq request = new ConversationReq();\nrequest.setMsgDestruct(true);\nrequest.setMsgDestructTime(3600);\n\nOpenIMClient.getInstance().conversationManager.setConversation(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 请求已完成。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n conversationID,\n request\n);\n```\n\n`msgDestructTime` 的单位为秒。关闭时只传 `request.setMsgDestruct(false)`;该能力用于定期删除服务端消息,不是阅后即焚。\n\n会话列表中的设置变化可通过 `onConversationChanged` 接收,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", "description": "使用 setConversation() 启用、关闭并配置会话的服务端消息定期删除策略。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-destruct", "title": "定期删除服务端消息" }, "/sdk/android/conversation/managing-conversations/hide-a-conversation": { - "body": "`hideConversation()` 只隐藏当前登录用户的会话入口,不会删除单聊关系、退出群组或影响其他用户。\n\n```java\nOpenIMClient.getInstance().conversationManager.hideConversation(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n conversationStore.remove(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationHideFailure(code, error);\n }\n },\n conversationID\n);\n```\n\n该方法适合临时从聊天列表移除入口。收到新消息或重新同步后,隐藏的会话可能再次出现。\n\n成功回调表示隐藏请求已完成,调用端可以从当前列表移除该 `conversationID`。会话列表后续发生变化时,可通过 `onConversationChanged` 接收更新,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "body": "`hideConversation()` 只隐藏当前登录用户的会话入口,不会删除单聊关系、退出群组或影响其他用户。\n\n```java\nOpenIMClient.getInstance().conversationManager.hideConversation(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 请求已完成,会话已隐藏。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n conversationID\n);\n```\n\n该方法适合临时从聊天列表移除入口。收到新消息或重新同步后,隐藏的会话可能再次出现。\n\n成功回调表示隐藏请求已完成,调用端可以从当前列表移除该 `conversationID`。会话列表后续发生变化时,可通过 `onConversationChanged` 接收更新,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", "description": "使用 hideConversation() 从当前账号的会话列表隐藏入口。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", "title": "隐藏会话" }, "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages": { - "body": "`deleteConversationAndDeleteAllMsg()` 删除指定会话及其全部消息。\n\n```java\nOpenIMClient.getInstance().conversationManager.deleteConversationAndDeleteAllMsg(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n messageStore.clearConversation(conversationID);\n conversationStore.remove(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationDeleteFailure(code, error);\n }\n },\n conversationID\n);\n```\n\n成功回调后清理当前消息列表和会话行。该操作不删除好友关系,也不退出或解散群组;聊天目标仍存在时,会话可能由新消息或同步重新生成。\n\n需要更新会话列表时,可重新查询会话或通过 `onConversationChanged` 接收变化,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", + "body": "`deleteConversationAndDeleteAllMsg()` 删除指定会话及其全部消息。\n\n```java\nOpenIMClient.getInstance().conversationManager.deleteConversationAndDeleteAllMsg(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 请求已完成,会话及其消息已删除。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n conversationID\n);\n```\n\n成功回调后清理当前消息列表和会话行。该操作不删除好友关系,也不退出或解散群组;聊天目标仍存在时,会话可能由新消息或同步重新生成。\n\n需要更新会话列表时,可重新查询会话或通过 `onConversationChanged` 接收变化,监听器设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。", "description": "使用 deleteConversationAndDeleteAllMsg() 删除指定会话及其全部消息。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", "title": "删除会话及消息" }, "/sdk/android/conversation/managing-conversations/clear-conversation-messages": { - "body": "`messageManager.clearConversationAndDeleteAllMsg()` 清空指定会话的消息并保留会话入口。\n\n```java\nOpenIMClient.getInstance().messageManager.clearConversationAndDeleteAllMsg(\n conversationID,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n messageStore.clearConversation(conversationID);\n }\n\n @Override\n public void onError(int code, String error) {\n recordConversationClearFailure(code, error);\n }\n }\n);\n```\n\n成功回调后,会话入口仍然保留,但当前账号下的消息会被清除。需要更新会话列表时,可重新查询会话或通过 `onConversationChanged` 接收变化。", + "body": "`messageManager.clearConversationAndDeleteAllMsg()` 清空指定会话的消息并保留会话入口。\n\n```java\nOpenIMClient.getInstance().messageManager.clearConversationAndDeleteAllMsg(\n conversationID,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 请求已完成,消息已清空。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n }\n);\n```\n\n成功回调后,会话入口仍然保留,但当前账号下的消息会被清除。需要更新会话列表时,可重新查询会话或通过 `onConversationChanged` 接收变化。", "description": "使用 messageManager.clearConversationAndDeleteAllMsg() 保留会话入口并清空其消息。", "headings": [], "sourcePath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", @@ -1167,238 +1167,238 @@ "title": "群组概览" }, "/sdk/android/group/create-group": { - "body": "使用 `createGroup()` 创建群组。`GroupInfo` 填写群资料;初始普通成员、管理员和群主分别通过独立参数传入。成功回调返回创建后的完整 `GroupInfo`,其中包含新群组的 `groupID`。\n\n```java\nGroupInfo info = new GroupInfo();\ninfo.setGroupName(\"项目讨论\");\ninfo.setIntroduction(\"仅限项目成员\");\n\nOpenIMClient.getInstance().groupManager.createGroup(\n memberUserIDs, adminUserIDs, info, ownerUserID,\n new OnBase() {\n @Override public void onSuccess(GroupInfo group) { openGroup(group.getGroupID()); }\n @Override public void onError(int code, String error) { showCreateError(error); }\n }\n);\n```", + "body": "使用 `createGroup()` 创建群组。`GroupInfo` 填写群资料;初始普通成员、管理员和群主分别通过独立参数传入。成功回调返回创建后的完整 `GroupInfo`,其中包含新群组的 `groupID`。\n\n```java\nGroupInfo info = new GroupInfo();\ninfo.setGroupName(\"项目讨论\");\ninfo.setIntroduction(\"仅限项目成员\");\n\nOpenIMClient.getInstance().groupManager.createGroup(\n memberUserIDs, adminUserIDs, info, ownerUserID,\n new OnBase() {\n @Override public void onSuccess(GroupInfo group) { /* group 包含新群组信息。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n }\n);\n```", "description": "使用 createGroup 创建群资料并指定初始成员、管理员和群主。", "headings": [], "sourcePath": "/sdk/android/group/create-group", "title": "创建群组" }, "/sdk/android/group/update-group-profile": { - "body": "使用 `setGroupInfo()` 更新群资料。请求对象包含 `groupID` 和需要修改的字段,只提交本次要更新的内容。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setGroupName(\"移动端项目组\");\nupdate.setIntroduction(\"Android 与 iOS 协作群\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markGroupUpdateSubmitted(groupID); }\n @Override public void onError(int code, String error) { showGroupUpdateError(error); }\n});\n```\n\n群公告和扩展字段使用相同接口,分别见相关页面。", + "body": "使用 `setGroupInfo()` 更新群资料。请求对象包含 `groupID` 和需要修改的字段,只提交本次要更新的内容。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setGroupName(\"移动端项目组\");\nupdate.setIntroduction(\"Android 与 iOS 协作群\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n});\n```\n\n群公告和扩展字段使用相同接口,分别见相关页面。", "description": "使用 setGroupInfo 更新群名称、头像、简介和其他群资料字段。", "headings": [], "sourcePath": "/sdk/android/group/update-group-profile", "title": "更新群名称、简介和头像" }, "/sdk/android/group/set-group-announcement": { - "body": "构造包含 `groupID` 与 `notification` 的 `GroupInfo`,再调用 `setGroupInfo()`。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setNotification(\"今晚 20:00 进行版本发布确认。\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { refreshAnnouncement(groupID); }\n @Override public void onError(int code, String error) { showAnnouncementError(error); }\n});\n```\n\n公告的更新时间和更新人保存在 `GroupInfo` 的 `notificationUpdateTime`、`notificationUserID` 字段中;需要读取时查询群资料。", + "body": "构造包含 `groupID` 与 `notification` 的 `GroupInfo`,再调用 `setGroupInfo()`。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setNotification(\"今晚 20:00 进行版本发布确认。\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n});\n```\n\n公告的更新时间和更新人保存在 `GroupInfo` 的 `notificationUpdateTime`、`notificationUserID` 字段中;需要读取时查询群资料。", "description": "通过 GroupInfo.notification 发布或更新群公告。", "headings": [], "sourcePath": "/sdk/android/group/set-group-announcement", "title": "发布或更新群公告" }, "/sdk/android/group/set-group-extension": { - "body": "`GroupInfo.ex` 是完整字符串,SDK 不会合并 JSON;提交新值会替换原有内容。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setEx(\"{\\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false}\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markExtensionSubmitted(groupID); }\n @Override public void onError(int code, String error) { showExtensionError(error); }\n});\n```", + "body": "`GroupInfo.ex` 是完整字符串,SDK 不会合并 JSON;提交新值会替换原有内容。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setEx(\"{\\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false}\");\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n});\n```", "description": "通过 GroupInfo.ex 保存应用定义的群组扩展数据。", "headings": [], "sourcePath": "/sdk/android/group/set-group-extension", "title": "设置群组扩展字段" }, "/sdk/android/group/set-group-join-verification": { - "body": "入群验证写入 `GroupInfo.needVerification`,再调用 `setGroupInfo()`。可使用 `GroupVerification` 常量:`APPLY_NEED_VERIFICATION_INVITE_DIRECTLY`、`ALL_NEED_VERIFICATION` 和 `DIRECTLY`。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setNeedVerification(GroupVerification.ALL_NEED_VERIFICATION);\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markVerificationSubmitted(groupID); }\n @Override public void onError(int code, String error) { showVerificationError(error); }\n});\n```\n\n该设置影响后续入群请求,不替代对已存在申请的同意或拒绝处理。", + "body": "入群验证写入 `GroupInfo.needVerification`,再调用 `setGroupInfo()`。可使用 `GroupVerification` 常量:`APPLY_NEED_VERIFICATION_INVITE_DIRECTLY`、`ALL_NEED_VERIFICATION` 和 `DIRECTLY`。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setNeedVerification(GroupVerification.ALL_NEED_VERIFICATION);\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n});\n```\n\n该设置影响后续入群请求,不替代对已存在申请的同意或拒绝处理。", "description": "通过 GroupInfo.needVerification 配置申请和邀请的入群验证规则。", "headings": [], "sourcePath": "/sdk/android/group/set-group-join-verification", "title": "设置入群验证方式" }, "/sdk/android/group/set-group-member-profile-access": { - "body": "`lookMemberInfo` 使用整数开关:`0` 关闭,`1` 打开。更新时只提交该权限字段和 `groupID`。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setLookMemberInfo(1);\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markMemberInfoAccessSubmitted(groupID); }\n @Override public void onError(int code, String error) { showPermissionError(error); }\n});\n```\n\n此开关约束通过群组入口获取成员资料的权限,不改变成员已经拥有的用户资料。", + "body": "`lookMemberInfo` 使用整数开关:`0` 关闭,`1` 打开。更新时只提交该权限字段和 `groupID`。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setLookMemberInfo(1);\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n});\n```\n\n此开关约束通过群组入口获取成员资料的权限,不改变成员已经拥有的用户资料。", "description": "通过 GroupInfo.lookMemberInfo 设置是否允许通过群组查看成员资料。", "headings": [], "sourcePath": "/sdk/android/group/set-group-member-profile-access", "title": "设置成员资料查看权限" }, "/sdk/android/group/set-group-member-friend-permission": { - "body": "`applyMemberFriend` 使用整数开关:`0` 关闭,`1` 打开。该规则只影响从该群成员关系入口发起的好友申请。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setApplyMemberFriend(0);\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markFriendPermissionSubmitted(groupID); }\n @Override public void onError(int code, String error) { showPermissionError(error); }\n});\n```", + "body": "`applyMemberFriend` 使用整数开关:`0` 关闭,`1` 打开。该规则只影响从该群成员关系入口发起的好友申请。\n\n```java\nGroupInfo update = new GroupInfo();\nupdate.setGroupID(groupID);\nupdate.setApplyMemberFriend(0);\n\nOpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n});\n```", "description": "通过 GroupInfo.applyMemberFriend 设置是否允许从群成员发起好友申请。", "headings": [], "sourcePath": "/sdk/android/group/set-group-member-friend-permission", "title": "设置群内添加好友权限" }, "/sdk/android/group/change-group-mute": { - "body": "使用 `changeGroupMute()` 切换全员禁言。`true` 开启,`false` 关闭;成员级禁言见[禁言或解除禁言群成员](/sdk/android/group/managing-group-members/change-group-member-mute)。\n\n```java\nOpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() {\n @Override public void onSuccess(String data) { markGroupMuteSubmitted(groupID, true); }\n @Override public void onError(int code, String error) { showGroupMuteError(error); }\n}, groupID, true);\n```", + "body": "使用 `changeGroupMute()` 切换全员禁言。`true` 开启,`false` 关闭;成员级禁言见[禁言或解除禁言群成员](/sdk/android/group/managing-group-members/change-group-member-mute)。\n\n```java\nOpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, groupID, true);\n```", "description": "使用 changeGroupMute 开启或关闭群组全员禁言。", "headings": [], "sourcePath": "/sdk/android/group/change-group-mute", "title": "设置群组全员禁言" }, "/sdk/android/group/join-group": { - "body": "使用 `joinGroup()` 提交入群请求。`joinSource` 表示入群来源:`2` 表示邀请,`3` 表示搜索,`4` 表示二维码;带扩展数据时使用五参数重载。\n\n```java\nOpenIMClient.getInstance().groupManager.joinGroup(new OnBase() {\n @Override public void onSuccess(String data) { markJoinSubmitted(groupID); }\n @Override public void onError(int code, String error) { showJoinError(error); }\n}, groupID, \"希望加入项目讨论\", 3, \"{\\\"from\\\":\\\"search\\\"}\");\n```\n\n[入群验证方式](/sdk/android/group/set-group-join-verification)决定用户是直接加入还是先提交申请。需要审核时,成功回调只表示申请已提交;实际加入后通过 `onJoinedGroupAdded` 接收通知。", + "body": "使用 `joinGroup()` 提交入群请求。`joinSource` 表示入群来源:`2` 表示邀请,`3` 表示搜索,`4` 表示二维码;带扩展数据时使用五参数重载。\n\n```java\nOpenIMClient.getInstance().groupManager.joinGroup(new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已提交。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, groupID, \"希望加入项目讨论\", 3, \"{\\\"from\\\":\\\"search\\\"}\");\n```\n\n[入群验证方式](/sdk/android/group/set-group-join-verification)决定用户是直接加入还是先提交申请。需要审核时,成功回调只表示申请已提交;实际加入后通过 `onJoinedGroupAdded` 接收通知。", "description": "使用 joinGroup 提交入群申请或加入请求。", "headings": [], "sourcePath": "/sdk/android/group/join-group", "title": "申请加入群组" }, "/sdk/android/group/quit-group": { - "body": "`quitGroup()` 仅作用于当前登录用户,不会解散群组或移除其他成员。\n\n```java\nOpenIMClient.getInstance().groupManager.quitGroup(new OnBase() {\n @Override public void onSuccess(String data) { removeJoinedGroup(groupID); }\n @Override public void onError(int code, String error) { showQuitError(error); }\n}, groupID);\n```\n\n请求成功后,继续处理 `onJoinedGroupDeleted` 回调。", + "body": "`quitGroup()` 仅作用于当前登录用户,不会解散群组或移除其他成员。\n\n```java\nOpenIMClient.getInstance().groupManager.quitGroup(new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, groupID);\n```\n\n请求成功后,继续处理 `onJoinedGroupDeleted` 回调。", "description": "使用 quitGroup 让当前登录用户退出指定群组。", "headings": [], "sourcePath": "/sdk/android/group/quit-group", "title": "退出群组" }, "/sdk/android/group/dismiss-group": { - "body": "`dismissGroup()` 解散指定群组,仅群主可执行。\n\n```java\nOpenIMClient.getInstance().groupManager.dismissGroup(new OnBase() {\n @Override public void onSuccess(String data) { markDismissSubmitted(groupID); }\n @Override public void onError(int code, String error) { showDismissError(error); }\n}, groupID);\n```\n\n通过 `onGroupDismissed` 接收群组解散通知。", + "body": "`dismissGroup()` 解散指定群组,仅群主可执行。\n\n```java\nOpenIMClient.getInstance().groupManager.dismissGroup(new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, groupID);\n```\n\n通过 `onGroupDismissed` 接收群组解散通知。", "description": "使用 dismissGroup 解散当前用户有权限管理的群组。", "headings": [], "sourcePath": "/sdk/android/group/dismiss-group", "title": "解散群组" }, "/sdk/android/group/retrieving-groups/get-specified-groups-info": { - "body": "`getGroupsInfo()` 的 `groupIDs` 参数为要查询的群组 ID 列表,返回结果为 `GroupInfo` 列表。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupsInfo(new OnBase>() {\n @Override public void onSuccess(List groups) { showGroups(groups); }\n @Override public void onError(int code, String error) { showGroupQueryError(error); }\n}, groupIDs);\n```", + "body": "`getGroupsInfo()` 的 `groupIDs` 参数为要查询的群组 ID 列表,返回结果为 `GroupInfo` 列表。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupsInfo(new OnBase>() {\n @Override public void onSuccess(List groups) { /* groups 是查询到的群组资料。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, groupIDs);\n```", "description": "使用 getGroupsInfo 批量查询指定群组的最新资料。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", "title": "查询指定群组资料" }, "/sdk/android/group/retrieving-groups/get-joined-group-list-page": { - "body": "`offset` 从 `0` 开始,后续页按上一页返回的条目数推进;返回为空时停止加载。\n\n```java\nOpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() {\n @Override public void onSuccess(List groups) { appendJoinedGroups(groups); }\n @Override public void onError(int code, String error) { showPageError(error); }\n}, offset, 20);\n```\n\n加入或退出群组时,通过 `onJoinedGroupAdded` 和 `onJoinedGroupDeleted` 接收通知。", + "body": "`offset` 从 `0` 开始,后续页按上一页返回的条目数推进;返回为空时停止加载。\n\n```java\nOpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() {\n @Override public void onSuccess(List groups) { /* groups 是当前页群组。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, offset, 20);\n```\n\n加入或退出群组时,通过 `onJoinedGroupAdded` 和 `onJoinedGroupDeleted` 接收通知。", "description": "使用 getJoinedGroupListPage 分页读取当前账号已加入的群组。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", "title": "分页获取已加入群组" }, "/sdk/android/group/retrieving-groups/is-join-group": { - "body": "`isJoinGroup()`检查当前登录用户是否加入目标群组,参数为 `groupID`。\n\n```java\nOpenIMClient.getInstance().groupManager.isJoinGroup(groupID, new OnBase() {\n @Override public void onSuccess(Boolean joined) { updateJoinAction(Boolean.TRUE.equals(joined)); }\n @Override public void onError(int code, String error) { showMembershipError(error); }\n});\n```", + "body": "`isJoinGroup()`检查当前登录用户是否加入目标群组,参数为 `groupID`。\n\n```java\nOpenIMClient.getInstance().groupManager.isJoinGroup(groupID, new OnBase() {\n @Override public void onSuccess(Boolean joined) { /* joined 表示当前用户是否已在群内。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n});\n```", "description": "使用 isJoinGroup 查询当前登录用户是否已经加入指定群组。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", "title": "检查是否已加入群组" }, "/sdk/android/group/retrieving-groups/search-groups": { - "body": "`searchGroups()` 接收关键词列表,并分别指定是否搜索群 ID、群名称。两个开关都关闭时没有有效搜索范围。\n\n```java\nOpenIMClient.getInstance().groupManager.searchGroups(new OnBase>() {\n @Override public void onSuccess(List groups) { showSearchResults(groups); }\n @Override public void onError(int code, String error) { showSearchError(error); }\n}, Collections.singletonList(keyword), true, true);\n```\n\n用户不一定是 `searchGroups()` 搜索到的群组的群成员,是否为群成员通过 [`isJoinGroup()`](/sdk/android/group/retrieving-groups/is-join-group) 确定。", + "body": "`searchGroups()` 接收关键词列表,并分别指定是否搜索群 ID、群名称。两个开关都关闭时没有有效搜索范围。\n\n```java\nOpenIMClient.getInstance().groupManager.searchGroups(new OnBase>() {\n @Override public void onSuccess(List groups) { /* groups 是查询结果。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, Collections.singletonList(keyword), true, true);\n```\n\n用户不一定是 `searchGroups()` 搜索到的群组的群成员,是否为群成员通过 [`isJoinGroup()`](/sdk/android/group/retrieving-groups/is-join-group) 确定。", "description": "使用 searchGroups 按群 ID 或群名称搜索本地可查询的群组。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-groups/search-groups", "title": "搜索群组" }, "/sdk/android/group/group-applications/get-group-application-list-as-recipient": { - "body": "传入 `GetGroupApplicationListAsRecipientReq` 设置分页和筛选条件。可设置 `offset`、`count`、`groupIDs` 和 `handleResults`。\n\n```java\nGetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq(0, 20);\nOpenIMClient.getInstance().groupManager.getRecvGroupApplicationList(\n new OnBase>() {\n @Override public void onSuccess(List items) { mergeReceivedApplications(items); }\n @Override public void onError(int code, String error) { showApplicationError(error); }\n }, request);\n```", + "body": "传入 `GetGroupApplicationListAsRecipientReq` 设置分页和筛选条件。可设置 `offset`、`count`、`groupIDs` 和 `handleResults`。\n\n```java\nGetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq(0, 20);\nOpenIMClient.getInstance().groupManager.getRecvGroupApplicationList(\n new OnBase>() {\n @Override public void onSuccess(List items) { /* items 是当前页申请记录。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n }, request);\n```", "description": "使用 getRecvGroupApplicationList 分页读取当前用户可处理的入群申请。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", "title": "获取收到的入群申请" }, "/sdk/android/group/group-applications/get-group-application-list-as-applicant": { - "body": "使用 `GetGroupApplicationListAsApplicantReq` 设置分页和筛选条件,再调用 `getSendGroupApplicationList()`。\n\n```java\nGetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq(0, 20);\nOpenIMClient.getInstance().groupManager.getSendGroupApplicationList(\n new OnBase>() {\n @Override public void onSuccess(List items) { mergeSentApplications(items); }\n @Override public void onError(int code, String error) { showApplicationError(error); }\n }, request);\n```\n\n申请被同意后,通过 `onJoinedGroupAdded` 接收加入群组通知。", + "body": "使用 `GetGroupApplicationListAsApplicantReq` 设置分页和筛选条件,再调用 `getSendGroupApplicationList()`。\n\n```java\nGetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq(0, 20);\nOpenIMClient.getInstance().groupManager.getSendGroupApplicationList(\n new OnBase>() {\n @Override public void onSuccess(List items) { /* items 是当前页申请记录。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n }, request);\n```\n\n申请被同意后,通过 `onJoinedGroupAdded` 接收加入群组通知。", "description": "使用 getSendGroupApplicationList 分页读取当前用户发出的入群申请。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", "title": "获取发出的入群申请" }, "/sdk/android/group/group-applications/accept-group-application": { - "body": "调用时同时传入申请的 `groupID`、申请人 `userID` 和处理说明。当前用户需要具有审批权限。\n\n```java\nOpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() {\n @Override public void onSuccess(String data) { markApplicationHandled(groupID, applicantUserID); }\n @Override public void onError(int code, String error) { showHandleError(error); }\n}, groupID, applicantUserID, \"欢迎加入\");\n```\n\n同意后,通过[群组概览](/sdk/android/group/overview-group)中的相关事件接收申请状态和成员变化通知。", + "body": "调用时同时传入申请的 `groupID`、申请人 `userID` 和处理说明。当前用户需要具有审批权限。\n\n```java\nOpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, groupID, applicantUserID, \"欢迎加入\");\n```\n\n同意后,通过[群组概览](/sdk/android/group/overview-group)中的相关事件接收申请状态和成员变化通知。", "description": "使用 acceptGroupApplication 同意指定用户的入群申请。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/accept-group-application", "title": "接受入群申请" }, "/sdk/android/group/group-applications/refuse-group-application": { - "body": "拒绝操作同样使用申请所属 `groupID`、申请人 `userID` 和处理说明。\n\n```java\nOpenIMClient.getInstance().groupManager.refuseGroupApplication(new OnBase() {\n @Override public void onSuccess(String data) { markApplicationRejected(groupID, applicantUserID); }\n @Override public void onError(int code, String error) { showHandleError(error); }\n}, groupID, applicantUserID, \"当前群组人数已满\");\n```\n\n拒绝成功后,通过 `onGroupApplicationRejected` 接收通知,也可以重新调用查询 API 获取最新申请列表。", + "body": "拒绝操作同样使用申请所属 `groupID`、申请人 `userID` 和处理说明。\n\n```java\nOpenIMClient.getInstance().groupManager.refuseGroupApplication(new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, groupID, applicantUserID, \"当前群组人数已满\");\n```\n\n拒绝成功后,通过 `onGroupApplicationRejected` 接收通知,也可以重新调用查询 API 获取最新申请列表。", "description": "使用 refuseGroupApplication 拒绝指定用户的入群申请。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", "title": "拒绝入群申请" }, "/sdk/android/group/group-applications/delete-group-requests": { - "body": "`deleteGroupRequests()` 接收 `DeleteGroupRequestsReq`,可传入多个 `SimpleGroupRequests` 批量删除申请记录。每个 `SimpleGroupRequests` 包含 `fromUserID` 和 `groupID`:`fromUserID` 为申请人的用户 ID,`groupID` 为申请加入的群组 ID。\n\n```java\nSimpleGroupRequests[] groupRequests = {\n new SimpleGroupRequests(firstApplicantUserID, firstGroupID),\n new SimpleGroupRequests(secondApplicantUserID, secondGroupID)\n};\nDeleteGroupRequestsReq request = new DeleteGroupRequestsReq(groupRequests);\n\nOpenIMClient.getInstance().groupManager.deleteGroupRequests(new OnBase() {\n @Override public void onSuccess(String data) { showDeleteSuccess(); }\n @Override public void onError(int code, String error) { showDeleteError(error); }\n}, request);\n```\n\n删除申请记录不等于拒绝申请。需要拒绝申请时,使用 `refuseGroupApplication()`。", + "body": "`deleteGroupRequests()` 接收 `DeleteGroupRequestsReq`,可传入多个 `SimpleGroupRequests` 批量删除申请记录。每个 `SimpleGroupRequests` 包含 `fromUserID` 和 `groupID`:`fromUserID` 为申请人的用户 ID,`groupID` 为申请加入的群组 ID。\n\n```java\nSimpleGroupRequests[] groupRequests = {\n new SimpleGroupRequests(firstApplicantUserID, firstGroupID),\n new SimpleGroupRequests(secondApplicantUserID, secondGroupID)\n};\nDeleteGroupRequestsReq request = new DeleteGroupRequestsReq(groupRequests);\n\nOpenIMClient.getInstance().groupManager.deleteGroupRequests(new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, request);\n```\n\n删除申请记录不等于拒绝申请。需要拒绝申请时,使用 `refuseGroupApplication()`。", "description": "使用 deleteGroupRequests 批量删除指定的入群申请记录。", "headings": [], "sourcePath": "/sdk/android/group/group-applications/delete-group-requests", "title": "删除入群申请" }, "/sdk/android/group/retrieving-group-members/get-group-member-list": { - "body": "`filter` 传 `0` 查询全部成员,`1` 普通成员,`2` 群主,`3` 管理员。`offset` 与 `count` 控制分页。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMemberList(\n new OnBase>() {\n @Override public void onSuccess(List members) { appendMembers(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID, 0, offset, 50);\n```", + "body": "`filter` 传 `0` 查询全部成员,`1` 普通成员,`2` 群主,`3` 管理员。`offset` 与 `count` 控制分页。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMemberList(\n new OnBase>() {\n @Override public void onSuccess(List members) { /* members 是当前页成员。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n }, groupID, 0, offset, 50);\n```", "description": "使用 getGroupMemberList 按角色和分页条件读取群成员。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", "title": "分页查询群成员" }, "/sdk/android/group/retrieving-group-members/get-specified-group-members-info": { - "body": "`getGroupMembersInfo()` 接收一个 `groupID` 和目标用户 ID 列表,返回这些用户在群内的 `GroupMembersInfo`。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMembersInfo(\n new OnBase>() {\n @Override public void onSuccess(List members) { mergeMembers(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID, userIDs);\n```", + "body": "`getGroupMembersInfo()` 接收一个 `groupID` 和目标用户 ID 列表,返回这些用户在群内的 `GroupMembersInfo`。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMembersInfo(\n new OnBase>() {\n @Override public void onSuccess(List members) { /* members 是查询到的成员资料。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n }, groupID, userIDs);\n```", "description": "使用 getGroupMembersInfo 批量读取指定成员在群内的资料。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", "title": "查询指定群成员资料" }, "/sdk/android/group/retrieving-group-members/get-users-in-group": { - "body": "`getUsersInGroup()` 返回传入用户中已在指定群内的 ID 列表,不返回成员资料。\n\n```java\nOpenIMClient.getInstance().groupManager.getUsersInGroup(new OnBase>() {\n @Override public void onSuccess(List joinedUserIDs) { updateMembership(joinedUserIDs); }\n @Override public void onError(int code, String error) { showMembershipError(error); }\n}, groupID, candidateUserIDs);\n```\n\n需要昵称、角色或禁言状态时,再调用[查询指定群成员资料](/sdk/android/group/retrieving-group-members/get-specified-group-members-info)。", + "body": "`getUsersInGroup()` 返回传入用户中已在指定群内的 ID 列表,不返回成员资料。\n\n```java\nOpenIMClient.getInstance().groupManager.getUsersInGroup(new OnBase>() {\n @Override public void onSuccess(List joinedUserIDs) { /* joinedUserIDs 是在群成员 ID。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, groupID, candidateUserIDs);\n```\n\n需要昵称、角色或禁言状态时,再调用[查询指定群成员资料](/sdk/android/group/retrieving-group-members/get-specified-group-members-info)。", "description": "使用 getUsersInGroup 从候选用户中筛出当前在群内的用户 ID。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", "title": "查询用户入群状态" }, "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin": { - "body": "使用 `getGroupMemberOwnerAndAdmin()` 获取需要展示或校验管理身份的成员记录。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMemberOwnerAndAdmin(\n new OnBase>() {\n @Override public void onSuccess(List members) { showModerators(members); }\n @Override public void onError(int code, String error) { showMemberQueryError(error); }\n }, groupID);\n```\n\n`roleLevel` 的群主、管理员和普通成员常量见 `GroupRole`。", + "body": "使用 `getGroupMemberOwnerAndAdmin()` 获取需要展示或校验管理身份的成员记录。\n\n```java\nOpenIMClient.getInstance().groupManager.getGroupMemberOwnerAndAdmin(\n new OnBase>() {\n @Override public void onSuccess(List members) { /* members 是查询到的成员资料。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n }, groupID);\n```\n\n`roleLevel` 的群主、管理员和普通成员常量见 `GroupRole`。", "description": "使用 getGroupMemberOwnerAndAdmin 查询群主和管理员成员资料。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", "title": "获取群主和管理员" }, "/sdk/android/group/retrieving-group-members/search-group-members": { - "body": "指定关键词列表、用户 ID 与群昵称两个搜索开关,以及分页条件。\n\n```java\nOpenIMClient.getInstance().groupManager.searchGroupMembers(\n new OnBase>() {\n @Override public void onSuccess(List members) { showMemberSearch(members); }\n @Override public void onError(int code, String error) { showSearchError(error); }\n }, groupID, Collections.singletonList(keyword), true, true, 0, 20);\n```\n\n搜索仅限目标群组;空关键词或两个搜索开关均关闭时不应发起请求。", + "body": "指定关键词列表、用户 ID 与群昵称两个搜索开关,以及分页条件。\n\n```java\nOpenIMClient.getInstance().groupManager.searchGroupMembers(\n new OnBase>() {\n @Override public void onSuccess(List members) { /* members 是查询结果。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n }, groupID, Collections.singletonList(keyword), true, true, 0, 20);\n```\n\n搜索仅限目标群组;空关键词或两个搜索开关均关闭时不应发起请求。", "description": "使用 searchGroupMembers 按用户 ID 或群昵称搜索群成员。", "headings": [], "sourcePath": "/sdk/android/group/retrieving-group-members/search-group-members", "title": "搜索群成员" }, "/sdk/android/group/managing-group-members/invite-user-to-group": { - "body": "传入群 ID、待邀请用户 ID 列表和邀请说明。调用成功表示邀请请求已提交;用户实际加入后通过 `onGroupMemberAdded` 接收通知。\n\n```java\nOpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() {\n @Override public void onSuccess(String data) { markInviteSubmitted(groupID); }\n @Override public void onError(int code, String error) { showInviteError(error); }\n}, groupID, inviteeUserIDs, \"邀请加入项目讨论\");\n```", + "body": "传入群 ID、待邀请用户 ID 列表和邀请说明。调用成功表示邀请请求已提交;用户实际加入后通过 `onGroupMemberAdded` 接收通知。\n\n```java\nOpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, groupID, inviteeUserIDs, \"邀请加入项目讨论\");\n```", "description": "使用 inviteUserToGroup 邀请一组用户加入指定群组。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", "title": "邀请用户加入群组" }, "/sdk/android/group/managing-group-members/kick-group-member": { - "body": "`kickGroupMember()` 接收成员 ID 列表和移除说明。\n\n```java\nOpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() {\n @Override public void onSuccess(String data) { markRemovalSubmitted(groupID); }\n @Override public void onError(int code, String error) { showRemovalError(error); }\n}, groupID, memberUserIDs, \"已不再参与该项目\");\n```\n\n移除成功后,通过 `onGroupMemberDeleted` 接收成员移除通知。", + "body": "`kickGroupMember()` 接收成员 ID 列表和移除说明。\n\n```java\nOpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, groupID, memberUserIDs, \"已不再参与该项目\");\n```\n\n移除成功后,通过 `onGroupMemberDeleted` 接收成员移除通知。", "description": "使用 kickGroupMember 将指定成员移出群组。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/kick-group-member", "title": "移除群成员" }, "/sdk/android/group/managing-group-members/set-group-member-nickname": { - "body": "成员资料修改统一使用 `setGroupMemberInfo()`。请求中填写 `groupID`、`userID` 和 `nickname`。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setNickname(\"小林\");\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markNicknameSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberUpdateError(error); }\n});\n```\n\n修改成功后,通过[群组概览](/sdk/android/group/overview-group)中的 `onGroupMemberInfoChanged` 接收成员资料变化通知。", + "body": "成员资料修改统一使用 `setGroupMemberInfo()`。请求中填写 `groupID`、`userID` 和 `nickname`。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setNickname(\"小林\");\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n});\n```\n\n修改成功后,通过[群组概览](/sdk/android/group/overview-group)中的 `onGroupMemberInfoChanged` 接收成员资料变化通知。", "description": "使用 SetGroupMemberInfo.nickname 更新成员在指定群中的显示昵称。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", "title": "修改群内昵称" }, "/sdk/android/group/managing-group-members/set-group-member-role-level": { - "body": "`roleLevel` 使用 `GroupRole` 常量:`OWNER`、`ADMIN` 和 `MEMBER`。转让群主请使用[转让群主](/sdk/android/group/managing-group-members/transfer-group-owner)。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setRoleLevel(GroupRole.ADMIN);\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markRoleSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showRoleError(error); }\n});\n```\n\n角色修改成功后,通过 `onGroupMemberInfoChanged` 接收成员资料变化通知。", + "body": "`roleLevel` 使用 `GroupRole` 常量:`OWNER`、`ADMIN` 和 `MEMBER`。转让群主请使用[转让群主](/sdk/android/group/managing-group-members/transfer-group-owner)。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setRoleLevel(GroupRole.ADMIN);\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n});\n```\n\n角色修改成功后,通过 `onGroupMemberInfoChanged` 接收成员资料变化通知。", "description": "使用 SetGroupMemberInfo.roleLevel 设置成员的群内角色。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", "title": "设置管理员" }, "/sdk/android/group/managing-group-members/set-group-member-avatar": { - "body": "群成员头像是群内资料字段,不修改用户全局头像。传入已可访问的头像 URL。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setFaceURL(avatarURL);\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markAvatarSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberUpdateError(error); }\n});\n```\n\n修改成功后,通过 `onGroupMemberInfoChanged` 接收成员资料变化通知。", + "body": "群成员头像是群内资料字段,不修改用户全局头像。传入已可访问的头像 URL。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setFaceURL(avatarURL);\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n});\n```\n\n修改成功后,通过 `onGroupMemberInfoChanged` 接收成员资料变化通知。", "description": "使用 SetGroupMemberInfo.faceURL 更新成员在群内展示的头像。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-avatar", "title": "更新群成员头像" }, "/sdk/android/group/managing-group-members/set-group-member-extension": { - "body": "`SetGroupMemberInfo.ex` 字符串用于保存群成员扩展信息,可存储 JSON 字符串拓展群成员信息。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setEx(\"{\\\"duty\\\":\\\"reviewer\\\"}\");\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { markMemberExtensionSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberUpdateError(error); }\n});\n```", + "body": "`SetGroupMemberInfo.ex` 字符串用于保存群成员扩展信息,可存储 JSON 字符串拓展群成员信息。\n\n```java\nSetGroupMemberInfo update = new SetGroupMemberInfo();\nupdate.setGroupID(groupID);\nupdate.setUserID(userID);\nupdate.setEx(\"{\\\"duty\\\":\\\"reviewer\\\"}\");\n\nOpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n});\n```", "description": "使用 SetGroupMemberInfo.ex 保存应用定义的群成员扩展数据。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-extension", "title": "设置群成员扩展字段" }, "/sdk/android/group/managing-group-members/transfer-group-owner": { - "body": "`transferGroupOwner()` 接收 `groupID` 和 `newOwnerUserID` 两个参数:`groupID` 为要转让群主的群组 ID,`newOwnerUserID` 为新群主的用户 ID,该用户必须是该群的成员。\n\n```java\nOpenIMClient.getInstance().groupManager.transferGroupOwner(new OnBase() {\n @Override public void onSuccess(String data) { markOwnershipTransferSubmitted(groupID); }\n @Override public void onError(int code, String error) { showTransferError(error); }\n}, groupID, newOwnerUserID);\n```\n\n转让成功后,可以重新调用[获取群主和管理员](/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin)获取最新资料。", + "body": "`transferGroupOwner()` 接收 `groupID` 和 `newOwnerUserID` 两个参数:`groupID` 为要转让群主的群组 ID,`newOwnerUserID` 为新群主的用户 ID,该用户必须是该群的成员。\n\n```java\nOpenIMClient.getInstance().groupManager.transferGroupOwner(new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, groupID, newOwnerUserID);\n```\n\n转让成功后,可以重新调用[获取群主和管理员](/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin)获取最新资料。", "description": "使用 transferGroupOwner 将群主身份转让给指定群成员。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/transfer-group-owner", "title": "转让群主" }, "/sdk/android/group/managing-group-members/change-group-member-mute": { - "body": "`seconds` 为禁言时长,单位为秒;传 `0` 解除成员禁言。该操作与[全员禁言](/sdk/android/group/change-group-mute)相互独立。\n\n```java\nOpenIMClient.getInstance().groupManager.changeGroupMemberMute(new OnBase() {\n @Override public void onSuccess(String data) { markMemberMuteSubmitted(groupID, userID); }\n @Override public void onError(int code, String error) { showMemberMuteError(error); }\n}, groupID, userID, 3600L);\n```", + "body": "`seconds` 为禁言时长,单位为秒;传 `0` 解除成员禁言。该操作与[全员禁言](/sdk/android/group/change-group-mute)相互独立。\n\n```java\nOpenIMClient.getInstance().groupManager.changeGroupMemberMute(new OnBase() {\n @Override public void onSuccess(String data) { /* 请求已完成。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, groupID, userID, 3600L);\n```", "description": "使用 changeGroupMemberMute 设置指定成员的禁言时长。", "headings": [], "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", "title": "设置群成员禁言" }, "/sdk/android/message/overview-message": { - "body": "Android SDK 使用 `Message` 表示一条消息。消息创建、发送、接收、查询和状态变更是不同阶段;创建 `Message` 不会发送消息,发送成功也不代表其他客户端已经完成接收。\n\n消息列表通常以 `clientMsgID` 作为客户端去重和更新键,并结合当前会话上下文判断消息属于单聊还是群聊。`Message` 本身不包含 `conversationID`,会话 ID 来自当前会话、历史查询参数或消息事件上下文。\n\n## 消息处理流程\n\n| 阶段 | Android API 或回调 | 说明 |\n| ---- | ------------------------------------------ | ----------------------------------------------------------------- |\n| 创建 | `MessageManager.create*Message()` | 创建待发送的 `Message` 对象,不写入服务端,也不会触发新消息回调。 |\n| 发送 | `sendMessage()` 或 `sendMessageNotOss()` | 单聊传入 `recvUid`,群聊传入 `recvGid`。 |\n| 接收 | `OnAdvanceMsgListener` | 处理实时、离线、在线消息以及撤回、删除和已读回执等变化。 |\n| 查询 | 历史消息、按 ID 查找或搜索 API | 查询结果是调用时的消息快照,不代替实时消息监听。 |\n| 更新 | 撤回、删除、修改、置顶、已读和本地扩展 API | 分别处理 API 结果、对应事件和必要的列表重新查询。 |\n\n```java\nmessageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override\n public void onRecvNewMessage(Message message) {\n messageStore.merge(message);\n }\n\n @Override\n public void onRecvOfflineNewMessage(List messages) {\n messageStore.mergeAll(messages);\n }\n\n @Override\n public void onRecvMessageRevokedV2(RevokedInfo info) {\n messageStore.markRevoked(info);\n }\n\n @Override\n public void onMsgDeleted(Message message) {\n messageStore.remove(message.getClientMsgID());\n }\n});\n```\n\n重复调用 `MessageManager` 的 `setAdvancedMsgListener()` 会覆盖之前设置的 listener。应用应在统一的消息状态层注册一次,再把回调中的消息变化分发给页面。\n\n## Message 字段\n\n创建、发送、接收和查询返回的消息对象都是 `Message`。常用字段如下:\n\n| 字段 | 类型 | 说明 |\n| ---------------- | ----------------- | --------------------------------------------------- |\n| `clientMsgID` | `String` | 客户端消息 ID,用于列表去重、状态更新和定位消息。 |\n| `serverMsgID` | `String` | 服务端消息 ID;消息尚未成功发送时可能没有有效值。 |\n| `sessionType` | `int` | 会话类型;结合 `recvID`、`groupID` 判断单聊或群聊。 |\n| `sendID` | `String` | 发送者用户 ID。 |\n| `recvID` | `String` | 单聊接收方用户 ID。 |\n| `groupID` | `String` | 群聊对应的群组 ID。 |\n| `msgFrom` | `int` | 标识消息是用户级别还是系统级别。 |\n| `contentType` | `int` | 消息类型,使用 `MessageType` 常量判断内容字段。 |\n| `createTime` | `long` | 消息对象创建时间,Android SDK 模型注释约定为纳秒。 |\n| `sendTime` | `long` | 消息发送时间,Android SDK 模型注释约定为毫秒。 |\n| `seq` | `int` | 服务端消息序号。 |\n| `status` | `int` | 发送状态,使用 `MessageStatus` 常量判断。 |\n| `isRead` | `boolean` | 当前客户端保存的已读状态。 |\n| `platformID` | `int` | 发送消息的客户端平台。 |\n| `senderNickname` | `String` | 发送者昵称快照。 |\n| `senderFaceUrl` | `String` | 发送者头像 URL 快照。 |\n| `offlinePush` | `OfflinePushInfo` | 离线推送内容。 |\n| `attachedInfo` | `String` | SDK 附加信息。 |\n| `ext` | `Object` | Android 消息附加字段。 |\n| `ex` | `Object` | 消息附加字段。 |\n| `localEx` | `Object` | 仅保存在当前设备的消息扩展字段。 |\n\n消息正文位于与 `contentType` 对应的 element 字段中,不要根据列表位置或展示文本判断消息类型:\n\n| 消息内容 | 对应字段 |\n| ------------------------ | ---------------------------------------------------- |\n| 文本、富文本 | `textElem`、`advancedTextElem` |\n| 图片、音频、视频、文件 | `pictureElem`、`soundElem`、`videoElem`、`fileElem` |\n| @ 消息、回复消息 | `atTextElem`、`quoteElem` |\n| 合并转发 | `mergeElem` |\n| 名片、位置、表情 | `cardElem`、`locationElem`、`faceElem` |\n| 自定义消息 | `customElem` |\n| 通知、输入状态和附加状态 | `notificationElem`、`typingElem`、`attachedInfoElem` |\n\n## 创建和发送不同内容\n\n发送一条消息分为两个步骤:\n\n1. 调用对应内容类型的 `create*Message()` 方法,获得待发送的 `Message`。\n2. 将该 `Message` 传给 [`sendMessage()`](/sdk/android/message/sending-messages/send-message)。单聊设置 `recvUid`,群聊设置 `recvGid`。\n\n下表列出了可创建的消息类型及其对应页面:\n\n| 内容 | 页面 |\n| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 文本与富文本 | [创建文本消息](/sdk/android/message/creating-messages/create-text-message)、[创建富文本消息](/sdk/android/message/creating-messages/create-advanced-text-message) |\n| @ 消息 | [创建 @ 消息](/sdk/android/message/creating-messages/create-text-at-message) |\n| 图片、音频、视频和文件 | [创建图片消息](/sdk/android/message/creating-messages/create-image-message)、[创建文件消息](/sdk/android/message/creating-messages/create-file-message) |\n| 名片、位置和表情 | [创建名片消息](/sdk/android/message/creating-messages/create-card-message)、[创建位置消息](/sdk/android/message/creating-messages/create-location-message)、[创建表情消息](/sdk/android/message/creating-messages/create-face-message) |\n| 回复、转发和合并转发 | [创建回复消息](/sdk/android/message/creating-messages/create-quote-message)、[创建转发消息](/sdk/android/message/creating-messages/create-forward-message)、[创建合并转发消息](/sdk/android/message/creating-messages/create-merger-message) |\n| 自定义业务内容 | [创建自定义消息](/sdk/android/message/creating-messages/create-custom-message) |\n\n发送本地路径或本地文件创建的媒体消息时,调用 `sendMessage()`,SDK 会在发送过程中上传媒体文件。使用已有远端 URL 创建媒体消息时,调用对应的 `create*MessageByURL()` 方法,再通过 [`sendMessageNotOss()`](/sdk/android/message/sending-messages/send-message-not-oss) 发送,无需再次上传媒体文件。\n\n## 按任务查找页面\n\n| 任务 | 页面 |\n| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 发送普通消息或已上传的媒体消息 | [发送消息](/sdk/android/message/sending-messages/send-message)、[发送不经 OSS 的消息](/sdk/android/message/sending-messages/send-message-not-oss) |\n| 接收实时、离线和在线消息 | [接收消息](/sdk/android/message/receiving-messages/receive-messages)、[接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) |\n| 加载历史消息或反向加载消息 | [加载历史消息](/sdk/android/message/retrieving-messages/load-older-messages)、[反向加载历史消息](/sdk/android/message/retrieving-messages/load-newer-messages) |\n| 按 ID 定位或搜索消息 | [按 ID 查找消息](/sdk/android/message/retrieving-messages/find-messages-by-id)、[搜索消息](/sdk/android/message/searching-messages/search-messages) |\n| 删除、撤回、修改或置顶消息 | [删除消息](/sdk/android/message/managing-messages/delete-saved-messages)、[撤回消息](/sdk/android/message/managing-messages/revoke-a-message)、[修改消息](/sdk/android/message/managing-messages/modify-a-message)、[设置消息置顶](/sdk/android/message/managing-messages/set-message-pinned) |\n| 管理会话未读数和群聊已读回执 | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read)、[上报群消息已读](/sdk/android/message/managing-read-status/send-group-read-receipts)、[查询群消息已读成员](/sdk/android/message/managing-read-status/get-group-message-readers) |\n| 上报或查询输入状态 | [更新输入状态](/sdk/android/message/composing-messages/update-typing-status)、[查询输入状态](/sdk/android/message/composing-messages/get-typing-status) |\n| 插入、删除或扩展仅当前设备可见的消息 | [插入本地单聊消息](/sdk/android/message/managing-messages/insert-local-single-message)、[删除本地消息](/sdk/android/message/managing-messages/delete-local-message)、[设置消息本地扩展](/sdk/android/message/managing-messages/set-message-local-ex) |\n\n## 状态同步边界\n\n| 变化 | 处理位置 | 合并方式 |\n| ------------------ | ---------------------------------------------------------------------------- | ---------------------------------------------- |\n| 新消息和离线消息 | [接收消息](/sdk/android/message/receiving-messages/receive-messages) | 先确定目标会话,再按 `clientMsgID` 合并。 |\n| 消息撤回 | `onRecvMessageRevokedV2` | 按撤回信息中的消息 ID 更新原消息状态。 |\n| 消息删除 | `onMsgDeleted` | 按消息 ID 从当前会话列表移除。 |\n| C2C 和群聊已读回执 | `onRecvC2CReadReceipt`、`onRecvGroupMessageReadReceipt` | 更新对应消息或会话的已读状态。 |\n| 消息扩展变化 | `onRecvMessageExtensionsChanged` 等回调 | 按消息 ID 更新扩展字段,不替换整条消息的正文。 |\n| 输入状态 | [更新输入状态](/sdk/android/message/composing-messages/update-typing-status) | 按会话和用户更新临时状态,不写入普通消息列表。 |\n\n对于撤回、删除、已读和消息扩展等状态变化,应先处理 API 的调用结果,再通过 `OnAdvanceMsgListener` 同步相关回调;必要时重新查询消息列表。", + "body": "Android SDK 使用 `Message` 表示一条消息。消息创建、发送、接收、查询和状态变更是不同阶段;创建 `Message` 不会发送消息,发送成功也不代表其他客户端已经完成接收。\n\n消息列表通常以 `clientMsgID` 作为客户端去重和更新键,并结合当前会话上下文判断消息属于单聊还是群聊。`Message` 本身不包含 `conversationID`,会话 ID 来自当前会话、历史查询参数或消息事件上下文。\n\n## 消息处理流程\n\n| 阶段 | Android API 或回调 | 说明 |\n| ---- | ------------------------------------------ | ----------------------------------------------------------------- |\n| 创建 | `MessageManager.create*Message()` | 创建待发送的 `Message` 对象,不写入服务端,也不会触发新消息回调。 |\n| 发送 | `sendMessage()` 或 `sendMessageNotOss()` | 单聊传入 `recvUid`,群聊传入 `recvGid`。 |\n| 接收 | `OnAdvanceMsgListener` | 处理实时、离线、在线消息以及撤回、删除和已读回执等变化。 |\n| 查询 | 历史消息、按 ID 查找或搜索 API | 查询结果是调用时的消息快照,不代替实时消息监听。 |\n| 更新 | 撤回、删除、修改、置顶、已读和本地扩展 API | 分别处理 API 结果、对应事件和必要的列表重新查询。 |\n\n```java\nmessageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override\n public void onRecvNewMessage(Message message) {\n // message 是新收到的消息。\n }\n\n @Override\n public void onRecvOfflineNewMessage(List messages) {\n // messages 是离线期间收到的消息。\n }\n\n @Override\n public void onRecvMessageRevokedV2(RevokedInfo info) {\n // info 包含被撤回消息的信息。\n }\n\n @Override\n public void onMsgDeleted(Message message) {\n // message 是已删除的消息。\n }\n});\n```\n\n重复调用 `MessageManager` 的 `setAdvancedMsgListener()` 会覆盖之前设置的 listener。应用应在统一的消息状态层注册一次,再把回调中的消息变化分发给页面。\n\n## Message 字段\n\n创建、发送、接收和查询返回的消息对象都是 `Message`。常用字段如下:\n\n| 字段 | 类型 | 说明 |\n| ---------------- | ----------------- | --------------------------------------------------- |\n| `clientMsgID` | `String` | 客户端消息 ID,用于列表去重、状态更新和定位消息。 |\n| `serverMsgID` | `String` | 服务端消息 ID;消息尚未成功发送时可能没有有效值。 |\n| `sessionType` | `int` | 会话类型;结合 `recvID`、`groupID` 判断单聊或群聊。 |\n| `sendID` | `String` | 发送者用户 ID。 |\n| `recvID` | `String` | 单聊接收方用户 ID。 |\n| `groupID` | `String` | 群聊对应的群组 ID。 |\n| `msgFrom` | `int` | 标识消息是用户级别还是系统级别。 |\n| `contentType` | `int` | 消息类型,使用 `MessageType` 常量判断内容字段。 |\n| `createTime` | `long` | 消息对象创建时间,Android SDK 模型注释约定为纳秒。 |\n| `sendTime` | `long` | 消息发送时间,Android SDK 模型注释约定为毫秒。 |\n| `seq` | `int` | 服务端消息序号。 |\n| `status` | `int` | 发送状态,使用 `MessageStatus` 常量判断。 |\n| `isRead` | `boolean` | 当前客户端保存的已读状态。 |\n| `platformID` | `int` | 发送消息的客户端平台。 |\n| `senderNickname` | `String` | 发送者昵称快照。 |\n| `senderFaceUrl` | `String` | 发送者头像 URL 快照。 |\n| `offlinePush` | `OfflinePushInfo` | 离线推送内容。 |\n| `attachedInfo` | `String` | SDK 附加信息。 |\n| `ext` | `Object` | Android 消息附加字段。 |\n| `ex` | `Object` | 消息附加字段。 |\n| `localEx` | `Object` | 仅保存在当前设备的消息扩展字段。 |\n\n消息正文位于与 `contentType` 对应的 element 字段中,不要根据列表位置或展示文本判断消息类型:\n\n| 消息内容 | 对应字段 |\n| ------------------------ | ---------------------------------------------------- |\n| 文本、富文本 | `textElem`、`advancedTextElem` |\n| 图片、音频、视频、文件 | `pictureElem`、`soundElem`、`videoElem`、`fileElem` |\n| @ 消息、回复消息 | `atTextElem`、`quoteElem` |\n| 合并转发 | `mergeElem` |\n| 名片、位置、表情 | `cardElem`、`locationElem`、`faceElem` |\n| 自定义消息 | `customElem` |\n| 通知、输入状态和附加状态 | `notificationElem`、`typingElem`、`attachedInfoElem` |\n\n## 创建和发送不同内容\n\n发送一条消息分为两个步骤:\n\n1. 调用对应内容类型的 `create*Message()` 方法,获得待发送的 `Message`。\n2. 将该 `Message` 传给 [`sendMessage()`](/sdk/android/message/sending-messages/send-message)。单聊设置 `recvUid`,群聊设置 `recvGid`。\n\n下表列出了可创建的消息类型及其对应页面:\n\n| 内容 | 页面 |\n| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 文本与富文本 | [创建文本消息](/sdk/android/message/creating-messages/create-text-message)、[创建富文本消息](/sdk/android/message/creating-messages/create-advanced-text-message) |\n| @ 消息 | [创建 @ 消息](/sdk/android/message/creating-messages/create-text-at-message) |\n| 图片、音频、视频和文件 | [创建图片消息](/sdk/android/message/creating-messages/create-image-message)、[创建文件消息](/sdk/android/message/creating-messages/create-file-message) |\n| 名片、位置和表情 | [创建名片消息](/sdk/android/message/creating-messages/create-card-message)、[创建位置消息](/sdk/android/message/creating-messages/create-location-message)、[创建表情消息](/sdk/android/message/creating-messages/create-face-message) |\n| 回复、转发和合并转发 | [创建回复消息](/sdk/android/message/creating-messages/create-quote-message)、[创建转发消息](/sdk/android/message/creating-messages/create-forward-message)、[创建合并转发消息](/sdk/android/message/creating-messages/create-merger-message) |\n| 自定义业务内容 | [创建自定义消息](/sdk/android/message/creating-messages/create-custom-message) |\n\n发送本地路径或本地文件创建的媒体消息时,调用 `sendMessage()`,SDK 会在发送过程中上传媒体文件。使用已有远端 URL 创建媒体消息时,调用对应的 `create*MessageByURL()` 方法,再通过 [`sendMessageNotOss()`](/sdk/android/message/sending-messages/send-message-not-oss) 发送,无需再次上传媒体文件。\n\n## 按任务查找页面\n\n| 任务 | 页面 |\n| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 发送普通消息或已上传的媒体消息 | [发送消息](/sdk/android/message/sending-messages/send-message)、[发送不经 OSS 的消息](/sdk/android/message/sending-messages/send-message-not-oss) |\n| 接收实时、离线和在线消息 | [接收消息](/sdk/android/message/receiving-messages/receive-messages)、[接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) |\n| 加载历史消息或反向加载消息 | [加载历史消息](/sdk/android/message/retrieving-messages/load-older-messages)、[反向加载历史消息](/sdk/android/message/retrieving-messages/load-newer-messages) |\n| 按 ID 定位或搜索消息 | [按 ID 查找消息](/sdk/android/message/retrieving-messages/find-messages-by-id)、[搜索消息](/sdk/android/message/searching-messages/search-messages) |\n| 删除、撤回、修改或置顶消息 | [删除消息](/sdk/android/message/managing-messages/delete-saved-messages)、[撤回消息](/sdk/android/message/managing-messages/revoke-a-message)、[修改消息](/sdk/android/message/managing-messages/modify-a-message)、[设置消息置顶](/sdk/android/message/managing-messages/set-message-pinned) |\n| 管理会话未读数和群聊已读回执 | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read)、[上报群消息已读](/sdk/android/message/managing-read-status/send-group-read-receipts)、[查询群消息已读成员](/sdk/android/message/managing-read-status/get-group-message-readers) |\n| 上报或查询输入状态 | [更新输入状态](/sdk/android/message/composing-messages/update-typing-status)、[查询输入状态](/sdk/android/message/composing-messages/get-typing-status) |\n| 插入、删除或扩展仅当前设备可见的消息 | [插入本地单聊消息](/sdk/android/message/managing-messages/insert-local-single-message)、[删除本地消息](/sdk/android/message/managing-messages/delete-local-message)、[设置消息本地扩展](/sdk/android/message/managing-messages/set-message-local-ex) |\n\n## 状态同步边界\n\n| 变化 | 处理位置 | 合并方式 |\n| ------------------ | ---------------------------------------------------------------------------- | ---------------------------------------------- |\n| 新消息和离线消息 | [接收消息](/sdk/android/message/receiving-messages/receive-messages) | 先确定目标会话,再按 `clientMsgID` 合并。 |\n| 消息撤回 | `onRecvMessageRevokedV2` | 按撤回信息中的消息 ID 更新原消息状态。 |\n| 消息删除 | `onMsgDeleted` | 按消息 ID 从当前会话列表移除。 |\n| C2C 和群聊已读回执 | `onRecvC2CReadReceipt`、`onRecvGroupMessageReadReceipt` | 更新对应消息或会话的已读状态。 |\n| 消息扩展变化 | `onRecvMessageExtensionsChanged` 等回调 | 按消息 ID 更新扩展字段,不替换整条消息的正文。 |\n| 输入状态 | [更新输入状态](/sdk/android/message/composing-messages/update-typing-status) | 按会话和用户更新临时状态,不写入普通消息列表。 |\n\n对于撤回、删除、已读和消息扩展等状态变化,应先处理 API 的调用结果,再通过 `OnAdvanceMsgListener` 同步相关回调;必要时重新查询消息列表。", "description": "了解 Android SDK 的 Message 模型、消息生命周期和消息监听。", "headings": [ { @@ -1592,7 +1592,7 @@ "title": "创建合并消息" }, "/sdk/android/message/sending-messages/send-message": { - "body": "单聊填写 `recvUid`,群聊填写 `recvGid`。通过 `OnMsgSendCallback` 处理发送成功、失败和媒体进度。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onSuccess(Message sentMessage) { mergeSentMessage(sentMessage); }\n @Override public void onError(int code, String error) { showSendError(error); }\n}, message, peerUserID, null, offlinePushInfo);\n```", + "body": "单聊填写 `recvUid`,群聊填写 `recvGid`。通过 `OnMsgSendCallback` 处理发送成功、失败和媒体进度。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onSuccess(Message sentMessage) { /* sentMessage 是发送成功的消息。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, message, peerUserID, null, offlinePushInfo);\n```", "description": "使用 sendMessage 将 Message 发送到单聊或群聊。", "headings": [], "sourcePath": "/sdk/android/message/sending-messages/send-message", @@ -1606,21 +1606,21 @@ "title": "发送不经 OSS 的消息" }, "/sdk/android/message/sending-messages/set-msg-send-progress-listener": { - "body": "通过 `OnMsgSendCallback.onProgress()` 获取当前消息的发送进度。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onProgress(long progress) { updateProgress(progress); }\n @Override public void onSuccess(Message sentMessage) { finishProgress(); }\n @Override public void onError(int code, String error) { failProgress(error); }\n}, message, peerUserID, null, offlinePushInfo);\n```", + "body": "通过 `OnMsgSendCallback.onProgress()` 获取当前消息的发送进度。\n\n```java\nmessageManager.sendMessage(new OnMsgSendCallback() {\n @Override public void onProgress(long progress) { /* progress 是发送进度。 */ }\n @Override public void onSuccess(Message sentMessage) { /* sentMessage 是发送成功的消息。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, message, peerUserID, null, offlinePushInfo);\n```", "description": "通过 OnMsgSendCallback 的进度回调更新媒体发送进度。", "headings": [], "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", "title": "监听消息发送进度" }, "/sdk/android/message/receiving-messages/receive-messages": { - "body": "设置 `setAdvancedMsgListener()` 后,`onRecvNewMessage` 接收实时消息,`onRecvOfflineNewMessage` 接收离线批次,`onRecvOnlineOnlyMessage` 仅接收在线消息。\n\n```java\nmessageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); }\n @Override public void onRecvOfflineNewMessage(List messages) { messageStore.mergeAll(messages); }\n});\n```", + "body": "设置 `setAdvancedMsgListener()` 后,`onRecvNewMessage` 接收实时消息,`onRecvOfflineNewMessage` 接收离线批次,`onRecvOnlineOnlyMessage` 仅接收在线消息。\n\n```java\nmessageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() {\n @Override public void onRecvNewMessage(Message message) { /* message 是新收到的消息。 */ }\n @Override public void onRecvOfflineNewMessage(List messages) { /* messages 是离线消息。 */ }\n});\n```", "description": "使用 OnAdvanceMsgListener 接收新消息、离线消息和在线消息。", "headings": [], "sourcePath": "/sdk/android/message/receiving-messages/receive-messages", "title": "接收消息" }, "/sdk/android/message/receiving-messages/receive-custom-business-messages": { - "body": "自定义业务回调携带字符串,业务侧应按约定格式解析,不要将其直接当作 `Message` 渲染。\n\n```java\nmessageManager.setCustomBusinessListener(new OnCustomBusinessListener() {\n @Override public void onRecvCustomBusinessMessage(String payload) { handleBusiness(payload); }\n});\n```", + "body": "自定义业务回调携带字符串,业务侧应按约定格式解析,不要将其直接当作 `Message` 渲染。\n\n```java\nmessageManager.setCustomBusinessListener(new OnCustomBusinessListener() {\n @Override public void onRecvCustomBusinessMessage(String payload) { /* payload 是自定义业务数据。 */ }\n});\n```", "description": "使用 setCustomBusinessListener 接收独立于普通聊天消息的业务回调。", "headings": [], "sourcePath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", @@ -1641,14 +1641,14 @@ "title": "反向加载历史消息" }, "/sdk/android/message/retrieving-messages/find-messages-by-id": { - "body": "构造 `SearchParams` 列表查询消息。\n\n```java\nmessageManager.findMessageList(new OnBase() {\n @Override public void onSuccess(SearchResult result) { showFoundMessages(result); }\n @Override public void onError(int code, String error) { showQueryError(error); }\n}, searchParams);\n```", + "body": "构造 `SearchParams` 列表查询消息。\n\n```java\nmessageManager.findMessageList(new OnBase() {\n @Override public void onSuccess(SearchResult result) { /* result 是查询结果。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, searchParams);\n```", "description": "使用 findMessageList 按 SearchParams 查询消息记录。", "headings": [], "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", "title": "按 ID 查找消息" }, "/sdk/android/message/retrieving-messages/load-message-context": { - "body": "从搜索结果或引用消息跳入聊天上下文时,把已经取得的 `Message` 作为锚点。\n\n## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `conversationID` | `String` | 是 | 锚点消息所在的会话 ID。 |\n| `startMsg` | `Message` | 是 | 已经取得的锚点消息。 |\n| `type` | `ViewType` | 是 | 上下文查看类型;引用消息使用 `ViewType.History`,搜索结果使用 `ViewType.Search`。 |\n| `before` | `int` | 是 | 锚点之前最多读取的消息数量。 |\n| `after` | `int` | 是 | 锚点之后最多读取的消息数量。 |\n\n```java\nmessageManager.fetchSurroundingMessages(\n new OnBase() {\n @Override\n public void onSuccess(Messages messages) {\n List surrounding = messages.getData();\n renderMessages(surrounding);\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n },\n conversationID,\n targetMessage,\n ViewType.Search,\n 20,\n 20\n);\n```\n\n成功回调中的 `messages.getData()` 是锚点前后取得的消息列表,消息字段见[消息概览](/sdk/android/message/overview-message)。\n\n`before` 和 `after` 分别限制锚点前后的数量。锚点靠近历史边界或部分消息已经删除时,返回结果可能少于请求总数。需要先定位消息时,见[按 ID 查找消息](/sdk/android/message/retrieving-messages/find-messages-by-id)。", + "body": "从搜索结果或引用消息跳入聊天上下文时,把已经取得的 `Message` 作为锚点。\n\n## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `conversationID` | `String` | 是 | 锚点消息所在的会话 ID。 |\n| `startMsg` | `Message` | 是 | 已经取得的锚点消息。 |\n| `type` | `ViewType` | 是 | 上下文查看类型;引用消息使用 `ViewType.History`,搜索结果使用 `ViewType.Search`。 |\n| `before` | `int` | 是 | 锚点之前最多读取的消息数量。 |\n| `after` | `int` | 是 | 锚点之后最多读取的消息数量。 |\n\n```java\nmessageManager.fetchSurroundingMessages(\n new OnBase() {\n @Override\n public void onSuccess(Messages messages) {\n List surrounding = messages.getData();\n // surrounding 是目标消息及其上下文。\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n },\n conversationID,\n targetMessage,\n ViewType.Search,\n 20,\n 20\n);\n```\n\n成功回调中的 `messages.getData()` 是锚点前后取得的消息列表,消息字段见[消息概览](/sdk/android/message/overview-message)。\n\n`before` 和 `after` 分别限制锚点前后的数量。锚点靠近历史边界或部分消息已经删除时,返回结果可能少于请求总数。需要先定位消息时,见[按 ID 查找消息](/sdk/android/message/retrieving-messages/find-messages-by-id)。", "description": "使用 Android SDK 读取一条消息前后的上下文。", "headings": [ { @@ -1668,14 +1668,14 @@ "title": "搜索消息" }, "/sdk/android/message/composing-messages/update-typing-status": { - "body": "进入输入状态时,将 `focus` 设为 `true`;输入结束、输入框失去焦点或退出会话时,将其设为 `false`。\n\n```java\nconversationManager.changeInputState(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 输入状态已上报\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n },\n conversationID,\n true\n);\n```\n\n输入结束时及时清除状态:\n\n```java\nconversationManager.changeInputState(callback, conversationID, false);\n```\n\n避免频繁重复上报相同状态。成功回调表示上报请求已经完成。\n\n其他客户端通过 `OnConversationListener.onConversationUserInputStatusChanged` 接收输入状态变化。Android SDK 以字符串形式返回事件载荷,应在校验 JSON 后再解析:\n\n```java\n@Override\npublic void onConversationUserInputStatusChanged(String payload) {\n InputStatesChangedData state = JsonUtil.toObj(\n payload,\n InputStatesChangedData.class\n );\n if (state == null || state.getConversationID() == null) {\n return;\n }\n updateTypingState(\n state.getConversationID(),\n state.getUserID(),\n state.getPlatformIDs()\n );\n}\n```\n\n回调中的 `conversationID`、`userID` 和 `platformIDs` 分别表示会话、用户和正在输入的平台。`ConversationManager` 只能设置一个 `OnConversationListener`;如果应用还需要处理其他会话事件,请在同一个 listener 中实现相应回调。\n\n需要主动查询指定用户是否正在输入时,使用[查询输入状态](/sdk/android/message/composing-messages/get-typing-status)。", + "body": "进入输入状态时,将 `focus` 设为 `true`;输入结束、输入框失去焦点或退出会话时,将其设为 `false`。\n\n```java\nconversationManager.changeInputState(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 输入状态已上报\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明上报失败原因。\n }\n },\n conversationID,\n true\n);\n```\n\n输入结束时及时清除状态:\n\n```java\nconversationManager.changeInputState(callback, conversationID, false);\n```\n\n避免频繁重复上报相同状态。成功回调表示上报请求已经完成。\n\n其他客户端通过 `OnConversationListener.onConversationUserInputStatusChanged` 接收输入状态变化。Android SDK 以字符串形式返回事件载荷,应在校验 JSON 后再解析:\n\n```java\n@Override\npublic void onConversationUserInputStatusChanged(String payload) {\n InputStatesChangedData state = JsonUtil.toObj(\n payload,\n InputStatesChangedData.class\n );\n if (state == null || state.getConversationID() == null) {\n return;\n }\n // state 包含会话、用户和正在输入的平台。\n}\n```\n\n回调中的 `conversationID`、`userID` 和 `platformIDs` 分别表示会话、用户和正在输入的平台。`ConversationManager` 只能设置一个 `OnConversationListener`;如果应用还需要处理其他会话事件,请在同一个 listener 中实现相应回调。\n\n需要主动查询指定用户是否正在输入时,使用[查询输入状态](/sdk/android/message/composing-messages/get-typing-status)。", "description": "使用 Android SDK 上报当前会话的输入状态。", "headings": [], "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", "title": "上报输入状态" }, "/sdk/android/message/composing-messages/get-typing-status": { - "body": "查询指定用户当前正在输入的平台 ID 列表。\n\n```java\nOpenIMClient.getInstance().conversationManager.getInputState(\n new OnBase>() {\n @Override\n public void onSuccess(List platformIDs) {\n boolean typing = platformIDs != null && !platformIDs.isEmpty();\n updateTypingState(conversationID, userID, typing);\n }\n\n @Override\n public void onError(int code, String error) {\n recordTypingStatusQueryFailure(code, error);\n }\n },\n conversationID,\n userID\n);\n```\n\n成功回调返回平台 ID 列表;空列表表示该用户当前没有平台处于输入状态。输入状态发生变化时,通过[上报输入状态](/sdk/android/message/composing-messages/update-typing-status)页面介绍的回调接收通知。", + "body": "查询指定用户当前正在输入的平台 ID 列表。\n\n```java\nOpenIMClient.getInstance().conversationManager.getInputState(\n new OnBase>() {\n @Override\n public void onSuccess(List platformIDs) {\n boolean typing = platformIDs != null && !platformIDs.isEmpty();\n // typing 表示该用户当前输入状态。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n conversationID,\n userID\n);\n```\n\n成功回调返回平台 ID 列表;空列表表示该用户当前没有平台处于输入状态。输入状态发生变化时,通过[上报输入状态](/sdk/android/message/composing-messages/update-typing-status)页面介绍的回调接收通知。", "description": "使用 getInputState 查询指定用户在会话中的当前输入状态。", "headings": [], "sourcePath": "/sdk/android/message/composing-messages/get-typing-status", @@ -1689,7 +1689,7 @@ "title": "删除本地消息" }, "/sdk/android/message/managing-messages/delete-saved-messages": { - "body": "## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `conversationID` | `String` | 是 | 要删除消息所在的会话 ID。 |\n| `clientMsgIDs` | `String[]` | 是 | 要删除的消息 ID 列表;同一批 ID 必须属于同一会话。 |\n| `isSync` | `boolean` | 是 | 是否把删除动作同步到当前账号的其他客户端。 |\n\n```java\nDeleteMessagesReq request = new DeleteMessagesReq(\n true,\n conversationID,\n selectedClientMsgIDs.toArray(new String[0])\n);\n\nmessageManager.deleteMessages(request, new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 删除请求已完成\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n});\n```\n\n`isSync` 为 `false` 时,删除当前设备及当前账号服务端保存的记录;为 `true` 时,还会请求把删除动作同步到当前账号的其他客户端。该操作不会删除其他会话成员持有的副本,也不会产生撤回提示。\n\n成功回调表示删除请求已经完成;开启同步时,不代表其他客户端已经收到事件或完成界面更新。\n\n开启同步后,其他客户端可通过 `OnAdvanceMsgListener.onMsgDeleted` 接收删除的消息:\n\n```java\n@Override\npublic void onMsgDeleted(Message message) {\n handleDeletedMessage(message);\n}\n```", + "body": "## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `conversationID` | `String` | 是 | 要删除消息所在的会话 ID。 |\n| `clientMsgIDs` | `String[]` | 是 | 要删除的消息 ID 列表;同一批 ID 必须属于同一会话。 |\n| `isSync` | `boolean` | 是 | 是否把删除动作同步到当前账号的其他客户端。 |\n\n```java\nDeleteMessagesReq request = new DeleteMessagesReq(\n true,\n conversationID,\n selectedClientMsgIDs.toArray(new String[0])\n);\n\nmessageManager.deleteMessages(request, new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 删除请求已完成\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n});\n```\n\n`isSync` 为 `false` 时,删除当前设备及当前账号服务端保存的记录;为 `true` 时,还会请求把删除动作同步到当前账号的其他客户端。该操作不会删除其他会话成员持有的副本,也不会产生撤回提示。\n\n成功回调表示删除请求已经完成;开启同步时,不代表其他客户端已经收到事件或完成界面更新。\n\n开启同步后,其他客户端可通过 `OnAdvanceMsgListener.onMsgDeleted` 接收删除的消息:\n\n```java\n@Override\npublic void onMsgDeleted(Message message) {\n // message 是已删除的消息。\n}\n```", "description": "使用 Android SDK 批量删除当前账号在同一会话中的消息。", "headings": [ { @@ -1702,35 +1702,35 @@ "title": "批量删除消息" }, "/sdk/android/message/managing-messages/delete-user-messages": { - "body": "```java\nmessageManager.deleteUserAllMessagesInConv(\n conversationID,\n targetUserID,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 删除请求已完成\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n }\n);\n```\n\n该 API 只用于群聊,可删除指定用户在目标群会话中的全部消息。调用者没有操作权限时,通过 `onError` 返回错误。\n\n其他客户端通过 `OnAdvanceMsgListener.onDeleteUserAllMsgsInConv` 接收删除通知。回调参数包含对应的 `conversationID` 和 `userID`:\n\n```java\n@Override\npublic void onDeleteUserAllMsgsInConv(DeleteUserAllMsgsListenerMsg event) {\n handleUserMessagesDeleted(event.getConversationID(), event.getUserID());\n}\n```", + "body": "```java\nmessageManager.deleteUserAllMessagesInConv(\n conversationID,\n targetUserID,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 删除请求已完成\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n }\n);\n```\n\n该 API 只用于群聊,可删除指定用户在目标群会话中的全部消息。调用者没有操作权限时,通过 `onError` 返回错误。\n\n其他客户端通过 `OnAdvanceMsgListener.onDeleteUserAllMsgsInConv` 接收删除通知。回调参数包含对应的 `conversationID` 和 `userID`:\n\n```java\n@Override\npublic void onDeleteUserAllMsgsInConv(DeleteUserAllMsgsListenerMsg event) {\n // event 包含受影响的会话和用户。\n}\n```", "description": "使用 Android SDK 删除指定用户在群聊中的全部消息。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/delete-user-messages", "title": "删除群聊中指定用户的全部消息" }, "/sdk/android/message/managing-messages/revoke-a-message": { - "body": "撤回会使其他客户端把原消息显示为撤回状态。调用失败时,通过错误回调获取错误码和错误信息。\n\n```java\nmessageManager.revokeMessageV2(callback, conversationID, clientMsgID);\n```\n\n成功回调表示撤回请求已经完成。其他客户端通过 `OnAdvanceMsgListener.onRecvMessageRevokedV2` 接收撤回通知。\n\n`RevokedInfo` 包含 `clientMsgID`、撤回者和撤回时间:\n\n```java\n@Override\npublic void onRecvMessageRevokedV2(RevokedInfo info) {\n handleRevokedMessage(info);\n}\n```\n\n接收端应把对应消息更新为撤回状态,而不是直接从列表删除。`MessageManager` 只能设置一个 `OnAdvanceMsgListener`;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见[事件概览](/sdk/android/events/overview-events)。", + "body": "撤回会使其他客户端把原消息显示为撤回状态。调用失败时,通过错误回调获取错误码和错误信息。\n\n```java\nmessageManager.revokeMessageV2(callback, conversationID, clientMsgID);\n```\n\n成功回调表示撤回请求已经完成。其他客户端通过 `OnAdvanceMsgListener.onRecvMessageRevokedV2` 接收撤回通知。\n\n`RevokedInfo` 包含 `clientMsgID`、撤回者和撤回时间:\n\n```java\n@Override\npublic void onRecvMessageRevokedV2(RevokedInfo info) {\n // info 包含被撤回消息的信息。\n}\n```\n\n接收端应把对应消息更新为撤回状态,而不是直接从列表删除。`MessageManager` 只能设置一个 `OnAdvanceMsgListener`;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见[事件概览](/sdk/android/events/overview-events)。", "description": "撤回已发送消息,并处理其他客户端收到的撤回通知。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", "title": "撤回消息" }, "/sdk/android/message/managing-messages/modify-a-message": { - "body": "`modifyMessage` 用于修改会话中已经存在的消息。通常应以原消息为基础修改支持编辑的内容,并保留其他字段。\n\n```java\nmessageManager.modifyMessage(callback, modifyRequest);\n```\n\n成功回调表示修改请求已经完成。\n\n消息修改后,其他客户端通过 `OnAdvanceMsgListener.onMessageModified` 接收修改后的完整 `Message`:\n\n```java\n@Override\npublic void onMessageModified(Message message) {\n handleModifiedMessage(message);\n}\n```\n\n`MessageManager` 只能设置一个 `OnAdvanceMsgListener`;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见[事件概览](/sdk/android/events/overview-events)。", + "body": "`modifyMessage` 用于修改会话中已经存在的消息。通常应以原消息为基础修改支持编辑的内容,并保留其他字段。\n\n```java\nmessageManager.modifyMessage(callback, modifyRequest);\n```\n\n成功回调表示修改请求已经完成。\n\n消息修改后,其他客户端通过 `OnAdvanceMsgListener.onMessageModified` 接收修改后的完整 `Message`:\n\n```java\n@Override\npublic void onMessageModified(Message message) {\n // message 是修改后的消息。\n}\n```\n\n`MessageManager` 只能设置一个 `OnAdvanceMsgListener`;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见[事件概览](/sdk/android/events/overview-events)。", "description": "修改支持编辑的消息内容,并处理其他客户端收到的消息修改事件。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", "title": "修改消息" }, "/sdk/android/message/managing-messages/get-pinned-messages": { - "body": "成功回调返回指定会话当前的置顶消息列表。\n\n```java\nmessageManager.getConversationPinnedMsgs(new OnBase>() {\n @Override public void onSuccess(List messages) { showPinned(messages); }\n @Override public void onError(int code, String error) { showPinnedError(error); }\n}, conversationID);\n```", + "body": "成功回调返回指定会话当前的置顶消息列表。\n\n```java\nmessageManager.getConversationPinnedMsgs(new OnBase>() {\n @Override public void onSuccess(List messages) { /* messages 是置顶消息。 */ }\n @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ }\n}, conversationID);\n```", "description": "使用 getConversationPinnedMsgs 查询会话中的置顶消息。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", "title": "查询会话置顶消息" }, "/sdk/android/message/managing-messages/set-message-pinned": { - "body": "最后一个参数为 `true` 时置顶消息,为 `false` 时取消置顶:\n\n```java\nmessageManager.setConversationPinnedMsg(\n callback,\n conversationID,\n clientMsgID,\n true\n);\n```\n\n成功回调表示设置请求完成,不代表置顶变化事件已经到达。\n\n置顶消息发生变化时,`OnAdvanceMsgListener.onChangedPinnedMsg` 返回对应的 `conversationID` 和当前置顶消息列表:\n\n```java\n@Override\npublic void onChangedPinnedMsg(ChangedPinnedMsg event) {\n handlePinnedMessagesChanged(event.getConversationID(), event.getMsgs());\n}\n```\n\n`MessageManager` 只能设置一个 `OnAdvanceMsgListener`;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见[事件概览](/sdk/android/events/overview-events)。需要主动获取当前置顶消息时,使用[查询会话置顶消息](/sdk/android/message/managing-messages/get-pinned-messages)。", + "body": "最后一个参数为 `true` 时置顶消息,为 `false` 时取消置顶:\n\n```java\nmessageManager.setConversationPinnedMsg(\n callback,\n conversationID,\n clientMsgID,\n true\n);\n```\n\n成功回调表示设置请求完成,不代表置顶变化事件已经到达。\n\n置顶消息发生变化时,`OnAdvanceMsgListener.onChangedPinnedMsg` 返回对应的 `conversationID` 和当前置顶消息列表:\n\n```java\n@Override\npublic void onChangedPinnedMsg(ChangedPinnedMsg event) {\n // event.getMsgs() 是置顶状态发生变化的消息。\n}\n```\n\n`MessageManager` 只能设置一个 `OnAdvanceMsgListener`;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见[事件概览](/sdk/android/events/overview-events)。需要主动获取当前置顶消息时,使用[查询会话置顶消息](/sdk/android/message/managing-messages/get-pinned-messages)。", "description": "设置会话消息的置顶状态,并处理置顶消息变化事件。", "headings": [], "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", @@ -1772,14 +1772,14 @@ "title": "设置消息本地扩展" }, "/sdk/android/message/managing-read-status/send-group-read-receipts": { - "body": "```java\nmessageManager.sendGroupMessageReadReceipt(\n conversationID,\n visibleClientMsgIDs,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 已读回执已上报\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n }\n);\n```\n\n同一批消息必须属于目标群会话。成功回调只表示服务端接受上报,不代表其他客户端界面已经更新。会话未读数仍由 `markConversationMessageAsRead` 独立维护。\n\n其他客户端通过 `OnAdvanceMsgListener.onRecvGroupMessageReadReceipt` 接收群消息已读回执:\n\n```java\n@Override\npublic void onRecvGroupMessageReadReceipt(GroupMessageReceipt receipt) {\n handleGroupMessageReadReceipt(receipt);\n}\n```\n\n需要查询某条群消息的已读或未读成员时,使用[查询群消息已读成员](/sdk/android/message/managing-read-status/get-group-message-readers)。", + "body": "```java\nmessageManager.sendGroupMessageReadReceipt(\n conversationID,\n visibleClientMsgIDs,\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 已读回执已上报\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n }\n);\n```\n\n同一批消息必须属于目标群会话。成功回调只表示服务端接受上报,不代表其他客户端界面已经更新。会话未读数仍由 `markConversationMessageAsRead` 独立维护。\n\n其他客户端通过 `OnAdvanceMsgListener.onRecvGroupMessageReadReceipt` 接收群消息已读回执:\n\n```java\n@Override\npublic void onRecvGroupMessageReadReceipt(GroupMessageReceipt receipt) {\n // receipt 包含群消息已读回执。\n}\n```\n\n需要查询某条群消息的已读或未读成员时,使用[查询群消息已读成员](/sdk/android/message/managing-read-status/get-group-message-readers)。", "description": "使用 Android SDK 上报群消息已读回执。", "headings": [], "sourcePath": "/sdk/android/message/managing-read-status/send-group-read-receipts", "title": "上报群消息已读" }, "/sdk/android/message/managing-read-status/get-group-message-readers": { - "body": "## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `conversationID` | `String` | 是 | 群聊会话 ID。 |\n| `clientMsgID` | `String` | 是 | 要查询阅读成员的消息 ID。 |\n| `filter` | `int` | 是 | `0` 查询已读成员,`1` 查询未读成员。 |\n| `offset` | `int` | 是 | 分页偏移量,首页传 `0`。 |\n| `count` | `int` | 是 | 本次请求的成员数量。 |\n\n```java\nmessageManager.getGroupMessageReaderList(\n conversationID,\n clientMsgID,\n 0,\n 0,\n 50,\n new OnBase>() {\n @Override\n public void onSuccess(List members) {\n renderMembers(members);\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n }\n);\n```\n\n成功回调返回当前页 `GroupMembersInfo` 列表,字段含义见[分页查询群成员](/sdk/android/group/retrieving-group-members/get-group-member-list)。需要完整列表时继续分页。", + "body": "## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `conversationID` | `String` | 是 | 群聊会话 ID。 |\n| `clientMsgID` | `String` | 是 | 要查询阅读成员的消息 ID。 |\n| `filter` | `int` | 是 | `0` 查询已读成员,`1` 查询未读成员。 |\n| `offset` | `int` | 是 | 分页偏移量,首页传 `0`。 |\n| `count` | `int` | 是 | 本次请求的成员数量。 |\n\n```java\nmessageManager.getGroupMessageReaderList(\n conversationID,\n clientMsgID,\n 0,\n 0,\n 50,\n new OnBase>() {\n @Override\n public void onSuccess(List members) {\n // members 是已读该消息的成员资料。\n }\n\n @Override\n public void onError(int code, String error) {\n // 处理失败\n }\n }\n);\n```\n\n成功回调返回当前页 `GroupMembersInfo` 列表,字段含义见[分页查询群成员](/sdk/android/group/retrieving-group-members/get-group-member-list)。需要完整列表时继续分页。", "description": "使用 Android SDK 分页查询群消息的已读或未读成员。", "headings": [ { @@ -1792,7 +1792,7 @@ "title": "查询群消息已读成员" }, "/sdk/android/file-uploads/upload-file": { - "body": "`uploadFile()` 是独立文件上传能力,可用于头像、群头像、资料附件或其他业务文件。上传过程不从属于消息,也不会自动创建消息或更新用户资料。\n\n## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| ------------------ | ------------------- | -------- | -------------------------------------------------------------------------- |\n| `base` | `OnBase` | 是 | 接收上传请求的最终成功或失败结果。 |\n| `listener` | `OnPutFileListener` | 是 | 接收当前任务的文件、分片、哈希及上传完成信息。 |\n| `putArgs.filepath` | `String` | 是 | Android 应用可读取的本地文件路径。 |\n| `putArgs.name` | `String` | 是 | 上传使用的文件名;`PutArgs` 默认使用传入路径,可按业务需要改为原始文件名。 |\n| `putArgs.cuase` | `String` | 否 | 业务约定的上传原因。字段名以 Android SDK 的 `PutArgs` 声明为准。 |\n\n```java\nFile file = new File(localPath);\nPutArgs args = new PutArgs(file.getAbsolutePath());\nargs.name = file.getName();\nargs.cuase = \"user-avatar\";\n\nOpenIMClient.getInstance().uploadFile(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n finishUploadRequest(result);\n }\n\n @Override\n public void onError(int code, String error) {\n showUploadError(code, error);\n }\n },\n new OnPutFileListener() {\n @Override\n public void open(long size) {\n initializeUpload(uploadTaskID, size);\n }\n\n @Override\n public void uploadID(String id) {\n bindSdkUploadID(uploadTaskID, id);\n }\n\n @Override\n public void uploadComplete(long fileSize, long streamSize, long storageSize) {\n recordUploadSizes(uploadTaskID, fileSize, streamSize, storageSize);\n }\n\n @Override\n public void complete(long size, String url, long type) {\n completeUpload(uploadTaskID, size, url, type);\n }\n },\n args\n);\n```\n\n## 回调说明\n\n`OnPutFileListener` 的回调和参数如下:\n\n| 回调 | 参数 | 说明 |\n| -------------------- | --------------------------------------- | ---------------------------------------------------- |\n| `open` | `size` | 打开指定大小的文件,可用于初始化任务。 |\n| `partSize` | `partSize`, `num` | 单个分片大小和分片总数。 |\n| `hashPartProgress` | `index`, `size`, `partHash` | 单个分片完成哈希计算时的分片索引、大小和哈希值。 |\n| `hashPartComplete` | `partsHash`, `fileHash` | 所有分片完成哈希计算后的组合哈希和最终文件哈希。 |\n| `uploadID` | `uploadID` | SDK 生成的上传标识。 |\n| `uploadPartComplete` | `index`, `partSize`, `partHash` | 一个分片上传完成时的分片索引、大小和哈希值。 |\n| `uploadComplete` | `fileSize`, `streamSize`, `storageSize` | 整个文件上传阶段的数据:文件大小、流大小和存储大小。 |\n| `complete` | `size`, `url`, `type` | 文件上传完成后的最终大小、远端 URL 和资源类型。 |\n\n`complete()` 返回的 URL 可用于后续更新头像、保存附件地址或创建 URL 类型的媒体消息。上传成功只表示文件资源已经写入远端;资料更新、消息创建和消息发送仍需分别调用对应 API。", + "body": "`uploadFile()` 是独立文件上传能力,可用于头像、群头像、资料附件或其他业务文件。上传过程不从属于消息,也不会自动创建消息或更新用户资料。\n\n## 参数说明\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| ------------------ | ------------------- | -------- | -------------------------------------------------------------------------- |\n| `base` | `OnBase` | 是 | 接收上传请求的最终成功或失败结果。 |\n| `listener` | `OnPutFileListener` | 是 | 接收当前任务的文件、分片、哈希及上传完成信息。 |\n| `putArgs.filepath` | `String` | 是 | Android 应用可读取的本地文件路径。 |\n| `putArgs.name` | `String` | 是 | 上传使用的文件名;`PutArgs` 默认使用传入路径,可按业务需要改为原始文件名。 |\n| `putArgs.cuase` | `String` | 否 | 业务约定的上传原因。字段名以 Android SDK 的 `PutArgs` 声明为准。 |\n\n```java\nFile file = new File(localPath);\nPutArgs args = new PutArgs(file.getAbsolutePath());\nargs.name = file.getName();\nargs.cuase = \"user-avatar\";\n\nOpenIMClient.getInstance().uploadFile(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n // result 是上传请求的最终结果。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n new OnPutFileListener() {\n @Override\n public void open(long size) {\n // size 是待上传文件的大小。\n }\n\n @Override\n public void uploadID(String id) {\n // id 是 SDK 生成的上传标识。\n }\n\n @Override\n public void uploadComplete(long fileSize, long streamSize, long storageSize) {\n // 文件、流和存储大小均已可用。\n }\n\n @Override\n public void complete(long size, String url, long type) {\n // url 是已上传资源的远端地址。\n }\n },\n args\n);\n```\n\n## 回调说明\n\n`OnPutFileListener` 的回调和参数如下:\n\n| 回调 | 参数 | 说明 |\n| -------------------- | --------------------------------------- | ---------------------------------------------------- |\n| `open` | `size` | 打开指定大小的文件,可用于初始化任务。 |\n| `partSize` | `partSize`, `num` | 单个分片大小和分片总数。 |\n| `hashPartProgress` | `index`, `size`, `partHash` | 单个分片完成哈希计算时的分片索引、大小和哈希值。 |\n| `hashPartComplete` | `partsHash`, `fileHash` | 所有分片完成哈希计算后的组合哈希和最终文件哈希。 |\n| `uploadID` | `uploadID` | SDK 生成的上传标识。 |\n| `uploadPartComplete` | `index`, `partSize`, `partHash` | 一个分片上传完成时的分片索引、大小和哈希值。 |\n| `uploadComplete` | `fileSize`, `streamSize`, `storageSize` | 整个文件上传阶段的数据:文件大小、流大小和存储大小。 |\n| `complete` | `size`, `url`, `type` | 文件上传完成后的最终大小、远端 URL 和资源类型。 |\n\n`complete()` 返回的 URL 可用于后续更新头像、保存附件地址或创建 URL 类型的媒体消息。上传成功只表示文件资源已经写入远端;资料更新、消息创建和消息发送仍需分别调用对应 API。", "description": "使用 Android SDK 独立上传文件并获取远端资源地址。", "headings": [ { @@ -1838,7 +1838,7 @@ "title": "音视频通话概览" }, "/sdk/android/calling/managing-calls/start-single-call": { - "body": "`signalingInvite()` 发起单聊通话。Android SDK 负责通话信令,应用仍需使用返回的房间凭据接入实时音视频媒体引擎。\n\n## 参数说明\n\n调用方法:\n\n```java\nsignalingInvite(OnBase callback, SignalingInfo info)\n```\n\n下表字段均为 `info` 的属性;使用点号表示嵌套对象。仅列出 Android SDK 与 WASM SDK 共有的参数。\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `invitation` | `SignalingInvitationInfo` | 是 | 本次通话邀请。 |\n| `invitation.inviterUserID` | `String` | 是 | 邀请者,传入当前登录用户 ID。 |\n| `invitation.inviteeUserIDList` | `List` | 是 | 被邀请用户列表;单聊只填写对方一个用户。 |\n| `invitation.groupID` | `String` | 是 | 群ID,单聊固定传空字符串。 |\n| `invitation.roomID` | `String` | 是 | 本次通话的唯一房间标识,后续状态按它合并。 |\n| `invitation.timeout` | `long` | 是 | 邀请等待时长,单位为秒。 |\n| `invitation.mediaType` | `String` | 是 | 媒体类型,业务通常约定为 `audio` 或 `video`。 |\n| `invitation.sessionType` | `int` | 是 | 单聊使用 `ConversationType.SINGLE_CHAT`,群聊使用 `ConversationType.SUPER_GROUP_CHAT`。 |\n| `invitation.platformID` | `int` | 是 | 当前客户端平台,固定传入 `Platform.ANDROID`。 |\n| `invitation.customData` | `String` | 否 | 随邀请携带的业务扩展字符串。 |\n| `invitation.initiateTime` | `long` | 否 | 邀请发起时间。通常由信令链路维护,无需手动填写。 |\n| `offlinePushInfo` | `OfflinePushInfo` | 否 | 被邀请人离线时使用的推送内容。 |\n| `offlinePushInfo.title` | `String` | 条件必填 | 推送标题,提供 `offlinePushInfo` 时必填 |\n| `offlinePushInfo.desc` | `String` | 条件必填 | 推送正文,提供 `offlinePushInfo` 时必填 |\n| `offlinePushInfo.ex` | `String` | 条件必填 | 推送扩展字符串,没有内容时传空字符串。 |\n| `offlinePushInfo.iOSPushSound` | `String` | 条件必填 | iOS 推送声音,提供 `offlinePushInfo` 时必填 |\n| `offlinePushInfo.iOSBadgeCount` | `boolean` | 条件必填 | 是否更新 iOS 角标,提供 `offlinePushInfo` 时必填 |\n\n```java\nSignalingInvitationInfo invitation = new SignalingInvitationInfo();\ninvitation.setInviterUserID(currentUserID);\ninvitation.setInviteeUserIDList(Collections.singletonList(peerUserID));\ninvitation.setGroupID(\"\");\ninvitation.setRoomID(roomID);\ninvitation.setTimeout(30);\ninvitation.setMediaType(\"video\");\ninvitation.setSessionType(ConversationType.SINGLE_CHAT);\ninvitation.setPlatformID(Platform.ANDROID);\ninvitation.setCustomData(\"{\\\"source\\\":\\\"contact-card\\\"}\");\n\nSignalingInfo info = new SignalingInfo();\ninfo.setInvitation(invitation);\ninfo.setOfflinePushInfo(offlinePushInfo);\n\nOpenIMClient.getInstance().signalingManager.signalingInvite(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n joinMediaRoom(\n credentials.getRoomID(),\n credentials.getToken(),\n credentials.getLiveURL()\n );\n }\n\n @Override\n public void onError(int code, String error) {\n showCallError(code, error);\n }\n },\n info\n);\n```\n\n成功回调返回 `SignalingCertificate`。其中 `roomID` 是媒体房间 ID,`token` 是加入房间使用的短期凭据,`liveURL` 是媒体服务提供的连接地址,`busyLineUserIDList` 是忙线用户列表。\n\n只有取得有效的 `token` 和 `roomID` 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。", + "body": "`signalingInvite()` 发起单聊通话。Android SDK 负责通话信令,应用仍需使用返回的房间凭据接入实时音视频媒体引擎。\n\n## 参数说明\n\n调用方法:\n\n```java\nsignalingInvite(OnBase callback, SignalingInfo info)\n```\n\n下表字段均为 `info` 的属性;使用点号表示嵌套对象。仅列出 Android SDK 与 WASM SDK 共有的参数。\n\n| 参数 | 类型 | 是否必填 | 说明 |\n| --- | --- | --- | --- |\n| `invitation` | `SignalingInvitationInfo` | 是 | 本次通话邀请。 |\n| `invitation.inviterUserID` | `String` | 是 | 邀请者,传入当前登录用户 ID。 |\n| `invitation.inviteeUserIDList` | `List` | 是 | 被邀请用户列表;单聊只填写对方一个用户。 |\n| `invitation.groupID` | `String` | 是 | 群ID,单聊固定传空字符串。 |\n| `invitation.roomID` | `String` | 是 | 本次通话的唯一房间标识,后续状态按它合并。 |\n| `invitation.timeout` | `long` | 是 | 邀请等待时长,单位为秒。 |\n| `invitation.mediaType` | `String` | 是 | 媒体类型,业务通常约定为 `audio` 或 `video`。 |\n| `invitation.sessionType` | `int` | 是 | 单聊使用 `ConversationType.SINGLE_CHAT`,群聊使用 `ConversationType.SUPER_GROUP_CHAT`。 |\n| `invitation.platformID` | `int` | 是 | 当前客户端平台,固定传入 `Platform.ANDROID`。 |\n| `invitation.customData` | `String` | 否 | 随邀请携带的业务扩展字符串。 |\n| `invitation.initiateTime` | `long` | 否 | 邀请发起时间。通常由信令链路维护,无需手动填写。 |\n| `offlinePushInfo` | `OfflinePushInfo` | 否 | 被邀请人离线时使用的推送内容。 |\n| `offlinePushInfo.title` | `String` | 条件必填 | 推送标题,提供 `offlinePushInfo` 时必填 |\n| `offlinePushInfo.desc` | `String` | 条件必填 | 推送正文,提供 `offlinePushInfo` 时必填 |\n| `offlinePushInfo.ex` | `String` | 条件必填 | 推送扩展字符串,没有内容时传空字符串。 |\n| `offlinePushInfo.iOSPushSound` | `String` | 条件必填 | iOS 推送声音,提供 `offlinePushInfo` 时必填 |\n| `offlinePushInfo.iOSBadgeCount` | `boolean` | 条件必填 | 是否更新 iOS 角标,提供 `offlinePushInfo` 时必填 |\n\n```java\nSignalingInvitationInfo invitation = new SignalingInvitationInfo();\ninvitation.setInviterUserID(currentUserID);\ninvitation.setInviteeUserIDList(Collections.singletonList(peerUserID));\ninvitation.setGroupID(\"\");\ninvitation.setRoomID(roomID);\ninvitation.setTimeout(30);\ninvitation.setMediaType(\"video\");\ninvitation.setSessionType(ConversationType.SINGLE_CHAT);\ninvitation.setPlatformID(Platform.ANDROID);\ninvitation.setCustomData(\"{\\\"source\\\":\\\"contact-card\\\"}\");\n\nSignalingInfo info = new SignalingInfo();\ninfo.setInvitation(invitation);\ninfo.setOfflinePushInfo(offlinePushInfo);\n\nOpenIMClient.getInstance().signalingManager.signalingInvite(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n // credentials 提供 roomID、token 和 liveURL,用于接入媒体房间。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n info\n);\n```\n\n成功回调返回 `SignalingCertificate`。其中 `roomID` 是媒体房间 ID,`token` 是加入房间使用的短期凭据,`liveURL` 是媒体服务提供的连接地址,`busyLineUserIDList` 是忙线用户列表。\n\n只有取得有效的 `token` 和 `roomID` 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。", "description": "使用 Android SDK 发起单聊音视频通话。", "headings": [ { @@ -1851,70 +1851,70 @@ "title": "发起单聊通话" }, "/sdk/android/calling/managing-calls/start-group-call": { - "body": "`signalingInviteInGroup()` 发起群聊通话,参数类型与[发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)相同。群聊通话时,`invitation.groupID` 必须传入群组 ID,`invitation.sessionType` 固定为 `ConversationType.GROUP_CHAT`。\n\n只会邀请 `inviteeUserIDList` 中列出的成员,填写 `groupID` 不会自动邀请全群。`inviteeUserIDList` 列表应排除当前用户、空值和重复成员。示例以群组 ID 作为房间 ID;若自行生成 `roomID`,所有参与者必须使用相同的值。\n\n```java\nSignalingInvitationInfo invitation = new SignalingInvitationInfo();\ninvitation.setInviterUserID(currentUserID);\ninvitation.setInviteeUserIDList(selectedGroupMemberIDs);\ninvitation.setGroupID(groupID);\ninvitation.setRoomID(groupID);\ninvitation.setTimeout(30);\ninvitation.setMediaType(\"video\");\ninvitation.setSessionType(ConversationType.GROUP_CHAT);\ninvitation.setPlatformID(Platform.ANDROID);\ninvitation.setCustomData(\"{\\\"source\\\":\\\"group-call\\\"}\");\n\nSignalingInfo info = new SignalingInfo();\ninfo.setInvitation(invitation);\ninfo.setOfflinePushInfo(offlinePushInfo);\n\nOpenIMClient.getInstance().signalingManager.signalingInviteInGroup(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n startGroupCall(credentials);\n }\n\n @Override\n public void onError(int code, String error) {\n showCallError(code, error);\n }\n },\n info\n);\n```\n\n成功回调返回 `SignalingCertificate`,其中 `roomID` 是媒体房间 ID,`token` 是加入房间使用的短期凭据,`liveURL` 是媒体服务提供的连接地址,`busyLineUserIDList` 是忙线用户列表。忙线用户不影响其余成员的邀请;成功也不表示已有成员接听。\n\n只有取得有效的 `token` 和 `roomID` 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。", + "body": "`signalingInviteInGroup()` 发起群聊通话,参数类型与[发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)相同。群聊通话时,`invitation.groupID` 必须传入群组 ID,`invitation.sessionType` 固定为 `ConversationType.GROUP_CHAT`。\n\n只会邀请 `inviteeUserIDList` 中列出的成员,填写 `groupID` 不会自动邀请全群。`inviteeUserIDList` 列表应排除当前用户、空值和重复成员。示例以群组 ID 作为房间 ID;若自行生成 `roomID`,所有参与者必须使用相同的值。\n\n```java\nSignalingInvitationInfo invitation = new SignalingInvitationInfo();\ninvitation.setInviterUserID(currentUserID);\ninvitation.setInviteeUserIDList(selectedGroupMemberIDs);\ninvitation.setGroupID(groupID);\ninvitation.setRoomID(groupID);\ninvitation.setTimeout(30);\ninvitation.setMediaType(\"video\");\ninvitation.setSessionType(ConversationType.GROUP_CHAT);\ninvitation.setPlatformID(Platform.ANDROID);\ninvitation.setCustomData(\"{\\\"source\\\":\\\"group-call\\\"}\");\n\nSignalingInfo info = new SignalingInfo();\ninfo.setInvitation(invitation);\ninfo.setOfflinePushInfo(offlinePushInfo);\n\nOpenIMClient.getInstance().signalingManager.signalingInviteInGroup(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n // credentials 包含加入媒体房间所需凭据。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n info\n);\n```\n\n成功回调返回 `SignalingCertificate`,其中 `roomID` 是媒体房间 ID,`token` 是加入房间使用的短期凭据,`liveURL` 是媒体服务提供的连接地址,`busyLineUserIDList` 是忙线用户列表。忙线用户不影响其余成员的邀请;成功也不表示已有成员接听。\n\n只有取得有效的 `token` 和 `roomID` 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。", "description": "使用 Android SDK 发起群聊音视频通话。", "headings": [], "sourcePath": "/sdk/android/calling/managing-calls/start-group-call", "title": "发起群聊通话" }, "/sdk/android/calling/managing-calls/accept-call": { - "body": "从 `onReceiveNewInvitation` 取得原始 `SignalingInfo` 后,使用 `signalingAccept()` 接受邀请:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingAccept(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n joinMediaRoom(\n credentials.getRoomID(),\n credentials.getToken(),\n credentials.getLiveURL()\n );\n }\n\n @Override\n public void onError(int code, String error) {\n showAcceptError(code, error);\n }\n },\n receivedInfo\n);\n```\n\n`receivedInfo` 必须保留收到的原始 `roomID`、邀请人、被邀请人和会话类型,不能重新构造为只包含 `roomID` 的对象。\n\n成功回调返回 `SignalingCertificate`。取得有效的 `token` 和 `roomID` 后再连接媒体房间;API 成功仅表示已向服务端提交接听请求,不代表通话已建立,请继续监听[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events),根据邀请方、其他设备或房间参与者返回的事件更新通话界面和状态。", + "body": "从 `onReceiveNewInvitation` 取得原始 `SignalingInfo` 后,使用 `signalingAccept()` 接受邀请:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingAccept(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n // credentials 提供 roomID、token 和 liveURL,用于接入媒体房间。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n receivedInfo\n);\n```\n\n`receivedInfo` 必须保留收到的原始 `roomID`、邀请人、被邀请人和会话类型,不能重新构造为只包含 `roomID` 的对象。\n\n成功回调返回 `SignalingCertificate`。取得有效的 `token` 和 `roomID` 后再连接媒体房间;API 成功仅表示已向服务端提交接听请求,不代表通话已建立,请继续监听[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events),根据邀请方、其他设备或房间参与者返回的事件更新通话界面和状态。", "description": "使用 Android SDK 接受通话邀请并获取房间凭据。", "headings": [], "sourcePath": "/sdk/android/calling/managing-calls/accept-call", "title": "接受通话" }, "/sdk/android/calling/managing-calls/reject-call": { - "body": "用户拒绝来电时,将收到的原始 `SignalingInfo` 交给 `signalingReject()`:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingReject(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n closeIncomingCallUI();\n }\n\n @Override\n public void onError(int code, String error) {\n showRejectError(code, error);\n }\n },\n signalingInfo\n);\n```\n\n成功回调只表示拒绝信令请求完成。发起端随后通过 `onInviteeRejected` 更新界面;完整处理见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。", + "body": "用户拒绝来电时,将收到的原始 `SignalingInfo` 交给 `signalingReject()`:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingReject(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n // 拒绝信令请求已完成。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n signalingInfo\n);\n```\n\n成功回调只表示拒绝信令请求完成。发起端随后通过 `onInviteeRejected` 更新界面;完整处理见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。", "description": "使用 Android SDK 拒绝通话邀请。", "headings": [], "sourcePath": "/sdk/android/calling/managing-calls/reject-call", "title": "拒绝通话" }, "/sdk/android/calling/managing-calls/cancel-call": { - "body": "邀请尚未接通时,发起方可调用 `signalingCancel()` 取消通话邀请:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingCancel(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n stopWaitingForAnswer(activeInfo.getInvitation().getRoomID());\n }\n\n @Override\n public void onError(int code, String error) {\n showCancelError(code, error);\n }\n },\n activeInfo\n);\n```\n\n必须传入发起时保存的完整 `SignalingInfo`,不能只构造一个 `roomID`。成功回调表示取消信令请求完成;应用还应结束本地等待接听状态,并释放尚未使用的媒体资源。远端通过 `onInvitationCancelled` 更新。", + "body": "邀请尚未接通时,发起方可调用 `signalingCancel()` 取消通话邀请:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingCancel(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n // 信令操作已完成。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n activeInfo\n);\n```\n\n必须传入发起时保存的完整 `SignalingInfo`,不能只构造一个 `roomID`。成功回调表示取消信令请求完成;应用还应结束本地等待接听状态,并释放尚未使用的媒体资源。远端通过 `onInvitationCancelled` 更新。", "description": "使用 Android SDK 取消尚未接通的通话邀请。", "headings": [], "sourcePath": "/sdk/android/calling/managing-calls/cancel-call", "title": "取消通话邀请" }, "/sdk/android/calling/managing-calls/hang-up-call": { - "body": "通话建立后,任一参与者都可以调用 `signalingHungUp()` 挂断。传入当前通话保存的完整 `SignalingInfo`,其中的 `roomID` 必须与当前媒体房间一致。\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingHungUp(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n releaseCallResources(signalingInfo.getInvitation().getRoomID());\n }\n\n @Override\n public void onError(int code, String error) {\n showHangUpError(code, error);\n }\n },\n signalingInfo\n);\n```\n\n成功回调只表示挂断信令请求已完成,不代表本地资源已自动释放。应用应关闭通话界面、停止本地采集、断开媒体房间,并释放摄像头和麦克风。", + "body": "通话建立后,任一参与者都可以调用 `signalingHungUp()` 挂断。传入当前通话保存的完整 `SignalingInfo`,其中的 `roomID` 必须与当前媒体房间一致。\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingHungUp(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n // 信令操作已完成。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n signalingInfo\n);\n```\n\n成功回调只表示挂断信令请求已完成,不代表本地资源已自动释放。应用应关闭通话界面、停止本地采集、断开媒体房间,并释放摄像头和麦克风。", "description": "使用 Android SDK 挂断已经建立的通话。", "headings": [], "sourcePath": "/sdk/android/calling/managing-calls/hang-up-call", "title": "挂断通话" }, "/sdk/android/calling/managing-calls/handle-call-events": { - "body": "在应用的通话状态管理处注册一次 `OnSignalingListener`。SDK 通过这些回调通知来电、接听、拒绝、取消、超时、挂断以及成员进出房间;应用据此更新通话界面和本地通话状态。\n\n`SignalingManager` 同时只保留一个 listener,重复调用 `setSignalingListener()` 会替换之前的 listener。退出登录或切换账号时,先停止更新旧账号的通话状态,再为新账号设置 listener。\n\n```java\nOpenIMClient.getInstance().signalingManager.setSignalingListener(\n new OnSignalingListener() {\n @Override\n public void onReceiveNewInvitation(SignalingInfo info) {\n showIncomingCall(info);\n }\n\n @Override\n public void onInviteeAccepted(SignalingInfo info) {\n updateCallStatus(info, \"accepted\");\n }\n\n @Override\n public void onInviteeRejected(SignalingInfo info) {\n updateCallStatus(info, \"rejected\");\n }\n\n @Override\n public void onInvitationCancelled(SignalingInfo info) {\n endCall(info);\n }\n\n @Override\n public void onInvitationTimeout(SignalingInfo info) {\n endCall(info);\n }\n\n @Override\n public void onInviteeAcceptedByOtherDevice(SignalingInfo info) {\n endCall(info);\n }\n\n @Override\n public void onInviteeRejectedByOtherDevice(SignalingInfo info) {\n endCall(info);\n }\n\n @Override\n public void onHangup(SignalingInfo info) {\n endCall(info);\n }\n\n @Override\n public void onRoomParticipantConnected(RoomCallingInfo room) {\n updateParticipantStatus(room, true);\n }\n\n @Override\n public void onRoomParticipantDisconnected(RoomCallingInfo room) {\n updateParticipantStatus(room, false);\n }\n\n @Override\n public void onStreamChange(String streamInfo) {\n handleStreamChange(streamInfo);\n }\n }\n);\n```\n\n| 回调 | 何时触发 | 应用应做什么 |\n| --- | --- | --- |\n| `onReceiveNewInvitation` | 收到新的通话邀请。 | 保存 `SignalingInfo`,显示来电界面,并让用户选择接听或拒绝。 |\n| `onInviteeAccepted`、`onInviteeRejected` | 某位被邀请者接听或拒绝。 | 更新该成员的通话状态;群聊中不应影响其他成员。 |\n| `onInvitationCancelled`、`onInvitationTimeout`、`onHangup` | 邀请被取消、超时或任一方挂断。 | 关闭对应通话界面,断开媒体房间并释放本地资源。 |\n| `onInviteeAcceptedByOtherDevice`、`onInviteeRejectedByOtherDevice` | 同一账号的另一台设备已接听或拒绝。 | 结束当前设备上的来电界面,避免两台设备同时处理同一邀请。 |\n| `onRoomParticipantConnected`、`onRoomParticipantDisconnected` | 成员进入或离开媒体房间。 | 更新群聊中的成员状态。 |\n| `onStreamChange` | 服务端发送媒体流变化信息。 | 按接入服务端实际约定解析字符串,再更新媒体流。 |", + "body": "在应用的通话状态管理处注册一次 `OnSignalingListener`。SDK 通过这些回调通知来电、接听、拒绝、取消、超时、挂断以及成员进出房间;应用据此更新通话界面和本地通话状态。\n\n`SignalingManager` 同时只保留一个 listener,重复调用 `setSignalingListener()` 会替换之前的 listener。退出登录或切换账号时,先停止更新旧账号的通话状态,再为新账号设置 listener。\n\n```java\nOpenIMClient.getInstance().signalingManager.setSignalingListener(\n new OnSignalingListener() {\n @Override\n public void onReceiveNewInvitation(SignalingInfo info) {\n // info 包含来电邀请信息。\n }\n\n @Override\n public void onInviteeAccepted(SignalingInfo info) {\n // info 表示通话已接受。\n }\n\n @Override\n public void onInviteeRejected(SignalingInfo info) {\n // info 表示通话已拒绝。\n }\n\n @Override\n public void onInvitationCancelled(SignalingInfo info) {\n // info 表示邀请已取消。\n }\n\n @Override\n public void onInvitationTimeout(SignalingInfo info) {\n // info 表示邀请已超时。\n }\n\n @Override\n public void onInviteeAcceptedByOtherDevice(SignalingInfo info) {\n // info 表示其他设备已接听。\n }\n\n @Override\n public void onInviteeRejectedByOtherDevice(SignalingInfo info) {\n // info 表示其他设备已拒绝。\n }\n\n @Override\n public void onHangup(SignalingInfo info) {\n // info 表示通话已挂断。\n }\n\n @Override\n public void onRoomParticipantConnected(RoomCallingInfo room) {\n // room 包含加入后的参与者信息。\n }\n\n @Override\n public void onRoomParticipantDisconnected(RoomCallingInfo room) {\n // room 包含离开后的参与者信息。\n }\n\n @Override\n public void onStreamChange(String streamInfo) {\n // streamInfo 包含媒体流变化。\n }\n }\n);\n```\n\n| 回调 | 何时触发 | 应用应做什么 |\n| --- | --- | --- |\n| `onReceiveNewInvitation` | 收到新的通话邀请。 | 保存 `SignalingInfo`,显示来电界面,并让用户选择接听或拒绝。 |\n| `onInviteeAccepted`、`onInviteeRejected` | 某位被邀请者接听或拒绝。 | 更新该成员的通话状态;群聊中不应影响其他成员。 |\n| `onInvitationCancelled`、`onInvitationTimeout`、`onHangup` | 邀请被取消、超时或任一方挂断。 | 关闭对应通话界面,断开媒体房间并释放本地资源。 |\n| `onInviteeAcceptedByOtherDevice`、`onInviteeRejectedByOtherDevice` | 同一账号的另一台设备已接听或拒绝。 | 结束当前设备上的来电界面,避免两台设备同时处理同一邀请。 |\n| `onRoomParticipantConnected`、`onRoomParticipantDisconnected` | 成员进入或离开媒体房间。 | 更新群聊中的成员状态。 |\n| `onStreamChange` | 服务端发送媒体流变化信息。 | 按接入服务端实际约定解析字符串,再更新媒体流。 |", "description": "集中设置 Android SDK 的通话邀请、参与者和媒体流 listener。", "headings": [], "sourcePath": "/sdk/android/calling/managing-calls/handle-call-events", "title": "处理通话事件" }, "/sdk/android/calling/retrieving-call-information/restore-pending-invitation": { - "body": "`getSignalingInvitationInfoStartApp()` 用于在应用启动或恢复时获取未处理的通话邀请。\n\n```java\nOpenIMClient.getInstance().signalingManager.getSignalingInvitationInfoStartApp(\n new OnBase() {\n @Override\n public void onSuccess(SignalingInfo info) {\n if (info != null\n && info.getInvitation() != null\n && info.getInvitation().getRoomID() != null\n && !info.getInvitation().getRoomID().isEmpty()) {\n restoreIncomingCall(info);\n }\n }\n\n @Override\n public void onError(int code, String error) {\n clearExpiredIncomingCall();\n }\n }\n);\n```\n\n成功回调返回的是调用时的邀请快照,不会接通通话,仍需自行处理取消、超时、接受通话邀请。", + "body": "`getSignalingInvitationInfoStartApp()` 用于在应用启动或恢复时获取未处理的通话邀请。\n\n```java\nOpenIMClient.getInstance().signalingManager.getSignalingInvitationInfoStartApp(\n new OnBase() {\n @Override\n public void onSuccess(SignalingInfo info) {\n // 使用前校验 info 中 invitation 和 roomID 是否有效。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明查询失败原因。\n }\n }\n);\n```\n\n成功回调返回的是调用时的邀请快照,不会接通通话,仍需自行处理取消、超时、接受通话邀请。", "description": "使用 Android SDK 恢复应用启动时尚未处理的通话邀请。", "headings": [], "sourcePath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", "title": "恢复启动前收到的通话邀请" }, "/sdk/android/calling/retrieving-call-information/get-room-by-group-id": { - "body": "`signalingGetRoomByGroupID()` 的参数是群组 ID,不是 `roomID`,即使通话使用了自定义 `roomID`。\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID(\n new OnBase() {\n @Override\n public void onSuccess(RoomCallingInfo room) {\n if (room.getRoomID() != null && !room.getRoomID().isEmpty()) {\n renderParticipants(room.getParticipant());\n }\n }\n\n @Override\n public void onError(int code, String error) {\n showNoActiveGroupCall();\n }\n },\n groupID\n);\n```\n\n成功回调返回 `RoomCallingInfo` 快照,其中包含房间 ID、原始邀请、参与者、群组 ID、Token 和连接地址。\n\n如果当前群组没有进行中的通话,接口可能返回错误或空房间。此时应清除本地保存的通话状态和房间凭据,不要继续尝试加入旧房间。", + "body": "`signalingGetRoomByGroupID()` 的参数是群组 ID,不是 `roomID`,即使通话使用了自定义 `roomID`。\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID(\n new OnBase() {\n @Override\n public void onSuccess(RoomCallingInfo room) {\n // room 包含房间、邀请和当前参与者快照。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明查询失败原因。\n }\n },\n groupID\n);\n```\n\n成功回调返回 `RoomCallingInfo` 快照,其中包含房间 ID、原始邀请、参与者、群组 ID、Token 和连接地址。\n\n成功结果没有有效 `roomID` 时,表示未取得可用的房间信息。错误回调中的 `code` 和 `error` 只说明查询失败原因,不能据此判断群组没有进行中的通话。", "description": "使用 Android SDK 按群组 ID 查询进行中的通话房间。", "headings": [], "sourcePath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", "title": "查询群组通话房间" }, "/sdk/android/calling/retrieving-call-information/get-token-by-room-id": { - "body": "已经知道 `roomID`、但需要重新获取入会凭据时,调用 `signalingGetTokenByRoomID()`:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingGetTokenByRoomID(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n if (credentials.getToken() != null\n && credentials.getRoomID() != null) {\n joinMediaRoom(\n credentials.getRoomID(),\n credentials.getToken(),\n credentials.getLiveURL()\n );\n }\n }\n\n @Override\n public void onError(int code, String error) {\n showCredentialError(code, error);\n }\n },\n roomID\n);\n```\n\n成功回调返回 `SignalingCertificate`,可获取接入音视频房间所需的 `token` 和 `liveURL`。\n\n房间 Token 是短期敏感凭据,只在内存中使用,不要写入日志、URL、分析事件或持久化存储。", + "body": "已经知道 `roomID`、但需要重新获取入会凭据时,调用 `signalingGetTokenByRoomID()`:\n\n```java\nOpenIMClient.getInstance().signalingManager.signalingGetTokenByRoomID(\n new OnBase() {\n @Override\n public void onSuccess(SignalingCertificate credentials) {\n // credentials 提供 roomID、token 和 liveURL,用于接入媒体房间。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n roomID\n);\n```\n\n成功回调返回 `SignalingCertificate`,可获取接入音视频房间所需的 `token` 和 `liveURL`。\n\n房间 Token 是短期敏感凭据,只在内存中使用,不要写入日志、URL、分析事件或持久化存储。", "description": "使用 Android SDK 按房间 ID 重新获取入会凭据。", "headings": [], "sourcePath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", "title": "获取通话房间 Token" }, "/sdk/android/calling/sending-custom-signals/send-a-custom-signal": { - "body": "`signalingSendCustomSignal()` 用于在指定通话房间内发送少量与通话相关的业务信息,例如举手、切换布局提示或临时状态同步。它不是聊天消息接口,也不适合发送大量数据或文件。\n\n## 发送信令\n\n`roomID` 与 `customInfo` 都是必填字符串。需要传递结构化数据时,应定义稳定的数据格式并序列化为 JSON。\n\n```java\nJSONObject signal = new JSONObject();\nsignal.put(\"version\", 1);\nsignal.put(\"eventID\", eventID);\nsignal.put(\"type\", \"hand-raised\");\nsignal.put(\"userID\", currentUserID);\nsignal.put(\"sentAt\", System.currentTimeMillis());\n\nOpenIMClient.getInstance().signalingManager.signalingSendCustomSignal(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n markSignalSent(eventID);\n }\n\n @Override\n public void onError(int code, String error) {\n showSignalError(code, error);\n }\n },\n roomID,\n signal.toString()\n);\n```\n\n成功回调只表示发送请求已完成,不表示其他参与者已收到或处理该信令。建议在 `customInfo` 中包含协议版本和唯一的 `eventID`,以便接收方识别重复消息。不要放入大文件、聊天记录、长期状态或敏感凭据。\n\n## 接收信令\n\n收到自定义信令时,`OnSignalingListener.onReceiveCustomSignal` 会返回 `CustomSignalingInfo`。先确认它属于当前房间并校验数据格式,再更新界面:\n\n```java\n@Override\npublic void onReceiveCustomSignal(CustomSignalingInfo info) {\n if (info == null || !activeRoomID.equals(info.getRoomID())) {\n return;\n }\n\n CallSignal signal = parseAndValidateCallSignal(info.getCustomInfo());\n String mergeID = info.getRoomID() + \":\" + signal.getEventID();\n if (hasAppliedSignal(mergeID)) {\n return;\n }\n applyCallSignal(signal);\n}\n```\n\n如果业务需要避免重复处理,可以在自定义信令中携带唯一事件 ID,并在接收端记录已处理的事件。消息可能不会按发送顺序到达,因此不要依赖到达顺序决定业务状态。\n\n将 `onReceiveCustomSignal` 与其他通话回调一起注册到[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)中的 listener。`SignalingManager` 只保留一个 listener;重新设置会覆盖已有的其他通话回调。\n\n客户端自定义信令不能用于授予主持人、付费或隐私权限。这类需要可信校验的状态应由服务端保存和判断;在连接断连恢复时,应该从房间查询或业务后端恢复长期状态。", + "body": "`signalingSendCustomSignal()` 用于在指定通话房间内发送少量与通话相关的业务信息,例如举手、切换布局提示或临时状态同步。它不是聊天消息接口,也不适合发送大量数据或文件。\n\n## 发送信令\n\n`roomID` 与 `customInfo` 都是必填字符串。需要传递结构化数据时,应定义稳定的数据格式并序列化为 JSON。\n\n```java\nJSONObject signal = new JSONObject();\nsignal.put(\"version\", 1);\nsignal.put(\"eventID\", eventID);\nsignal.put(\"type\", \"hand-raised\");\nsignal.put(\"userID\", currentUserID);\nsignal.put(\"sentAt\", System.currentTimeMillis());\n\nOpenIMClient.getInstance().signalingManager.signalingSendCustomSignal(\n new OnBase() {\n @Override\n public void onSuccess(String result) {\n // 信令发送请求已完成。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n roomID,\n signal.toString()\n);\n```\n\n成功回调只表示发送请求已完成,不表示其他参与者已收到或处理该信令。建议在 `customInfo` 中包含协议版本和唯一的 `eventID`,以便接收方识别重复消息。不要放入大文件、聊天记录、长期状态或敏感凭据。\n\n## 接收信令\n\n收到自定义信令时,`OnSignalingListener.onReceiveCustomSignal` 会返回 `CustomSignalingInfo`。先确认它属于当前房间并校验数据格式,再更新界面:\n\n```java\n@Override\npublic void onReceiveCustomSignal(CustomSignalingInfo info) {\n // 先检查 info.getRoomID(),再按业务协议解析 info.getCustomInfo()。\n}\n```\n\n如果业务需要避免重复处理,可以在自定义信令中携带唯一事件 ID,并在接收端记录已处理的事件。消息可能不会按发送顺序到达,因此不要依赖到达顺序决定业务状态。\n\n将 `onReceiveCustomSignal` 与其他通话回调一起注册到[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)中的 listener。`SignalingManager` 只保留一个 listener;重新设置会覆盖已有的其他通话回调。\n\n客户端自定义信令不能用于授予主持人、付费或隐私权限。这类需要可信校验的状态应由服务端保存和判断;在连接断连恢复时,应该从房间查询或业务后端恢复长期状态。", "description": "使用 Android SDK 在通话房间中发送和接收自定义信令。", "headings": [ { @@ -1955,7 +1955,7 @@ "title": "事件概览" }, "/sdk/android/logger": { - "body": "OpenIM Android SDK 日志用于定位初始化、连接和业务 API 调用问题。开发和预发布环境可以输出较详细的信息;生产环境应减少日志量,并避免记录 Token、完整消息正文、原始文件 URL、通话房间凭据和用户隐私字段。\n\n## 初始化日志配置\n\n在调用 `initSDK()` 时配置日志:\n\n```java\nFile dataDirectory = new File(application.getFilesDir(), \"openim\");\nFile logDirectory = new File(application.getFilesDir(), \"openim-logs\");\n\nInitConfig config = new InitConfig(\n apiAddr,\n wsAddr,\n dataDirectory.getAbsolutePath()\n);\nconfig.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn;\nconfig.isLogStandardOutput = BuildConfig.DEBUG;\nconfig.logFilePath = logDirectory.getAbsolutePath();\n\nboolean initialized = OpenIMClient.getInstance().initSDK(\n application,\n config,\n connectionListener\n);\n```\n\n| 字段 | 说明 |\n| --- | --- |\n| `logLevel` | 使用 `LogLevel` 常量控制详细程度。可选值包括 `DebugWithSQL`、`Debug`、`Info`、`Warn`、`Error`、`Panic` 和 `Fatal`。 |\n| `isLogStandardOutput` | 是否把 SDK 日志输出到 Android 标准日志;开发诊断时开启。 |\n| `logFilePath` | 可选日志目录,应位于应用可写范围并纳入容量与保留期管理。 |\n\n开发诊断可以使用 `Debug`;只有排查数据库问题时才临时启用 `DebugWithSQL`。生产环境通常使用 `Warn` 或 `Error`,并关闭不必要的标准输出。\n\n## 写入应用日志\n\n需要把业务日志写入 SDK 日志时,使用 `logs()`:\n\n```java\nOpenIMClient.getInstance().logs(\n LogLevel.Error,\n ChatRepository.class.getSimpleName(),\n 184,\n \"send_message_failed\",\n errorMessage,\n \"conversationID\", conversationID,\n \"clientMsgID\", clientMsgID\n);\n```\n\n`currentClassName` 和 `currentLineNum` 用于定位调用位置,`msgStr` 是简短动作描述,`errStr` 是错误信息。`Warn`、`Error`、`Panic` 和 `Fatal` 级别必须提供非空错误信息。末尾的 `extra` 按“键、值”成对传入;只记录排查所需的非敏感标识。\n\n旧版带 `OnBase`、`Map` 参数的 `logs()` 重载已经废弃,不应在新代码中使用。\n\n## 上传日志\n\n`uploadLogs()` 可将客户端日志上传至服务器,主要使用场景是用户主动提交诊断日志。\n\n```java\nString cancelID = UUID.randomUUID().toString();\n\nOpenIMClient.getInstance().uploadLogs(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n showLogUploadCompleted();\n }\n\n @Override\n public void onError(int code, String error) {\n showLogUploadError(code, error);\n }\n },\n new ArrayList<>(),\n 2000, // line\n cancelID,\n \"support-ticket-42\", // ex\n new UploadLogProgress() {\n @Override\n public void onProgress(long current, long total) {\n updateLogUploadProgress(current, total);\n }\n }\n);\n```\n\n| 参数 | 说明 |\n| --- | --- |\n| `params` | 历史遗留参数,当前 SDK 不使用;传入空列表,例如 `new ArrayList<>()`。 |\n| `line` | 本次上传读取的日志行数配置。 |\n| `cancelID` | 本次上传的稳定标识,可使用业务生成的 UUID。 |\n| `ex` | 附加到上传任务的诊断说明,例如工单 ID;不能包含凭据或隐私数据。 |\n| `UploadLogProgress` | 提供当前进度和总量,用于更新上传界面。 |\n\n成功 callback 表示本次日志上传请求完成。\n\n## 使用 operationID 定位一次 SDK 调用\n\nOpenIM Android SDK 的公共业务方法不接收 `operationID` 参数。每次调用 SDK 时,会自动生成 `operationID`。`operationID` 只对应一次 SDK 调用,不是用户身份、权限凭据、业务幂等键或业务 ID。\n\n排查问题时,在客户端 SDK 日志中找到报错或异常调用附近的 `operationID`,可用它定位这一次 SDK 调用的相关日志。向技术支持提供日志时,同时提供发生时间、用户 ID、操作名称,以及必要的 `conversationID`、`clientMsgID`、`groupID` 或 `roomID`,有助于更快找到对应记录。\n\n## 相关页面\n\n- [按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation)\n- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)\n- [发送消息](/sdk/android/message/sending-messages/send-message)", + "body": "OpenIM Android SDK 日志用于定位初始化、连接和业务 API 调用问题。开发和预发布环境可以输出较详细的信息;生产环境应减少日志量,并避免记录 Token、完整消息正文、原始文件 URL、通话房间凭据和用户隐私字段。\n\n## 初始化日志配置\n\n在调用 `initSDK()` 时配置日志:\n\n```java\nFile dataDirectory = new File(application.getFilesDir(), \"openim\");\nFile logDirectory = new File(application.getFilesDir(), \"openim-logs\");\n\nInitConfig config = new InitConfig(\n apiAddr,\n wsAddr,\n dataDirectory.getAbsolutePath()\n);\nconfig.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn;\nconfig.isLogStandardOutput = BuildConfig.DEBUG;\nconfig.logFilePath = logDirectory.getAbsolutePath();\n\nboolean initialized = OpenIMClient.getInstance().initSDK(\n application,\n config,\n connectionListener\n);\n```\n\n| 字段 | 说明 |\n| --- | --- |\n| `logLevel` | 使用 `LogLevel` 常量控制详细程度。可选值包括 `DebugWithSQL`、`Debug`、`Info`、`Warn`、`Error`、`Panic` 和 `Fatal`。 |\n| `isLogStandardOutput` | 是否把 SDK 日志输出到 Android 标准日志;开发诊断时开启。 |\n| `logFilePath` | 可选日志目录,应位于应用可写范围并纳入容量与保留期管理。 |\n\n开发诊断可以使用 `Debug`;只有排查数据库问题时才临时启用 `DebugWithSQL`。生产环境通常使用 `Warn` 或 `Error`,并关闭不必要的标准输出。\n\n## 写入应用日志\n\n需要把业务日志写入 SDK 日志时,使用 `logs()`:\n\n```java\nOpenIMClient.getInstance().logs(\n LogLevel.Error,\n ChatRepository.class.getSimpleName(),\n 184,\n \"send_message_failed\",\n errorMessage,\n \"conversationID\", conversationID,\n \"clientMsgID\", clientMsgID\n);\n```\n\n`currentClassName` 和 `currentLineNum` 用于定位调用位置,`msgStr` 是简短动作描述,`errStr` 是错误信息。`Warn`、`Error`、`Panic` 和 `Fatal` 级别必须提供非空错误信息。末尾的 `extra` 按“键、值”成对传入;只记录排查所需的非敏感标识。\n\n旧版带 `OnBase`、`Map` 参数的 `logs()` 重载已经废弃,不应在新代码中使用。\n\n## 上传日志\n\n`uploadLogs()` 可将客户端日志上传至服务器,主要使用场景是用户主动提交诊断日志。\n\n```java\nString cancelID = UUID.randomUUID().toString();\n\nOpenIMClient.getInstance().uploadLogs(\n new OnBase() {\n @Override\n public void onSuccess(String data) {\n // 日志上传请求已完成。\n }\n\n @Override\n public void onError(int code, String error) {\n // code 和 error 说明失败原因。\n }\n },\n new ArrayList<>(),\n 2000, // line\n cancelID,\n \"support-ticket-42\", // ex\n new UploadLogProgress() {\n @Override\n public void onProgress(long current, long total) {\n // current 和 total 表示上传进度。\n }\n }\n);\n```\n\n| 参数 | 说明 |\n| --- | --- |\n| `params` | 历史遗留参数,当前 SDK 不使用;传入空列表,例如 `new ArrayList<>()`。 |\n| `line` | 本次上传读取的日志行数配置。 |\n| `cancelID` | 本次上传的稳定标识,可使用业务生成的 UUID。 |\n| `ex` | 附加到上传任务的诊断说明,例如工单 ID;不能包含凭据或隐私数据。 |\n| `UploadLogProgress` | 提供当前进度和总量,用于更新上传界面。 |\n\n成功 callback 表示本次日志上传请求完成。\n\n## 使用 operationID 定位一次 SDK 调用\n\nOpenIM Android SDK 的公共业务方法不接收 `operationID` 参数。每次调用 SDK 时,会自动生成 `operationID`。`operationID` 只对应一次 SDK 调用,不是用户身份、权限凭据、业务幂等键或业务 ID。\n\n排查问题时,在客户端 SDK 日志中找到报错或异常调用附近的 `operationID`,可用它定位这一次 SDK 调用的相关日志。向技术支持提供日志时,同时提供发生时间、用户 ID、操作名称,以及必要的 `conversationID`、`clientMsgID`、`groupID` 或 `roomID`,有助于更快找到对应记录。\n\n## 相关页面\n\n- [按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation)\n- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)\n- [发送消息](/sdk/android/message/sending-messages/send-message)", "description": "配置 Android SDK 日志、写入应用诊断信息并上传日志。", "headings": [ { diff --git a/src/generated/search-index-zh.json b/src/generated/search-index-zh.json index 26c84bd8c2..649d2fc0c9 100644 --- a/src/generated/search-index-zh.json +++ b/src/generated/search-index-zh.json @@ -2141,7 +2141,7 @@ "description": "使用 getOneConversation() 按用户或群组获取一个会话。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversation-by-target", - "content": "getOneConversation 按用户或群组获取一个会话信息,适用于从通讯录、用户资料或群资料进入聊天页的场景。单聊传对方用户 ID,群聊传群组 ID。 OpenIMClient.getInstance .conversationManager.getOneConversation new OnBase @Override public void onSuccess ConversationInfo conversation openChatPage conversation ; @Override public void onError int code, String error recordConversationOpenFailure code, error ; , sourceId, ConversationType.SINGLE CHAT ; 参数 sourceId 在单聊中是对方 userID ,在群聊中是 groupID 。群聊根据群类型使用 ConversationType.GROUP CHAT 或 ConversationType.SUPER GROUP CHAT 。 成功回调返回 ConversationInfo 。如果需要接收会话列表的新增或变化,请参考 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 设置 OnConversationListener 。" + "content": "getOneConversation 按用户或群组获取一个会话信息,适用于从通讯录、用户资料或群资料进入聊天页的场景。单聊传对方用户 ID,群聊传群组 ID。 OpenIMClient.getInstance .conversationManager.getOneConversation new OnBase @Override public void onSuccess ConversationInfo conversation // conversation 是目标会话资料。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , sourceId, ConversationType.SINGLE CHAT ; 参数 sourceId 在单聊中是对方 userID ,在群聊中是 groupID 。群聊根据群类型使用 ConversationType.GROUP CHAT 或 ConversationType.SUPER GROUP CHAT 。 成功回调返回 ConversationInfo 。如果需要接收会话列表的新增或变化,请参考 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 设置 OnConversationListener 。" }, { "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", @@ -2157,7 +2157,7 @@ "description": "使用 getMultipleConversation() 按 conversationID 批量获取会话。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversations-by-id", - "content": "使用 getMultipleConversation 根据 conversationIDs 查询多个会话。 conversationIDs 是待查询的会话 ID 列表。 OpenIMClient.getInstance .conversationManager.getMultipleConversation new OnBase @Override public void onSuccess List conversations for ConversationInfo item : conversations conversationStore.put item.getConversationID , item ; @Override public void onError int code, String error recordConversationQueryFailure code, error ; , conversationIDs ; 成功回调返回 List 。" + "content": "使用 getMultipleConversation 根据 conversationIDs 查询多个会话。 conversationIDs 是待查询的会话 ID 列表。 OpenIMClient.getInstance .conversationManager.getMultipleConversation new OnBase @Override public void onSuccess List conversations // conversations 是按 conversationIDs 查询到的会话快照。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , conversationIDs ; 成功回调返回 List 。" }, { "path": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", @@ -2165,7 +2165,7 @@ "description": "使用 getConversationListSplit() 分页获取当前账号的会话列表。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation retrieving-conversations retrieve-conversation-list", - "content": "会话列表属于当前登录用户。每条 ConversationInfo 包含会话标识、未读数、最后一条消息、置顶和草稿等状态。 分页获取会话 OpenIMClient.getInstance .conversationManager.getConversationListSplit new OnBase @Override public void onSuccess List conversations mergeConversations conversations ; @Override public void onError int code, String error recordConversationListFailure code, error ; , 0, 50 ; | 参数 | 类型 | 说明 | | | | | | offset | long | 从 0 开始的分页偏移量;刷新时重置为 0 。 | | count | long | 本页期望返回的会话数量。 | 成功回调返回当前页 List 。继续加载时按已经请求的条目数量推进 offset ;返回数量小于 count 时通常表示到达末页。 保持列表同步 会话列表发生新增或变化时,可以通过 OnConversationListener 接收以下 callback: OnConversationListener conversationListener = new OnConversationListener @Override public void onNewConversation List conversations mergeConversations conversations ; @Override public void onConversationChanged List conversations mergeConversations conversations ; ; OpenIMClient.getInstance .conversationManager.setOnConversationListener conversationListener ; 两个事件都携带 List ,可按 conversationID 更新列表中的对应会话。 setOnConversationListener 设置后即可接收会话变化。" + "content": "会话列表属于当前登录用户。每条 ConversationInfo 包含会话标识、未读数、最后一条消息、置顶和草稿等状态。 分页获取会话 OpenIMClient.getInstance .conversationManager.getConversationListSplit new OnBase @Override public void onSuccess List conversations // conversations 是当前页会话列表。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , 0, 50 ; | 参数 | 类型 | 说明 | | | | | | offset | long | 从 0 开始的分页偏移量;刷新时重置为 0 。 | | count | long | 本页期望返回的会话数量。 | 成功回调返回当前页 List 。继续加载时按已经请求的条目数量推进 offset ;返回数量小于 count 时通常表示到达末页。 保持列表同步 会话列表发生新增或变化时,可以通过 OnConversationListener 接收以下 callback: OnConversationListener conversationListener = new OnConversationListener @Override public void onNewConversation List conversations // conversations 是新增会话。 @Override public void onConversationChanged List conversations // conversations 是发生变化的会话。 ; OpenIMClient.getInstance .conversationManager.setOnConversationListener conversationListener ; 两个事件都携带 List ,可按 conversationID 更新列表中的对应会话。 setOnConversationListener 设置后即可接收会话变化。" }, { "path": "/sdk/android/conversation/managing-conversations/pin-conversation", @@ -2173,7 +2173,7 @@ "description": "使用 pinConversation() 设置指定会话的置顶状态。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations pin-conversation", - "content": "OpenIMClient.getInstance .conversationManager.pinConversation new OnBase @Override public void onSuccess String data markPinRequestSubmitted conversationID, true ; @Override public void onError int code, String error recordConversationPinFailure code, error ; , conversationID, true ; 最后一个参数为 true 时置顶,传 false 时取消置顶。 会话列表发生变化时,可通过 onConversationChanged 接收更新,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "OpenIMClient.getInstance .conversationManager.pinConversation new OnBase @Override public void onSuccess String data // 请求已完成。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , conversationID, true ; 最后一个参数为 true 时置顶,传 false 时取消置顶。 会话列表发生变化时,可通过 onConversationChanged 接收更新,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/set-conversation-extension", @@ -2181,7 +2181,7 @@ "description": "使用 setConversationEx() 设置指定会话的业务扩展字符串。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-conversation-extension", - "content": "ex 是用于保存会话扩展信息的字符串,可以传入 JSON 字符串或其他业务约定格式的字符串。 OpenIMClient.getInstance .conversationManager.setConversationEx new OnBase @Override public void onSuccess String data markConversationExtensionSubmitted conversationID ; @Override public void onError int code, String error recordConversationExtensionFailure code, error ; , conversationID, extensionJSON ; 成功回调表示设置请求已完成。会话列表中的扩展字段变化可通过 onConversationChanged 接收,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "ex 是用于保存会话扩展信息的字符串,可以传入 JSON 字符串或其他业务约定格式的字符串。 OpenIMClient.getInstance .conversationManager.setConversationEx new OnBase @Override public void onSuccess String data // 请求已完成。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , conversationID, extensionJSON ; 成功回调表示设置请求已完成。会话列表中的扩展字段变化可通过 onConversationChanged 接收,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/set-conversation-draft", @@ -2189,7 +2189,7 @@ "description": "使用 setConversationDraft() 保存会话草稿。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-conversation-draft", - "content": "用户离开聊天页、切换会话或输入框内容变化时,可以使用 setConversationDraft 保存草稿。输入过程中先维护编辑器状态并对保存调用做防抖;离开页面前再提交一次最新文本。 OpenIMClient.getInstance .conversationManager.setConversationDraft new OnBase @Override public void onSuccess String data markDraftSubmitted conversationID ; @Override public void onError int code, String error recordDraftSaveFailure code, error ; , conversationID, editorValue ; 清空草稿时传空字符串。会话列表中的草稿变化可通过 onConversationChanged 接收。" + "content": "用户离开聊天页、切换会话或输入框内容变化时,可以使用 setConversationDraft 保存草稿。输入过程中先维护编辑器状态并对保存调用做防抖;离开页面前再提交一次最新文本。 OpenIMClient.getInstance .conversationManager.setConversationDraft new OnBase @Override public void onSuccess String data // 请求已完成。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , conversationID, editorValue ; 清空草稿时传空字符串。会话列表中的草稿变化可通过 onConversationChanged 接收。" }, { "path": "/sdk/android/conversation/managing-conversations/set-message-receive-option", @@ -2197,7 +2197,7 @@ "description": "使用 setConversationRecvMessageOpt() 设置单个会话的消息接收与通知方式。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-message-receive-option", - "content": "OpenIMClient.getInstance .conversationManager.setConversationRecvMessageOpt new OnBase @Override public void onSuccess String data markReceiveOptionSubmitted conversationID ; @Override public void onError int code, String error recordReceiveOptionFailure code, error ; , conversationID, 2 ; | 数值 | 含义 | | | | | 0 | 正常接收消息并允许通知。 | | 1 | 不接收该会话消息,也不通知。 | | 2 | 接收该会话消息,但不通知。 | 账号级默认策略见 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception 。会话列表中的接收方式变化可通过 onConversationChanged 接收,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "OpenIMClient.getInstance .conversationManager.setConversationRecvMessageOpt new OnBase @Override public void onSuccess String data // 请求已完成。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , conversationID, 2 ; | 数值 | 含义 | | | | | 0 | 正常接收消息并允许通知。 | | 1 | 不接收该会话消息,也不通知。 | | 2 | 接收该会话消息,但不通知。 | 账号级默认策略见 设置全局消息接收方式 /sdk/android/user/user profile/set global message reception 。会话列表中的接收方式变化可通过 onConversationChanged 接收,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/clear-group-mentions", @@ -2205,7 +2205,7 @@ "description": "使用 resetConversationGroupAtType() 将指定会话的群聊 @ 状态重置为普通状态。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations clear-group-mentions", - "content": "群聊消息中有人 @ 当前用户或 @ 全体成员时, groupAtType 用于标记会话列表中的提醒状态。当前用户阅读相关消息后,调用 resetConversationGroupAtType 清除该会话 groupAtType 的 @ 提醒状态,并更新会话列表 UI。 OpenIMClient.getInstance .conversationManager.resetConversationGroupAtType new OnBase @Override public void onSuccess String data markGroupMentionStateReset conversationID ; @Override public void onError int code, String error recordGroupMentionResetFailure code, error ; , conversationID ; 会话列表中的状态变化可通过 onConversationChanged 接收,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "群聊消息中有人 @ 当前用户或 @ 全体成员时, groupAtType 用于标记会话列表中的提醒状态。当前用户阅读相关消息后,调用 resetConversationGroupAtType 清除该会话 groupAtType 的 @ 提醒状态,并更新会话列表 UI。 OpenIMClient.getInstance .conversationManager.resetConversationGroupAtType new OnBase @Override public void onSuccess String data // 请求已完成。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , conversationID ; 会话列表中的状态变化可通过 onConversationChanged 接收,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/mark-conversation-read", @@ -2213,7 +2213,7 @@ "description": "使用 messageManager.markConversationMessageAsRead() 将指定会话的消息标记为已读。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations mark-conversation-read", - "content": "用户打开会话并阅读完当前可见消息后,调用 messageManager.markConversationMessageAsRead 标记会话已读。不要在仅预览通知或后台收到消息时提前标记。 OpenIMClient.getInstance .messageManager.markConversationMessageAsRead conversationID, new OnBase @Override public void onSuccess String data markConversationReadSubmitted conversationID ; @Override public void onError int code, String error recordMarkReadFailure code, error ; ; 成功回调表示标记请求已完成。需要更新会话列表时,可重新查询会话或通过 onConversationChanged 接收变化。 对于单聊,可以通过 OnAdvanceMsgListener.onRecvC2CReadReceipt 监听对端发来的已读回执。消息监听器的设置方式见 接收消息 /sdk/android/message/receiving messages/receive messages ,消息回调和已读回执字段见 消息概览 /sdk/android/message/overview message 。" + "content": "用户打开会话并阅读完当前可见消息后,调用 messageManager.markConversationMessageAsRead 标记会话已读。不要在仅预览通知或后台收到消息时提前标记。 OpenIMClient.getInstance .messageManager.markConversationMessageAsRead conversationID, new OnBase @Override public void onSuccess String data // 请求已完成。 @Override public void onError int code, String error // code 和 error 说明失败原因。 ; 成功回调表示标记请求已完成。需要更新会话列表时,可重新查询会话或通过 onConversationChanged 接收变化。 对于单聊,可以通过 OnAdvanceMsgListener.onRecvC2CReadReceipt 监听对端发来的已读回执。消息监听器的设置方式见 接收消息 /sdk/android/message/receiving messages/receive messages ,消息回调和已读回执字段见 消息概览 /sdk/android/message/overview message 。" }, { "path": "/sdk/android/conversation/managing-conversations/get-total-unread-count", @@ -2221,7 +2221,7 @@ "description": "使用 getTotalUnreadMsgCount() 获取当前账号的总未读数。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations get-total-unread-count", - "content": "getTotalUnreadMsgCount 返回当前账号所有会话的总未读数。 OpenIMClient.getInstance .conversationManager.getTotalUnreadMsgCount new OnBase @Override public void onSuccess String value int totalUnread = Integer.parseInt value ; updateApplicationBadge totalUnread ; @Override public void onError int code, String error recordTotalUnreadFailure code, error ; ; 回调值是 String ,解析后即可用于显示总未读数。 总未读数发生变化时,可以通过 OnConversationListener.onTotalUnreadMessageCountChanged int count 接收更新;监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "getTotalUnreadMsgCount 返回当前账号所有会话的总未读数。 OpenIMClient.getInstance .conversationManager.getTotalUnreadMsgCount new OnBase @Override public void onSuccess String value int totalUnread = Integer.parseInt value ; // totalUnread 是当前账号的未读消息总数。 @Override public void onError int code, String error // code 和 error 说明失败原因。 ; 回调值是 String ,解析后即可用于显示总未读数。 总未读数发生变化时,可以通过 OnConversationListener.onTotalUnreadMessageCountChanged int count 接收更新;监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/set-private-chat", @@ -2229,7 +2229,7 @@ "description": "使用 setOneConversationPrivateChat() 设置会话的阅后即焚模式。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-private-chat", - "content": "OpenIMClient.getInstance .conversationManager.setOneConversationPrivateChat new OnBase @Override public void onSuccess String data markPrivateChatSubmitted conversationID, true ; @Override public void onError int code, String error recordPrivateChatFailure code, error ; , conversationID, true ; 传入 false 关闭阅后即焚。具体保留时长由 burnDuration 单独设置,见 设置阅后即焚时长 /sdk/android/conversation/managing conversations/set burn duration 。该能力与定期删除服务端消息不同。 会话列表中的阅后即焚状态变化可通过 onConversationChanged 接收,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "OpenIMClient.getInstance .conversationManager.setOneConversationPrivateChat new OnBase @Override public void onSuccess String data // 请求已完成。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , conversationID, true ; 传入 false 关闭阅后即焚。具体保留时长由 burnDuration 单独设置,见 设置阅后即焚时长 /sdk/android/conversation/managing conversations/set burn duration 。该能力与定期删除服务端消息不同。 会话列表中的阅后即焚状态变化可通过 onConversationChanged 接收,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/set-burn-duration", @@ -2237,7 +2237,7 @@ "description": "使用 setConversationBurnDuration() 设置阅后即焚模式的消息保留时长。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-burn-duration", - "content": "OpenIMClient.getInstance .conversationManager.setConversationBurnDuration new OnBase @Override public void onSuccess String data markBurnDurationSubmitted conversationID, 30 ; @Override public void onError int code, String error recordBurnDurationFailure code, error ; , conversationID, 30 ; burnDuration 的单位为秒。启用或关闭阅后即焚需要设置 isPrivateChat ,见 开启或关闭阅后即焚 /sdk/android/conversation/managing conversations/set private chat 。不要把它与服务端消息定期删除周期 msgDestructTime 混用。 会话列表中的时长变化可通过 onConversationChanged 接收,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "OpenIMClient.getInstance .conversationManager.setConversationBurnDuration new OnBase @Override public void onSuccess String data // 请求已完成。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , conversationID, 30 ; burnDuration 的单位为秒。启用或关闭阅后即焚需要设置 isPrivateChat ,见 开启或关闭阅后即焚 /sdk/android/conversation/managing conversations/set private chat 。不要把它与服务端消息定期删除周期 msgDestructTime 混用。 会话列表中的时长变化可通过 onConversationChanged 接收,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/set-message-destruct", @@ -2245,7 +2245,7 @@ "description": "使用 setConversation() 启用、关闭并配置会话的服务端消息定期删除策略。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-message-destruct", - "content": "isMsgDestruct 与 msgDestructTime 共同构成服务端消息定期删除设置,可以在一次 ConversationReq 中提交。 ConversationReq request = new ConversationReq ; request.setMsgDestruct true ; request.setMsgDestructTime 3600 ; OpenIMClient.getInstance .conversationManager.setConversation new OnBase @Override public void onSuccess String data markMessageDestructSubmitted conversationID ; @Override public void onError int code, String error recordMessageDestructFailure code, error ; , conversationID, request ; msgDestructTime 的单位为秒。关闭时只传 request.setMsgDestruct false ;该能力用于定期删除服务端消息,不是阅后即焚。 会话列表中的设置变化可通过 onConversationChanged 接收,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "isMsgDestruct 与 msgDestructTime 共同构成服务端消息定期删除设置,可以在一次 ConversationReq 中提交。 ConversationReq request = new ConversationReq ; request.setMsgDestruct true ; request.setMsgDestructTime 3600 ; OpenIMClient.getInstance .conversationManager.setConversation new OnBase @Override public void onSuccess String data // 请求已完成。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , conversationID, request ; msgDestructTime 的单位为秒。关闭时只传 request.setMsgDestruct false ;该能力用于定期删除服务端消息,不是阅后即焚。 会话列表中的设置变化可通过 onConversationChanged 接收,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/hide-a-conversation", @@ -2253,7 +2253,7 @@ "description": "使用 hideConversation() 从当前账号的会话列表隐藏入口。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations hide-a-conversation", - "content": "hideConversation 只隐藏当前登录用户的会话入口,不会删除单聊关系、退出群组或影响其他用户。 OpenIMClient.getInstance .conversationManager.hideConversation new OnBase @Override public void onSuccess String data conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationHideFailure code, error ; , conversationID ; 该方法适合临时从聊天列表移除入口。收到新消息或重新同步后,隐藏的会话可能再次出现。 成功回调表示隐藏请求已完成,调用端可以从当前列表移除该 conversationID 。会话列表后续发生变化时,可通过 onConversationChanged 接收更新,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "hideConversation 只隐藏当前登录用户的会话入口,不会删除单聊关系、退出群组或影响其他用户。 OpenIMClient.getInstance .conversationManager.hideConversation new OnBase @Override public void onSuccess String data // 请求已完成,会话已隐藏。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , conversationID ; 该方法适合临时从聊天列表移除入口。收到新消息或重新同步后,隐藏的会话可能再次出现。 成功回调表示隐藏请求已完成,调用端可以从当前列表移除该 conversationID 。会话列表后续发生变化时,可通过 onConversationChanged 接收更新,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", @@ -2261,7 +2261,7 @@ "description": "使用 deleteConversationAndDeleteAllMsg() 删除指定会话及其全部消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations delete-conversation-with-messages", - "content": "deleteConversationAndDeleteAllMsg 删除指定会话及其全部消息。 OpenIMClient.getInstance .conversationManager.deleteConversationAndDeleteAllMsg new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationDeleteFailure code, error ; , conversationID ; 成功回调后清理当前消息列表和会话行。该操作不删除好友关系,也不退出或解散群组;聊天目标仍存在时,会话可能由新消息或同步重新生成。 需要更新会话列表时,可重新查询会话或通过 onConversationChanged 接收变化,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" + "content": "deleteConversationAndDeleteAllMsg 删除指定会话及其全部消息。 OpenIMClient.getInstance .conversationManager.deleteConversationAndDeleteAllMsg new OnBase @Override public void onSuccess String data // 请求已完成,会话及其消息已删除。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , conversationID ; 成功回调后清理当前消息列表和会话行。该操作不删除好友关系,也不退出或解散群组;聊天目标仍存在时,会话可能由新消息或同步重新生成。 需要更新会话列表时,可重新查询会话或通过 onConversationChanged 接收变化,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { "path": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", @@ -2269,7 +2269,7 @@ "description": "使用 messageManager.clearConversationAndDeleteAllMsg() 保留会话入口并清空其消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations clear-conversation-messages", - "content": "messageManager.clearConversationAndDeleteAllMsg 清空指定会话的消息并保留会话入口。 OpenIMClient.getInstance .messageManager.clearConversationAndDeleteAllMsg conversationID, new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; @Override public void onError int code, String error recordConversationClearFailure code, error ; ; 成功回调后,会话入口仍然保留,但当前账号下的消息会被清除。需要更新会话列表时,可重新查询会话或通过 onConversationChanged 接收变化。" + "content": "messageManager.clearConversationAndDeleteAllMsg 清空指定会话的消息并保留会话入口。 OpenIMClient.getInstance .messageManager.clearConversationAndDeleteAllMsg conversationID, new OnBase @Override public void onSuccess String data // 请求已完成,消息已清空。 @Override public void onError int code, String error // code 和 error 说明失败原因。 ; 成功回调后,会话入口仍然保留,但当前账号下的消息会被清除。需要更新会话列表时,可重新查询会话或通过 onConversationChanged 接收变化。" }, { "path": "/sdk/android/group/overview-group", @@ -2285,7 +2285,7 @@ "description": "使用 createGroup 创建群资料并指定初始成员、管理员和群主。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group create-group", - "content": "使用 createGroup 创建群组。 GroupInfo 填写群资料;初始普通成员、管理员和群主分别通过独立参数传入。成功回调返回创建后的完整 GroupInfo ,其中包含新群组的 groupID 。 GroupInfo info = new GroupInfo ; info.setGroupName \"项目讨论\" ; info.setIntroduction \"仅限项目成员\" ; OpenIMClient.getInstance .groupManager.createGroup memberUserIDs, adminUserIDs, info, ownerUserID, new OnBase @Override public void onSuccess GroupInfo group openGroup group.getGroupID ; @Override public void onError int code, String error showCreateError error ; ;" + "content": "使用 createGroup 创建群组。 GroupInfo 填写群资料;初始普通成员、管理员和群主分别通过独立参数传入。成功回调返回创建后的完整 GroupInfo ,其中包含新群组的 groupID 。 GroupInfo info = new GroupInfo ; info.setGroupName \"项目讨论\" ; info.setIntroduction \"仅限项目成员\" ; OpenIMClient.getInstance .groupManager.createGroup memberUserIDs, adminUserIDs, info, ownerUserID, new OnBase @Override public void onSuccess GroupInfo group / group 包含新群组信息。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ;" }, { "path": "/sdk/android/group/update-group-profile", @@ -2293,7 +2293,7 @@ "description": "使用 setGroupInfo 更新群名称、头像、简介和其他群资料字段。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group update-group-profile", - "content": "使用 setGroupInfo 更新群资料。请求对象包含 groupID 和需要修改的字段,只提交本次要更新的内容。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setGroupName \"移动端项目组\" ; update.setIntroduction \"Android 与 iOS 协作群\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markGroupUpdateSubmitted groupID ; @Override public void onError int code, String error showGroupUpdateError error ; ; 群公告和扩展字段使用相同接口,分别见相关页面。" + "content": "使用 setGroupInfo 更新群资料。请求对象包含 groupID 和需要修改的字段,只提交本次要更新的内容。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setGroupName \"移动端项目组\" ; update.setIntroduction \"Android 与 iOS 协作群\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ; 群公告和扩展字段使用相同接口,分别见相关页面。" }, { "path": "/sdk/android/group/set-group-announcement", @@ -2301,7 +2301,7 @@ "description": "通过 GroupInfo.notification 发布或更新群公告。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-announcement", - "content": "构造包含 groupID 与 notification 的 GroupInfo ,再调用 setGroupInfo 。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNotification \"今晚 20:00 进行版本发布确认。\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data refreshAnnouncement groupID ; @Override public void onError int code, String error showAnnouncementError error ; ; 公告的更新时间和更新人保存在 GroupInfo 的 notificationUpdateTime 、 notificationUserID 字段中;需要读取时查询群资料。" + "content": "构造包含 groupID 与 notification 的 GroupInfo ,再调用 setGroupInfo 。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNotification \"今晚 20:00 进行版本发布确认。\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ; 公告的更新时间和更新人保存在 GroupInfo 的 notificationUpdateTime 、 notificationUserID 字段中;需要读取时查询群资料。" }, { "path": "/sdk/android/group/set-group-extension", @@ -2309,7 +2309,7 @@ "description": "通过 GroupInfo.ex 保存应用定义的群组扩展数据。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-extension", - "content": "GroupInfo.ex 是完整字符串,SDK 不会合并 JSON;提交新值会替换原有内容。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setEx \" \\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false \" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markExtensionSubmitted groupID ; @Override public void onError int code, String error showExtensionError error ; ;" + "content": "GroupInfo.ex 是完整字符串,SDK 不会合并 JSON;提交新值会替换原有内容。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setEx \" \\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false \" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ;" }, { "path": "/sdk/android/group/set-group-join-verification", @@ -2317,7 +2317,7 @@ "description": "通过 GroupInfo.needVerification 配置申请和邀请的入群验证规则。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-join-verification", - "content": "入群验证写入 GroupInfo.needVerification ,再调用 setGroupInfo 。可使用 GroupVerification 常量: APPLY NEED VERIFICATION INVITE DIRECTLY 、 ALL NEED VERIFICATION 和 DIRECTLY 。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNeedVerification GroupVerification.ALL NEED VERIFICATION ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markVerificationSubmitted groupID ; @Override public void onError int code, String error showVerificationError error ; ; 该设置影响后续入群请求,不替代对已存在申请的同意或拒绝处理。" + "content": "入群验证写入 GroupInfo.needVerification ,再调用 setGroupInfo 。可使用 GroupVerification 常量: APPLY NEED VERIFICATION INVITE DIRECTLY 、 ALL NEED VERIFICATION 和 DIRECTLY 。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNeedVerification GroupVerification.ALL NEED VERIFICATION ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ; 该设置影响后续入群请求,不替代对已存在申请的同意或拒绝处理。" }, { "path": "/sdk/android/group/set-group-member-profile-access", @@ -2325,7 +2325,7 @@ "description": "通过 GroupInfo.lookMemberInfo 设置是否允许通过群组查看成员资料。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-member-profile-access", - "content": "lookMemberInfo 使用整数开关: 0 关闭, 1 打开。更新时只提交该权限字段和 groupID 。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setLookMemberInfo 1 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markMemberInfoAccessSubmitted groupID ; @Override public void onError int code, String error showPermissionError error ; ; 此开关约束通过群组入口获取成员资料的权限,不改变成员已经拥有的用户资料。" + "content": "lookMemberInfo 使用整数开关: 0 关闭, 1 打开。更新时只提交该权限字段和 groupID 。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setLookMemberInfo 1 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ; 此开关约束通过群组入口获取成员资料的权限,不改变成员已经拥有的用户资料。" }, { "path": "/sdk/android/group/set-group-member-friend-permission", @@ -2333,7 +2333,7 @@ "description": "通过 GroupInfo.applyMemberFriend 设置是否允许从群成员发起好友申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-member-friend-permission", - "content": "applyMemberFriend 使用整数开关: 0 关闭, 1 打开。该规则只影响从该群成员关系入口发起的好友申请。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setApplyMemberFriend 0 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markFriendPermissionSubmitted groupID ; @Override public void onError int code, String error showPermissionError error ; ;" + "content": "applyMemberFriend 使用整数开关: 0 关闭, 1 打开。该规则只影响从该群成员关系入口发起的好友申请。 GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setApplyMemberFriend 0 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ;" }, { "path": "/sdk/android/group/change-group-mute", @@ -2341,7 +2341,7 @@ "description": "使用 changeGroupMute 开启或关闭群组全员禁言。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group change-group-mute", - "content": "使用 changeGroupMute 切换全员禁言。 true 开启, false 关闭;成员级禁言见 禁言或解除禁言群成员 /sdk/android/group/managing group members/change group member mute 。 OpenIMClient.getInstance .groupManager.changeGroupMute new OnBase @Override public void onSuccess String data markGroupMuteSubmitted groupID, true ; @Override public void onError int code, String error showGroupMuteError error ; , groupID, true ;" + "content": "使用 changeGroupMute 切换全员禁言。 true 开启, false 关闭;成员级禁言见 禁言或解除禁言群成员 /sdk/android/group/managing group members/change group member mute 。 OpenIMClient.getInstance .groupManager.changeGroupMute new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , groupID, true ;" }, { "path": "/sdk/android/group/join-group", @@ -2349,7 +2349,7 @@ "description": "使用 joinGroup 提交入群申请或加入请求。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group join-group", - "content": "使用 joinGroup 提交入群请求。 joinSource 表示入群来源: 2 表示邀请, 3 表示搜索, 4 表示二维码;带扩展数据时使用五参数重载。 OpenIMClient.getInstance .groupManager.joinGroup new OnBase @Override public void onSuccess String data markJoinSubmitted groupID ; @Override public void onError int code, String error showJoinError error ; , groupID, \"希望加入项目讨论\", 3, \" \\\"from\\\":\\\"search\\\" \" ; 入群验证方式 /sdk/android/group/set group join verification 决定用户是直接加入还是先提交申请。需要审核时,成功回调只表示申请已提交;实际加入后通过 onJoinedGroupAdded 接收通知。" + "content": "使用 joinGroup 提交入群请求。 joinSource 表示入群来源: 2 表示邀请, 3 表示搜索, 4 表示二维码;带扩展数据时使用五参数重载。 OpenIMClient.getInstance .groupManager.joinGroup new OnBase @Override public void onSuccess String data / 请求已提交。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , groupID, \"希望加入项目讨论\", 3, \" \\\"from\\\":\\\"search\\\" \" ; 入群验证方式 /sdk/android/group/set group join verification 决定用户是直接加入还是先提交申请。需要审核时,成功回调只表示申请已提交;实际加入后通过 onJoinedGroupAdded 接收通知。" }, { "path": "/sdk/android/group/quit-group", @@ -2357,7 +2357,7 @@ "description": "使用 quitGroup 让当前登录用户退出指定群组。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group quit-group", - "content": "quitGroup 仅作用于当前登录用户,不会解散群组或移除其他成员。 OpenIMClient.getInstance .groupManager.quitGroup new OnBase @Override public void onSuccess String data removeJoinedGroup groupID ; @Override public void onError int code, String error showQuitError error ; , groupID ; 请求成功后,继续处理 onJoinedGroupDeleted 回调。" + "content": "quitGroup 仅作用于当前登录用户,不会解散群组或移除其他成员。 OpenIMClient.getInstance .groupManager.quitGroup new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , groupID ; 请求成功后,继续处理 onJoinedGroupDeleted 回调。" }, { "path": "/sdk/android/group/dismiss-group", @@ -2365,7 +2365,7 @@ "description": "使用 dismissGroup 解散当前用户有权限管理的群组。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group dismiss-group", - "content": "dismissGroup 解散指定群组,仅群主可执行。 OpenIMClient.getInstance .groupManager.dismissGroup new OnBase @Override public void onSuccess String data markDismissSubmitted groupID ; @Override public void onError int code, String error showDismissError error ; , groupID ; 通过 onGroupDismissed 接收群组解散通知。" + "content": "dismissGroup 解散指定群组,仅群主可执行。 OpenIMClient.getInstance .groupManager.dismissGroup new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , groupID ; 通过 onGroupDismissed 接收群组解散通知。" }, { "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", @@ -2373,7 +2373,7 @@ "description": "使用 getGroupsInfo 批量查询指定群组的最新资料。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups get-specified-groups-info", - "content": "getGroupsInfo 的 groupIDs 参数为要查询的群组 ID 列表,返回结果为 GroupInfo 列表。 OpenIMClient.getInstance .groupManager.getGroupsInfo new OnBase @Override public void onSuccess List groups showGroups groups ; @Override public void onError int code, String error showGroupQueryError error ; , groupIDs ;" + "content": "getGroupsInfo 的 groupIDs 参数为要查询的群组 ID 列表,返回结果为 GroupInfo 列表。 OpenIMClient.getInstance .groupManager.getGroupsInfo new OnBase @Override public void onSuccess List groups / groups 是查询到的群组资料。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , groupIDs ;" }, { "path": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", @@ -2381,7 +2381,7 @@ "description": "使用 getJoinedGroupListPage 分页读取当前账号已加入的群组。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups get-joined-group-list-page", - "content": "offset 从 0 开始,后续页按上一页返回的条目数推进;返回为空时停止加载。 OpenIMClient.getInstance .groupManager.getJoinedGroupListPage new OnBase @Override public void onSuccess List groups appendJoinedGroups groups ; @Override public void onError int code, String error showPageError error ; , offset, 20 ; 加入或退出群组时,通过 onJoinedGroupAdded 和 onJoinedGroupDeleted 接收通知。" + "content": "offset 从 0 开始,后续页按上一页返回的条目数推进;返回为空时停止加载。 OpenIMClient.getInstance .groupManager.getJoinedGroupListPage new OnBase @Override public void onSuccess List groups / groups 是当前页群组。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , offset, 20 ; 加入或退出群组时,通过 onJoinedGroupAdded 和 onJoinedGroupDeleted 接收通知。" }, { "path": "/sdk/android/group/retrieving-groups/is-join-group", @@ -2389,7 +2389,7 @@ "description": "使用 isJoinGroup 查询当前登录用户是否已经加入指定群组。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups is-join-group", - "content": "isJoinGroup 检查当前登录用户是否加入目标群组,参数为 groupID 。 OpenIMClient.getInstance .groupManager.isJoinGroup groupID, new OnBase @Override public void onSuccess Boolean joined updateJoinAction Boolean.TRUE.equals joined ; @Override public void onError int code, String error showMembershipError error ; ;" + "content": "isJoinGroup 检查当前登录用户是否加入目标群组,参数为 groupID 。 OpenIMClient.getInstance .groupManager.isJoinGroup groupID, new OnBase @Override public void onSuccess Boolean joined / joined 表示当前用户是否已在群内。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ;" }, { "path": "/sdk/android/group/retrieving-groups/search-groups", @@ -2397,7 +2397,7 @@ "description": "使用 searchGroups 按群 ID 或群名称搜索本地可查询的群组。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups search-groups", - "content": "searchGroups 接收关键词列表,并分别指定是否搜索群 ID、群名称。两个开关都关闭时没有有效搜索范围。 OpenIMClient.getInstance .groupManager.searchGroups new OnBase @Override public void onSuccess List groups showSearchResults groups ; @Override public void onError int code, String error showSearchError error ; , Collections.singletonList keyword , true, true ; 用户不一定是 searchGroups 搜索到的群组的群成员,是否为群成员通过 isJoinGroup /sdk/android/group/retrieving groups/is join group 确定。" + "content": "searchGroups 接收关键词列表,并分别指定是否搜索群 ID、群名称。两个开关都关闭时没有有效搜索范围。 OpenIMClient.getInstance .groupManager.searchGroups new OnBase @Override public void onSuccess List groups / groups 是查询结果。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , Collections.singletonList keyword , true, true ; 用户不一定是 searchGroups 搜索到的群组的群成员,是否为群成员通过 isJoinGroup /sdk/android/group/retrieving groups/is join group 确定。" }, { "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", @@ -2405,7 +2405,7 @@ "description": "使用 getRecvGroupApplicationList 分页读取当前用户可处理的入群申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-recipient", - "content": "传入 GetGroupApplicationListAsRecipientReq 设置分页和筛选条件。可设置 offset 、 count 、 groupIDs 和 handleResults 。 GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .groupManager.getRecvGroupApplicationList new OnBase @Override public void onSuccess List items mergeReceivedApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ;" + "content": "传入 GetGroupApplicationListAsRecipientReq 设置分页和筛选条件。可设置 offset 、 count 、 groupIDs 和 handleResults 。 GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .groupManager.getRecvGroupApplicationList new OnBase @Override public void onSuccess List items / items 是当前页申请记录。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , request ;" }, { "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", @@ -2413,7 +2413,7 @@ "description": "使用 getSendGroupApplicationList 分页读取当前用户发出的入群申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-applicant", - "content": "使用 GetGroupApplicationListAsApplicantReq 设置分页和筛选条件,再调用 getSendGroupApplicationList 。 GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .groupManager.getSendGroupApplicationList new OnBase @Override public void onSuccess List items mergeSentApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ; 申请被同意后,通过 onJoinedGroupAdded 接收加入群组通知。" + "content": "使用 GetGroupApplicationListAsApplicantReq 设置分页和筛选条件,再调用 getSendGroupApplicationList 。 GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .groupManager.getSendGroupApplicationList new OnBase @Override public void onSuccess List items / items 是当前页申请记录。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , request ; 申请被同意后,通过 onJoinedGroupAdded 接收加入群组通知。" }, { "path": "/sdk/android/group/group-applications/accept-group-application", @@ -2421,7 +2421,7 @@ "description": "使用 acceptGroupApplication 同意指定用户的入群申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications accept-group-application", - "content": "调用时同时传入申请的 groupID 、申请人 userID 和处理说明。当前用户需要具有审批权限。 OpenIMClient.getInstance .groupManager.acceptGroupApplication new OnBase @Override public void onSuccess String data markApplicationHandled groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"欢迎加入\" ; 同意后,通过 群组概览 /sdk/android/group/overview group 中的相关事件接收申请状态和成员变化通知。" + "content": "调用时同时传入申请的 groupID 、申请人 userID 和处理说明。当前用户需要具有审批权限。 OpenIMClient.getInstance .groupManager.acceptGroupApplication new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , groupID, applicantUserID, \"欢迎加入\" ; 同意后,通过 群组概览 /sdk/android/group/overview group 中的相关事件接收申请状态和成员变化通知。" }, { "path": "/sdk/android/group/group-applications/refuse-group-application", @@ -2429,7 +2429,7 @@ "description": "使用 refuseGroupApplication 拒绝指定用户的入群申请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications refuse-group-application", - "content": "拒绝操作同样使用申请所属 groupID 、申请人 userID 和处理说明。 OpenIMClient.getInstance .groupManager.refuseGroupApplication new OnBase @Override public void onSuccess String data markApplicationRejected groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"当前群组人数已满\" ; 拒绝成功后,通过 onGroupApplicationRejected 接收通知,也可以重新调用查询 API 获取最新申请列表。" + "content": "拒绝操作同样使用申请所属 groupID 、申请人 userID 和处理说明。 OpenIMClient.getInstance .groupManager.refuseGroupApplication new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , groupID, applicantUserID, \"当前群组人数已满\" ; 拒绝成功后,通过 onGroupApplicationRejected 接收通知,也可以重新调用查询 API 获取最新申请列表。" }, { "path": "/sdk/android/group/group-applications/delete-group-requests", @@ -2437,7 +2437,7 @@ "description": "使用 deleteGroupRequests 批量删除指定的入群申请记录。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications delete-group-requests", - "content": "deleteGroupRequests 接收 DeleteGroupRequestsReq ,可传入多个 SimpleGroupRequests 批量删除申请记录。每个 SimpleGroupRequests 包含 fromUserID 和 groupID : fromUserID 为申请人的用户 ID, groupID 为申请加入的群组 ID。 SimpleGroupRequests groupRequests = new SimpleGroupRequests firstApplicantUserID, firstGroupID , new SimpleGroupRequests secondApplicantUserID, secondGroupID ; DeleteGroupRequestsReq request = new DeleteGroupRequestsReq groupRequests ; OpenIMClient.getInstance .groupManager.deleteGroupRequests new OnBase @Override public void onSuccess String data showDeleteSuccess ; @Override public void onError int code, String error showDeleteError error ; , request ; 删除申请记录不等于拒绝申请。需要拒绝申请时,使用 refuseGroupApplication 。" + "content": "deleteGroupRequests 接收 DeleteGroupRequestsReq ,可传入多个 SimpleGroupRequests 批量删除申请记录。每个 SimpleGroupRequests 包含 fromUserID 和 groupID : fromUserID 为申请人的用户 ID, groupID 为申请加入的群组 ID。 SimpleGroupRequests groupRequests = new SimpleGroupRequests firstApplicantUserID, firstGroupID , new SimpleGroupRequests secondApplicantUserID, secondGroupID ; DeleteGroupRequestsReq request = new DeleteGroupRequestsReq groupRequests ; OpenIMClient.getInstance .groupManager.deleteGroupRequests new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , request ; 删除申请记录不等于拒绝申请。需要拒绝申请时,使用 refuseGroupApplication 。" }, { "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", @@ -2445,7 +2445,7 @@ "description": "使用 getGroupMemberList 按角色和分页条件读取群成员。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-group-member-list", - "content": "filter 传 0 查询全部成员, 1 普通成员, 2 群主, 3 管理员。 offset 与 count 控制分页。 OpenIMClient.getInstance .groupManager.getGroupMemberList new OnBase @Override public void onSuccess List members appendMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, 0, offset, 50 ;" + "content": "filter 传 0 查询全部成员, 1 普通成员, 2 群主, 3 管理员。 offset 与 count 控制分页。 OpenIMClient.getInstance .groupManager.getGroupMemberList new OnBase @Override public void onSuccess List members / members 是当前页成员。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , groupID, 0, offset, 50 ;" }, { "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", @@ -2453,7 +2453,7 @@ "description": "使用 getGroupMembersInfo 批量读取指定成员在群内的资料。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-specified-group-members-info", - "content": "getGroupMembersInfo 接收一个 groupID 和目标用户 ID 列表,返回这些用户在群内的 GroupMembersInfo 。 OpenIMClient.getInstance .groupManager.getGroupMembersInfo new OnBase @Override public void onSuccess List members mergeMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, userIDs ;" + "content": "getGroupMembersInfo 接收一个 groupID 和目标用户 ID 列表,返回这些用户在群内的 GroupMembersInfo 。 OpenIMClient.getInstance .groupManager.getGroupMembersInfo new OnBase @Override public void onSuccess List members / members 是查询到的成员资料。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , groupID, userIDs ;" }, { "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", @@ -2461,7 +2461,7 @@ "description": "使用 getUsersInGroup 从候选用户中筛出当前在群内的用户 ID。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-users-in-group", - "content": "getUsersInGroup 返回传入用户中已在指定群内的 ID 列表,不返回成员资料。 OpenIMClient.getInstance .groupManager.getUsersInGroup new OnBase @Override public void onSuccess List joinedUserIDs updateMembership joinedUserIDs ; @Override public void onError int code, String error showMembershipError error ; , groupID, candidateUserIDs ; 需要昵称、角色或禁言状态时,再调用 查询指定群成员资料 /sdk/android/group/retrieving group members/get specified group members info 。" + "content": "getUsersInGroup 返回传入用户中已在指定群内的 ID 列表,不返回成员资料。 OpenIMClient.getInstance .groupManager.getUsersInGroup new OnBase @Override public void onSuccess List joinedUserIDs / joinedUserIDs 是在群成员 ID。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , groupID, candidateUserIDs ; 需要昵称、角色或禁言状态时,再调用 查询指定群成员资料 /sdk/android/group/retrieving group members/get specified group members info 。" }, { "path": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", @@ -2469,7 +2469,7 @@ "description": "使用 getGroupMemberOwnerAndAdmin 查询群主和管理员成员资料。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-group-member-owner-and-admin", - "content": "使用 getGroupMemberOwnerAndAdmin 获取需要展示或校验管理身份的成员记录。 OpenIMClient.getInstance .groupManager.getGroupMemberOwnerAndAdmin new OnBase @Override public void onSuccess List members showModerators members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID ; roleLevel 的群主、管理员和普通成员常量见 GroupRole 。" + "content": "使用 getGroupMemberOwnerAndAdmin 获取需要展示或校验管理身份的成员记录。 OpenIMClient.getInstance .groupManager.getGroupMemberOwnerAndAdmin new OnBase @Override public void onSuccess List members / members 是查询到的成员资料。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , groupID ; roleLevel 的群主、管理员和普通成员常量见 GroupRole 。" }, { "path": "/sdk/android/group/retrieving-group-members/search-group-members", @@ -2477,7 +2477,7 @@ "description": "使用 searchGroupMembers 按用户 ID 或群昵称搜索群成员。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members search-group-members", - "content": "指定关键词列表、用户 ID 与群昵称两个搜索开关,以及分页条件。 OpenIMClient.getInstance .groupManager.searchGroupMembers new OnBase @Override public void onSuccess List members showMemberSearch members ; @Override public void onError int code, String error showSearchError error ; , groupID, Collections.singletonList keyword , true, true, 0, 20 ; 搜索仅限目标群组;空关键词或两个搜索开关均关闭时不应发起请求。" + "content": "指定关键词列表、用户 ID 与群昵称两个搜索开关,以及分页条件。 OpenIMClient.getInstance .groupManager.searchGroupMembers new OnBase @Override public void onSuccess List members / members 是查询结果。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , groupID, Collections.singletonList keyword , true, true, 0, 20 ; 搜索仅限目标群组;空关键词或两个搜索开关均关闭时不应发起请求。" }, { "path": "/sdk/android/group/managing-group-members/invite-user-to-group", @@ -2485,7 +2485,7 @@ "description": "使用 inviteUserToGroup 邀请一组用户加入指定群组。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members invite-user-to-group", - "content": "传入群 ID、待邀请用户 ID 列表和邀请说明。调用成功表示邀请请求已提交;用户实际加入后通过 onGroupMemberAdded 接收通知。 OpenIMClient.getInstance .groupManager.inviteUserToGroup new OnBase @Override public void onSuccess String data markInviteSubmitted groupID ; @Override public void onError int code, String error showInviteError error ; , groupID, inviteeUserIDs, \"邀请加入项目讨论\" ;" + "content": "传入群 ID、待邀请用户 ID 列表和邀请说明。调用成功表示邀请请求已提交;用户实际加入后通过 onGroupMemberAdded 接收通知。 OpenIMClient.getInstance .groupManager.inviteUserToGroup new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , groupID, inviteeUserIDs, \"邀请加入项目讨论\" ;" }, { "path": "/sdk/android/group/managing-group-members/kick-group-member", @@ -2493,7 +2493,7 @@ "description": "使用 kickGroupMember 将指定成员移出群组。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members kick-group-member", - "content": "kickGroupMember 接收成员 ID 列表和移除说明。 OpenIMClient.getInstance .groupManager.kickGroupMember new OnBase @Override public void onSuccess String data markRemovalSubmitted groupID ; @Override public void onError int code, String error showRemovalError error ; , groupID, memberUserIDs, \"已不再参与该项目\" ; 移除成功后,通过 onGroupMemberDeleted 接收成员移除通知。" + "content": "kickGroupMember 接收成员 ID 列表和移除说明。 OpenIMClient.getInstance .groupManager.kickGroupMember new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , groupID, memberUserIDs, \"已不再参与该项目\" ; 移除成功后,通过 onGroupMemberDeleted 接收成员移除通知。" }, { "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", @@ -2501,7 +2501,7 @@ "description": "使用 SetGroupMemberInfo.nickname 更新成员在指定群中的显示昵称。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-nickname", - "content": "成员资料修改统一使用 setGroupMemberInfo 。请求中填写 groupID 、 userID 和 nickname 。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setNickname \"小林\" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markNicknameSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; 修改成功后,通过 群组概览 /sdk/android/group/overview group 中的 onGroupMemberInfoChanged 接收成员资料变化通知。" + "content": "成员资料修改统一使用 setGroupMemberInfo 。请求中填写 groupID 、 userID 和 nickname 。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setNickname \"小林\" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ; 修改成功后,通过 群组概览 /sdk/android/group/overview group 中的 onGroupMemberInfoChanged 接收成员资料变化通知。" }, { "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", @@ -2509,7 +2509,7 @@ "description": "使用 SetGroupMemberInfo.roleLevel 设置成员的群内角色。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-role-level", - "content": "roleLevel 使用 GroupRole 常量: OWNER 、 ADMIN 和 MEMBER 。转让群主请使用 转让群主 /sdk/android/group/managing group members/transfer group owner 。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setRoleLevel GroupRole.ADMIN ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markRoleSubmitted groupID, userID ; @Override public void onError int code, String error showRoleError error ; ; 角色修改成功后,通过 onGroupMemberInfoChanged 接收成员资料变化通知。" + "content": "roleLevel 使用 GroupRole 常量: OWNER 、 ADMIN 和 MEMBER 。转让群主请使用 转让群主 /sdk/android/group/managing group members/transfer group owner 。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setRoleLevel GroupRole.ADMIN ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ; 角色修改成功后,通过 onGroupMemberInfoChanged 接收成员资料变化通知。" }, { "path": "/sdk/android/group/managing-group-members/set-group-member-avatar", @@ -2517,7 +2517,7 @@ "description": "使用 SetGroupMemberInfo.faceURL 更新成员在群内展示的头像。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-avatar", - "content": "群成员头像是群内资料字段,不修改用户全局头像。传入已可访问的头像 URL。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setFaceURL avatarURL ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markAvatarSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; 修改成功后,通过 onGroupMemberInfoChanged 接收成员资料变化通知。" + "content": "群成员头像是群内资料字段,不修改用户全局头像。传入已可访问的头像 URL。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setFaceURL avatarURL ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ; 修改成功后,通过 onGroupMemberInfoChanged 接收成员资料变化通知。" }, { "path": "/sdk/android/group/managing-group-members/set-group-member-extension", @@ -2525,7 +2525,7 @@ "description": "使用 SetGroupMemberInfo.ex 保存应用定义的群成员扩展数据。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-extension", - "content": "SetGroupMemberInfo.ex 字符串用于保存群成员扩展信息,可存储 JSON 字符串拓展群成员信息。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setEx \" \\\"duty\\\":\\\"reviewer\\\" \" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markMemberExtensionSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ;" + "content": "SetGroupMemberInfo.ex 字符串用于保存群成员扩展信息,可存储 JSON 字符串拓展群成员信息。 SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setEx \" \\\"duty\\\":\\\"reviewer\\\" \" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ;" }, { "path": "/sdk/android/group/managing-group-members/transfer-group-owner", @@ -2533,7 +2533,7 @@ "description": "使用 transferGroupOwner 将群主身份转让给指定群成员。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members transfer-group-owner", - "content": "transferGroupOwner 接收 groupID 和 newOwnerUserID 两个参数: groupID 为要转让群主的群组 ID, newOwnerUserID 为新群主的用户 ID,该用户必须是该群的成员。 OpenIMClient.getInstance .groupManager.transferGroupOwner new OnBase @Override public void onSuccess String data markOwnershipTransferSubmitted groupID ; @Override public void onError int code, String error showTransferError error ; , groupID, newOwnerUserID ; 转让成功后,可以重新调用 获取群主和管理员 /sdk/android/group/retrieving group members/get group member owner and admin 获取最新资料。" + "content": "transferGroupOwner 接收 groupID 和 newOwnerUserID 两个参数: groupID 为要转让群主的群组 ID, newOwnerUserID 为新群主的用户 ID,该用户必须是该群的成员。 OpenIMClient.getInstance .groupManager.transferGroupOwner new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , groupID, newOwnerUserID ; 转让成功后,可以重新调用 获取群主和管理员 /sdk/android/group/retrieving group members/get group member owner and admin 获取最新资料。" }, { "path": "/sdk/android/group/managing-group-members/change-group-member-mute", @@ -2541,7 +2541,7 @@ "description": "使用 changeGroupMemberMute 设置指定成员的禁言时长。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members change-group-member-mute", - "content": "seconds 为禁言时长,单位为秒;传 0 解除成员禁言。该操作与 全员禁言 /sdk/android/group/change group mute 相互独立。 OpenIMClient.getInstance .groupManager.changeGroupMemberMute new OnBase @Override public void onSuccess String data markMemberMuteSubmitted groupID, userID ; @Override public void onError int code, String error showMemberMuteError error ; , groupID, userID, 3600L ;" + "content": "seconds 为禁言时长,单位为秒;传 0 解除成员禁言。该操作与 全员禁言 /sdk/android/group/change group mute 相互独立。 OpenIMClient.getInstance .groupManager.changeGroupMemberMute new OnBase @Override public void onSuccess String data / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , groupID, userID, 3600L ;" }, { "path": "/sdk/android/message/overview-message", @@ -2549,7 +2549,7 @@ "description": "了解 Android SDK 的 Message 模型、消息生命周期和消息监听。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message overview-message", - "content": "Android SDK 使用 Message 表示一条消息。消息创建、发送、接收、查询和状态变更是不同阶段;创建 Message 不会发送消息,发送成功也不代表其他客户端已经完成接收。 消息列表通常以 clientMsgID 作为客户端去重和更新键,并结合当前会话上下文判断消息属于单聊还是群聊。 Message 本身不包含 conversationID ,会话 ID 来自当前会话、历史查询参数或消息事件上下文。 消息处理流程 | 阶段 | Android API 或回调 | 说明 | | | | | | 创建 | MessageManager.create Message | 创建待发送的 Message 对象,不写入服务端,也不会触发新消息回调。 | | 发送 | sendMessage 或 sendMessageNotOss | 单聊传入 recvUid ,群聊传入 recvGid 。 | | 接收 | OnAdvanceMsgListener | 处理实时、离线、在线消息以及撤回、删除和已读回执等变化。 | | 查询 | 历史消息、按 ID 查找或搜索 API | 查询结果是调用时的消息快照,不代替实时消息监听。 | | 更新 | 撤回、删除、修改、置顶、已读和本地扩展 API | 分别处理 API 结果、对应事件和必要的列表重新查询。 | messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; @Override public void onRecvOfflineNewMessage List messages messageStore.mergeAll messages ; @Override public void onRecvMessageRevokedV2 RevokedInfo info messageStore.markRevoked info ; @Override public void onMsgDeleted Message message messageStore.remove message.getClientMsgID ; ; 重复调用 MessageManager 的 setAdvancedMsgListener 会覆盖之前设置的 listener。应用应在统一的消息状态层注册一次,再把回调中的消息变化分发给页面。 Message 字段 创建、发送、接收和查询返回的消息对象都是 Message 。常用字段如下: | 字段 | 类型 | 说明 | | | | | | clientMsgID | String | 客户端消息 ID,用于列表去重、状态更新和定位消息。 | | serverMsgID | String | 服务端消息 ID;消息尚未成功发送时可能没有有效值。 | | sessionType | int | 会话类型;结合 recvID 、 groupID 判断单聊或群聊。 | | sendID | String | 发送者用户 ID。 | | recvID | String | 单聊接收方用户 ID。 | | groupID | String | 群聊对应的群组 ID。 | | msgFrom | int | 标识消息是用户级别还是系统级别。 | | contentType | int | 消息类型,使用 MessageType 常量判断内容字段。 | | createTime | long | 消息对象创建时间,Android SDK 模型注释约定为纳秒。 | | sendTime | long | 消息发送时间,Android SDK 模型注释约定为毫秒。 | | seq | int | 服务端消息序号。 | | status | int | 发送状态,使用 MessageStatus 常量判断。 | | isRead | boolean | 当前客户端保存的已读状态。 | | platformID | int | 发送消息的客户端平台。 | | senderNickname | String | 发送者昵称快照。 | | senderFaceUrl | String | 发送者头像 URL 快照。 | | offlinePush | OfflinePushInfo | 离线推送内容。 | | attachedInfo | String | SDK 附加信息。 | | ext | Object | Android 消息附加字段。 | | ex | Object | 消息附加字段。 | | localEx | Object | 仅保存在当前设备的消息扩展字段。 | 消息正文位于与 contentType 对应的 element 字段中,不要根据列表位置或展示文本判断消息类型: | 消息内容 | 对应字段 | | | | | 文本、富文本 | textElem 、 advancedTextElem | | 图片、音频、视频、文件 | pictureElem 、 soundElem 、 videoElem 、 fileElem | | @ 消息、回复消息 | atTextElem 、 quoteElem | | 合并转发 | mergeElem | | 名片、位置、表情 | cardElem 、 locationElem 、 faceElem | | 自定义消息 | customElem | | 通知、输入状态和附加状态 | notificationElem 、 typingElem 、 attachedInfoElem | 创建和发送不同内容 发送一条消息分为两个步骤: 1. 调用对应内容类型的 create Message 方法,获得待发送的 Message 。 2. 将该 Message 传给 sendMessage /sdk/android/message/sending messages/send message 。单聊设置 recvUid ,群聊设置 recvGid 。 下表列出了可创建的消息类型及其对应页面: | 内容 | 页面 | | | | | 文本与富文本 | 创建文本消息 /sdk/android/message/creating messages/create text message 、 创建富文本消息 /sdk/android/message/creating messages/create advanced text message | | @ 消息 | 创建 @ 消息 /sdk/android/message/creating messages/create text at message | | 图片、音频、视频和文件 | 创建图片消息 /sdk/android/message/creating messages/create image message 、 创建文件消息 /sdk/android/message/creating messages/create file message | | 名片、位置和表情 | 创建名片消息 /sdk/android/message/creating messages/create card message 、 创建位置消息 /sdk/android/message/creating messages/create location message 、 创建表情消息 /sdk/android/message/creating messages/create face message | | 回复、转发和合并转发 | 创建回复消息 /sdk/android/message/creating messages/create quote message 、 创建转发消息 /sdk/android/message/creating messages/create forward message 、 创建合并转发消息 /sdk/android/message/creating messages/create merger message | | 自定义业务内容 | 创建自定义消息 /sdk/android/message/creating messages/create custom message | 发送本地路径或本地文件创建的媒体消息时,调用 sendMessage ,SDK 会在发送过程中上传媒体文件。使用已有远端 URL 创建媒体消息时,调用对应的 create MessageByURL 方法,再通过 sendMessageNotOss /sdk/android/message/sending messages/send message not oss 发送,无需再次上传媒体文件。 按任务查找页面 | 任务 | 页面 | | | | | 发送普通消息或已上传的媒体消息 | 发送消息 /sdk/android/message/sending messages/send message 、 发送不经 OSS 的消息 /sdk/android/message/sending messages/send message not oss | | 接收实时、离线和在线消息 | 接收消息 /sdk/android/message/receiving messages/receive messages 、 接收自定义业务消息 /sdk/android/message/receiving messages/receive custom business messages | | 加载历史消息或反向加载消息 | 加载历史消息 /sdk/android/message/retrieving messages/load older messages 、 反向加载历史消息 /sdk/android/message/retrieving messages/load newer messages | | 按 ID 定位或搜索消息 | 按 ID 查找消息 /sdk/android/message/retrieving messages/find messages by id 、 搜索消息 /sdk/android/message/searching messages/search messages | | 删除、撤回、修改或置顶消息 | 删除消息 /sdk/android/message/managing messages/delete saved messages 、 撤回消息 /sdk/android/message/managing messages/revoke a message 、 修改消息 /sdk/android/message/managing messages/modify a message 、 设置消息置顶 /sdk/android/message/managing messages/set message pinned | | 管理会话未读数和群聊已读回执 | 标记会话已读 /sdk/android/conversation/managing conversations/mark conversation read 、 上报群消息已读 /sdk/android/message/managing read status/send group read receipts 、 查询群消息已读成员 /sdk/android/message/managing read status/get group message readers | | 上报或查询输入状态 | 更新输入状态 /sdk/android/message/composing messages/update typing status 、 查询输入状态 /sdk/android/message/composing messages/get typing status | | 插入、删除或扩展仅当前设备可见的消息 | 插入本地单聊消息 /sdk/android/message/managing messages/insert local single message 、 删除本地消息 /sdk/android/message/managing messages/delete local message 、 设置消息本地扩展 /sdk/android/message/managing messages/set message local ex | 状态同步边界 | 变化 | 处理位置 | 合并方式 | | | | | | 新消息和离线消息 | 接收消息 /sdk/android/message/receiving messages/receive messages | 先确定目标会话,再按 clientMsgID 合并。 | | 消息撤回 | onRecvMessageRevokedV2 | 按撤回信息中的消息 ID 更新原消息状态。 | | 消息删除 | onMsgDeleted | 按消息 ID 从当前会话列表移除。 | | C2C 和群聊已读回执 | onRecvC2CReadReceipt 、 onRecvGroupMessageReadReceipt | 更新对应消息或会话的已读状态。 | | 消息扩展变化 | onRecvMessageExtensionsChanged 等回调 | 按消息 ID 更新扩展字段,不替换整条消息的正文。 | | 输入状态 | 更新输入状态 /sdk/android/message/composing messages/update typing status | 按会话和用户更新临时状态,不写入普通消息列表。 | 对于撤回、删除、已读和消息扩展等状态变化,应先处理 API 的调用结果,再通过 OnAdvanceMsgListener 同步相关回调;必要时重新查询消息列表。" + "content": "Android SDK 使用 Message 表示一条消息。消息创建、发送、接收、查询和状态变更是不同阶段;创建 Message 不会发送消息,发送成功也不代表其他客户端已经完成接收。 消息列表通常以 clientMsgID 作为客户端去重和更新键,并结合当前会话上下文判断消息属于单聊还是群聊。 Message 本身不包含 conversationID ,会话 ID 来自当前会话、历史查询参数或消息事件上下文。 消息处理流程 | 阶段 | Android API 或回调 | 说明 | | | | | | 创建 | MessageManager.create Message | 创建待发送的 Message 对象,不写入服务端,也不会触发新消息回调。 | | 发送 | sendMessage 或 sendMessageNotOss | 单聊传入 recvUid ,群聊传入 recvGid 。 | | 接收 | OnAdvanceMsgListener | 处理实时、离线、在线消息以及撤回、删除和已读回执等变化。 | | 查询 | 历史消息、按 ID 查找或搜索 API | 查询结果是调用时的消息快照,不代替实时消息监听。 | | 更新 | 撤回、删除、修改、置顶、已读和本地扩展 API | 分别处理 API 结果、对应事件和必要的列表重新查询。 | messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message // message 是新收到的消息。 @Override public void onRecvOfflineNewMessage List messages // messages 是离线期间收到的消息。 @Override public void onRecvMessageRevokedV2 RevokedInfo info // info 包含被撤回消息的信息。 @Override public void onMsgDeleted Message message // message 是已删除的消息。 ; 重复调用 MessageManager 的 setAdvancedMsgListener 会覆盖之前设置的 listener。应用应在统一的消息状态层注册一次,再把回调中的消息变化分发给页面。 Message 字段 创建、发送、接收和查询返回的消息对象都是 Message 。常用字段如下: | 字段 | 类型 | 说明 | | | | | | clientMsgID | String | 客户端消息 ID,用于列表去重、状态更新和定位消息。 | | serverMsgID | String | 服务端消息 ID;消息尚未成功发送时可能没有有效值。 | | sessionType | int | 会话类型;结合 recvID 、 groupID 判断单聊或群聊。 | | sendID | String | 发送者用户 ID。 | | recvID | String | 单聊接收方用户 ID。 | | groupID | String | 群聊对应的群组 ID。 | | msgFrom | int | 标识消息是用户级别还是系统级别。 | | contentType | int | 消息类型,使用 MessageType 常量判断内容字段。 | | createTime | long | 消息对象创建时间,Android SDK 模型注释约定为纳秒。 | | sendTime | long | 消息发送时间,Android SDK 模型注释约定为毫秒。 | | seq | int | 服务端消息序号。 | | status | int | 发送状态,使用 MessageStatus 常量判断。 | | isRead | boolean | 当前客户端保存的已读状态。 | | platformID | int | 发送消息的客户端平台。 | | senderNickname | String | 发送者昵称快照。 | | senderFaceUrl | String | 发送者头像 URL 快照。 | | offlinePush | OfflinePushInfo | 离线推送内容。 | | attachedInfo | String | SDK 附加信息。 | | ext | Object | Android 消息附加字段。 | | ex | Object | 消息附加字段。 | | localEx | Object | 仅保存在当前设备的消息扩展字段。 | 消息正文位于与 contentType 对应的 element 字段中,不要根据列表位置或展示文本判断消息类型: | 消息内容 | 对应字段 | | | | | 文本、富文本 | textElem 、 advancedTextElem | | 图片、音频、视频、文件 | pictureElem 、 soundElem 、 videoElem 、 fileElem | | @ 消息、回复消息 | atTextElem 、 quoteElem | | 合并转发 | mergeElem | | 名片、位置、表情 | cardElem 、 locationElem 、 faceElem | | 自定义消息 | customElem | | 通知、输入状态和附加状态 | notificationElem 、 typingElem 、 attachedInfoElem | 创建和发送不同内容 发送一条消息分为两个步骤: 1. 调用对应内容类型的 create Message 方法,获得待发送的 Message 。 2. 将该 Message 传给 sendMessage /sdk/android/message/sending messages/send message 。单聊设置 recvUid ,群聊设置 recvGid 。 下表列出了可创建的消息类型及其对应页面: | 内容 | 页面 | | | | | 文本与富文本 | 创建文本消息 /sdk/android/message/creating messages/create text message 、 创建富文本消息 /sdk/android/message/creating messages/create advanced text message | | @ 消息 | 创建 @ 消息 /sdk/android/message/creating messages/create text at message | | 图片、音频、视频和文件 | 创建图片消息 /sdk/android/message/creating messages/create image message 、 创建文件消息 /sdk/android/message/creating messages/create file message | | 名片、位置和表情 | 创建名片消息 /sdk/android/message/creating messages/create card message 、 创建位置消息 /sdk/android/message/creating messages/create location message 、 创建表情消息 /sdk/android/message/creating messages/create face message | | 回复、转发和合并转发 | 创建回复消息 /sdk/android/message/creating messages/create quote message 、 创建转发消息 /sdk/android/message/creating messages/create forward message 、 创建合并转发消息 /sdk/android/message/creating messages/create merger message | | 自定义业务内容 | 创建自定义消息 /sdk/android/message/creating messages/create custom message | 发送本地路径或本地文件创建的媒体消息时,调用 sendMessage ,SDK 会在发送过程中上传媒体文件。使用已有远端 URL 创建媒体消息时,调用对应的 create MessageByURL 方法,再通过 sendMessageNotOss /sdk/android/message/sending messages/send message not oss 发送,无需再次上传媒体文件。 按任务查找页面 | 任务 | 页面 | | | | | 发送普通消息或已上传的媒体消息 | 发送消息 /sdk/android/message/sending messages/send message 、 发送不经 OSS 的消息 /sdk/android/message/sending messages/send message not oss | | 接收实时、离线和在线消息 | 接收消息 /sdk/android/message/receiving messages/receive messages 、 接收自定义业务消息 /sdk/android/message/receiving messages/receive custom business messages | | 加载历史消息或反向加载消息 | 加载历史消息 /sdk/android/message/retrieving messages/load older messages 、 反向加载历史消息 /sdk/android/message/retrieving messages/load newer messages | | 按 ID 定位或搜索消息 | 按 ID 查找消息 /sdk/android/message/retrieving messages/find messages by id 、 搜索消息 /sdk/android/message/searching messages/search messages | | 删除、撤回、修改或置顶消息 | 删除消息 /sdk/android/message/managing messages/delete saved messages 、 撤回消息 /sdk/android/message/managing messages/revoke a message 、 修改消息 /sdk/android/message/managing messages/modify a message 、 设置消息置顶 /sdk/android/message/managing messages/set message pinned | | 管理会话未读数和群聊已读回执 | 标记会话已读 /sdk/android/conversation/managing conversations/mark conversation read 、 上报群消息已读 /sdk/android/message/managing read status/send group read receipts 、 查询群消息已读成员 /sdk/android/message/managing read status/get group message readers | | 上报或查询输入状态 | 更新输入状态 /sdk/android/message/composing messages/update typing status 、 查询输入状态 /sdk/android/message/composing messages/get typing status | | 插入、删除或扩展仅当前设备可见的消息 | 插入本地单聊消息 /sdk/android/message/managing messages/insert local single message 、 删除本地消息 /sdk/android/message/managing messages/delete local message 、 设置消息本地扩展 /sdk/android/message/managing messages/set message local ex | 状态同步边界 | 变化 | 处理位置 | 合并方式 | | | | | | 新消息和离线消息 | 接收消息 /sdk/android/message/receiving messages/receive messages | 先确定目标会话,再按 clientMsgID 合并。 | | 消息撤回 | onRecvMessageRevokedV2 | 按撤回信息中的消息 ID 更新原消息状态。 | | 消息删除 | onMsgDeleted | 按消息 ID 从当前会话列表移除。 | | C2C 和群聊已读回执 | onRecvC2CReadReceipt 、 onRecvGroupMessageReadReceipt | 更新对应消息或会话的已读状态。 | | 消息扩展变化 | onRecvMessageExtensionsChanged 等回调 | 按消息 ID 更新扩展字段,不替换整条消息的正文。 | | 输入状态 | 更新输入状态 /sdk/android/message/composing messages/update typing status | 按会话和用户更新临时状态,不写入普通消息列表。 | 对于撤回、删除、已读和消息扩展等状态变化,应先处理 API 的调用结果,再通过 OnAdvanceMsgListener 同步相关回调;必要时重新查询消息列表。" }, { "path": "/sdk/android/message/creating-messages/create-text-message", @@ -2741,7 +2741,7 @@ "description": "使用 sendMessage 将 Message 发送到单聊或群聊。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message sending-messages send-message", - "content": "单聊填写 recvUid ,群聊填写 recvGid 。通过 OnMsgSendCallback 处理发送成功、失败和媒体进度。 messageManager.sendMessage new OnMsgSendCallback @Override public void onSuccess Message sentMessage mergeSentMessage sentMessage ; @Override public void onError int code, String error showSendError error ; , message, peerUserID, null, offlinePushInfo ;" + "content": "单聊填写 recvUid ,群聊填写 recvGid 。通过 OnMsgSendCallback 处理发送成功、失败和媒体进度。 messageManager.sendMessage new OnMsgSendCallback @Override public void onSuccess Message sentMessage / sentMessage 是发送成功的消息。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , message, peerUserID, null, offlinePushInfo ;" }, { "path": "/sdk/android/message/sending-messages/send-message-not-oss", @@ -2757,7 +2757,7 @@ "description": "通过 OnMsgSendCallback 的进度回调更新媒体发送进度。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message sending-messages set-msg-send-progress-listener", - "content": "通过 OnMsgSendCallback.onProgress 获取当前消息的发送进度。 messageManager.sendMessage new OnMsgSendCallback @Override public void onProgress long progress updateProgress progress ; @Override public void onSuccess Message sentMessage finishProgress ; @Override public void onError int code, String error failProgress error ; , message, peerUserID, null, offlinePushInfo ;" + "content": "通过 OnMsgSendCallback.onProgress 获取当前消息的发送进度。 messageManager.sendMessage new OnMsgSendCallback @Override public void onProgress long progress / progress 是发送进度。 / @Override public void onSuccess Message sentMessage / sentMessage 是发送成功的消息。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , message, peerUserID, null, offlinePushInfo ;" }, { "path": "/sdk/android/message/receiving-messages/receive-messages", @@ -2765,7 +2765,7 @@ "description": "使用 OnAdvanceMsgListener 接收新消息、离线消息和在线消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message receiving-messages receive-messages", - "content": "设置 setAdvancedMsgListener 后, onRecvNewMessage 接收实时消息, onRecvOfflineNewMessage 接收离线批次, onRecvOnlineOnlyMessage 仅接收在线消息。 messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; @Override public void onRecvOfflineNewMessage List messages messageStore.mergeAll messages ; ;" + "content": "设置 setAdvancedMsgListener 后, onRecvNewMessage 接收实时消息, onRecvOfflineNewMessage 接收离线批次, onRecvOnlineOnlyMessage 仅接收在线消息。 messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message / message 是新收到的消息。 / @Override public void onRecvOfflineNewMessage List messages / messages 是离线消息。 / ;" }, { "path": "/sdk/android/message/receiving-messages/receive-custom-business-messages", @@ -2773,7 +2773,7 @@ "description": "使用 setCustomBusinessListener 接收独立于普通聊天消息的业务回调。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message receiving-messages receive-custom-business-messages", - "content": "自定义业务回调携带字符串,业务侧应按约定格式解析,不要将其直接当作 Message 渲染。 messageManager.setCustomBusinessListener new OnCustomBusinessListener @Override public void onRecvCustomBusinessMessage String payload handleBusiness payload ; ;" + "content": "自定义业务回调携带字符串,业务侧应按约定格式解析,不要将其直接当作 Message 渲染。 messageManager.setCustomBusinessListener new OnCustomBusinessListener @Override public void onRecvCustomBusinessMessage String payload / payload 是自定义业务数据。 / ;" }, { "path": "/sdk/android/message/retrieving-messages/load-older-messages", @@ -2797,7 +2797,7 @@ "description": "使用 findMessageList 按 SearchParams 查询消息记录。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message retrieving-messages find-messages-by-id", - "content": "构造 SearchParams 列表查询消息。 messageManager.findMessageList new OnBase @Override public void onSuccess SearchResult result showFoundMessages result ; @Override public void onError int code, String error showQueryError error ; , searchParams ;" + "content": "构造 SearchParams 列表查询消息。 messageManager.findMessageList new OnBase @Override public void onSuccess SearchResult result / result 是查询结果。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , searchParams ;" }, { "path": "/sdk/android/message/retrieving-messages/load-message-context", @@ -2805,7 +2805,7 @@ "description": "使用 Android SDK 读取一条消息前后的上下文。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message retrieving-messages load-message-context", - "content": "从搜索结果或引用消息跳入聊天上下文时,把已经取得的 Message 作为锚点。 参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | conversationID | String | 是 | 锚点消息所在的会话 ID。 | | startMsg | Message | 是 | 已经取得的锚点消息。 | | type | ViewType | 是 | 上下文查看类型;引用消息使用 ViewType.History ,搜索结果使用 ViewType.Search 。 | | before | int | 是 | 锚点之前最多读取的消息数量。 | | after | int | 是 | 锚点之后最多读取的消息数量。 | messageManager.fetchSurroundingMessages new OnBase @Override public void onSuccess Messages messages List surrounding = messages.getData ; renderMessages surrounding ; @Override public void onError int code, String error // 处理失败 , conversationID, targetMessage, ViewType.Search, 20, 20 ; 成功回调中的 messages.getData 是锚点前后取得的消息列表,消息字段见 消息概览 /sdk/android/message/overview message 。 before 和 after 分别限制锚点前后的数量。锚点靠近历史边界或部分消息已经删除时,返回结果可能少于请求总数。需要先定位消息时,见 按 ID 查找消息 /sdk/android/message/retrieving messages/find messages by id 。" + "content": "从搜索结果或引用消息跳入聊天上下文时,把已经取得的 Message 作为锚点。 参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | conversationID | String | 是 | 锚点消息所在的会话 ID。 | | startMsg | Message | 是 | 已经取得的锚点消息。 | | type | ViewType | 是 | 上下文查看类型;引用消息使用 ViewType.History ,搜索结果使用 ViewType.Search 。 | | before | int | 是 | 锚点之前最多读取的消息数量。 | | after | int | 是 | 锚点之后最多读取的消息数量。 | messageManager.fetchSurroundingMessages new OnBase @Override public void onSuccess Messages messages List surrounding = messages.getData ; // surrounding 是目标消息及其上下文。 @Override public void onError int code, String error // 处理失败 , conversationID, targetMessage, ViewType.Search, 20, 20 ; 成功回调中的 messages.getData 是锚点前后取得的消息列表,消息字段见 消息概览 /sdk/android/message/overview message 。 before 和 after 分别限制锚点前后的数量。锚点靠近历史边界或部分消息已经删除时,返回结果可能少于请求总数。需要先定位消息时,见 按 ID 查找消息 /sdk/android/message/retrieving messages/find messages by id 。" }, { "path": "/sdk/android/message/searching-messages/search-messages", @@ -2821,7 +2821,7 @@ "description": "使用 Android SDK 上报当前会话的输入状态。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message composing-messages update-typing-status", - "content": "进入输入状态时,将 focus 设为 true ;输入结束、输入框失去焦点或退出会话时,将其设为 false 。 conversationManager.changeInputState new OnBase @Override public void onSuccess String data // 输入状态已上报 @Override public void onError int code, String error // 处理失败 , conversationID, true ; 输入结束时及时清除状态: conversationManager.changeInputState callback, conversationID, false ; 避免频繁重复上报相同状态。成功回调表示上报请求已经完成。 其他客户端通过 OnConversationListener.onConversationUserInputStatusChanged 接收输入状态变化。Android SDK 以字符串形式返回事件载荷,应在校验 JSON 后再解析: @Override public void onConversationUserInputStatusChanged String payload InputStatesChangedData state = JsonUtil.toObj payload, InputStatesChangedData.class ; if state == null || state.getConversationID == null return; updateTypingState state.getConversationID , state.getUserID , state.getPlatformIDs ; 回调中的 conversationID 、 userID 和 platformIDs 分别表示会话、用户和正在输入的平台。 ConversationManager 只能设置一个 OnConversationListener ;如果应用还需要处理其他会话事件,请在同一个 listener 中实现相应回调。 需要主动查询指定用户是否正在输入时,使用 查询输入状态 /sdk/android/message/composing messages/get typing status 。" + "content": "进入输入状态时,将 focus 设为 true ;输入结束、输入框失去焦点或退出会话时,将其设为 false 。 conversationManager.changeInputState new OnBase @Override public void onSuccess String data // 输入状态已上报 @Override public void onError int code, String error // code 和 error 说明上报失败原因。 , conversationID, true ; 输入结束时及时清除状态: conversationManager.changeInputState callback, conversationID, false ; 避免频繁重复上报相同状态。成功回调表示上报请求已经完成。 其他客户端通过 OnConversationListener.onConversationUserInputStatusChanged 接收输入状态变化。Android SDK 以字符串形式返回事件载荷,应在校验 JSON 后再解析: @Override public void onConversationUserInputStatusChanged String payload InputStatesChangedData state = JsonUtil.toObj payload, InputStatesChangedData.class ; if state == null || state.getConversationID == null return; // state 包含会话、用户和正在输入的平台。 回调中的 conversationID 、 userID 和 platformIDs 分别表示会话、用户和正在输入的平台。 ConversationManager 只能设置一个 OnConversationListener ;如果应用还需要处理其他会话事件,请在同一个 listener 中实现相应回调。 需要主动查询指定用户是否正在输入时,使用 查询输入状态 /sdk/android/message/composing messages/get typing status 。" }, { "path": "/sdk/android/message/composing-messages/get-typing-status", @@ -2829,7 +2829,7 @@ "description": "使用 getInputState 查询指定用户在会话中的当前输入状态。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message composing-messages get-typing-status", - "content": "查询指定用户当前正在输入的平台 ID 列表。 OpenIMClient.getInstance .conversationManager.getInputState new OnBase @Override public void onSuccess List platformIDs boolean typing = platformIDs = null && platformIDs.isEmpty ; updateTypingState conversationID, userID, typing ; @Override public void onError int code, String error recordTypingStatusQueryFailure code, error ; , conversationID, userID ; 成功回调返回平台 ID 列表;空列表表示该用户当前没有平台处于输入状态。输入状态发生变化时,通过 上报输入状态 /sdk/android/message/composing messages/update typing status 页面介绍的回调接收通知。" + "content": "查询指定用户当前正在输入的平台 ID 列表。 OpenIMClient.getInstance .conversationManager.getInputState new OnBase @Override public void onSuccess List platformIDs boolean typing = platformIDs = null && platformIDs.isEmpty ; // typing 表示该用户当前输入状态。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , conversationID, userID ; 成功回调返回平台 ID 列表;空列表表示该用户当前没有平台处于输入状态。输入状态发生变化时,通过 上报输入状态 /sdk/android/message/composing messages/update typing status 页面介绍的回调接收通知。" }, { "path": "/sdk/android/message/managing-messages/delete-local-message", @@ -2845,7 +2845,7 @@ "description": "使用 Android SDK 批量删除当前账号在同一会话中的消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages delete-saved-messages", - "content": "参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | conversationID | String | 是 | 要删除消息所在的会话 ID。 | | clientMsgIDs | String | 是 | 要删除的消息 ID 列表;同一批 ID 必须属于同一会话。 | | isSync | boolean | 是 | 是否把删除动作同步到当前账号的其他客户端。 | DeleteMessagesReq request = new DeleteMessagesReq true, conversationID, selectedClientMsgIDs.toArray new String 0 ; messageManager.deleteMessages request, new OnBase @Override public void onSuccess String data // 删除请求已完成 @Override public void onError int code, String error // 处理失败 ; isSync 为 false 时,删除当前设备及当前账号服务端保存的记录;为 true 时,还会请求把删除动作同步到当前账号的其他客户端。该操作不会删除其他会话成员持有的副本,也不会产生撤回提示。 成功回调表示删除请求已经完成;开启同步时,不代表其他客户端已经收到事件或完成界面更新。 开启同步后,其他客户端可通过 OnAdvanceMsgListener.onMsgDeleted 接收删除的消息: @Override public void onMsgDeleted Message message handleDeletedMessage message ;" + "content": "参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | conversationID | String | 是 | 要删除消息所在的会话 ID。 | | clientMsgIDs | String | 是 | 要删除的消息 ID 列表;同一批 ID 必须属于同一会话。 | | isSync | boolean | 是 | 是否把删除动作同步到当前账号的其他客户端。 | DeleteMessagesReq request = new DeleteMessagesReq true, conversationID, selectedClientMsgIDs.toArray new String 0 ; messageManager.deleteMessages request, new OnBase @Override public void onSuccess String data // 删除请求已完成 @Override public void onError int code, String error // 处理失败 ; isSync 为 false 时,删除当前设备及当前账号服务端保存的记录;为 true 时,还会请求把删除动作同步到当前账号的其他客户端。该操作不会删除其他会话成员持有的副本,也不会产生撤回提示。 成功回调表示删除请求已经完成;开启同步时,不代表其他客户端已经收到事件或完成界面更新。 开启同步后,其他客户端可通过 OnAdvanceMsgListener.onMsgDeleted 接收删除的消息: @Override public void onMsgDeleted Message message // message 是已删除的消息。" }, { "path": "/sdk/android/message/managing-messages/delete-user-messages", @@ -2853,7 +2853,7 @@ "description": "使用 Android SDK 删除指定用户在群聊中的全部消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages delete-user-messages", - "content": "messageManager.deleteUserAllMessagesInConv conversationID, targetUserID, new OnBase @Override public void onSuccess String data // 删除请求已完成 @Override public void onError int code, String error // 处理失败 ; 该 API 只用于群聊,可删除指定用户在目标群会话中的全部消息。调用者没有操作权限时,通过 onError 返回错误。 其他客户端通过 OnAdvanceMsgListener.onDeleteUserAllMsgsInConv 接收删除通知。回调参数包含对应的 conversationID 和 userID : @Override public void onDeleteUserAllMsgsInConv DeleteUserAllMsgsListenerMsg event handleUserMessagesDeleted event.getConversationID , event.getUserID ;" + "content": "messageManager.deleteUserAllMessagesInConv conversationID, targetUserID, new OnBase @Override public void onSuccess String data // 删除请求已完成 @Override public void onError int code, String error // 处理失败 ; 该 API 只用于群聊,可删除指定用户在目标群会话中的全部消息。调用者没有操作权限时,通过 onError 返回错误。 其他客户端通过 OnAdvanceMsgListener.onDeleteUserAllMsgsInConv 接收删除通知。回调参数包含对应的 conversationID 和 userID : @Override public void onDeleteUserAllMsgsInConv DeleteUserAllMsgsListenerMsg event // event 包含受影响的会话和用户。" }, { "path": "/sdk/android/message/managing-messages/revoke-a-message", @@ -2861,7 +2861,7 @@ "description": "撤回已发送消息,并处理其他客户端收到的撤回通知。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages revoke-a-message", - "content": "撤回会使其他客户端把原消息显示为撤回状态。调用失败时,通过错误回调获取错误码和错误信息。 messageManager.revokeMessageV2 callback, conversationID, clientMsgID ; 成功回调表示撤回请求已经完成。其他客户端通过 OnAdvanceMsgListener.onRecvMessageRevokedV2 接收撤回通知。 RevokedInfo 包含 clientMsgID 、撤回者和撤回时间: @Override public void onRecvMessageRevokedV2 RevokedInfo info handleRevokedMessage info ; 接收端应把对应消息更新为撤回状态,而不是直接从列表删除。 MessageManager 只能设置一个 OnAdvanceMsgListener ;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见 事件概览 /sdk/android/events/overview events 。" + "content": "撤回会使其他客户端把原消息显示为撤回状态。调用失败时,通过错误回调获取错误码和错误信息。 messageManager.revokeMessageV2 callback, conversationID, clientMsgID ; 成功回调表示撤回请求已经完成。其他客户端通过 OnAdvanceMsgListener.onRecvMessageRevokedV2 接收撤回通知。 RevokedInfo 包含 clientMsgID 、撤回者和撤回时间: @Override public void onRecvMessageRevokedV2 RevokedInfo info // info 包含被撤回消息的信息。 接收端应把对应消息更新为撤回状态,而不是直接从列表删除。 MessageManager 只能设置一个 OnAdvanceMsgListener ;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见 事件概览 /sdk/android/events/overview events 。" }, { "path": "/sdk/android/message/managing-messages/modify-a-message", @@ -2869,7 +2869,7 @@ "description": "修改支持编辑的消息内容,并处理其他客户端收到的消息修改事件。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages modify-a-message", - "content": "modifyMessage 用于修改会话中已经存在的消息。通常应以原消息为基础修改支持编辑的内容,并保留其他字段。 messageManager.modifyMessage callback, modifyRequest ; 成功回调表示修改请求已经完成。 消息修改后,其他客户端通过 OnAdvanceMsgListener.onMessageModified 接收修改后的完整 Message : @Override public void onMessageModified Message message handleModifiedMessage message ; MessageManager 只能设置一个 OnAdvanceMsgListener ;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见 事件概览 /sdk/android/events/overview events 。" + "content": "modifyMessage 用于修改会话中已经存在的消息。通常应以原消息为基础修改支持编辑的内容,并保留其他字段。 messageManager.modifyMessage callback, modifyRequest ; 成功回调表示修改请求已经完成。 消息修改后,其他客户端通过 OnAdvanceMsgListener.onMessageModified 接收修改后的完整 Message : @Override public void onMessageModified Message message // message 是修改后的消息。 MessageManager 只能设置一个 OnAdvanceMsgListener ;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见 事件概览 /sdk/android/events/overview events 。" }, { "path": "/sdk/android/message/managing-messages/get-pinned-messages", @@ -2877,7 +2877,7 @@ "description": "使用 getConversationPinnedMsgs 查询会话中的置顶消息。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages get-pinned-messages", - "content": "成功回调返回指定会话当前的置顶消息列表。 messageManager.getConversationPinnedMsgs new OnBase @Override public void onSuccess List messages showPinned messages ; @Override public void onError int code, String error showPinnedError error ; , conversationID ;" + "content": "成功回调返回指定会话当前的置顶消息列表。 messageManager.getConversationPinnedMsgs new OnBase @Override public void onSuccess List messages / messages 是置顶消息。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , conversationID ;" }, { "path": "/sdk/android/message/managing-messages/set-message-pinned", @@ -2885,7 +2885,7 @@ "description": "设置会话消息的置顶状态,并处理置顶消息变化事件。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages set-message-pinned", - "content": "最后一个参数为 true 时置顶消息,为 false 时取消置顶: messageManager.setConversationPinnedMsg callback, conversationID, clientMsgID, true ; 成功回调表示设置请求完成,不代表置顶变化事件已经到达。 置顶消息发生变化时, OnAdvanceMsgListener.onChangedPinnedMsg 返回对应的 conversationID 和当前置顶消息列表: @Override public void onChangedPinnedMsg ChangedPinnedMsg event handlePinnedMessagesChanged event.getConversationID , event.getMsgs ; MessageManager 只能设置一个 OnAdvanceMsgListener ;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见 事件概览 /sdk/android/events/overview events 。需要主动获取当前置顶消息时,使用 查询会话置顶消息 /sdk/android/message/managing messages/get pinned messages 。" + "content": "最后一个参数为 true 时置顶消息,为 false 时取消置顶: messageManager.setConversationPinnedMsg callback, conversationID, clientMsgID, true ; 成功回调表示设置请求完成,不代表置顶变化事件已经到达。 置顶消息发生变化时, OnAdvanceMsgListener.onChangedPinnedMsg 返回对应的 conversationID 和当前置顶消息列表: @Override public void onChangedPinnedMsg ChangedPinnedMsg event // event.getMsgs 是置顶状态发生变化的消息。 MessageManager 只能设置一个 OnAdvanceMsgListener ;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见 事件概览 /sdk/android/events/overview events 。需要主动获取当前置顶消息时,使用 查询会话置顶消息 /sdk/android/message/managing messages/get pinned messages 。" }, { "path": "/sdk/android/message/managing-messages/insert-local-single-message", @@ -2933,7 +2933,7 @@ "description": "使用 Android SDK 上报群消息已读回执。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-read-status send-group-read-receipts", - "content": "messageManager.sendGroupMessageReadReceipt conversationID, visibleClientMsgIDs, new OnBase @Override public void onSuccess String data // 已读回执已上报 @Override public void onError int code, String error // 处理失败 ; 同一批消息必须属于目标群会话。成功回调只表示服务端接受上报,不代表其他客户端界面已经更新。会话未读数仍由 markConversationMessageAsRead 独立维护。 其他客户端通过 OnAdvanceMsgListener.onRecvGroupMessageReadReceipt 接收群消息已读回执: @Override public void onRecvGroupMessageReadReceipt GroupMessageReceipt receipt handleGroupMessageReadReceipt receipt ; 需要查询某条群消息的已读或未读成员时,使用 查询群消息已读成员 /sdk/android/message/managing read status/get group message readers 。" + "content": "messageManager.sendGroupMessageReadReceipt conversationID, visibleClientMsgIDs, new OnBase @Override public void onSuccess String data // 已读回执已上报 @Override public void onError int code, String error // 处理失败 ; 同一批消息必须属于目标群会话。成功回调只表示服务端接受上报,不代表其他客户端界面已经更新。会话未读数仍由 markConversationMessageAsRead 独立维护。 其他客户端通过 OnAdvanceMsgListener.onRecvGroupMessageReadReceipt 接收群消息已读回执: @Override public void onRecvGroupMessageReadReceipt GroupMessageReceipt receipt // receipt 包含群消息已读回执。 需要查询某条群消息的已读或未读成员时,使用 查询群消息已读成员 /sdk/android/message/managing read status/get group message readers 。" }, { "path": "/sdk/android/message/managing-read-status/get-group-message-readers", @@ -2941,7 +2941,7 @@ "description": "使用 Android SDK 分页查询群消息的已读或未读成员。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-read-status get-group-message-readers", - "content": "参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | conversationID | String | 是 | 群聊会话 ID。 | | clientMsgID | String | 是 | 要查询阅读成员的消息 ID。 | | filter | int | 是 | 0 查询已读成员, 1 查询未读成员。 | | offset | int | 是 | 分页偏移量,首页传 0 。 | | count | int | 是 | 本次请求的成员数量。 | messageManager.getGroupMessageReaderList conversationID, clientMsgID, 0, 0, 50, new OnBase @Override public void onSuccess List members renderMembers members ; @Override public void onError int code, String error // 处理失败 ; 成功回调返回当前页 GroupMembersInfo 列表,字段含义见 分页查询群成员 /sdk/android/group/retrieving group members/get group member list 。需要完整列表时继续分页。" + "content": "参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | conversationID | String | 是 | 群聊会话 ID。 | | clientMsgID | String | 是 | 要查询阅读成员的消息 ID。 | | filter | int | 是 | 0 查询已读成员, 1 查询未读成员。 | | offset | int | 是 | 分页偏移量,首页传 0 。 | | count | int | 是 | 本次请求的成员数量。 | messageManager.getGroupMessageReaderList conversationID, clientMsgID, 0, 0, 50, new OnBase @Override public void onSuccess List members // members 是已读该消息的成员资料。 @Override public void onError int code, String error // 处理失败 ; 成功回调返回当前页 GroupMembersInfo 列表,字段含义见 分页查询群成员 /sdk/android/group/retrieving group members/get group member list 。需要完整列表时继续分页。" }, { "path": "/sdk/android/file-uploads/upload-file", @@ -2949,7 +2949,7 @@ "description": "使用 Android SDK 独立上传文件并获取远端资源地址。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android file-uploads upload-file", - "content": "uploadFile 是独立文件上传能力,可用于头像、群头像、资料附件或其他业务文件。上传过程不从属于消息,也不会自动创建消息或更新用户资料。 参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | base | OnBase | 是 | 接收上传请求的最终成功或失败结果。 | | listener | OnPutFileListener | 是 | 接收当前任务的文件、分片、哈希及上传完成信息。 | | putArgs.filepath | String | 是 | Android 应用可读取的本地文件路径。 | | putArgs.name | String | 是 | 上传使用的文件名; PutArgs 默认使用传入路径,可按业务需要改为原始文件名。 | | putArgs.cuase | String | 否 | 业务约定的上传原因。字段名以 Android SDK 的 PutArgs 声明为准。 | File file = new File localPath ; PutArgs args = new PutArgs file.getAbsolutePath ; args.name = file.getName ; args.cuase = \"user avatar\"; OpenIMClient.getInstance .uploadFile new OnBase @Override public void onSuccess String result finishUploadRequest result ; @Override public void onError int code, String error showUploadError code, error ; , new OnPutFileListener @Override public void open long size initializeUpload uploadTaskID, size ; @Override public void uploadID String id bindSdkUploadID uploadTaskID, id ; @Override public void uploadComplete long fileSize, long streamSize, long storageSize recordUploadSizes uploadTaskID, fileSize, streamSize, storageSize ; @Override public void complete long size, String url, long type completeUpload uploadTaskID, size, url, type ; , args ; 回调说明 OnPutFileListener 的回调和参数如下: | 回调 | 参数 | 说明 | | | | | | open | size | 打开指定大小的文件,可用于初始化任务。 | | partSize | partSize , num | 单个分片大小和分片总数。 | | hashPartProgress | index , size , partHash | 单个分片完成哈希计算时的分片索引、大小和哈希值。 | | hashPartComplete | partsHash , fileHash | 所有分片完成哈希计算后的组合哈希和最终文件哈希。 | | uploadID | uploadID | SDK 生成的上传标识。 | | uploadPartComplete | index , partSize , partHash | 一个分片上传完成时的分片索引、大小和哈希值。 | | uploadComplete | fileSize , streamSize , storageSize | 整个文件上传阶段的数据:文件大小、流大小和存储大小。 | | complete | size , url , type | 文件上传完成后的最终大小、远端 URL 和资源类型。 | complete 返回的 URL 可用于后续更新头像、保存附件地址或创建 URL 类型的媒体消息。上传成功只表示文件资源已经写入远端;资料更新、消息创建和消息发送仍需分别调用对应 API。" + "content": "uploadFile 是独立文件上传能力,可用于头像、群头像、资料附件或其他业务文件。上传过程不从属于消息,也不会自动创建消息或更新用户资料。 参数说明 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | base | OnBase | 是 | 接收上传请求的最终成功或失败结果。 | | listener | OnPutFileListener | 是 | 接收当前任务的文件、分片、哈希及上传完成信息。 | | putArgs.filepath | String | 是 | Android 应用可读取的本地文件路径。 | | putArgs.name | String | 是 | 上传使用的文件名; PutArgs 默认使用传入路径,可按业务需要改为原始文件名。 | | putArgs.cuase | String | 否 | 业务约定的上传原因。字段名以 Android SDK 的 PutArgs 声明为准。 | File file = new File localPath ; PutArgs args = new PutArgs file.getAbsolutePath ; args.name = file.getName ; args.cuase = \"user avatar\"; OpenIMClient.getInstance .uploadFile new OnBase @Override public void onSuccess String result // result 是上传请求的最终结果。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , new OnPutFileListener @Override public void open long size // size 是待上传文件的大小。 @Override public void uploadID String id // id 是 SDK 生成的上传标识。 @Override public void uploadComplete long fileSize, long streamSize, long storageSize // 文件、流和存储大小均已可用。 @Override public void complete long size, String url, long type // url 是已上传资源的远端地址。 , args ; 回调说明 OnPutFileListener 的回调和参数如下: | 回调 | 参数 | 说明 | | | | | | open | size | 打开指定大小的文件,可用于初始化任务。 | | partSize | partSize , num | 单个分片大小和分片总数。 | | hashPartProgress | index , size , partHash | 单个分片完成哈希计算时的分片索引、大小和哈希值。 | | hashPartComplete | partsHash , fileHash | 所有分片完成哈希计算后的组合哈希和最终文件哈希。 | | uploadID | uploadID | SDK 生成的上传标识。 | | uploadPartComplete | index , partSize , partHash | 一个分片上传完成时的分片索引、大小和哈希值。 | | uploadComplete | fileSize , streamSize , storageSize | 整个文件上传阶段的数据:文件大小、流大小和存储大小。 | | complete | size , url , type | 文件上传完成后的最终大小、远端 URL 和资源类型。 | complete 返回的 URL 可用于后续更新头像、保存附件地址或创建 URL 类型的媒体消息。上传成功只表示文件资源已经写入远端;资料更新、消息创建和消息发送仍需分别调用对应 API。" }, { "path": "/sdk/android/calling/overview-calling", @@ -2965,7 +2965,7 @@ "description": "使用 Android SDK 发起单聊音视频通话。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls start-single-call", - "content": "signalingInvite 发起单聊通话。Android SDK 负责通话信令,应用仍需使用返回的房间凭据接入实时音视频媒体引擎。 参数说明 调用方法: signalingInvite OnBase callback, SignalingInfo info 下表字段均为 info 的属性;使用点号表示嵌套对象。仅列出 Android SDK 与 WASM SDK 共有的参数。 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | invitation | SignalingInvitationInfo | 是 | 本次通话邀请。 | | invitation.inviterUserID | String | 是 | 邀请者,传入当前登录用户 ID。 | | invitation.inviteeUserIDList | List | 是 | 被邀请用户列表;单聊只填写对方一个用户。 | | invitation.groupID | String | 是 | 群ID,单聊固定传空字符串。 | | invitation.roomID | String | 是 | 本次通话的唯一房间标识,后续状态按它合并。 | | invitation.timeout | long | 是 | 邀请等待时长,单位为秒。 | | invitation.mediaType | String | 是 | 媒体类型,业务通常约定为 audio 或 video 。 | | invitation.sessionType | int | 是 | 单聊使用 ConversationType.SINGLE CHAT ,群聊使用 ConversationType.SUPER GROUP CHAT 。 | | invitation.platformID | int | 是 | 当前客户端平台,固定传入 Platform.ANDROID 。 | | invitation.customData | String | 否 | 随邀请携带的业务扩展字符串。 | | invitation.initiateTime | long | 否 | 邀请发起时间。通常由信令链路维护,无需手动填写。 | | offlinePushInfo | OfflinePushInfo | 否 | 被邀请人离线时使用的推送内容。 | | offlinePushInfo.title | String | 条件必填 | 推送标题,提供 offlinePushInfo 时必填 | | offlinePushInfo.desc | String | 条件必填 | 推送正文,提供 offlinePushInfo 时必填 | | offlinePushInfo.ex | String | 条件必填 | 推送扩展字符串,没有内容时传空字符串。 | | offlinePushInfo.iOSPushSound | String | 条件必填 | iOS 推送声音,提供 offlinePushInfo 时必填 | | offlinePushInfo.iOSBadgeCount | boolean | 条件必填 | 是否更新 iOS 角标,提供 offlinePushInfo 时必填 | SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList Collections.singletonList peerUserID ; invitation.setGroupID \"\" ; invitation.setRoomID roomID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.SINGLE CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"contact card\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInvite new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCallError code, error ; , info ; 成功回调返回 SignalingCertificate 。其中 roomID 是媒体房间 ID, token 是加入房间使用的短期凭据, liveURL 是媒体服务提供的连接地址, busyLineUserIDList 是忙线用户列表。 只有取得有效的 token 和 roomID 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态见 处理通话事件 /sdk/android/calling/managing calls/handle call events 。" + "content": "signalingInvite 发起单聊通话。Android SDK 负责通话信令,应用仍需使用返回的房间凭据接入实时音视频媒体引擎。 参数说明 调用方法: signalingInvite OnBase callback, SignalingInfo info 下表字段均为 info 的属性;使用点号表示嵌套对象。仅列出 Android SDK 与 WASM SDK 共有的参数。 | 参数 | 类型 | 是否必填 | 说明 | | | | | | | invitation | SignalingInvitationInfo | 是 | 本次通话邀请。 | | invitation.inviterUserID | String | 是 | 邀请者,传入当前登录用户 ID。 | | invitation.inviteeUserIDList | List | 是 | 被邀请用户列表;单聊只填写对方一个用户。 | | invitation.groupID | String | 是 | 群ID,单聊固定传空字符串。 | | invitation.roomID | String | 是 | 本次通话的唯一房间标识,后续状态按它合并。 | | invitation.timeout | long | 是 | 邀请等待时长,单位为秒。 | | invitation.mediaType | String | 是 | 媒体类型,业务通常约定为 audio 或 video 。 | | invitation.sessionType | int | 是 | 单聊使用 ConversationType.SINGLE CHAT ,群聊使用 ConversationType.SUPER GROUP CHAT 。 | | invitation.platformID | int | 是 | 当前客户端平台,固定传入 Platform.ANDROID 。 | | invitation.customData | String | 否 | 随邀请携带的业务扩展字符串。 | | invitation.initiateTime | long | 否 | 邀请发起时间。通常由信令链路维护,无需手动填写。 | | offlinePushInfo | OfflinePushInfo | 否 | 被邀请人离线时使用的推送内容。 | | offlinePushInfo.title | String | 条件必填 | 推送标题,提供 offlinePushInfo 时必填 | | offlinePushInfo.desc | String | 条件必填 | 推送正文,提供 offlinePushInfo 时必填 | | offlinePushInfo.ex | String | 条件必填 | 推送扩展字符串,没有内容时传空字符串。 | | offlinePushInfo.iOSPushSound | String | 条件必填 | iOS 推送声音,提供 offlinePushInfo 时必填 | | offlinePushInfo.iOSBadgeCount | boolean | 条件必填 | 是否更新 iOS 角标,提供 offlinePushInfo 时必填 | SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList Collections.singletonList peerUserID ; invitation.setGroupID \"\" ; invitation.setRoomID roomID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.SINGLE CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"contact card\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInvite new OnBase @Override public void onSuccess SignalingCertificate credentials // credentials 提供 roomID、token 和 liveURL,用于接入媒体房间。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , info ; 成功回调返回 SignalingCertificate 。其中 roomID 是媒体房间 ID, token 是加入房间使用的短期凭据, liveURL 是媒体服务提供的连接地址, busyLineUserIDList 是忙线用户列表。 只有取得有效的 token 和 roomID 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态见 处理通话事件 /sdk/android/calling/managing calls/handle call events 。" }, { "path": "/sdk/android/calling/managing-calls/start-group-call", @@ -2973,7 +2973,7 @@ "description": "使用 Android SDK 发起群聊音视频通话。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls start-group-call", - "content": "signalingInviteInGroup 发起群聊通话,参数类型与 发起单聊通话 /sdk/android/calling/managing calls/start single call 相同。群聊通话时, invitation.groupID 必须传入群组 ID, invitation.sessionType 固定为 ConversationType.GROUP CHAT 。 只会邀请 inviteeUserIDList 中列出的成员,填写 groupID 不会自动邀请全群。 inviteeUserIDList 列表应排除当前用户、空值和重复成员。示例以群组 ID 作为房间 ID;若自行生成 roomID ,所有参与者必须使用相同的值。 SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList selectedGroupMemberIDs ; invitation.setGroupID groupID ; invitation.setRoomID groupID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.GROUP CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"group call\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInviteInGroup new OnBase @Override public void onSuccess SignalingCertificate credentials startGroupCall credentials ; @Override public void onError int code, String error showCallError code, error ; , info ; 成功回调返回 SignalingCertificate ,其中 roomID 是媒体房间 ID, token 是加入房间使用的短期凭据, liveURL 是媒体服务提供的连接地址, busyLineUserIDList 是忙线用户列表。忙线用户不影响其余成员的邀请;成功也不表示已有成员接听。 只有取得有效的 token 和 roomID 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态见 处理通话事件 /sdk/android/calling/managing calls/handle call events 。" + "content": "signalingInviteInGroup 发起群聊通话,参数类型与 发起单聊通话 /sdk/android/calling/managing calls/start single call 相同。群聊通话时, invitation.groupID 必须传入群组 ID, invitation.sessionType 固定为 ConversationType.GROUP CHAT 。 只会邀请 inviteeUserIDList 中列出的成员,填写 groupID 不会自动邀请全群。 inviteeUserIDList 列表应排除当前用户、空值和重复成员。示例以群组 ID 作为房间 ID;若自行生成 roomID ,所有参与者必须使用相同的值。 SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList selectedGroupMemberIDs ; invitation.setGroupID groupID ; invitation.setRoomID groupID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.GROUP CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"group call\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInviteInGroup new OnBase @Override public void onSuccess SignalingCertificate credentials // credentials 包含加入媒体房间所需凭据。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , info ; 成功回调返回 SignalingCertificate ,其中 roomID 是媒体房间 ID, token 是加入房间使用的短期凭据, liveURL 是媒体服务提供的连接地址, busyLineUserIDList 是忙线用户列表。忙线用户不影响其余成员的邀请;成功也不表示已有成员接听。 只有取得有效的 token 和 roomID 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态见 处理通话事件 /sdk/android/calling/managing calls/handle call events 。" }, { "path": "/sdk/android/calling/managing-calls/accept-call", @@ -2981,7 +2981,7 @@ "description": "使用 Android SDK 接受通话邀请并获取房间凭据。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls accept-call", - "content": "从 onReceiveNewInvitation 取得原始 SignalingInfo 后,使用 signalingAccept 接受邀请: OpenIMClient.getInstance .signalingManager.signalingAccept new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showAcceptError code, error ; , receivedInfo ; receivedInfo 必须保留收到的原始 roomID 、邀请人、被邀请人和会话类型,不能重新构造为只包含 roomID 的对象。 成功回调返回 SignalingCertificate 。取得有效的 token 和 roomID 后再连接媒体房间;API 成功仅表示已向服务端提交接听请求,不代表通话已建立,请继续监听 处理通话事件 /sdk/android/calling/managing calls/handle call events ,根据邀请方、其他设备或房间参与者返回的事件更新通话界面和状态。" + "content": "从 onReceiveNewInvitation 取得原始 SignalingInfo 后,使用 signalingAccept 接受邀请: OpenIMClient.getInstance .signalingManager.signalingAccept new OnBase @Override public void onSuccess SignalingCertificate credentials // credentials 提供 roomID、token 和 liveURL,用于接入媒体房间。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , receivedInfo ; receivedInfo 必须保留收到的原始 roomID 、邀请人、被邀请人和会话类型,不能重新构造为只包含 roomID 的对象。 成功回调返回 SignalingCertificate 。取得有效的 token 和 roomID 后再连接媒体房间;API 成功仅表示已向服务端提交接听请求,不代表通话已建立,请继续监听 处理通话事件 /sdk/android/calling/managing calls/handle call events ,根据邀请方、其他设备或房间参与者返回的事件更新通话界面和状态。" }, { "path": "/sdk/android/calling/managing-calls/reject-call", @@ -2989,7 +2989,7 @@ "description": "使用 Android SDK 拒绝通话邀请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls reject-call", - "content": "用户拒绝来电时,将收到的原始 SignalingInfo 交给 signalingReject : OpenIMClient.getInstance .signalingManager.signalingReject new OnBase @Override public void onSuccess String result closeIncomingCallUI ; @Override public void onError int code, String error showRejectError code, error ; , signalingInfo ; 成功回调只表示拒绝信令请求完成。发起端随后通过 onInviteeRejected 更新界面;完整处理见 处理通话事件 /sdk/android/calling/managing calls/handle call events 。" + "content": "用户拒绝来电时,将收到的原始 SignalingInfo 交给 signalingReject : OpenIMClient.getInstance .signalingManager.signalingReject new OnBase @Override public void onSuccess String result // 拒绝信令请求已完成。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , signalingInfo ; 成功回调只表示拒绝信令请求完成。发起端随后通过 onInviteeRejected 更新界面;完整处理见 处理通话事件 /sdk/android/calling/managing calls/handle call events 。" }, { "path": "/sdk/android/calling/managing-calls/cancel-call", @@ -2997,7 +2997,7 @@ "description": "使用 Android SDK 取消尚未接通的通话邀请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls cancel-call", - "content": "邀请尚未接通时,发起方可调用 signalingCancel 取消通话邀请: OpenIMClient.getInstance .signalingManager.signalingCancel new OnBase @Override public void onSuccess String result stopWaitingForAnswer activeInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showCancelError code, error ; , activeInfo ; 必须传入发起时保存的完整 SignalingInfo ,不能只构造一个 roomID 。成功回调表示取消信令请求完成;应用还应结束本地等待接听状态,并释放尚未使用的媒体资源。远端通过 onInvitationCancelled 更新。" + "content": "邀请尚未接通时,发起方可调用 signalingCancel 取消通话邀请: OpenIMClient.getInstance .signalingManager.signalingCancel new OnBase @Override public void onSuccess String result // 信令操作已完成。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , activeInfo ; 必须传入发起时保存的完整 SignalingInfo ,不能只构造一个 roomID 。成功回调表示取消信令请求完成;应用还应结束本地等待接听状态,并释放尚未使用的媒体资源。远端通过 onInvitationCancelled 更新。" }, { "path": "/sdk/android/calling/managing-calls/hang-up-call", @@ -3005,7 +3005,7 @@ "description": "使用 Android SDK 挂断已经建立的通话。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls hang-up-call", - "content": "通话建立后,任一参与者都可以调用 signalingHungUp 挂断。传入当前通话保存的完整 SignalingInfo ,其中的 roomID 必须与当前媒体房间一致。 OpenIMClient.getInstance .signalingManager.signalingHungUp new OnBase @Override public void onSuccess String result releaseCallResources signalingInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showHangUpError code, error ; , signalingInfo ; 成功回调只表示挂断信令请求已完成,不代表本地资源已自动释放。应用应关闭通话界面、停止本地采集、断开媒体房间,并释放摄像头和麦克风。" + "content": "通话建立后,任一参与者都可以调用 signalingHungUp 挂断。传入当前通话保存的完整 SignalingInfo ,其中的 roomID 必须与当前媒体房间一致。 OpenIMClient.getInstance .signalingManager.signalingHungUp new OnBase @Override public void onSuccess String result // 信令操作已完成。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , signalingInfo ; 成功回调只表示挂断信令请求已完成,不代表本地资源已自动释放。应用应关闭通话界面、停止本地采集、断开媒体房间,并释放摄像头和麦克风。" }, { "path": "/sdk/android/calling/managing-calls/handle-call-events", @@ -3013,7 +3013,7 @@ "description": "集中设置 Android SDK 的通话邀请、参与者和媒体流 listener。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls handle-call-events", - "content": "在应用的通话状态管理处注册一次 OnSignalingListener 。SDK 通过这些回调通知来电、接听、拒绝、取消、超时、挂断以及成员进出房间;应用据此更新通话界面和本地通话状态。 SignalingManager 同时只保留一个 listener,重复调用 setSignalingListener 会替换之前的 listener。退出登录或切换账号时,先停止更新旧账号的通话状态,再为新账号设置 listener。 OpenIMClient.getInstance .signalingManager.setSignalingListener new OnSignalingListener @Override public void onReceiveNewInvitation SignalingInfo info showIncomingCall info ; @Override public void onInviteeAccepted SignalingInfo info updateCallStatus info, \"accepted\" ; @Override public void onInviteeRejected SignalingInfo info updateCallStatus info, \"rejected\" ; @Override public void onInvitationCancelled SignalingInfo info endCall info ; @Override public void onInvitationTimeout SignalingInfo info endCall info ; @Override public void onInviteeAcceptedByOtherDevice SignalingInfo info endCall info ; @Override public void onInviteeRejectedByOtherDevice SignalingInfo info endCall info ; @Override public void onHangup SignalingInfo info endCall info ; @Override public void onRoomParticipantConnected RoomCallingInfo room updateParticipantStatus room, true ; @Override public void onRoomParticipantDisconnected RoomCallingInfo room updateParticipantStatus room, false ; @Override public void onStreamChange String streamInfo handleStreamChange streamInfo ; ; | 回调 | 何时触发 | 应用应做什么 | | | | | | onReceiveNewInvitation | 收到新的通话邀请。 | 保存 SignalingInfo ,显示来电界面,并让用户选择接听或拒绝。 | | onInviteeAccepted 、 onInviteeRejected | 某位被邀请者接听或拒绝。 | 更新该成员的通话状态;群聊中不应影响其他成员。 | | onInvitationCancelled 、 onInvitationTimeout 、 onHangup | 邀请被取消、超时或任一方挂断。 | 关闭对应通话界面,断开媒体房间并释放本地资源。 | | onInviteeAcceptedByOtherDevice 、 onInviteeRejectedByOtherDevice | 同一账号的另一台设备已接听或拒绝。 | 结束当前设备上的来电界面,避免两台设备同时处理同一邀请。 | | onRoomParticipantConnected 、 onRoomParticipantDisconnected | 成员进入或离开媒体房间。 | 更新群聊中的成员状态。 | | onStreamChange | 服务端发送媒体流变化信息。 | 按接入服务端实际约定解析字符串,再更新媒体流。 |" + "content": "在应用的通话状态管理处注册一次 OnSignalingListener 。SDK 通过这些回调通知来电、接听、拒绝、取消、超时、挂断以及成员进出房间;应用据此更新通话界面和本地通话状态。 SignalingManager 同时只保留一个 listener,重复调用 setSignalingListener 会替换之前的 listener。退出登录或切换账号时,先停止更新旧账号的通话状态,再为新账号设置 listener。 OpenIMClient.getInstance .signalingManager.setSignalingListener new OnSignalingListener @Override public void onReceiveNewInvitation SignalingInfo info // info 包含来电邀请信息。 @Override public void onInviteeAccepted SignalingInfo info // info 表示通话已接受。 @Override public void onInviteeRejected SignalingInfo info // info 表示通话已拒绝。 @Override public void onInvitationCancelled SignalingInfo info // info 表示邀请已取消。 @Override public void onInvitationTimeout SignalingInfo info // info 表示邀请已超时。 @Override public void onInviteeAcceptedByOtherDevice SignalingInfo info // info 表示其他设备已接听。 @Override public void onInviteeRejectedByOtherDevice SignalingInfo info // info 表示其他设备已拒绝。 @Override public void onHangup SignalingInfo info // info 表示通话已挂断。 @Override public void onRoomParticipantConnected RoomCallingInfo room // room 包含加入后的参与者信息。 @Override public void onRoomParticipantDisconnected RoomCallingInfo room // room 包含离开后的参与者信息。 @Override public void onStreamChange String streamInfo // streamInfo 包含媒体流变化。 ; | 回调 | 何时触发 | 应用应做什么 | | | | | | onReceiveNewInvitation | 收到新的通话邀请。 | 保存 SignalingInfo ,显示来电界面,并让用户选择接听或拒绝。 | | onInviteeAccepted 、 onInviteeRejected | 某位被邀请者接听或拒绝。 | 更新该成员的通话状态;群聊中不应影响其他成员。 | | onInvitationCancelled 、 onInvitationTimeout 、 onHangup | 邀请被取消、超时或任一方挂断。 | 关闭对应通话界面,断开媒体房间并释放本地资源。 | | onInviteeAcceptedByOtherDevice 、 onInviteeRejectedByOtherDevice | 同一账号的另一台设备已接听或拒绝。 | 结束当前设备上的来电界面,避免两台设备同时处理同一邀请。 | | onRoomParticipantConnected 、 onRoomParticipantDisconnected | 成员进入或离开媒体房间。 | 更新群聊中的成员状态。 | | onStreamChange | 服务端发送媒体流变化信息。 | 按接入服务端实际约定解析字符串,再更新媒体流。 |" }, { "path": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", @@ -3021,7 +3021,7 @@ "description": "使用 Android SDK 恢复应用启动时尚未处理的通话邀请。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling retrieving-call-information restore-pending-invitation", - "content": "getSignalingInvitationInfoStartApp 用于在应用启动或恢复时获取未处理的通话邀请。 OpenIMClient.getInstance .signalingManager.getSignalingInvitationInfoStartApp new OnBase @Override public void onSuccess SignalingInfo info if info = null && info.getInvitation = null && info.getInvitation .getRoomID = null && info.getInvitation .getRoomID .isEmpty restoreIncomingCall info ; @Override public void onError int code, String error clearExpiredIncomingCall ; ; 成功回调返回的是调用时的邀请快照,不会接通通话,仍需自行处理取消、超时、接受通话邀请。" + "content": "getSignalingInvitationInfoStartApp 用于在应用启动或恢复时获取未处理的通话邀请。 OpenIMClient.getInstance .signalingManager.getSignalingInvitationInfoStartApp new OnBase @Override public void onSuccess SignalingInfo info // 使用前校验 info 中 invitation 和 roomID 是否有效。 @Override public void onError int code, String error // code 和 error 说明查询失败原因。 ; 成功回调返回的是调用时的邀请快照,不会接通通话,仍需自行处理取消、超时、接受通话邀请。" }, { "path": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", @@ -3029,7 +3029,7 @@ "description": "使用 Android SDK 按群组 ID 查询进行中的通话房间。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling retrieving-call-information get-room-by-group-id", - "content": "signalingGetRoomByGroupID 的参数是群组 ID,不是 roomID ,即使通话使用了自定义 roomID 。 OpenIMClient.getInstance .signalingManager.signalingGetRoomByGroupID new OnBase @Override public void onSuccess RoomCallingInfo room if room.getRoomID = null && room.getRoomID .isEmpty renderParticipants room.getParticipant ; @Override public void onError int code, String error showNoActiveGroupCall ; , groupID ; 成功回调返回 RoomCallingInfo 快照,其中包含房间 ID、原始邀请、参与者、群组 ID、Token 和连接地址。 如果当前群组没有进行中的通话,接口可能返回错误或空房间。此时应清除本地保存的通话状态和房间凭据,不要继续尝试加入旧房间。" + "content": "signalingGetRoomByGroupID 的参数是群组 ID,不是 roomID ,即使通话使用了自定义 roomID 。 OpenIMClient.getInstance .signalingManager.signalingGetRoomByGroupID new OnBase @Override public void onSuccess RoomCallingInfo room // room 包含房间、邀请和当前参与者快照。 @Override public void onError int code, String error // code 和 error 说明查询失败原因。 , groupID ; 成功回调返回 RoomCallingInfo 快照,其中包含房间 ID、原始邀请、参与者、群组 ID、Token 和连接地址。 成功结果没有有效 roomID 时,表示未取得可用的房间信息。错误回调中的 code 和 error 只说明查询失败原因,不能据此判断群组没有进行中的通话。" }, { "path": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", @@ -3037,7 +3037,7 @@ "description": "使用 Android SDK 按房间 ID 重新获取入会凭据。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling retrieving-call-information get-token-by-room-id", - "content": "已经知道 roomID 、但需要重新获取入会凭据时,调用 signalingGetTokenByRoomID : OpenIMClient.getInstance .signalingManager.signalingGetTokenByRoomID new OnBase @Override public void onSuccess SignalingCertificate credentials if credentials.getToken = null && credentials.getRoomID = null joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCredentialError code, error ; , roomID ; 成功回调返回 SignalingCertificate ,可获取接入音视频房间所需的 token 和 liveURL 。 房间 Token 是短期敏感凭据,只在内存中使用,不要写入日志、URL、分析事件或持久化存储。" + "content": "已经知道 roomID 、但需要重新获取入会凭据时,调用 signalingGetTokenByRoomID : OpenIMClient.getInstance .signalingManager.signalingGetTokenByRoomID new OnBase @Override public void onSuccess SignalingCertificate credentials // credentials 提供 roomID、token 和 liveURL,用于接入媒体房间。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , roomID ; 成功回调返回 SignalingCertificate ,可获取接入音视频房间所需的 token 和 liveURL 。 房间 Token 是短期敏感凭据,只在内存中使用,不要写入日志、URL、分析事件或持久化存储。" }, { "path": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", @@ -3045,7 +3045,7 @@ "description": "使用 Android SDK 在通话房间中发送和接收自定义信令。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling sending-custom-signals send-a-custom-signal", - "content": "signalingSendCustomSignal 用于在指定通话房间内发送少量与通话相关的业务信息,例如举手、切换布局提示或临时状态同步。它不是聊天消息接口,也不适合发送大量数据或文件。 发送信令 roomID 与 customInfo 都是必填字符串。需要传递结构化数据时,应定义稳定的数据格式并序列化为 JSON。 JSONObject signal = new JSONObject ; signal.put \"version\", 1 ; signal.put \"eventID\", eventID ; signal.put \"type\", \"hand raised\" ; signal.put \"userID\", currentUserID ; signal.put \"sentAt\", System.currentTimeMillis ; OpenIMClient.getInstance .signalingManager.signalingSendCustomSignal new OnBase @Override public void onSuccess String result markSignalSent eventID ; @Override public void onError int code, String error showSignalError code, error ; , roomID, signal.toString ; 成功回调只表示发送请求已完成,不表示其他参与者已收到或处理该信令。建议在 customInfo 中包含协议版本和唯一的 eventID ,以便接收方识别重复消息。不要放入大文件、聊天记录、长期状态或敏感凭据。 接收信令 收到自定义信令时, OnSignalingListener.onReceiveCustomSignal 会返回 CustomSignalingInfo 。先确认它属于当前房间并校验数据格式,再更新界面: @Override public void onReceiveCustomSignal CustomSignalingInfo info if info == null || activeRoomID.equals info.getRoomID return; CallSignal signal = parseAndValidateCallSignal info.getCustomInfo ; String mergeID = info.getRoomID + \":\" + signal.getEventID ; if hasAppliedSignal mergeID return; applyCallSignal signal ; 如果业务需要避免重复处理,可以在自定义信令中携带唯一事件 ID,并在接收端记录已处理的事件。消息可能不会按发送顺序到达,因此不要依赖到达顺序决定业务状态。 将 onReceiveCustomSignal 与其他通话回调一起注册到 处理通话事件 /sdk/android/calling/managing calls/handle call events 中的 listener。 SignalingManager 只保留一个 listener;重新设置会覆盖已有的其他通话回调。 客户端自定义信令不能用于授予主持人、付费或隐私权限。这类需要可信校验的状态应由服务端保存和判断;在连接断连恢复时,应该从房间查询或业务后端恢复长期状态。" + "content": "signalingSendCustomSignal 用于在指定通话房间内发送少量与通话相关的业务信息,例如举手、切换布局提示或临时状态同步。它不是聊天消息接口,也不适合发送大量数据或文件。 发送信令 roomID 与 customInfo 都是必填字符串。需要传递结构化数据时,应定义稳定的数据格式并序列化为 JSON。 JSONObject signal = new JSONObject ; signal.put \"version\", 1 ; signal.put \"eventID\", eventID ; signal.put \"type\", \"hand raised\" ; signal.put \"userID\", currentUserID ; signal.put \"sentAt\", System.currentTimeMillis ; OpenIMClient.getInstance .signalingManager.signalingSendCustomSignal new OnBase @Override public void onSuccess String result // 信令发送请求已完成。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , roomID, signal.toString ; 成功回调只表示发送请求已完成,不表示其他参与者已收到或处理该信令。建议在 customInfo 中包含协议版本和唯一的 eventID ,以便接收方识别重复消息。不要放入大文件、聊天记录、长期状态或敏感凭据。 接收信令 收到自定义信令时, OnSignalingListener.onReceiveCustomSignal 会返回 CustomSignalingInfo 。先确认它属于当前房间并校验数据格式,再更新界面: @Override public void onReceiveCustomSignal CustomSignalingInfo info // 先检查 info.getRoomID ,再按业务协议解析 info.getCustomInfo 。 如果业务需要避免重复处理,可以在自定义信令中携带唯一事件 ID,并在接收端记录已处理的事件。消息可能不会按发送顺序到达,因此不要依赖到达顺序决定业务状态。 将 onReceiveCustomSignal 与其他通话回调一起注册到 处理通话事件 /sdk/android/calling/managing calls/handle call events 中的 listener。 SignalingManager 只保留一个 listener;重新设置会覆盖已有的其他通话回调。 客户端自定义信令不能用于授予主持人、付费或隐私权限。这类需要可信校验的状态应由服务端保存和判断;在连接断连恢复时,应该从房间查询或业务后端恢复长期状态。" }, { "path": "/sdk/android/events/overview-events", @@ -3061,7 +3061,7 @@ "description": "配置 Android SDK 日志、写入应用诊断信息并上传日志。", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android logger", - "content": "OpenIM Android SDK 日志用于定位初始化、连接和业务 API 调用问题。开发和预发布环境可以输出较详细的信息;生产环境应减少日志量,并避免记录 Token、完整消息正文、原始文件 URL、通话房间凭据和用户隐私字段。 初始化日志配置 在调用 initSDK 时配置日志: File dataDirectory = new File application.getFilesDir , \"openim\" ; File logDirectory = new File application.getFilesDir , \"openim logs\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn; config.isLogStandardOutput = BuildConfig.DEBUG; config.logFilePath = logDirectory.getAbsolutePath ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; | 字段 | 说明 | | | | | logLevel | 使用 LogLevel 常量控制详细程度。可选值包括 DebugWithSQL 、 Debug 、 Info 、 Warn 、 Error 、 Panic 和 Fatal 。 | | isLogStandardOutput | 是否把 SDK 日志输出到 Android 标准日志;开发诊断时开启。 | | logFilePath | 可选日志目录,应位于应用可写范围并纳入容量与保留期管理。 | 开发诊断可以使用 Debug ;只有排查数据库问题时才临时启用 DebugWithSQL 。生产环境通常使用 Warn 或 Error ,并关闭不必要的标准输出。 写入应用日志 需要把业务日志写入 SDK 日志时,使用 logs : OpenIMClient.getInstance .logs LogLevel.Error, ChatRepository.class.getSimpleName , 184, \"send message failed\", errorMessage, \"conversationID\", conversationID, \"clientMsgID\", clientMsgID ; currentClassName 和 currentLineNum 用于定位调用位置, msgStr 是简短动作描述, errStr 是错误信息。 Warn 、 Error 、 Panic 和 Fatal 级别必须提供非空错误信息。末尾的 extra 按“键、值”成对传入;只记录排查所需的非敏感标识。 旧版带 OnBase 、 Map 参数的 logs 重载已经废弃,不应在新代码中使用。 上传日志 uploadLogs 可将客户端日志上传至服务器,主要使用场景是用户主动提交诊断日志。 String cancelID = UUID.randomUUID .toString ; OpenIMClient.getInstance .uploadLogs new OnBase @Override public void onSuccess String data showLogUploadCompleted ; @Override public void onError int code, String error showLogUploadError code, error ; , new ArrayList< , 2000, // line cancelID, \"support ticket 42\", // ex new UploadLogProgress @Override public void onProgress long current, long total updateLogUploadProgress current, total ; ; | 参数 | 说明 | | | | | params | 历史遗留参数,当前 SDK 不使用;传入空列表,例如 new ArrayList< 。 | | line | 本次上传读取的日志行数配置。 | | cancelID | 本次上传的稳定标识,可使用业务生成的 UUID。 | | ex | 附加到上传任务的诊断说明,例如工单 ID;不能包含凭据或隐私数据。 | | UploadLogProgress | 提供当前进度和总量,用于更新上传界面。 | 成功 callback 表示本次日志上传请求完成。 使用 operationID 定位一次 SDK 调用 OpenIM Android SDK 的公共业务方法不接收 operationID 参数。每次调用 SDK 时,会自动生成 operationID 。 operationID 只对应一次 SDK 调用,不是用户身份、权限凭据、业务幂等键或业务 ID。 排查问题时,在客户端 SDK 日志中找到报错或异常调用附近的 operationID ,可用它定位这一次 SDK 调用的相关日志。向技术支持提供日志时,同时提供发生时间、用户 ID、操作名称,以及必要的 conversationID 、 clientMsgID 、 groupID 或 roomID ,有助于更快找到对应记录。 相关页面 按 Android 环境接入 /sdk/android/getting started/environment specific implementation 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 发送消息 /sdk/android/message/sending messages/send message" + "content": "OpenIM Android SDK 日志用于定位初始化、连接和业务 API 调用问题。开发和预发布环境可以输出较详细的信息;生产环境应减少日志量,并避免记录 Token、完整消息正文、原始文件 URL、通话房间凭据和用户隐私字段。 初始化日志配置 在调用 initSDK 时配置日志: File dataDirectory = new File application.getFilesDir , \"openim\" ; File logDirectory = new File application.getFilesDir , \"openim logs\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn; config.isLogStandardOutput = BuildConfig.DEBUG; config.logFilePath = logDirectory.getAbsolutePath ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; | 字段 | 说明 | | | | | logLevel | 使用 LogLevel 常量控制详细程度。可选值包括 DebugWithSQL 、 Debug 、 Info 、 Warn 、 Error 、 Panic 和 Fatal 。 | | isLogStandardOutput | 是否把 SDK 日志输出到 Android 标准日志;开发诊断时开启。 | | logFilePath | 可选日志目录,应位于应用可写范围并纳入容量与保留期管理。 | 开发诊断可以使用 Debug ;只有排查数据库问题时才临时启用 DebugWithSQL 。生产环境通常使用 Warn 或 Error ,并关闭不必要的标准输出。 写入应用日志 需要把业务日志写入 SDK 日志时,使用 logs : OpenIMClient.getInstance .logs LogLevel.Error, ChatRepository.class.getSimpleName , 184, \"send message failed\", errorMessage, \"conversationID\", conversationID, \"clientMsgID\", clientMsgID ; currentClassName 和 currentLineNum 用于定位调用位置, msgStr 是简短动作描述, errStr 是错误信息。 Warn 、 Error 、 Panic 和 Fatal 级别必须提供非空错误信息。末尾的 extra 按“键、值”成对传入;只记录排查所需的非敏感标识。 旧版带 OnBase 、 Map 参数的 logs 重载已经废弃,不应在新代码中使用。 上传日志 uploadLogs 可将客户端日志上传至服务器,主要使用场景是用户主动提交诊断日志。 String cancelID = UUID.randomUUID .toString ; OpenIMClient.getInstance .uploadLogs new OnBase @Override public void onSuccess String data // 日志上传请求已完成。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , new ArrayList< , 2000, // line cancelID, \"support ticket 42\", // ex new UploadLogProgress @Override public void onProgress long current, long total // current 和 total 表示上传进度。 ; | 参数 | 说明 | | | | | params | 历史遗留参数,当前 SDK 不使用;传入空列表,例如 new ArrayList< 。 | | line | 本次上传读取的日志行数配置。 | | cancelID | 本次上传的稳定标识,可使用业务生成的 UUID。 | | ex | 附加到上传任务的诊断说明,例如工单 ID;不能包含凭据或隐私数据。 | | UploadLogProgress | 提供当前进度和总量,用于更新上传界面。 | 成功 callback 表示本次日志上传请求完成。 使用 operationID 定位一次 SDK 调用 OpenIM Android SDK 的公共业务方法不接收 operationID 参数。每次调用 SDK 时,会自动生成 operationID 。 operationID 只对应一次 SDK 调用,不是用户身份、权限凭据、业务幂等键或业务 ID。 排查问题时,在客户端 SDK 日志中找到报错或异常调用附近的 operationID ,可用它定位这一次 SDK 调用的相关日志。向技术支持提供日志时,同时提供发生时间、用户 ID、操作名称,以及必要的 conversationID 、 clientMsgID 、 groupID 或 roomID ,有助于更快找到对应记录。 相关页面 按 Android 环境接入 /sdk/android/getting started/environment specific implementation 认证与管理登录会话 /sdk/android/getting started/authenticate and manage session 发送消息 /sdk/android/message/sending messages/send message" }, { "path": "/sdk/flutter/overview", diff --git a/src/generated/search-index.json b/src/generated/search-index.json index da40f78f63..c0a6d33e58 100644 --- a/src/generated/search-index.json +++ b/src/generated/search-index.json @@ -2141,7 +2141,7 @@ "description": "Use getOneConversation() to retrieve one conversation by user or group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversation-by-target", - "content": "getOneConversation retrieves one conversation by user or group and is suitable when opening a chat from a contact, user profile, or group profile. Pass the peer user ID for a one to one chat and the group ID for a group chat. OpenIMClient.getInstance .conversationManager.getOneConversation new OnBase @Override public void onSuccess ConversationInfo conversation openChatPage conversation ; @Override public void onError int code, String error recordConversationOpenFailure code, error ; , sourceId, ConversationType.SINGLE CHAT ; sourceId is the peer userID for a one to one chat and groupID for a group chat. Use ConversationType.GROUP CHAT or ConversationType.SUPER GROUP CHAT for a group according to its type. The callback returns ConversationInfo . To receive newly added or changed conversations, see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for how to set OnConversationListener ." + "content": "getOneConversation retrieves one conversation by user or group and is suitable when opening a chat from a contact, user profile, or group profile. Pass the peer user ID for a one to one chat and the group ID for a group chat. OpenIMClient.getInstance .conversationManager.getOneConversation new OnBase @Override public void onSuccess ConversationInfo conversation // conversation contains the target conversation profile. @Override public void onError int code, String error // code and error describe the failure. , sourceId, ConversationType.SINGLE CHAT ; sourceId is the peer userID for a one to one chat and groupID for a group chat. Use ConversationType.GROUP CHAT or ConversationType.SUPER GROUP CHAT for a group according to its type. The callback returns ConversationInfo . To receive newly added or changed conversations, see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for how to set OnConversationListener ." }, { "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", @@ -2157,7 +2157,7 @@ "description": "Use getMultipleConversation() to retrieve conversations by conversationID.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversations-by-id", - "content": "Use getMultipleConversation to retrieve multiple conversations by conversationIDs . conversationIDs is the list of conversation IDs to query. OpenIMClient.getInstance .conversationManager.getMultipleConversation new OnBase @Override public void onSuccess List conversations for ConversationInfo item : conversations conversationStore.put item.getConversationID , item ; @Override public void onError int code, String error recordConversationQueryFailure code, error ; , conversationIDs ; The callback returns List ." + "content": "Use getMultipleConversation to retrieve multiple conversations by conversationIDs . conversationIDs is the list of conversation IDs to query. OpenIMClient.getInstance .conversationManager.getMultipleConversation new OnBase @Override public void onSuccess List conversations // conversations contains snapshots for the requested conversationIDs. @Override public void onError int code, String error // code and error describe the failure. , conversationIDs ; The callback returns List ." }, { "path": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", @@ -2165,7 +2165,7 @@ "description": "Use getConversationListSplit() to retrieve the signed-in account conversation list by page.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation retrieving-conversations retrieve-conversation-list", - "content": "The conversation list belongs to the signed in account. Each ConversationInfo contains list state such as unread count, latest message, pinning, and draft. Retrieve a page OpenIMClient.getInstance .conversationManager.getConversationListSplit new OnBase @Override public void onSuccess List conversations mergeConversations conversations ; @Override public void onError int code, String error recordConversationListFailure code, error ; , 0, 50 ; | Parameter | Type | Description | | | | | | offset | long | Zero based paging offset; reset it to 0 on refresh. | | count | long | Requested number of conversations. | The callback returns the current List page. Advance offset by the requested item count. A page smaller than count normally indicates the end. Keep the list synchronized Use OnConversationListener to receive the following callbacks when conversations are added or changed: OnConversationListener conversationListener = new OnConversationListener @Override public void onNewConversation List conversations mergeConversations conversations ; @Override public void onConversationChanged List conversations mergeConversations conversations ; ; OpenIMClient.getInstance .conversationManager.setOnConversationListener conversationListener ; Both callbacks carry List ; update the corresponding conversation by conversationID . Once set, setOnConversationListener receives conversation changes." + "content": "The conversation list belongs to the signed in account. Each ConversationInfo contains list state such as unread count, latest message, pinning, and draft. Retrieve a page OpenIMClient.getInstance .conversationManager.getConversationListSplit new OnBase @Override public void onSuccess List conversations // conversations contains the current page. @Override public void onError int code, String error // code and error describe the failure. , 0, 50 ; | Parameter | Type | Description | | | | | | offset | long | Zero based paging offset; reset it to 0 on refresh. | | count | long | Requested number of conversations. | The callback returns the current List page. Advance offset by the requested item count. A page smaller than count normally indicates the end. Keep the list synchronized Use OnConversationListener to receive the following callbacks when conversations are added or changed: OnConversationListener conversationListener = new OnConversationListener @Override public void onNewConversation List conversations // conversations contains newly added conversations. @Override public void onConversationChanged List conversations // conversations contains changed conversations. ; OpenIMClient.getInstance .conversationManager.setOnConversationListener conversationListener ; Both callbacks carry List ; update the corresponding conversation by conversationID . Once set, setOnConversationListener receives conversation changes." }, { "path": "/sdk/android/conversation/managing-conversations/pin-conversation", @@ -2173,7 +2173,7 @@ "description": "Use pinConversation() to set the pinned state of a conversation.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations pin-conversation", - "content": "OpenIMClient.getInstance .conversationManager.pinConversation new OnBase @Override public void onSuccess String data markPinRequestSubmitted conversationID, true ; @Override public void onError int code, String error recordConversationPinFailure code, error ; , conversationID, true ; Pass true to pin and false to unpin. Conversation list changes can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." + "content": "OpenIMClient.getInstance .conversationManager.pinConversation new OnBase @Override public void onSuccess String data // The request completed. @Override public void onError int code, String error // code and error describe the failure. , conversationID, true ; Pass true to pin and false to unpin. Conversation list changes can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/set-conversation-extension", @@ -2181,7 +2181,7 @@ "description": "Use setConversationEx() to set a conversation extension string.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-conversation-extension", - "content": "ex is a string for storing conversation extension data. You can pass a JSON string or another string format defined by your application. OpenIMClient.getInstance .conversationManager.setConversationEx new OnBase @Override public void onSuccess String data markConversationExtensionSubmitted conversationID ; @Override public void onError int code, String error recordConversationExtensionFailure code, error ; , conversationID, extensionJSON ; Conversation list changes for the extension field can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." + "content": "ex is a string for storing conversation extension data. You can pass a JSON string or another string format defined by your application. OpenIMClient.getInstance .conversationManager.setConversationEx new OnBase @Override public void onSuccess String data // The request completed. @Override public void onError int code, String error // code and error describe the failure. , conversationID, extensionJSON ; Conversation list changes for the extension field can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/set-conversation-draft", @@ -2189,7 +2189,7 @@ "description": "Use setConversationDraft() to save a conversation draft.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-conversation-draft", - "content": "Save the draft when a chat is left, the conversation changes, or editor content changes. Maintain editor state locally and debounce intermediate saves; submit the newest value before leaving the page. OpenIMClient.getInstance .conversationManager.setConversationDraft new OnBase @Override public void onSuccess String data markDraftSubmitted conversationID ; @Override public void onError int code, String error recordDraftSaveFailure code, error ; , conversationID, editorValue ; Pass an empty string to clear the draft. Conversation list changes can be received through onConversationChanged ." + "content": "Save the draft when a chat is left, the conversation changes, or editor content changes. Maintain editor state locally and debounce intermediate saves; submit the newest value before leaving the page. OpenIMClient.getInstance .conversationManager.setConversationDraft new OnBase @Override public void onSuccess String data // The request completed. @Override public void onError int code, String error // code and error describe the failure. , conversationID, editorValue ; Pass an empty string to clear the draft. Conversation list changes can be received through onConversationChanged ." }, { "path": "/sdk/android/conversation/managing-conversations/set-message-receive-option", @@ -2197,7 +2197,7 @@ "description": "Use setConversationRecvMessageOpt() to set message reception and notification behavior for one conversation.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-message-receive-option", - "content": "OpenIMClient.getInstance .conversationManager.setConversationRecvMessageOpt new OnBase @Override public void onSuccess String data markReceiveOptionSubmitted conversationID ; @Override public void onError int code, String error recordReceiveOptionFailure code, error ; , conversationID, 2 ; | Value | Meaning | | | | | 0 | Receive messages and allow notifications. | | 1 | Do not receive messages from this conversation or notify. | | 2 | Receive messages from this conversation without notification. | The account default is documented in Set global message reception /sdk/android/user/user profile/set global message reception . Conversation list changes for this setting can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." + "content": "OpenIMClient.getInstance .conversationManager.setConversationRecvMessageOpt new OnBase @Override public void onSuccess String data // The request completed. @Override public void onError int code, String error // code and error describe the failure. , conversationID, 2 ; | Value | Meaning | | | | | 0 | Receive messages and allow notifications. | | 1 | Do not receive messages from this conversation or notify. | | 2 | Receive messages from this conversation without notification. | The account default is documented in Set global message reception /sdk/android/user/user profile/set global message reception . Conversation list changes for this setting can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/clear-group-mentions", @@ -2205,7 +2205,7 @@ "description": "Use resetConversationGroupAtType() to reset a group mention state for a conversation.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations clear-group-mentions", - "content": "When a group message mentions the current user or all group members, groupAtType marks the reminder state in the conversation list. After reading the relevant message, call resetConversationGroupAtType to clear the @ reminder from groupAtType for that conversation and update the conversation list UI. OpenIMClient.getInstance .conversationManager.resetConversationGroupAtType new OnBase @Override public void onSuccess String data markGroupMentionStateReset conversationID ; @Override public void onError int code, String error recordGroupMentionResetFailure code, error ; , conversationID ; Conversation list changes can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." + "content": "When a group message mentions the current user or all group members, groupAtType marks the reminder state in the conversation list. After reading the relevant message, call resetConversationGroupAtType to clear the @ reminder from groupAtType for that conversation and update the conversation list UI. OpenIMClient.getInstance .conversationManager.resetConversationGroupAtType new OnBase @Override public void onSuccess String data // The request completed. @Override public void onError int code, String error // code and error describe the failure. , conversationID ; Conversation list changes can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/mark-conversation-read", @@ -2213,7 +2213,7 @@ "description": "Use messageManager.markConversationMessageAsRead() to mark conversation messages as read.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations mark-conversation-read", - "content": "After the user has opened and read visible messages, call messageManager.markConversationMessageAsRead to mark the conversation as read. Do not mark a conversation read merely because a notification was previewed or a message arrived in the background. OpenIMClient.getInstance .messageManager.markConversationMessageAsRead conversationID, new OnBase @Override public void onSuccess String data markConversationReadSubmitted conversationID ; @Override public void onError int code, String error recordMarkReadFailure code, error ; ; The callback indicates that the mark as read request has completed. To update the conversation list, query conversations again or receive changes through onConversationChanged . For one to one chats, listen for read receipts from the peer through OnAdvanceMsgListener.onRecvC2CReadReceipt . See Receive messages /sdk/android/message/receiving messages/receive messages for the message listener setup and Message overview /sdk/android/message/overview message for message callbacks and read receipt fields." + "content": "After the user has opened and read visible messages, call messageManager.markConversationMessageAsRead to mark the conversation as read. Do not mark a conversation read merely because a notification was previewed or a message arrived in the background. OpenIMClient.getInstance .messageManager.markConversationMessageAsRead conversationID, new OnBase @Override public void onSuccess String data // The request completed. @Override public void onError int code, String error // code and error describe the failure. ; The callback indicates that the mark as read request has completed. To update the conversation list, query conversations again or receive changes through onConversationChanged . For one to one chats, listen for read receipts from the peer through OnAdvanceMsgListener.onRecvC2CReadReceipt . See Receive messages /sdk/android/message/receiving messages/receive messages for the message listener setup and Message overview /sdk/android/message/overview message for message callbacks and read receipt fields." }, { "path": "/sdk/android/conversation/managing-conversations/get-total-unread-count", @@ -2221,7 +2221,7 @@ "description": "Use getTotalUnreadMsgCount() to retrieve the total unread count for the signed-in account.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations get-total-unread-count", - "content": "getTotalUnreadMsgCount returns the total unread count for the signed in account. OpenIMClient.getInstance .conversationManager.getTotalUnreadMsgCount new OnBase @Override public void onSuccess String value int totalUnread = Integer.parseInt value ; updateApplicationBadge totalUnread ; @Override public void onError int code, String error recordTotalUnreadFailure code, error ; ; The callback value is a String and can be parsed for display. When the total unread count changes, receive the update through OnConversationListener.onTotalUnreadMessageCountChanged int count ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." + "content": "getTotalUnreadMsgCount returns the total unread count for the signed in account. OpenIMClient.getInstance .conversationManager.getTotalUnreadMsgCount new OnBase @Override public void onSuccess String value int totalUnread = Integer.parseInt value ; // totalUnread is the account's total unread count. @Override public void onError int code, String error // code and error describe the failure. ; The callback value is a String and can be parsed for display. When the total unread count changes, receive the update through OnConversationListener.onTotalUnreadMessageCountChanged int count ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/set-private-chat", @@ -2229,7 +2229,7 @@ "description": "Use setOneConversationPrivateChat() to configure burn-after-reading mode for a conversation.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-private-chat", - "content": "OpenIMClient.getInstance .conversationManager.setOneConversationPrivateChat new OnBase @Override public void onSuccess String data markPrivateChatSubmitted conversationID, true ; @Override public void onError int code, String error recordPrivateChatFailure code, error ; , conversationID, true ; Pass false to disable burn after reading. Set the duration separately with burnDuration ; see Set the burn duration /sdk/android/conversation/managing conversations/set burn duration . This is distinct from scheduled server message deletion. Conversation list changes can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." + "content": "OpenIMClient.getInstance .conversationManager.setOneConversationPrivateChat new OnBase @Override public void onSuccess String data // The request completed. @Override public void onError int code, String error // code and error describe the failure. , conversationID, true ; Pass false to disable burn after reading. Set the duration separately with burnDuration ; see Set the burn duration /sdk/android/conversation/managing conversations/set burn duration . This is distinct from scheduled server message deletion. Conversation list changes can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/set-burn-duration", @@ -2237,7 +2237,7 @@ "description": "Use setConversationBurnDuration() to set the burn-after-reading retention duration.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-burn-duration", - "content": "OpenIMClient.getInstance .conversationManager.setConversationBurnDuration new OnBase @Override public void onSuccess String data markBurnDurationSubmitted conversationID, 30 ; @Override public void onError int code, String error recordBurnDurationFailure code, error ; , conversationID, 30 ; burnDuration is measured in seconds. Enable or disable burn after reading with isPrivateChat ; do not confuse this value with the scheduled server deletion period msgDestructTime . Conversation list changes can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." + "content": "OpenIMClient.getInstance .conversationManager.setConversationBurnDuration new OnBase @Override public void onSuccess String data // The request completed. @Override public void onError int code, String error // code and error describe the failure. , conversationID, 30 ; burnDuration is measured in seconds. Enable or disable burn after reading with isPrivateChat ; do not confuse this value with the scheduled server deletion period msgDestructTime . Conversation list changes can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/set-message-destruct", @@ -2245,7 +2245,7 @@ "description": "Use setConversation() to configure scheduled server message deletion for a conversation.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations set-message-destruct", - "content": "isMsgDestruct and msgDestructTime together configure scheduled server message deletion and can be sent in one ConversationReq . ConversationReq request = new ConversationReq ; request.setMsgDestruct true ; request.setMsgDestructTime 3600 ; OpenIMClient.getInstance .conversationManager.setConversation new OnBase @Override public void onSuccess String data markMessageDestructSubmitted conversationID ; @Override public void onError int code, String error recordMessageDestructFailure code, error ; , conversationID, request ; msgDestructTime is measured in seconds. Set request.setMsgDestruct false to disable the policy. This capability is distinct from burn after reading. Conversation list changes can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." + "content": "isMsgDestruct and msgDestructTime together configure scheduled server message deletion and can be sent in one ConversationReq . ConversationReq request = new ConversationReq ; request.setMsgDestruct true ; request.setMsgDestructTime 3600 ; OpenIMClient.getInstance .conversationManager.setConversation new OnBase @Override public void onSuccess String data // The request completed. @Override public void onError int code, String error // code and error describe the failure. , conversationID, request ; msgDestructTime is measured in seconds. Set request.setMsgDestruct false to disable the policy. This capability is distinct from burn after reading. Conversation list changes can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/hide-a-conversation", @@ -2253,7 +2253,7 @@ "description": "Use hideConversation() to hide a conversation entry from the current account.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations hide-a-conversation", - "content": "hideConversation hides only the current account's conversation entry. It does not delete a one to one relationship, leave a group, or affect another account. OpenIMClient.getInstance .conversationManager.hideConversation new OnBase @Override public void onSuccess String data conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationHideFailure code, error ; , conversationID ; A hidden conversation can appear again after a new message or resynchronization. Remove it from the current list after success. Conversation list changes can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." + "content": "hideConversation hides only the current account's conversation entry. It does not delete a one to one relationship, leave a group, or affect another account. OpenIMClient.getInstance .conversationManager.hideConversation new OnBase @Override public void onSuccess String data // The request completed and the conversation was hidden. @Override public void onError int code, String error // code and error describe the failure. , conversationID ; A hidden conversation can appear again after a new message or resynchronization. Remove it from the current list after success. Conversation list changes can be received through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", @@ -2261,7 +2261,7 @@ "description": "Use deleteConversationAndDeleteAllMsg() to delete a conversation and its messages.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations delete-conversation-with-messages", - "content": "deleteConversationAndDeleteAllMsg deletes a conversation and all of its messages. OpenIMClient.getInstance .conversationManager.deleteConversationAndDeleteAllMsg new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; conversationStore.remove conversationID ; @Override public void onError int code, String error recordConversationDeleteFailure code, error ; , conversationID ; After success, clear the current message list and conversation row. This does not delete a friend relationship or leave or dismiss a group. A conversation can be regenerated by a new message or synchronization while the chat target still exists. To update the conversation list, query conversations again or receive changes through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." + "content": "deleteConversationAndDeleteAllMsg deletes a conversation and all of its messages. OpenIMClient.getInstance .conversationManager.deleteConversationAndDeleteAllMsg new OnBase @Override public void onSuccess String data // The request completed and the conversation and messages were deleted. @Override public void onError int code, String error // code and error describe the failure. , conversationID ; After success, clear the current message list and conversation row. This does not delete a friend relationship or leave or dismiss a group. A conversation can be regenerated by a new message or synchronization while the chat target still exists. To update the conversation list, query conversations again or receive changes through onConversationChanged ; see Get the conversation list /sdk/android/conversation/retrieving conversations/retrieve conversation list for listener setup." }, { "path": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", @@ -2269,7 +2269,7 @@ "description": "Use messageManager.clearConversationAndDeleteAllMsg() to keep a conversation entry while clearing its messages.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android conversation managing-conversations clear-conversation-messages", - "content": "messageManager.clearConversationAndDeleteAllMsg clears the messages in a conversation while keeping its entry. OpenIMClient.getInstance .messageManager.clearConversationAndDeleteAllMsg conversationID, new OnBase @Override public void onSuccess String data messageStore.clearConversation conversationID ; @Override public void onError int code, String error recordConversationClearFailure code, error ; ; The conversation entry remains, while the current account's messages are cleared. To update the conversation list, query conversations again or receive changes through onConversationChanged ." + "content": "messageManager.clearConversationAndDeleteAllMsg clears the messages in a conversation while keeping its entry. OpenIMClient.getInstance .messageManager.clearConversationAndDeleteAllMsg conversationID, new OnBase @Override public void onSuccess String data // The request completed and the messages were cleared. @Override public void onError int code, String error // code and error describe the failure. ; The conversation entry remains, while the current account's messages are cleared. To update the conversation list, query conversations again or receive changes through onConversationChanged ." }, { "path": "/sdk/android/group/overview-group", @@ -2285,7 +2285,7 @@ "description": "Use createGroup to create a group profile and specify its initial members, administrators, and owner.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group create-group", - "content": "Use createGroup to create a group. Set the group profile in GroupInfo , and pass the initial regular members, administrators, and owner as separate parameters. The success callback returns the complete GroupInfo , including the new group's groupID . GroupInfo info = new GroupInfo ; info.setGroupName \"Project discussion\" ; info.setIntroduction \"For project members only\" ; OpenIMClient.getInstance .groupManager.createGroup memberUserIDs, adminUserIDs, info, ownerUserID, new OnBase @Override public void onSuccess GroupInfo group openGroup group.getGroupID ; @Override public void onError int code, String error showCreateError error ; ;" + "content": "Use createGroup to create a group. Set the group profile in GroupInfo , and pass the initial regular members, administrators, and owner as separate parameters. The success callback returns the complete GroupInfo , including the new group's groupID . GroupInfo info = new GroupInfo ; info.setGroupName \"Project discussion\" ; info.setIntroduction \"For project members only\" ; OpenIMClient.getInstance .groupManager.createGroup memberUserIDs, adminUserIDs, info, ownerUserID, new OnBase @Override public void onSuccess GroupInfo group / group contains the new group profile. / @Override public void onError int code, String error / code and error describe the failure. / ;" }, { "path": "/sdk/android/group/update-group-profile", @@ -2293,7 +2293,7 @@ "description": "Use setGroupInfo to update a group name, avatar, introduction, and other profile fields.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group update-group-profile", - "content": "Use setGroupInfo to update a group profile. The request object contains the groupID and the fields being changed. Submit only the fields for the current update. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setGroupName \"Mobile project team\" ; update.setIntroduction \"Android and iOS collaboration group\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markGroupUpdateSubmitted groupID ; @Override public void onError int code, String error showGroupUpdateError error ; ; Group announcements and extra data use the same API and are covered on their respective pages." + "content": "Use setGroupInfo to update a group profile. The request object contains the groupID and the fields being changed. Submit only the fields for the current update. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setGroupName \"Mobile project team\" ; update.setIntroduction \"Android and iOS collaboration group\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / ; Group announcements and extra data use the same API and are covered on their respective pages." }, { "path": "/sdk/android/group/set-group-announcement", @@ -2301,7 +2301,7 @@ "description": "Publish or update a group announcement through GroupInfo.notification.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-announcement", - "content": "Create a GroupInfo containing the groupID and notification , then call setGroupInfo . GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNotification \"Release review starts at 20:00 tonight.\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data refreshAnnouncement groupID ; @Override public void onError int code, String error showAnnouncementError error ; ; The update time and author are stored in the GroupInfo fields notificationUpdateTime and notificationUserID . Query the group profile when you need to read them." + "content": "Create a GroupInfo containing the groupID and notification , then call setGroupInfo . GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNotification \"Release review starts at 20:00 tonight.\" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / ; The update time and author are stored in the GroupInfo fields notificationUpdateTime and notificationUserID . Query the group profile when you need to read them." }, { "path": "/sdk/android/group/set-group-extension", @@ -2309,7 +2309,7 @@ "description": "Store application-defined group data in GroupInfo.ex.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-extension", - "content": "GroupInfo.ex is a complete string; the SDK does not merge JSON values. Submitting a new value replaces the previous content. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setEx \" \\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false \" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markExtensionSubmitted groupID ; @Override public void onError int code, String error showExtensionError error ; ;" + "content": "GroupInfo.ex is a complete string; the SDK does not merge JSON values. Submitting a new value replaces the previous content. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setEx \" \\\"projectCode\\\":\\\"mobile\\\",\\\"archived\\\":false \" ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / ;" }, { "path": "/sdk/android/group/set-group-join-verification", @@ -2317,7 +2317,7 @@ "description": "Configure verification rules for group applications and invitations through GroupInfo.needVerification.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-join-verification", - "content": "Set the verification mode in GroupInfo.needVerification , then call setGroupInfo . Use one of the GroupVerification constants: APPLY NEED VERIFICATION INVITE DIRECTLY , ALL NEED VERIFICATION , or DIRECTLY . GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNeedVerification GroupVerification.ALL NEED VERIFICATION ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markVerificationSubmitted groupID ; @Override public void onError int code, String error showVerificationError error ; ; This setting applies to subsequent join requests. It does not accept or reject existing applications." + "content": "Set the verification mode in GroupInfo.needVerification , then call setGroupInfo . Use one of the GroupVerification constants: APPLY NEED VERIFICATION INVITE DIRECTLY , ALL NEED VERIFICATION , or DIRECTLY . GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setNeedVerification GroupVerification.ALL NEED VERIFICATION ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / ; This setting applies to subsequent join requests. It does not accept or reject existing applications." }, { "path": "/sdk/android/group/set-group-member-profile-access", @@ -2325,7 +2325,7 @@ "description": "Use GroupInfo.lookMemberInfo to control whether users can view member profiles through the group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-member-profile-access", - "content": "lookMemberInfo is an integer switch: 0 disables access and 1 enables it. Submit only the groupID and this permission field when changing the setting. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setLookMemberInfo 1 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markMemberInfoAccessSubmitted groupID ; @Override public void onError int code, String error showPermissionError error ; ; This switch controls profile access through the group. It does not change user profile data that a member already possesses." + "content": "lookMemberInfo is an integer switch: 0 disables access and 1 enables it. Submit only the groupID and this permission field when changing the setting. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setLookMemberInfo 1 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / ; This switch controls profile access through the group. It does not change user profile data that a member already possesses." }, { "path": "/sdk/android/group/set-group-member-friend-permission", @@ -2333,7 +2333,7 @@ "description": "Use GroupInfo.applyMemberFriend to control whether users can send friend requests from the group member list.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group set-group-member-friend-permission", - "content": "applyMemberFriend is an integer switch: 0 disables friend requests and 1 enables them. This rule only affects requests initiated through the member relationship in this group. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setApplyMemberFriend 0 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data markFriendPermissionSubmitted groupID ; @Override public void onError int code, String error showPermissionError error ; ;" + "content": "applyMemberFriend is an integer switch: 0 disables friend requests and 1 enables them. This rule only affects requests initiated through the member relationship in this group. GroupInfo update = new GroupInfo ; update.setGroupID groupID ; update.setApplyMemberFriend 0 ; OpenIMClient.getInstance .groupManager.setGroupInfo update, new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / ;" }, { "path": "/sdk/android/group/change-group-mute", @@ -2341,7 +2341,7 @@ "description": "Use changeGroupMute to enable or disable mute-all mode for a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group change-group-mute", - "content": "Use changeGroupMute to toggle mute all mode. Pass true to enable it or false to disable it. To mute one member, see Mute or unmute a group member /sdk/android/group/managing group members/change group member mute . OpenIMClient.getInstance .groupManager.changeGroupMute new OnBase @Override public void onSuccess String data markGroupMuteSubmitted groupID, true ; @Override public void onError int code, String error showGroupMuteError error ; , groupID, true ;" + "content": "Use changeGroupMute to toggle mute all mode. Pass true to enable it or false to disable it. To mute one member, see Mute or unmute a group member /sdk/android/group/managing group members/change group member mute . OpenIMClient.getInstance .groupManager.changeGroupMute new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / , groupID, true ;" }, { "path": "/sdk/android/group/join-group", @@ -2349,7 +2349,7 @@ "description": "Use joinGroup to submit a group application or join request.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group join-group", - "content": "Use joinGroup to submit a request to join a group. joinSource identifies how the user joined: 2 for an invitation, 3 for search, or 4 for a QR code. Use the five parameter overload when attaching extra data. OpenIMClient.getInstance .groupManager.joinGroup new OnBase @Override public void onSuccess String data markJoinSubmitted groupID ; @Override public void onError int code, String error showJoinError error ; , groupID, \"I would like to join the project discussion\", 3, \" \\\"from\\\":\\\"search\\\" \" ; The verification mode /sdk/android/group/set group join verification determines whether the user joins immediately or submits an application first. When approval is required, a successful callback means only that the application was submitted; onJoinedGroupAdded arrives after the user joins." + "content": "Use joinGroup to submit a request to join a group. joinSource identifies how the user joined: 2 for an invitation, 3 for search, or 4 for a QR code. Use the five parameter overload when attaching extra data. OpenIMClient.getInstance .groupManager.joinGroup new OnBase @Override public void onSuccess String data / The request was submitted. / @Override public void onError int code, String error / code and error describe the failure. / , groupID, \"I would like to join the project discussion\", 3, \" \\\"from\\\":\\\"search\\\" \" ; The verification mode /sdk/android/group/set group join verification determines whether the user joins immediately or submits an application first. When approval is required, a successful callback means only that the application was submitted; onJoinedGroupAdded arrives after the user joins." }, { "path": "/sdk/android/group/quit-group", @@ -2357,7 +2357,7 @@ "description": "Use quitGroup to remove the current signed-in user from a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group quit-group", - "content": "quitGroup only removes the current signed in user. It does not dismiss the group or remove other members. OpenIMClient.getInstance .groupManager.quitGroup new OnBase @Override public void onSuccess String data removeJoinedGroup groupID ; @Override public void onError int code, String error showQuitError error ; , groupID ; After the request succeeds, continue handling the onJoinedGroupDeleted callback." + "content": "quitGroup only removes the current signed in user. It does not dismiss the group or remove other members. OpenIMClient.getInstance .groupManager.quitGroup new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / , groupID ; After the request succeeds, continue handling the onJoinedGroupDeleted callback." }, { "path": "/sdk/android/group/dismiss-group", @@ -2365,7 +2365,7 @@ "description": "Use dismissGroup to dismiss a group that the current user is allowed to manage.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group dismiss-group", - "content": "dismissGroup dismisses the specified group and is available only to its owner. OpenIMClient.getInstance .groupManager.dismissGroup new OnBase @Override public void onSuccess String data markDismissSubmitted groupID ; @Override public void onError int code, String error showDismissError error ; , groupID ; Use onGroupDismissed to receive the group dismissal notification." + "content": "dismissGroup dismisses the specified group and is available only to its owner. OpenIMClient.getInstance .groupManager.dismissGroup new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / , groupID ; Use onGroupDismissed to receive the group dismissal notification." }, { "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", @@ -2373,7 +2373,7 @@ "description": "Use getGroupsInfo to retrieve the latest profiles for specified groups.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups get-specified-groups-info", - "content": "The groupIDs parameter of getGroupsInfo is the list of group IDs to query. The method returns a list of GroupInfo objects. OpenIMClient.getInstance .groupManager.getGroupsInfo new OnBase @Override public void onSuccess List groups showGroups groups ; @Override public void onError int code, String error showGroupQueryError error ; , groupIDs ;" + "content": "The groupIDs parameter of getGroupsInfo is the list of group IDs to query. The method returns a list of GroupInfo objects. OpenIMClient.getInstance .groupManager.getGroupsInfo new OnBase @Override public void onSuccess List groups / groups contains the requested group profiles. / @Override public void onError int code, String error / code and error describe the failure. / , groupIDs ;" }, { "path": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", @@ -2381,7 +2381,7 @@ "description": "Use getJoinedGroupListPage to retrieve the current account’s joined groups by page.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups get-joined-group-list-page", - "content": "Start offset at 0 , then advance it by the number of items returned in the previous page. Stop loading when the returned list is empty. OpenIMClient.getInstance .groupManager.getJoinedGroupListPage new OnBase @Override public void onSuccess List groups appendJoinedGroups groups ; @Override public void onError int code, String error showPageError error ; , offset, 20 ; When joining or leaving a group, receive notifications through onJoinedGroupAdded and onJoinedGroupDeleted ." + "content": "Start offset at 0 , then advance it by the number of items returned in the previous page. Stop loading when the returned list is empty. OpenIMClient.getInstance .groupManager.getJoinedGroupListPage new OnBase @Override public void onSuccess List groups / groups contains the current page. / @Override public void onError int code, String error / code and error describe the failure. / , offset, 20 ; When joining or leaving a group, receive notifications through onJoinedGroupAdded and onJoinedGroupDeleted ." }, { "path": "/sdk/android/group/retrieving-groups/is-join-group", @@ -2389,7 +2389,7 @@ "description": "Use isJoinGroup to determine whether the current signed-in user has joined a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups is-join-group", - "content": "isJoinGroup checks whether the current signed in user has joined the target group. Its parameter is groupID . OpenIMClient.getInstance .groupManager.isJoinGroup groupID, new OnBase @Override public void onSuccess Boolean joined updateJoinAction Boolean.TRUE.equals joined ; @Override public void onError int code, String error showMembershipError error ; ;" + "content": "isJoinGroup checks whether the current signed in user has joined the target group. Its parameter is groupID . OpenIMClient.getInstance .groupManager.isJoinGroup groupID, new OnBase @Override public void onSuccess Boolean joined / joined indicates whether the user is a member. / @Override public void onError int code, String error / code and error describe the failure. / ;" }, { "path": "/sdk/android/group/retrieving-groups/search-groups", @@ -2397,7 +2397,7 @@ "description": "Use searchGroups to search locally available groups by group ID or name.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-groups search-groups", - "content": "searchGroups accepts a keyword list and separate switches for searching group IDs and group names. If both switches are disabled, there is no valid search scope. OpenIMClient.getInstance .groupManager.searchGroups new OnBase @Override public void onSuccess List groups showSearchResults groups ; @Override public void onError int code, String error showSearchError error ; , Collections.singletonList keyword , true, true ; The current user is not necessarily a member of a group returned by searchGroups . Use isJoinGroup /sdk/android/group/retrieving groups/is join group to determine whether they are a member." + "content": "searchGroups accepts a keyword list and separate switches for searching group IDs and group names. If both switches are disabled, there is no valid search scope. OpenIMClient.getInstance .groupManager.searchGroups new OnBase @Override public void onSuccess List groups / groups contains the matches. / @Override public void onError int code, String error / code and error describe the failure. / , Collections.singletonList keyword , true, true ; The current user is not necessarily a member of a group returned by searchGroups . Use isJoinGroup /sdk/android/group/retrieving groups/is join group to determine whether they are a member." }, { "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", @@ -2405,7 +2405,7 @@ "description": "Use getRecvGroupApplicationList to retrieve group applications that the current user can handle.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-recipient", - "content": "Pass GetGroupApplicationListAsRecipientReq to set pagination and filters. You can set offset , count , groupIDs , and handleResults . GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .groupManager.getRecvGroupApplicationList new OnBase @Override public void onSuccess List items mergeReceivedApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ;" + "content": "Pass GetGroupApplicationListAsRecipientReq to set pagination and filters. You can set offset , count , groupIDs , and handleResults . GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq 0, 20 ; OpenIMClient.getInstance .groupManager.getRecvGroupApplicationList new OnBase @Override public void onSuccess List items / items contains the current page. / @Override public void onError int code, String error / code and error describe the failure. / , request ;" }, { "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", @@ -2413,7 +2413,7 @@ "description": "Use getSendGroupApplicationList to retrieve group applications sent by the current user.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications get-group-application-list-as-applicant", - "content": "Configure pagination and filters in GetGroupApplicationListAsApplicantReq , then call getSendGroupApplicationList . GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .groupManager.getSendGroupApplicationList new OnBase @Override public void onSuccess List items mergeSentApplications items ; @Override public void onError int code, String error showApplicationError error ; , request ; After an application is accepted, receive the group joined notification through onJoinedGroupAdded ." + "content": "Configure pagination and filters in GetGroupApplicationListAsApplicantReq , then call getSendGroupApplicationList . GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq 0, 20 ; OpenIMClient.getInstance .groupManager.getSendGroupApplicationList new OnBase @Override public void onSuccess List items / items contains the current page. / @Override public void onError int code, String error / code and error describe the failure. / , request ; After an application is accepted, receive the group joined notification through onJoinedGroupAdded ." }, { "path": "/sdk/android/group/group-applications/accept-group-application", @@ -2421,7 +2421,7 @@ "description": "Use acceptGroupApplication to accept a user’s application to join a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications accept-group-application", - "content": "Pass the application's groupID , the applicant's userID , and a handling message. The current user must have permission to approve the application. OpenIMClient.getInstance .groupManager.acceptGroupApplication new OnBase @Override public void onSuccess String data markApplicationHandled groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"Welcome to the group\" ; After acceptance, receive application status and member change notifications through the relevant events described in Group overview /sdk/android/group/overview group ." + "content": "Pass the application's groupID , the applicant's userID , and a handling message. The current user must have permission to approve the application. OpenIMClient.getInstance .groupManager.acceptGroupApplication new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / , groupID, applicantUserID, \"Welcome to the group\" ; After acceptance, receive application status and member change notifications through the relevant events described in Group overview /sdk/android/group/overview group ." }, { "path": "/sdk/android/group/group-applications/refuse-group-application", @@ -2429,7 +2429,7 @@ "description": "Use refuseGroupApplication to reject a user’s application to join a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications refuse-group-application", - "content": "The reject operation also takes the application's groupID , the applicant's userID , and a handling message. OpenIMClient.getInstance .groupManager.refuseGroupApplication new OnBase @Override public void onSuccess String data markApplicationRejected groupID, applicantUserID ; @Override public void onError int code, String error showHandleError error ; , groupID, applicantUserID, \"The group is currently full\" ; After the rejection succeeds, receive the notification through onGroupApplicationRejected or call the query API again to retrieve the latest application list." + "content": "The reject operation also takes the application's groupID , the applicant's userID , and a handling message. OpenIMClient.getInstance .groupManager.refuseGroupApplication new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / , groupID, applicantUserID, \"The group is currently full\" ; After the rejection succeeds, receive the notification through onGroupApplicationRejected or call the query API again to retrieve the latest application list." }, { "path": "/sdk/android/group/group-applications/delete-group-requests", @@ -2437,7 +2437,7 @@ "description": "Use deleteGroupRequests to delete specified group application records in a batch.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group group-applications delete-group-requests", - "content": "deleteGroupRequests accepts DeleteGroupRequestsReq , which can contain multiple SimpleGroupRequests items to delete application records in a batch. Each item contains fromUserID , the applicant's user ID, and groupID , the ID of the group the user applied to join. SimpleGroupRequests groupRequests = new SimpleGroupRequests firstApplicantUserID, firstGroupID , new SimpleGroupRequests secondApplicantUserID, secondGroupID ; DeleteGroupRequestsReq request = new DeleteGroupRequestsReq groupRequests ; OpenIMClient.getInstance .groupManager.deleteGroupRequests new OnBase @Override public void onSuccess String data showDeleteSuccess ; @Override public void onError int code, String error showDeleteError error ; , request ; Deleting an application record is not the same as rejecting an application. To reject an application, use refuseGroupApplication ." + "content": "deleteGroupRequests accepts DeleteGroupRequestsReq , which can contain multiple SimpleGroupRequests items to delete application records in a batch. Each item contains fromUserID , the applicant's user ID, and groupID , the ID of the group the user applied to join. SimpleGroupRequests groupRequests = new SimpleGroupRequests firstApplicantUserID, firstGroupID , new SimpleGroupRequests secondApplicantUserID, secondGroupID ; DeleteGroupRequestsReq request = new DeleteGroupRequestsReq groupRequests ; OpenIMClient.getInstance .groupManager.deleteGroupRequests new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / , request ; Deleting an application record is not the same as rejecting an application. To reject an application, use refuseGroupApplication ." }, { "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", @@ -2445,7 +2445,7 @@ "description": "Use getGroupMemberList to retrieve group members by role and page.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-group-member-list", - "content": "Set filter to 0 for all members, 1 for regular members, 2 for the owner, or 3 for administrators. Use offset and count for pagination. OpenIMClient.getInstance .groupManager.getGroupMemberList new OnBase @Override public void onSuccess List members appendMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, 0, offset, 50 ;" + "content": "Set filter to 0 for all members, 1 for regular members, 2 for the owner, or 3 for administrators. Use offset and count for pagination. OpenIMClient.getInstance .groupManager.getGroupMemberList new OnBase @Override public void onSuccess List members / members contains the current page. / @Override public void onError int code, String error / code and error describe the failure. / , groupID, 0, offset, 50 ;" }, { "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", @@ -2453,7 +2453,7 @@ "description": "Use getGroupMembersInfo to retrieve specified users’ profiles within a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-specified-group-members-info", - "content": "getGroupMembersInfo accepts one groupID and a list of target user IDs. It returns the users' GroupMembersInfo profiles within that group. OpenIMClient.getInstance .groupManager.getGroupMembersInfo new OnBase @Override public void onSuccess List members mergeMembers members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID, userIDs ;" + "content": "getGroupMembersInfo accepts one groupID and a list of target user IDs. It returns the users' GroupMembersInfo profiles within that group. OpenIMClient.getInstance .groupManager.getGroupMembersInfo new OnBase @Override public void onSuccess List members / members contains the requested profiles. / @Override public void onError int code, String error / code and error describe the failure. / , groupID, userIDs ;" }, { "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", @@ -2461,7 +2461,7 @@ "description": "Use getUsersInGroup to select the users who are currently members of a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-users-in-group", - "content": "getUsersInGroup returns the IDs among the supplied candidates that currently belong to the specified group. It does not return member profiles. OpenIMClient.getInstance .groupManager.getUsersInGroup new OnBase @Override public void onSuccess List joinedUserIDs updateMembership joinedUserIDs ; @Override public void onError int code, String error showMembershipError error ; , groupID, candidateUserIDs ; To retrieve nicknames, roles, or mute state, call Get group member profiles /sdk/android/group/retrieving group members/get specified group members info afterward." + "content": "getUsersInGroup returns the IDs among the supplied candidates that currently belong to the specified group. It does not return member profiles. OpenIMClient.getInstance .groupManager.getUsersInGroup new OnBase @Override public void onSuccess List joinedUserIDs / joinedUserIDs contains group member IDs. / @Override public void onError int code, String error / code and error describe the failure. / , groupID, candidateUserIDs ; To retrieve nicknames, roles, or mute state, call Get group member profiles /sdk/android/group/retrieving group members/get specified group members info afterward." }, { "path": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", @@ -2469,7 +2469,7 @@ "description": "Use getGroupMemberOwnerAndAdmin to retrieve the group owner and administrator profiles.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members get-group-member-owner-and-admin", - "content": "Use getGroupMemberOwnerAndAdmin when you need to display or check members with management roles. OpenIMClient.getInstance .groupManager.getGroupMemberOwnerAndAdmin new OnBase @Override public void onSuccess List members showModerators members ; @Override public void onError int code, String error showMemberQueryError error ; , groupID ; The owner, administrator, and regular member roleLevel constants are defined in GroupRole ." + "content": "Use getGroupMemberOwnerAndAdmin when you need to display or check members with management roles. OpenIMClient.getInstance .groupManager.getGroupMemberOwnerAndAdmin new OnBase @Override public void onSuccess List members / members contains owner and admin profiles. / @Override public void onError int code, String error / code and error describe the failure. / , groupID ; The owner, administrator, and regular member roleLevel constants are defined in GroupRole ." }, { "path": "/sdk/android/group/retrieving-group-members/search-group-members", @@ -2477,7 +2477,7 @@ "description": "Use searchGroupMembers to search group members by user ID or group nickname.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group retrieving-group-members search-group-members", - "content": "Provide a keyword list, switches for user ID and group nickname matching, and pagination parameters. OpenIMClient.getInstance .groupManager.searchGroupMembers new OnBase @Override public void onSuccess List members showMemberSearch members ; @Override public void onError int code, String error showSearchError error ; , groupID, Collections.singletonList keyword , true, true, 0, 20 ; The search is limited to the target group. Do not make the request with an empty keyword or with both search switches disabled." + "content": "Provide a keyword list, switches for user ID and group nickname matching, and pagination parameters. OpenIMClient.getInstance .groupManager.searchGroupMembers new OnBase @Override public void onSuccess List members / members contains the matches. / @Override public void onError int code, String error / code and error describe the failure. / , groupID, Collections.singletonList keyword , true, true, 0, 20 ; The search is limited to the target group. Do not make the request with an empty keyword or with both search switches disabled." }, { "path": "/sdk/android/group/managing-group-members/invite-user-to-group", @@ -2485,7 +2485,7 @@ "description": "Use inviteUserToGroup to invite a list of users to a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members invite-user-to-group", - "content": "Pass the group ID, the list of invited user IDs, and an invitation message. A successful call means that the invitation request was submitted; after a user joins, receive the notification through onGroupMemberAdded . OpenIMClient.getInstance .groupManager.inviteUserToGroup new OnBase @Override public void onSuccess String data markInviteSubmitted groupID ; @Override public void onError int code, String error showInviteError error ; , groupID, inviteeUserIDs, \"Join the project discussion\" ;" + "content": "Pass the group ID, the list of invited user IDs, and an invitation message. A successful call means that the invitation request was submitted; after a user joins, receive the notification through onGroupMemberAdded . OpenIMClient.getInstance .groupManager.inviteUserToGroup new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / , groupID, inviteeUserIDs, \"Join the project discussion\" ;" }, { "path": "/sdk/android/group/managing-group-members/kick-group-member", @@ -2493,7 +2493,7 @@ "description": "Use kickGroupMember to remove specified members from a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members kick-group-member", - "content": "kickGroupMember accepts a list of member IDs and a removal message. OpenIMClient.getInstance .groupManager.kickGroupMember new OnBase @Override public void onSuccess String data markRemovalSubmitted groupID ; @Override public void onError int code, String error showRemovalError error ; , groupID, memberUserIDs, \"No longer participating in this project\" ; After the removal succeeds, receive the member removal notification through onGroupMemberDeleted ." + "content": "kickGroupMember accepts a list of member IDs and a removal message. OpenIMClient.getInstance .groupManager.kickGroupMember new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / , groupID, memberUserIDs, \"No longer participating in this project\" ; After the removal succeeds, receive the member removal notification through onGroupMemberDeleted ." }, { "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", @@ -2501,7 +2501,7 @@ "description": "Use SetGroupMemberInfo.nickname to update a member’s display name in a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-nickname", - "content": "All group member profile changes use setGroupMemberInfo . Set the groupID , userID , and nickname in the request. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setNickname \"Lin\" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markNicknameSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; After the update succeeds, receive the member profile change notification through onGroupMemberInfoChanged as described in Group overview /sdk/android/group/overview group ." + "content": "All group member profile changes use setGroupMemberInfo . Set the groupID , userID , and nickname in the request. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setNickname \"Lin\" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / ; After the update succeeds, receive the member profile change notification through onGroupMemberInfoChanged as described in Group overview /sdk/android/group/overview group ." }, { "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", @@ -2509,7 +2509,7 @@ "description": "Use SetGroupMemberInfo.roleLevel to change a member’s role in a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-role-level", - "content": "Set roleLevel with a GroupRole constant: OWNER , ADMIN , or MEMBER . To transfer group ownership, use Transfer group ownership /sdk/android/group/managing group members/transfer group owner . SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setRoleLevel GroupRole.ADMIN ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markRoleSubmitted groupID, userID ; @Override public void onError int code, String error showRoleError error ; ; After the role update succeeds, receive the member profile change notification through onGroupMemberInfoChanged ." + "content": "Set roleLevel with a GroupRole constant: OWNER , ADMIN , or MEMBER . To transfer group ownership, use Transfer group ownership /sdk/android/group/managing group members/transfer group owner . SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setRoleLevel GroupRole.ADMIN ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / ; After the role update succeeds, receive the member profile change notification through onGroupMemberInfoChanged ." }, { "path": "/sdk/android/group/managing-group-members/set-group-member-avatar", @@ -2517,7 +2517,7 @@ "description": "Use SetGroupMemberInfo.faceURL to update the avatar displayed for a member in a group.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-avatar", - "content": "A group member avatar is a group specific profile field and does not change the user's global avatar. Pass an avatar URL that group members can access. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setFaceURL avatarURL ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markAvatarSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ; After the update succeeds, receive the member profile change notification through onGroupMemberInfoChanged ." + "content": "A group member avatar is a group specific profile field and does not change the user's global avatar. Pass an avatar URL that group members can access. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setFaceURL avatarURL ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / ; After the update succeeds, receive the member profile change notification through onGroupMemberInfoChanged ." }, { "path": "/sdk/android/group/managing-group-members/set-group-member-extension", @@ -2525,7 +2525,7 @@ "description": "Store application-defined group member data in SetGroupMemberInfo.ex.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members set-group-member-extension", - "content": "The SetGroupMemberInfo.ex string stores extra group member information and can contain a JSON string with additional member information. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setEx \" \\\"duty\\\":\\\"reviewer\\\" \" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data markMemberExtensionSubmitted groupID, userID ; @Override public void onError int code, String error showMemberUpdateError error ; ;" + "content": "The SetGroupMemberInfo.ex string stores extra group member information and can contain a JSON string with additional member information. SetGroupMemberInfo update = new SetGroupMemberInfo ; update.setGroupID groupID ; update.setUserID userID ; update.setEx \" \\\"duty\\\":\\\"reviewer\\\" \" ; OpenIMClient.getInstance .groupManager.setGroupMemberInfo update, new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / ;" }, { "path": "/sdk/android/group/managing-group-members/transfer-group-owner", @@ -2533,7 +2533,7 @@ "description": "Use transferGroupOwner to transfer group ownership to a specified member.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members transfer-group-owner", - "content": "transferGroupOwner accepts two parameters: groupID , the ID of the group whose ownership is being transferred, and newOwnerUserID , the ID of the new owner. The target user must already be a member of the group. OpenIMClient.getInstance .groupManager.transferGroupOwner new OnBase @Override public void onSuccess String data markOwnershipTransferSubmitted groupID ; @Override public void onError int code, String error showTransferError error ; , groupID, newOwnerUserID ; After the transfer succeeds, you can call Get group owners and admins /sdk/android/group/retrieving group members/get group member owner and admin again to retrieve the latest profiles." + "content": "transferGroupOwner accepts two parameters: groupID , the ID of the group whose ownership is being transferred, and newOwnerUserID , the ID of the new owner. The target user must already be a member of the group. OpenIMClient.getInstance .groupManager.transferGroupOwner new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / , groupID, newOwnerUserID ; After the transfer succeeds, you can call Get group owners and admins /sdk/android/group/retrieving group members/get group member owner and admin again to retrieve the latest profiles." }, { "path": "/sdk/android/group/managing-group-members/change-group-member-mute", @@ -2541,7 +2541,7 @@ "description": "Use changeGroupMemberMute to set the mute duration for a specified group member.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android group managing-group-members change-group-member-mute", - "content": "seconds is the mute duration in seconds. Pass 0 to unmute the member. Member level mute state is independent from the group mute all setting /sdk/android/group/change group mute . OpenIMClient.getInstance .groupManager.changeGroupMemberMute new OnBase @Override public void onSuccess String data markMemberMuteSubmitted groupID, userID ; @Override public void onError int code, String error showMemberMuteError error ; , groupID, userID, 3600L ;" + "content": "seconds is the mute duration in seconds. Pass 0 to unmute the member. Member level mute state is independent from the group mute all setting /sdk/android/group/change group mute . OpenIMClient.getInstance .groupManager.changeGroupMemberMute new OnBase @Override public void onSuccess String data / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / , groupID, userID, 3600L ;" }, { "path": "/sdk/android/message/overview-message", @@ -2549,7 +2549,7 @@ "description": "Learn about the Android SDK Message model, message lifecycle, and message listener.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message overview-message", - "content": "The Android SDK represents each message as Message . Message creation, sending, receiving, querying, and state changes are separate stages: creating a Message does not send it, and a successful send does not mean that other clients have already received it. Use clientMsgID as the client side deduplication and update key, together with the conversation context that identifies a one to one or group chat. Message does not contain conversationID ; obtain it from the active conversation, history query, or message event context. Message processing flow | Stage | Android API or callback | Description | | | | | | Create | MessageManager.create Message | Creates a Message object ready to be sent, without writing it to the server or triggering a new message callback. | | Send | sendMessage or sendMessageNotOss | Pass recvUid for a one to one chat or recvGid for a group chat. | | Receive | OnAdvanceMsgListener | Handles live, offline, online only, revoked, deleted, and read receipt changes. | | Query | History, ID lookup, or search APIs | Queries return a message snapshot and do not replace real time message listening. | | Update | Revoke, delete, modify, pin, read, and local extension APIs | Handle API results, related events, and any necessary list re query separately. | messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; @Override public void onRecvOfflineNewMessage List messages messageStore.mergeAll messages ; @Override public void onRecvMessageRevokedV2 RevokedInfo info messageStore.markRevoked info ; @Override public void onMsgDeleted Message message messageStore.remove message.getClientMsgID ; ; Calling setAdvancedMsgListener on the same MessageManager replaces the current listener. Register it in the shared message state layer and dispatch the resulting changes to screens. Message fields The message object returned by creation, sending, receiving, and querying APIs is a Message . Common fields include: | Field | Type | Description | | | | | | clientMsgID | String | Client message ID used for list deduplication, state updates, and message lookup. | | serverMsgID | String | Server message ID; it may not have a valid value before a message is sent successfully. | | sessionType | int | Conversation type; use it with recvID and groupID to distinguish one to one and group chats. | | sendID | String | Sender user ID. | | recvID | String | Recipient user ID for a one to one message. | | groupID | String | Group ID for a group message. | | msgFrom | int | Indicates whether the message is user level or system level. | | contentType | int | Message type; use MessageType constants to select the content field. | | createTime | long | Message creation time; the Android model documents this value in nanoseconds. | | sendTime | long | Message send time; the Android model documents this value in milliseconds. | | seq | int | Server message sequence number. | | status | int | Send state; use MessageStatus constants to interpret it. | | isRead | boolean | Read state snapshot stored on the current client. | | platformID | int | Client platform from which the message was sent. | | senderNickname | String | Snapshot of the sender's nickname. | | senderFaceUrl | String | Snapshot of the sender's avatar URL. | | isReact | boolean | Whether the message carries a reaction marker. | | isExternalExtensions | boolean | Whether the message uses external extensions. | | offlinePush | OfflinePushInfo | Offline push content. | | attachedInfo | String | SDK attachment information. | | ext | Object | Android message attachment field. | | ex | Object | Message attachment field. | | localEx | Object | Message extension field stored only on the current device. | The message body is stored in the element field selected by contentType . Do not infer the message type from list position or rendered text: | Message content | Corresponding field | | | | | Text and rich text | textElem , advancedTextElem | | Image, audio, video, and file | pictureElem , soundElem , videoElem , fileElem | | @ mention and reply | atTextElem , quoteElem | | Merged forward | mergeElem | | Contact card, location, and emoji | cardElem , locationElem , faceElem | | Custom message | customElem | | Notification, typing, and attached state | notificationElem , typingElem , attachedInfoElem | Create and send different content types Sending a message has two steps: 1. Call the create Message method for the desired content to obtain a pending Message . 2. Pass that Message to sendMessage /sdk/android/message/sending messages/send message . For a one to one chat, set recvUid ; for a group chat, set recvGid . The available message types and creation methods are: | Message content | Creation API | | | | | Text | createTextMessage /sdk/android/message/creating messages/create text message | | Rich text | createAdvancedTextMessage /sdk/android/message/creating messages/create advanced text message | | @ mention | createTextAtMessage /sdk/android/message/creating messages/create text at message | | Image | createImageMessage /sdk/android/message/creating messages/create image message , createImageMessageFromFullPath /sdk/android/message/creating messages/create image message by file , createImageMessageByURL /sdk/android/message/creating messages/create image message by url | | Audio | createSoundMessage /sdk/android/message/creating messages/create sound message , createSoundMessageFromFullPath /sdk/android/message/creating messages/create sound message by file , createSoundMessageByURL /sdk/android/message/creating messages/create sound message by url | | Video | createVideoMessage /sdk/android/message/creating messages/create video message , createVideoMessageFromFullPath /sdk/android/message/creating messages/create video message by file , createVideoMessageByURL /sdk/android/message/creating messages/create video message by url | | File | createFileMessage /sdk/android/message/creating messages/create file message , createFileMessageFromFullPath /sdk/android/message/creating messages/create file message by file , createFileMessageByURL /sdk/android/message/creating messages/create file message by url | | Contact card | createCardMessage /sdk/android/message/creating messages/create card message | | Location | createLocationMessage /sdk/android/message/creating messages/create location message | | Emoji | createFaceMessage /sdk/android/message/creating messages/create face message | | Reply | createQuoteMessage /sdk/android/message/creating messages/create quote message , createAdvancedQuoteMessage /sdk/android/message/creating messages/create advanced quote message | | Forward | createForwardMessage /sdk/android/message/creating messages/create forward message | | Merged forward | createMergerMessage /sdk/android/message/creating messages/create merger message | | Custom message | createCustomMessage /sdk/android/message/creating messages/create custom message | Choose the send method based on the media source. For a message created from a local path or local file, call sendMessage so the SDK uploads the media during sending. For a message created from an existing remote URL with create MessageByURL , call sendMessageNotOss /sdk/android/message/sending messages/send message not oss to send the message without uploading the media again. Find a page by task | Task | Page | | | | | Send an ordinary message or already uploaded media | Send a message /sdk/android/message/sending messages/send message , Send an uploaded media message /sdk/android/message/sending messages/send message not oss | | Receive live, offline, and online only messages | Receive messages /sdk/android/message/receiving messages/receive messages , Receive custom business messages /sdk/android/message/receiving messages/receive custom business messages | | Load message history or load it in reverse | Load message history /sdk/android/message/retrieving messages/load older messages , Load message history in reverse /sdk/android/message/retrieving messages/load newer messages | | Locate or search messages | Find messages by ID /sdk/android/message/retrieving messages/find messages by id , Search messages /sdk/android/message/searching messages/search messages | | Delete, revoke, modify, or pin messages | Delete messages /sdk/android/message/managing messages/delete saved messages , Revoke a message /sdk/android/message/managing messages/revoke a message , Modify a message /sdk/android/message/managing messages/modify a message , Pin a message /sdk/android/message/managing messages/set message pinned | | Manage conversation unread state and group read receipts | Mark a conversation as read /sdk/android/conversation/managing conversations/mark conversation read , Report group messages as read /sdk/android/message/managing read status/send group read receipts , Get group message readers /sdk/android/message/managing read status/get group message readers | | Report or retrieve typing status | Update typing status /sdk/android/message/composing messages/update typing status , Get typing status /sdk/android/message/composing messages/get typing status | | Insert, delete, or extend current device only messages | Insert a local one to one message /sdk/android/message/managing messages/insert local single message , Delete a local message /sdk/android/message/managing messages/delete local message , Set a local message extension /sdk/android/message/managing messages/set message local ex | State synchronization boundaries | Change | Handling location | Merge strategy | | | | | | New and offline messages | Receive messages /sdk/android/message/receiving messages/receive messages | Determine the target conversation, then merge by clientMsgID . | | Message revocation | onRecvMessageRevokedV2 | Update the original message by the ID in the revoke information. | | Message deletion | onMsgDeleted | Remove the message from the current conversation by ID. | | C2C and group read receipts | onRecvC2CReadReceipt , onRecvGroupMessageReadReceipt | Update the corresponding message or conversation read state. | | Message extension changes | onRecvMessageExtensionsChanged and related callbacks | Update extension fields by message ID without replacing the message body. | | Typing status | Update typing status /sdk/android/message/composing messages/update typing status | Maintain temporary state by conversation and user, outside the ordinary message list. | For message revocation, deletion, read receipts, and extension changes, handle the API result first, then process the related OnAdvanceMsgListener callbacks. Re query the message list when necessary." + "content": "The Android SDK represents each message as Message . Message creation, sending, receiving, querying, and state changes are separate stages: creating a Message does not send it, and a successful send does not mean that other clients have already received it. Use clientMsgID as the client side deduplication and update key, together with the conversation context that identifies a one to one or group chat. Message does not contain conversationID ; obtain it from the active conversation, history query, or message event context. Message processing flow | Stage | Android API or callback | Description | | | | | | Create | MessageManager.create Message | Creates a Message object ready to be sent, without writing it to the server or triggering a new message callback. | | Send | sendMessage or sendMessageNotOss | Pass recvUid for a one to one chat or recvGid for a group chat. | | Receive | OnAdvanceMsgListener | Handles live, offline, online only, revoked, deleted, and read receipt changes. | | Query | History, ID lookup, or search APIs | Queries return a message snapshot and do not replace real time message listening. | | Update | Revoke, delete, modify, pin, read, and local extension APIs | Handle API results, related events, and any necessary list re query separately. | messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message // message is the newly received message. @Override public void onRecvOfflineNewMessage List messages // messages contains messages received while offline. @Override public void onRecvMessageRevokedV2 RevokedInfo info // info identifies the revoked message. @Override public void onMsgDeleted Message message // message is the deleted message. ; Calling setAdvancedMsgListener on the same MessageManager replaces the current listener. Register it in the shared message state layer and dispatch the resulting changes to screens. Message fields The message object returned by creation, sending, receiving, and querying APIs is a Message . Common fields include: | Field | Type | Description | | | | | | clientMsgID | String | Client message ID used for list deduplication, state updates, and message lookup. | | serverMsgID | String | Server message ID; it may not have a valid value before a message is sent successfully. | | sessionType | int | Conversation type; use it with recvID and groupID to distinguish one to one and group chats. | | sendID | String | Sender user ID. | | recvID | String | Recipient user ID for a one to one message. | | groupID | String | Group ID for a group message. | | msgFrom | int | Indicates whether the message is user level or system level. | | contentType | int | Message type; use MessageType constants to select the content field. | | createTime | long | Message creation time; the Android model documents this value in nanoseconds. | | sendTime | long | Message send time; the Android model documents this value in milliseconds. | | seq | int | Server message sequence number. | | status | int | Send state; use MessageStatus constants to interpret it. | | isRead | boolean | Read state snapshot stored on the current client. | | platformID | int | Client platform from which the message was sent. | | senderNickname | String | Snapshot of the sender's nickname. | | senderFaceUrl | String | Snapshot of the sender's avatar URL. | | isReact | boolean | Whether the message carries a reaction marker. | | isExternalExtensions | boolean | Whether the message uses external extensions. | | offlinePush | OfflinePushInfo | Offline push content. | | attachedInfo | String | SDK attachment information. | | ext | Object | Android message attachment field. | | ex | Object | Message attachment field. | | localEx | Object | Message extension field stored only on the current device. | The message body is stored in the element field selected by contentType . Do not infer the message type from list position or rendered text: | Message content | Corresponding field | | | | | Text and rich text | textElem , advancedTextElem | | Image, audio, video, and file | pictureElem , soundElem , videoElem , fileElem | | @ mention and reply | atTextElem , quoteElem | | Merged forward | mergeElem | | Contact card, location, and emoji | cardElem , locationElem , faceElem | | Custom message | customElem | | Notification, typing, and attached state | notificationElem , typingElem , attachedInfoElem | Create and send different content types Sending a message has two steps: 1. Call the create Message method for the desired content to obtain a pending Message . 2. Pass that Message to sendMessage /sdk/android/message/sending messages/send message . For a one to one chat, set recvUid ; for a group chat, set recvGid . The available message types and creation methods are: | Message content | Creation API | | | | | Text | createTextMessage /sdk/android/message/creating messages/create text message | | Rich text | createAdvancedTextMessage /sdk/android/message/creating messages/create advanced text message | | @ mention | createTextAtMessage /sdk/android/message/creating messages/create text at message | | Image | createImageMessage /sdk/android/message/creating messages/create image message , createImageMessageFromFullPath /sdk/android/message/creating messages/create image message by file , createImageMessageByURL /sdk/android/message/creating messages/create image message by url | | Audio | createSoundMessage /sdk/android/message/creating messages/create sound message , createSoundMessageFromFullPath /sdk/android/message/creating messages/create sound message by file , createSoundMessageByURL /sdk/android/message/creating messages/create sound message by url | | Video | createVideoMessage /sdk/android/message/creating messages/create video message , createVideoMessageFromFullPath /sdk/android/message/creating messages/create video message by file , createVideoMessageByURL /sdk/android/message/creating messages/create video message by url | | File | createFileMessage /sdk/android/message/creating messages/create file message , createFileMessageFromFullPath /sdk/android/message/creating messages/create file message by file , createFileMessageByURL /sdk/android/message/creating messages/create file message by url | | Contact card | createCardMessage /sdk/android/message/creating messages/create card message | | Location | createLocationMessage /sdk/android/message/creating messages/create location message | | Emoji | createFaceMessage /sdk/android/message/creating messages/create face message | | Reply | createQuoteMessage /sdk/android/message/creating messages/create quote message , createAdvancedQuoteMessage /sdk/android/message/creating messages/create advanced quote message | | Forward | createForwardMessage /sdk/android/message/creating messages/create forward message | | Merged forward | createMergerMessage /sdk/android/message/creating messages/create merger message | | Custom message | createCustomMessage /sdk/android/message/creating messages/create custom message | Choose the send method based on the media source. For a message created from a local path or local file, call sendMessage so the SDK uploads the media during sending. For a message created from an existing remote URL with create MessageByURL , call sendMessageNotOss /sdk/android/message/sending messages/send message not oss to send the message without uploading the media again. Find a page by task | Task | Page | | | | | Send an ordinary message or already uploaded media | Send a message /sdk/android/message/sending messages/send message , Send an uploaded media message /sdk/android/message/sending messages/send message not oss | | Receive live, offline, and online only messages | Receive messages /sdk/android/message/receiving messages/receive messages , Receive custom business messages /sdk/android/message/receiving messages/receive custom business messages | | Load message history or load it in reverse | Load message history /sdk/android/message/retrieving messages/load older messages , Load message history in reverse /sdk/android/message/retrieving messages/load newer messages | | Locate or search messages | Find messages by ID /sdk/android/message/retrieving messages/find messages by id , Search messages /sdk/android/message/searching messages/search messages | | Delete, revoke, modify, or pin messages | Delete messages /sdk/android/message/managing messages/delete saved messages , Revoke a message /sdk/android/message/managing messages/revoke a message , Modify a message /sdk/android/message/managing messages/modify a message , Pin a message /sdk/android/message/managing messages/set message pinned | | Manage conversation unread state and group read receipts | Mark a conversation as read /sdk/android/conversation/managing conversations/mark conversation read , Report group messages as read /sdk/android/message/managing read status/send group read receipts , Get group message readers /sdk/android/message/managing read status/get group message readers | | Report or retrieve typing status | Update typing status /sdk/android/message/composing messages/update typing status , Get typing status /sdk/android/message/composing messages/get typing status | | Insert, delete, or extend current device only messages | Insert a local one to one message /sdk/android/message/managing messages/insert local single message , Delete a local message /sdk/android/message/managing messages/delete local message , Set a local message extension /sdk/android/message/managing messages/set message local ex | State synchronization boundaries | Change | Handling location | Merge strategy | | | | | | New and offline messages | Receive messages /sdk/android/message/receiving messages/receive messages | Determine the target conversation, then merge by clientMsgID . | | Message revocation | onRecvMessageRevokedV2 | Update the original message by the ID in the revoke information. | | Message deletion | onMsgDeleted | Remove the message from the current conversation by ID. | | C2C and group read receipts | onRecvC2CReadReceipt , onRecvGroupMessageReadReceipt | Update the corresponding message or conversation read state. | | Message extension changes | onRecvMessageExtensionsChanged and related callbacks | Update extension fields by message ID without replacing the message body. | | Typing status | Update typing status /sdk/android/message/composing messages/update typing status | Maintain temporary state by conversation and user, outside the ordinary message list. | For message revocation, deletion, read receipts, and extension changes, handle the API result first, then process the related OnAdvanceMsgListener callbacks. Re query the message list when necessary." }, { "path": "/sdk/android/message/creating-messages/create-text-message", @@ -2741,7 +2741,7 @@ "description": "Use sendMessage to send a Message to a one-to-one or group conversation.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message sending-messages send-message", - "content": "For a one to one message, set recvUid . For a group message, set recvGid . OnMsgSendCallback reports success, failure, and media upload progress. messageManager.sendMessage new OnMsgSendCallback @Override public void onSuccess Message sentMessage mergeSentMessage sentMessage ; @Override public void onError int code, String error showSendError error ; , message, peerUserID, null, offlinePushInfo ;" + "content": "For a one to one message, set recvUid . For a group message, set recvGid . OnMsgSendCallback reports success, failure, and media upload progress. messageManager.sendMessage new OnMsgSendCallback @Override public void onSuccess Message sentMessage / sentMessage is the successfully sent message. / @Override public void onError int code, String error / code and error describe the failure. / , message, peerUserID, null, offlinePushInfo ;" }, { "path": "/sdk/android/message/sending-messages/send-message-not-oss", @@ -2757,7 +2757,7 @@ "description": "Use the progress callback on OnMsgSendCallback to update media sending progress.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message sending-messages set-msg-send-progress-listener", - "content": "Use OnMsgSendCallback.onProgress to receive progress updates for the current message. messageManager.sendMessage new OnMsgSendCallback @Override public void onProgress long progress updateProgress progress ; @Override public void onSuccess Message sentMessage finishProgress ; @Override public void onError int code, String error failProgress error ; , message, peerUserID, null, offlinePushInfo ;" + "content": "Use OnMsgSendCallback.onProgress to receive progress updates for the current message. messageManager.sendMessage new OnMsgSendCallback @Override public void onProgress long progress / progress is the send progress. / @Override public void onSuccess Message sentMessage / sentMessage is the successfully sent message. / @Override public void onError int code, String error / code and error describe the failure. / , message, peerUserID, null, offlinePushInfo ;" }, { "path": "/sdk/android/message/receiving-messages/receive-messages", @@ -2765,7 +2765,7 @@ "description": "Use OnAdvanceMsgListener to receive new, offline, and online-only messages.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message receiving-messages receive-messages", - "content": "After calling setAdvancedMsgListener , onRecvNewMessage receives real time messages, onRecvOfflineNewMessage receives offline batches, and onRecvOnlineOnlyMessage receives online only messages. messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message messageStore.merge message ; @Override public void onRecvOfflineNewMessage List messages messageStore.mergeAll messages ; ;" + "content": "After calling setAdvancedMsgListener , onRecvNewMessage receives real time messages, onRecvOfflineNewMessage receives offline batches, and onRecvOnlineOnlyMessage receives online only messages. messageManager.setAdvancedMsgListener new OnAdvanceMsgListener @Override public void onRecvNewMessage Message message / message is the newly received message. / @Override public void onRecvOfflineNewMessage List messages / messages contains offline messages. / ;" }, { "path": "/sdk/android/message/receiving-messages/receive-custom-business-messages", @@ -2773,7 +2773,7 @@ "description": "Use setCustomBusinessListener to receive business callbacks that are separate from regular chat messages.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message receiving-messages receive-custom-business-messages", - "content": "The custom business callback carries a string payload. Parse it according to your application format instead of rendering it directly as a Message . messageManager.setCustomBusinessListener new OnCustomBusinessListener @Override public void onRecvCustomBusinessMessage String payload handleBusiness payload ; ;" + "content": "The custom business callback carries a string payload. Parse it according to your application format instead of rendering it directly as a Message . messageManager.setCustomBusinessListener new OnCustomBusinessListener @Override public void onRecvCustomBusinessMessage String payload / payload contains the custom business data. / ;" }, { "path": "/sdk/android/message/retrieving-messages/load-older-messages", @@ -2797,7 +2797,7 @@ "description": "Use findMessageList to retrieve message records with SearchParams.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message retrieving-messages find-messages-by-id", - "content": "Create a list of SearchParams for the messages you need. messageManager.findMessageList new OnBase @Override public void onSuccess SearchResult result showFoundMessages result ; @Override public void onError int code, String error showQueryError error ; , searchParams ;" + "content": "Create a list of SearchParams for the messages you need. messageManager.findMessageList new OnBase @Override public void onSuccess SearchResult result / result contains the matches. / @Override public void onError int code, String error / code and error describe the failure. / , searchParams ;" }, { "path": "/sdk/android/message/retrieving-messages/load-message-context", @@ -2805,7 +2805,7 @@ "description": "Retrieve messages before and after a specified message with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message retrieving-messages load-message-context", - "content": "When navigating from a search result or referenced message into its chat context, use the Message already retrieved as the anchor. Parameters | Parameter | Type | Required | Description | | | | | | | conversationID | String | Yes | ID of the conversation containing the anchor message. | | startMsg | Message | Yes | Previously retrieved anchor message. | | type | ViewType | Yes | Context type. Use ViewType.History for a referenced message and ViewType.Search for a search result. | | before | int | Yes | Maximum number of messages to retrieve before the anchor. | | after | int | Yes | Maximum number of messages to retrieve after the anchor. | messageManager.fetchSurroundingMessages new OnBase @Override public void onSuccess Messages messages List surrounding = messages.getData ; renderMessages surrounding ; @Override public void onError int code, String error // Handle the failure , conversationID, targetMessage, ViewType.Search, 20, 20 ; In the success callback, messages.getData is the list retrieved before and after the anchor. For message fields, see Message overview /sdk/android/message/overview message . before and after independently limit the number of messages on either side. The result can contain fewer messages than requested when the anchor is near a history boundary or some messages have been deleted. If the message must first be located, see Find messages by ID /sdk/android/message/retrieving messages/find messages by id ." + "content": "When navigating from a search result or referenced message into its chat context, use the Message already retrieved as the anchor. Parameters | Parameter | Type | Required | Description | | | | | | | conversationID | String | Yes | ID of the conversation containing the anchor message. | | startMsg | Message | Yes | Previously retrieved anchor message. | | type | ViewType | Yes | Context type. Use ViewType.History for a referenced message and ViewType.Search for a search result. | | before | int | Yes | Maximum number of messages to retrieve before the anchor. | | after | int | Yes | Maximum number of messages to retrieve after the anchor. | messageManager.fetchSurroundingMessages new OnBase @Override public void onSuccess Messages messages List surrounding = messages.getData ; // surrounding contains the target message and its context. @Override public void onError int code, String error // Handle the failure , conversationID, targetMessage, ViewType.Search, 20, 20 ; In the success callback, messages.getData is the list retrieved before and after the anchor. For message fields, see Message overview /sdk/android/message/overview message . before and after independently limit the number of messages on either side. The result can contain fewer messages than requested when the anchor is near a history boundary or some messages have been deleted. If the message must first be located, see Find messages by ID /sdk/android/message/retrieving messages/find messages by id ." }, { "path": "/sdk/android/message/searching-messages/search-messages", @@ -2821,7 +2821,7 @@ "description": "Report the current conversation typing state with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message composing-messages update-typing-status", - "content": "Set focus to true when typing starts. Set it to false when typing ends, the input field loses focus, or the conversation screen closes. conversationManager.changeInputState new OnBase @Override public void onSuccess String data // The typing state has been reported @Override public void onError int code, String error // Handle the failure , conversationID, true ; Clear the state promptly when typing ends: conversationManager.changeInputState callback, conversationID, false ; Avoid repeatedly reporting the same state. A successful callback means that the report request completed. Other clients receive typing state changes through OnConversationListener.onConversationUserInputStatusChanged . The Android SDK returns the event payload as a string, so validate the JSON before parsing it: @Override public void onConversationUserInputStatusChanged String payload InputStatesChangedData state = JsonUtil.toObj payload, InputStatesChangedData.class ; if state == null || state.getConversationID == null return; updateTypingState state.getConversationID , state.getUserID , state.getPlatformIDs ; The callback's conversationID , userID , and platformIDs identify the conversation, user, and platforms on which the user is typing. ConversationManager can retain only one OnConversationListener . If the application handles other conversation events, implement their callbacks in the same listener. To query whether a specified user is currently typing, use Retrieve typing status /sdk/android/message/composing messages/get typing status ." + "content": "Set focus to true when typing starts. Set it to false when typing ends, the input field loses focus, or the conversation screen closes. conversationManager.changeInputState new OnBase @Override public void onSuccess String data // The typing state has been reported @Override public void onError int code, String error // code and error describe why the report failed. , conversationID, true ; Clear the state promptly when typing ends: conversationManager.changeInputState callback, conversationID, false ; Avoid repeatedly reporting the same state. A successful callback means that the report request completed. Other clients receive typing state changes through OnConversationListener.onConversationUserInputStatusChanged . The Android SDK returns the event payload as a string, so validate the JSON before parsing it: @Override public void onConversationUserInputStatusChanged String payload InputStatesChangedData state = JsonUtil.toObj payload, InputStatesChangedData.class ; if state == null || state.getConversationID == null return; // state contains the conversation, user, and active typing platforms. The callback's conversationID , userID , and platformIDs identify the conversation, user, and platforms on which the user is typing. ConversationManager can retain only one OnConversationListener . If the application handles other conversation events, implement their callbacks in the same listener. To query whether a specified user is currently typing, use Retrieve typing status /sdk/android/message/composing messages/get typing status ." }, { "path": "/sdk/android/message/composing-messages/get-typing-status", @@ -2829,7 +2829,7 @@ "description": "Use getInputState to retrieve a specified user’s current typing status in a conversation.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message composing-messages get-typing-status", - "content": "Query the platform IDs on which a specified user is currently typing. OpenIMClient.getInstance .conversationManager.getInputState new OnBase @Override public void onSuccess List platformIDs boolean typing = platformIDs = null && platformIDs.isEmpty ; updateTypingState conversationID, userID, typing ; @Override public void onError int code, String error recordTypingStatusQueryFailure code, error ; , conversationID, userID ; The success callback returns a list of platform IDs. An empty list means that the user is not currently typing on any platform. To receive typing status changes, use the callback described in Update typing status /sdk/android/message/composing messages/update typing status ." + "content": "Query the platform IDs on which a specified user is currently typing. OpenIMClient.getInstance .conversationManager.getInputState new OnBase @Override public void onSuccess List platformIDs boolean typing = platformIDs = null && platformIDs.isEmpty ; // typing indicates the user's current typing status. @Override public void onError int code, String error // code and error describe the failure. , conversationID, userID ; The success callback returns a list of platform IDs. An empty list means that the user is not currently typing on any platform. To receive typing status changes, use the callback described in Update typing status /sdk/android/message/composing messages/update typing status ." }, { "path": "/sdk/android/message/managing-messages/delete-local-message", @@ -2845,7 +2845,7 @@ "description": "Delete multiple messages from one conversation for the current account with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages delete-saved-messages", - "content": "Parameters | Parameter | Type | Required | Description | | | | | | | conversationID | String | Yes | ID of the conversation containing the messages to delete. | | clientMsgIDs | String | Yes | IDs of the messages to delete. Every ID in one batch must belong to the same conversation. | | isSync | boolean | Yes | Whether to synchronize the deletion to the current account's other clients. | DeleteMessagesReq request = new DeleteMessagesReq true, conversationID, selectedClientMsgIDs.toArray new String 0 ; messageManager.deleteMessages request, new OnBase @Override public void onSuccess String data // The deletion request has completed @Override public void onError int code, String error // Handle the failure ; With isSync set to false , the operation deletes the current device's copy and the current account's server side record. With true , it also requests deletion synchronization to the account's other clients. It does not delete copies held by other conversation members or display a revocation notice. The success callback means that the deletion request has completed. When synchronization is enabled, it does not mean that other clients have already received the event or updated their interfaces. When synchronization is enabled, other clients can receive the deleted message through OnAdvanceMsgListener.onMsgDeleted : @Override public void onMsgDeleted Message message handleDeletedMessage message ;" + "content": "Parameters | Parameter | Type | Required | Description | | | | | | | conversationID | String | Yes | ID of the conversation containing the messages to delete. | | clientMsgIDs | String | Yes | IDs of the messages to delete. Every ID in one batch must belong to the same conversation. | | isSync | boolean | Yes | Whether to synchronize the deletion to the current account's other clients. | DeleteMessagesReq request = new DeleteMessagesReq true, conversationID, selectedClientMsgIDs.toArray new String 0 ; messageManager.deleteMessages request, new OnBase @Override public void onSuccess String data // The deletion request has completed @Override public void onError int code, String error // Handle the failure ; With isSync set to false , the operation deletes the current device's copy and the current account's server side record. With true , it also requests deletion synchronization to the account's other clients. It does not delete copies held by other conversation members or display a revocation notice. The success callback means that the deletion request has completed. When synchronization is enabled, it does not mean that other clients have already received the event or updated their interfaces. When synchronization is enabled, other clients can receive the deleted message through OnAdvanceMsgListener.onMsgDeleted : @Override public void onMsgDeleted Message message // message is the deleted message." }, { "path": "/sdk/android/message/managing-messages/delete-user-messages", @@ -2853,7 +2853,7 @@ "description": "Delete every message sent by a specified user in a group chat with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages delete-user-messages", - "content": "messageManager.deleteUserAllMessagesInConv conversationID, targetUserID, new OnBase @Override public void onSuccess String data // The deletion request has completed @Override public void onError int code, String error // Handle the failure ; This API is available only for group chats and deletes every message sent by the specified user in the target group conversation. If the caller does not have permission, onError returns the error. Other clients receive the deletion notification through OnAdvanceMsgListener.onDeleteUserAllMsgsInConv . The callback includes the corresponding conversationID and userID : @Override public void onDeleteUserAllMsgsInConv DeleteUserAllMsgsListenerMsg event handleUserMessagesDeleted event.getConversationID , event.getUserID ;" + "content": "messageManager.deleteUserAllMessagesInConv conversationID, targetUserID, new OnBase @Override public void onSuccess String data // The deletion request has completed @Override public void onError int code, String error // Handle the failure ; This API is available only for group chats and deletes every message sent by the specified user in the target group conversation. If the caller does not have permission, onError returns the error. Other clients receive the deletion notification through OnAdvanceMsgListener.onDeleteUserAllMsgsInConv . The callback includes the corresponding conversationID and userID : @Override public void onDeleteUserAllMsgsInConv DeleteUserAllMsgsListenerMsg event // event identifies the affected conversation and user." }, { "path": "/sdk/android/message/managing-messages/revoke-a-message", @@ -2861,7 +2861,7 @@ "description": "Revoke a sent message and handle revocation notifications received by other clients.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages revoke-a-message", - "content": "Revoking a message causes other clients to display the original message in a revoked state. If the call fails, the error callback returns an error code and message. messageManager.revokeMessageV2 callback, conversationID, clientMsgID ; The success callback means that the revocation request completed. Other clients receive the revocation notification through OnAdvanceMsgListener.onRecvMessageRevokedV2 . RevokedInfo contains the clientMsgID , revoker, and revocation time: @Override public void onRecvMessageRevokedV2 RevokedInfo info handleRevokedMessage info ; Update the matching message to a revoked state instead of deleting it from the list. MessageManager can retain only one OnAdvanceMsgListener . If the application handles other message events, implement their callbacks in the same listener. See Events /sdk/android/events/overview events for setup." + "content": "Revoking a message causes other clients to display the original message in a revoked state. If the call fails, the error callback returns an error code and message. messageManager.revokeMessageV2 callback, conversationID, clientMsgID ; The success callback means that the revocation request completed. Other clients receive the revocation notification through OnAdvanceMsgListener.onRecvMessageRevokedV2 . RevokedInfo contains the clientMsgID , revoker, and revocation time: @Override public void onRecvMessageRevokedV2 RevokedInfo info // info identifies the revoked message. Update the matching message to a revoked state instead of deleting it from the list. MessageManager can retain only one OnAdvanceMsgListener . If the application handles other message events, implement their callbacks in the same listener. See Events /sdk/android/events/overview events for setup." }, { "path": "/sdk/android/message/managing-messages/modify-a-message", @@ -2869,7 +2869,7 @@ "description": "Modify supported message content and handle modification events received by other clients.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages modify-a-message", - "content": "Use modifyMessage to change an existing message in a conversation. Normally, start with the original message, change the supported content, and preserve its other fields. messageManager.modifyMessage callback, modifyRequest ; The success callback means that the modification request completed. After a message is modified, other clients receive the complete modified Message through OnAdvanceMsgListener.onMessageModified : @Override public void onMessageModified Message message handleModifiedMessage message ; MessageManager can retain only one OnAdvanceMsgListener . If the application handles other message events, implement their callbacks in the same listener. See Events /sdk/android/events/overview events for setup." + "content": "Use modifyMessage to change an existing message in a conversation. Normally, start with the original message, change the supported content, and preserve its other fields. messageManager.modifyMessage callback, modifyRequest ; The success callback means that the modification request completed. After a message is modified, other clients receive the complete modified Message through OnAdvanceMsgListener.onMessageModified : @Override public void onMessageModified Message message // message is the modified message. MessageManager can retain only one OnAdvanceMsgListener . If the application handles other message events, implement their callbacks in the same listener. See Events /sdk/android/events/overview events for setup." }, { "path": "/sdk/android/message/managing-messages/get-pinned-messages", @@ -2877,7 +2877,7 @@ "description": "Use getConversationPinnedMsgs to retrieve pinned messages in a conversation.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages get-pinned-messages", - "content": "The success callback returns the messages currently pinned in the specified conversation. messageManager.getConversationPinnedMsgs new OnBase @Override public void onSuccess List messages showPinned messages ; @Override public void onError int code, String error showPinnedError error ; , conversationID ;" + "content": "The success callback returns the messages currently pinned in the specified conversation. messageManager.getConversationPinnedMsgs new OnBase @Override public void onSuccess List messages / messages contains pinned messages. / @Override public void onError int code, String error / code and error describe the failure. / , conversationID ;" }, { "path": "/sdk/android/message/managing-messages/set-message-pinned", @@ -2885,7 +2885,7 @@ "description": "Change a conversation message’s pinned state and handle pinned-message change events.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-messages set-message-pinned", - "content": "Pass true as the final argument to pin the message or false to unpin it: messageManager.setConversationPinnedMsg callback, conversationID, clientMsgID, true ; The success callback means that the request completed; it does not mean that the pinned message event has arrived. When pinned messages change, OnAdvanceMsgListener.onChangedPinnedMsg returns the corresponding conversationID and current list of pinned messages: @Override public void onChangedPinnedMsg ChangedPinnedMsg event handlePinnedMessagesChanged event.getConversationID , event.getMsgs ; MessageManager can retain only one OnAdvanceMsgListener . If the application handles other message events, implement their callbacks in the same listener. See Events /sdk/android/events/overview events for setup. To retrieve the current pinned messages directly, use View pinned messages /sdk/android/message/managing messages/get pinned messages ." + "content": "Pass true as the final argument to pin the message or false to unpin it: messageManager.setConversationPinnedMsg callback, conversationID, clientMsgID, true ; The success callback means that the request completed; it does not mean that the pinned message event has arrived. When pinned messages change, OnAdvanceMsgListener.onChangedPinnedMsg returns the corresponding conversationID and current list of pinned messages: @Override public void onChangedPinnedMsg ChangedPinnedMsg event // event.getMsgs contains messages whose pinned state changed. MessageManager can retain only one OnAdvanceMsgListener . If the application handles other message events, implement their callbacks in the same listener. See Events /sdk/android/events/overview events for setup. To retrieve the current pinned messages directly, use View pinned messages /sdk/android/message/managing messages/get pinned messages ." }, { "path": "/sdk/android/message/managing-messages/insert-local-single-message", @@ -2933,7 +2933,7 @@ "description": "Report group-message read receipts with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-read-status send-group-read-receipts", - "content": "messageManager.sendGroupMessageReadReceipt conversationID, visibleClientMsgIDs, new OnBase @Override public void onSuccess String data // The read receipts have been reported @Override public void onError int code, String error // Handle the failure ; Every message in one batch must belong to the target group conversation. A successful callback means only that the server accepted the report; it does not mean that other client interfaces have already updated. The conversation unread count is maintained separately through markConversationMessageAsRead . Other clients receive group message read receipts through OnAdvanceMsgListener.onRecvGroupMessageReadReceipt : @Override public void onRecvGroupMessageReadReceipt GroupMessageReceipt receipt handleGroupMessageReadReceipt receipt ; To retrieve members who have or have not read a specific group message, use Get members who read a group message /sdk/android/message/managing read status/get group message readers ." + "content": "messageManager.sendGroupMessageReadReceipt conversationID, visibleClientMsgIDs, new OnBase @Override public void onSuccess String data // The read receipts have been reported @Override public void onError int code, String error // Handle the failure ; Every message in one batch must belong to the target group conversation. A successful callback means only that the server accepted the report; it does not mean that other client interfaces have already updated. The conversation unread count is maintained separately through markConversationMessageAsRead . Other clients receive group message read receipts through OnAdvanceMsgListener.onRecvGroupMessageReadReceipt : @Override public void onRecvGroupMessageReadReceipt GroupMessageReceipt receipt // receipt contains the group message read receipt. To retrieve members who have or have not read a specific group message, use Get members who read a group message /sdk/android/message/managing read status/get group message readers ." }, { "path": "/sdk/android/message/managing-read-status/get-group-message-readers", @@ -2941,7 +2941,7 @@ "description": "Retrieve members who have or have not read a group message using pagination.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android message managing-read-status get-group-message-readers", - "content": "Parameters | Parameter | Type | Required | Description | | | | | | | conversationID | String | Yes | ID of the group conversation. | | clientMsgID | String | Yes | ID of the message whose reader list to query. | | filter | int | Yes | Pass 0 for members who have read the message or 1 for members who have not read it. | | offset | int | Yes | Pagination offset. Pass 0 for the first page. | | count | int | Yes | Maximum number of members to retrieve. | messageManager.getGroupMessageReaderList conversationID, clientMsgID, 0, 0, 50, new OnBase @Override public void onSuccess List members renderMembers members ; @Override public void onError int code, String error // Handle the failure ; The success callback returns the current page of GroupMembersInfo objects. For field descriptions, see List group members /sdk/android/group/retrieving group members/get group member list . Continue paging when the complete list is required." + "content": "Parameters | Parameter | Type | Required | Description | | | | | | | conversationID | String | Yes | ID of the group conversation. | | clientMsgID | String | Yes | ID of the message whose reader list to query. | | filter | int | Yes | Pass 0 for members who have read the message or 1 for members who have not read it. | | offset | int | Yes | Pagination offset. Pass 0 for the first page. | | count | int | Yes | Maximum number of members to retrieve. | messageManager.getGroupMessageReaderList conversationID, clientMsgID, 0, 0, 50, new OnBase @Override public void onSuccess List members // members contains the profiles of members who read the message. @Override public void onError int code, String error // Handle the failure ; The success callback returns the current page of GroupMembersInfo objects. For field descriptions, see List group members /sdk/android/group/retrieving group members/get group member list . Continue paging when the complete list is required." }, { "path": "/sdk/android/file-uploads/upload-file", @@ -2949,7 +2949,7 @@ "description": "Upload a standalone file with the Android SDK and retrieve its remote resource URL.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android file-uploads upload-file", - "content": "uploadFile uploads a standalone file for uses such as a user avatar, group avatar, profile attachment, or other application resource. The upload does not belong to a message and does not automatically create a message or update a profile. Parameters | Parameter | Type | Required | Description | | | | | | | base | OnBase | Yes | Receives the final success or failure result for the upload request. | | listener | OnPutFileListener | Yes | Receives file, part, hash, and completion information for this task. | | putArgs.filepath | String | Yes | A local file path readable by the Android application. | | putArgs.name | String | Yes | The upload file name. PutArgs initially uses the supplied path; replace it with the original file name when appropriate. | | putArgs.cuase | String | No | An application defined upload reason. The spelling follows the Android SDK PutArgs declaration. | File file = new File localPath ; PutArgs args = new PutArgs file.getAbsolutePath ; args.name = file.getName ; args.cuase = \"user avatar\"; OpenIMClient.getInstance .uploadFile new OnBase @Override public void onSuccess String result finishUploadRequest result ; @Override public void onError int code, String error showUploadError code, error ; , new OnPutFileListener @Override public void open long size initializeUpload uploadTaskID, size ; @Override public void uploadID String id bindSdkUploadID uploadTaskID, id ; @Override public void uploadComplete long fileSize, long streamSize, long storageSize recordUploadSizes uploadTaskID, fileSize, streamSize, storageSize ; @Override public void complete long size, String url, long type completeUpload uploadTaskID, size, url, type ; , args ; Callbacks OnPutFileListener provides the following callbacks and parameters: | Callback | Parameters | Description | | | | | | open | size | Opens a file of the given size; use it to initialize the task. | | partSize | partSize , num | The size of each part and the total number of parts. | | hashPartProgress | index , size , partHash | The part index, size, and hash after a part is hashed. | | hashPartComplete | partsHash , fileHash | The combined part hash and final file hash after all parts are hashed. | | uploadID | uploadID | The upload identifier generated by the SDK. | | uploadPartComplete | index , partSize , partHash | The part index, size, and hash when a part upload completes. | | uploadComplete | fileSize , streamSize , storageSize | File size, stream size, and storage size for the completed file upload stage. | | complete | size , url , type | The final file size, remote URL, and resource type after the upload completes. | The URL returned by complete can be used later to update an avatar, store an attachment address, or create a URL based media message. Upload success only means that the resource was written remotely; profile updates, message creation, and message sending remain separate API calls." + "content": "uploadFile uploads a standalone file for uses such as a user avatar, group avatar, profile attachment, or other application resource. The upload does not belong to a message and does not automatically create a message or update a profile. Parameters | Parameter | Type | Required | Description | | | | | | | base | OnBase | Yes | Receives the final success or failure result for the upload request. | | listener | OnPutFileListener | Yes | Receives file, part, hash, and completion information for this task. | | putArgs.filepath | String | Yes | A local file path readable by the Android application. | | putArgs.name | String | Yes | The upload file name. PutArgs initially uses the supplied path; replace it with the original file name when appropriate. | | putArgs.cuase | String | No | An application defined upload reason. The spelling follows the Android SDK PutArgs declaration. | File file = new File localPath ; PutArgs args = new PutArgs file.getAbsolutePath ; args.name = file.getName ; args.cuase = \"user avatar\"; OpenIMClient.getInstance .uploadFile new OnBase @Override public void onSuccess String result // result is the final upload request result. @Override public void onError int code, String error // code and error describe the failure. , new OnPutFileListener @Override public void open long size // size is the size of the file to upload. @Override public void uploadID String id // id is the upload identifier generated by the SDK. @Override public void uploadComplete long fileSize, long streamSize, long storageSize // File, stream, and storage sizes are now available. @Override public void complete long size, String url, long type // url is the remote URL of the uploaded resource. , args ; Callbacks OnPutFileListener provides the following callbacks and parameters: | Callback | Parameters | Description | | | | | | open | size | Opens a file of the given size; use it to initialize the task. | | partSize | partSize , num | The size of each part and the total number of parts. | | hashPartProgress | index , size , partHash | The part index, size, and hash after a part is hashed. | | hashPartComplete | partsHash , fileHash | The combined part hash and final file hash after all parts are hashed. | | uploadID | uploadID | The upload identifier generated by the SDK. | | uploadPartComplete | index , partSize , partHash | The part index, size, and hash when a part upload completes. | | uploadComplete | fileSize , streamSize , storageSize | File size, stream size, and storage size for the completed file upload stage. | | complete | size , url , type | The final file size, remote URL, and resource type after the upload completes. | The URL returned by complete can be used later to update an avatar, store an attachment address, or create a URL based media message. Upload success only means that the resource was written remotely; profile updates, message creation, and message sending remain separate API calls." }, { "path": "/sdk/android/calling/overview-calling", @@ -2965,7 +2965,7 @@ "description": "Start a one-to-one audio or video call with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls start-single-call", - "content": "signalingInvite starts a one to one call. The Android SDK handles call signaling; your application must connect a real time audio/video engine with the returned room credentials. Parameters Call signature: signalingInvite OnBase callback, SignalingInfo info All fields below belong to info ; dot notation represents nested objects. Only parameters shared by the Android and WASM SDKs are listed. | Parameter | Type | Required | Description | | | | | | | invitation | SignalingInvitationInfo | Yes | The call invitation. | | invitation.inviterUserID | String | Yes | The inviter; pass the current signed in user ID. | | invitation.inviteeUserIDList | List | Yes | The invitees; for a one to one call, include only the other user. | | invitation.groupID | String | Yes | Group ID. Pass an empty string for a one to one call. | | invitation.roomID | String | Yes | The call's unique room identifier and the primary key for subsequent state. | | invitation.timeout | long | Yes | Invitation timeout in seconds. | | invitation.mediaType | String | Yes | The application defined media type, typically audio or video . | | invitation.sessionType | int | Yes | Use ConversationType.SINGLE CHAT for one to one calls and ConversationType.SUPER GROUP CHAT for group calls. | | invitation.platformID | int | Yes | The current client platform; pass Platform.ANDROID . | | invitation.customData | String | No | Application extra data carried with the invitation. | | invitation.initiateTime | long | No | The invitation start time. It is normally maintained by the signaling flow and does not need to be set manually. | | offlinePushInfo | OfflinePushInfo | No | Push content used when the invitee is offline. | | offlinePushInfo.title | String | Conditionally required | Push title; required when offlinePushInfo is provided. | | offlinePushInfo.desc | String | Conditionally required | Push body; required when offlinePushInfo is provided. | | offlinePushInfo.ex | String | Conditionally required | Push extension string; pass an empty string when there is no content. | | offlinePushInfo.iOSPushSound | String | Conditionally required | iOS push sound; required when offlinePushInfo is provided. | | offlinePushInfo.iOSBadgeCount | boolean | Conditionally required | Whether to update the iOS badge; required when offlinePushInfo is provided. | SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList Collections.singletonList peerUserID ; invitation.setGroupID \"\" ; invitation.setRoomID roomID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.SINGLE CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"contact card\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInvite new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCallError code, error ; , info ; The success callback returns SignalingCertificate . roomID identifies the media room, token is a short lived join credential, liveURL is the media service address, and busyLineUserIDList contains busy users. Connect the media engine only after receiving a valid token and roomID . API success does not mean the invitee accepted; merge subsequent state through Handle call events /sdk/android/calling/managing calls/handle call events ." + "content": "signalingInvite starts a one to one call. The Android SDK handles call signaling; your application must connect a real time audio/video engine with the returned room credentials. Parameters Call signature: signalingInvite OnBase callback, SignalingInfo info All fields below belong to info ; dot notation represents nested objects. Only parameters shared by the Android and WASM SDKs are listed. | Parameter | Type | Required | Description | | | | | | | invitation | SignalingInvitationInfo | Yes | The call invitation. | | invitation.inviterUserID | String | Yes | The inviter; pass the current signed in user ID. | | invitation.inviteeUserIDList | List | Yes | The invitees; for a one to one call, include only the other user. | | invitation.groupID | String | Yes | Group ID. Pass an empty string for a one to one call. | | invitation.roomID | String | Yes | The call's unique room identifier and the primary key for subsequent state. | | invitation.timeout | long | Yes | Invitation timeout in seconds. | | invitation.mediaType | String | Yes | The application defined media type, typically audio or video . | | invitation.sessionType | int | Yes | Use ConversationType.SINGLE CHAT for one to one calls and ConversationType.SUPER GROUP CHAT for group calls. | | invitation.platformID | int | Yes | The current client platform; pass Platform.ANDROID . | | invitation.customData | String | No | Application extra data carried with the invitation. | | invitation.initiateTime | long | No | The invitation start time. It is normally maintained by the signaling flow and does not need to be set manually. | | offlinePushInfo | OfflinePushInfo | No | Push content used when the invitee is offline. | | offlinePushInfo.title | String | Conditionally required | Push title; required when offlinePushInfo is provided. | | offlinePushInfo.desc | String | Conditionally required | Push body; required when offlinePushInfo is provided. | | offlinePushInfo.ex | String | Conditionally required | Push extension string; pass an empty string when there is no content. | | offlinePushInfo.iOSPushSound | String | Conditionally required | iOS push sound; required when offlinePushInfo is provided. | | offlinePushInfo.iOSBadgeCount | boolean | Conditionally required | Whether to update the iOS badge; required when offlinePushInfo is provided. | SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList Collections.singletonList peerUserID ; invitation.setGroupID \"\" ; invitation.setRoomID roomID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.SINGLE CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"contact card\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInvite new OnBase @Override public void onSuccess SignalingCertificate credentials // credentials provides the roomID, token, and liveURL for joining a media room. @Override public void onError int code, String error // code and error describe the failure. , info ; The success callback returns SignalingCertificate . roomID identifies the media room, token is a short lived join credential, liveURL is the media service address, and busyLineUserIDList contains busy users. Connect the media engine only after receiving a valid token and roomID . API success does not mean the invitee accepted; merge subsequent state through Handle call events /sdk/android/calling/managing calls/handle call events ." }, { "path": "/sdk/android/calling/managing-calls/start-group-call", @@ -2973,7 +2973,7 @@ "description": "Start a group audio or video call with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls start-group-call", - "content": "signalingInviteInGroup starts a group call and uses the same parameter types as Start a one to one call /sdk/android/calling/managing calls/start single call . For group calls, invitation.groupID must contain the group ID and invitation.sessionType is always ConversationType.GROUP CHAT . Only members in inviteeUserIDList are invited; setting groupID does not invite every group member automatically. Exclude the current user, empty IDs, and duplicates from the list. This example uses the group ID as the room ID; if you generate a separate roomID , every participant must use the same value. SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList selectedGroupMemberIDs ; invitation.setGroupID groupID ; invitation.setRoomID groupID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.GROUP CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"group call\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInviteInGroup new OnBase @Override public void onSuccess SignalingCertificate credentials startGroupCall credentials ; @Override public void onError int code, String error showCallError code, error ; , info ; The success callback returns SignalingCertificate . roomID is the media room ID, token is the short lived credential for joining it, liveURL is the media service address, and busyLineUserIDList lists busy users. Busy users do not prevent invitations to the remaining members, and a successful callback does not mean that any member has accepted. Connect to the media room only after obtaining a valid token and roomID . A successful API call does not mean the invitees have accepted; merge subsequent state through Handle call events /sdk/android/calling/managing calls/handle call events ." + "content": "signalingInviteInGroup starts a group call and uses the same parameter types as Start a one to one call /sdk/android/calling/managing calls/start single call . For group calls, invitation.groupID must contain the group ID and invitation.sessionType is always ConversationType.GROUP CHAT . Only members in inviteeUserIDList are invited; setting groupID does not invite every group member automatically. Exclude the current user, empty IDs, and duplicates from the list. This example uses the group ID as the room ID; if you generate a separate roomID , every participant must use the same value. SignalingInvitationInfo invitation = new SignalingInvitationInfo ; invitation.setInviterUserID currentUserID ; invitation.setInviteeUserIDList selectedGroupMemberIDs ; invitation.setGroupID groupID ; invitation.setRoomID groupID ; invitation.setTimeout 30 ; invitation.setMediaType \"video\" ; invitation.setSessionType ConversationType.GROUP CHAT ; invitation.setPlatformID Platform.ANDROID ; invitation.setCustomData \" \\\"source\\\":\\\"group call\\\" \" ; SignalingInfo info = new SignalingInfo ; info.setInvitation invitation ; info.setOfflinePushInfo offlinePushInfo ; OpenIMClient.getInstance .signalingManager.signalingInviteInGroup new OnBase @Override public void onSuccess SignalingCertificate credentials // credentials contains the media room credentials. @Override public void onError int code, String error // code and error describe the failure. , info ; The success callback returns SignalingCertificate . roomID is the media room ID, token is the short lived credential for joining it, liveURL is the media service address, and busyLineUserIDList lists busy users. Busy users do not prevent invitations to the remaining members, and a successful callback does not mean that any member has accepted. Connect to the media room only after obtaining a valid token and roomID . A successful API call does not mean the invitees have accepted; merge subsequent state through Handle call events /sdk/android/calling/managing calls/handle call events ." }, { "path": "/sdk/android/calling/managing-calls/accept-call", @@ -2981,7 +2981,7 @@ "description": "Accept a call invitation with the Android SDK and retrieve room credentials.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls accept-call", - "content": "After receiving the original SignalingInfo from onReceiveNewInvitation , pass it to signalingAccept : OpenIMClient.getInstance .signalingManager.signalingAccept new OnBase @Override public void onSuccess SignalingCertificate credentials joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showAcceptError code, error ; , receivedInfo ; Preserve the original roomID , inviter, invitees, and session type in receivedInfo . Do not rebuild it as an object that contains only roomID . The success callback returns SignalingCertificate . Connect to the media room only after obtaining a valid token and roomID . A successful API call only confirms that the accept request was submitted to the server; it does not mean the call is established. Continue listening for call events /sdk/android/calling/managing calls/handle call events and update the call UI and state based on events from the inviter, other devices, or room participants." + "content": "After receiving the original SignalingInfo from onReceiveNewInvitation , pass it to signalingAccept : OpenIMClient.getInstance .signalingManager.signalingAccept new OnBase @Override public void onSuccess SignalingCertificate credentials // credentials provides the roomID, token, and liveURL for joining a media room. @Override public void onError int code, String error // code and error describe the failure. , receivedInfo ; Preserve the original roomID , inviter, invitees, and session type in receivedInfo . Do not rebuild it as an object that contains only roomID . The success callback returns SignalingCertificate . Connect to the media room only after obtaining a valid token and roomID . A successful API call only confirms that the accept request was submitted to the server; it does not mean the call is established. Continue listening for call events /sdk/android/calling/managing calls/handle call events and update the call UI and state based on events from the inviter, other devices, or room participants." }, { "path": "/sdk/android/calling/managing-calls/reject-call", @@ -2989,7 +2989,7 @@ "description": "Reject a call invitation with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls reject-call", - "content": "When the user declines an incoming call, pass the original SignalingInfo to signalingReject : OpenIMClient.getInstance .signalingManager.signalingReject new OnBase @Override public void onSuccess String result closeIncomingCallUI ; @Override public void onError int code, String error showRejectError code, error ; , signalingInfo ; The success callback only means that the reject signaling request completed. The inviter later updates its interface through onInviteeRejected ; see Handle call events /sdk/android/calling/managing calls/handle call events ." + "content": "When the user declines an incoming call, pass the original SignalingInfo to signalingReject : OpenIMClient.getInstance .signalingManager.signalingReject new OnBase @Override public void onSuccess String result // The reject signaling request completed. @Override public void onError int code, String error // code and error describe the failure. , signalingInfo ; The success callback only means that the reject signaling request completed. The inviter later updates its interface through onInviteeRejected ; see Handle call events /sdk/android/calling/managing calls/handle call events ." }, { "path": "/sdk/android/calling/managing-calls/cancel-call", @@ -2997,7 +2997,7 @@ "description": "Cancel a call invitation before it is accepted with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls cancel-call", - "content": "Before an invitation is accepted, the inviter can call signalingCancel : OpenIMClient.getInstance .signalingManager.signalingCancel new OnBase @Override public void onSuccess String result stopWaitingForAnswer activeInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showCancelError code, error ; , activeInfo ; Pass the complete SignalingInfo saved when the call was started, not a new object containing only roomID . A successful callback means that the cancel signaling request completed; the application should also end the local pending answer state and release unused media resources. Remote clients update through onInvitationCancelled ." + "content": "Before an invitation is accepted, the inviter can call signalingCancel : OpenIMClient.getInstance .signalingManager.signalingCancel new OnBase @Override public void onSuccess String result // The signaling request completed. @Override public void onError int code, String error // code and error describe the failure. , activeInfo ; Pass the complete SignalingInfo saved when the call was started, not a new object containing only roomID . A successful callback means that the cancel signaling request completed; the application should also end the local pending answer state and release unused media resources. Remote clients update through onInvitationCancelled ." }, { "path": "/sdk/android/calling/managing-calls/hang-up-call", @@ -3005,7 +3005,7 @@ "description": "Hang up an established call with the Android SDK.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls hang-up-call", - "content": "After a call is established, any participant can call signalingHungUp to hang up. Pass the complete SignalingInfo saved for the active call; its roomID must match the active media room. OpenIMClient.getInstance .signalingManager.signalingHungUp new OnBase @Override public void onSuccess String result releaseCallResources signalingInfo.getInvitation .getRoomID ; @Override public void onError int code, String error showHangUpError code, error ; , signalingInfo ; The success callback only confirms that the hang up signaling request completed; it does not release local resources automatically. Close the call UI, stop local capture, disconnect from the media room, and release the camera and microphone." + "content": "After a call is established, any participant can call signalingHungUp to hang up. Pass the complete SignalingInfo saved for the active call; its roomID must match the active media room. OpenIMClient.getInstance .signalingManager.signalingHungUp new OnBase @Override public void onSuccess String result // The signaling request completed. @Override public void onError int code, String error // code and error describe the failure. , signalingInfo ; The success callback only confirms that the hang up signaling request completed; it does not release local resources automatically. Close the call UI, stop local capture, disconnect from the media room, and release the camera and microphone." }, { "path": "/sdk/android/calling/managing-calls/handle-call-events", @@ -3013,7 +3013,7 @@ "description": "Register Android SDK invitation, participant, and media-stream callbacks in one call listener.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling managing-calls handle-call-events", - "content": "Register OnSignalingListener once in your application's call state manager. The SDK uses these callbacks to notify your app about incoming invitations, acceptances, rejections, cancellations, timeouts, hang ups, and participants joining or leaving a room. Use them to update the call UI and local call state. SignalingManager retains only one listener: calling setSignalingListener again replaces the previous listener. When signing out or switching accounts, first stop updating the old account's call state, then set the listener for the new account. OpenIMClient.getInstance .signalingManager.setSignalingListener new OnSignalingListener @Override public void onReceiveNewInvitation SignalingInfo info showIncomingCall info ; @Override public void onInviteeAccepted SignalingInfo info updateCallStatus info, \"accepted\" ; @Override public void onInviteeRejected SignalingInfo info updateCallStatus info, \"rejected\" ; @Override public void onInvitationCancelled SignalingInfo info endCall info ; @Override public void onInvitationTimeout SignalingInfo info endCall info ; @Override public void onInviteeAcceptedByOtherDevice SignalingInfo info endCall info ; @Override public void onInviteeRejectedByOtherDevice SignalingInfo info endCall info ; @Override public void onHangup SignalingInfo info endCall info ; @Override public void onRoomParticipantConnected RoomCallingInfo room updateParticipantStatus room, true ; @Override public void onRoomParticipantDisconnected RoomCallingInfo room updateParticipantStatus room, false ; @Override public void onStreamChange String streamInfo handleStreamChange streamInfo ; ; | Callback | When it is called | What your app should do | | | | | | onReceiveNewInvitation | A new call invitation arrives. | Save the SignalingInfo , show the incoming call UI, and let the user accept or reject it. | | onInviteeAccepted , onInviteeRejected | An invitee accepts or rejects. | Update that member's call status. In a group call, do not affect the other members. | | onInvitationCancelled , onInvitationTimeout , onHangup | An invitation is cancelled or times out, or either party hangs up. | Close the matching call UI, disconnect from the media room, and release local resources. | | onInviteeAcceptedByOtherDevice , onInviteeRejectedByOtherDevice | Another device signed in to the same account accepts or rejects. | End the incoming call UI on this device so that two devices do not handle the same invitation. | | onRoomParticipantConnected , onRoomParticipantDisconnected | A member joins or leaves the media room. | Update the member's status in a group call. | | onStreamChange | The server sends media stream change information. | Parse the string according to your server integration, then update the media stream. |" + "content": "Register OnSignalingListener once in your application's call state manager. The SDK uses these callbacks to notify your app about incoming invitations, acceptances, rejections, cancellations, timeouts, hang ups, and participants joining or leaving a room. Use them to update the call UI and local call state. SignalingManager retains only one listener: calling setSignalingListener again replaces the previous listener. When signing out or switching accounts, first stop updating the old account's call state, then set the listener for the new account. OpenIMClient.getInstance .signalingManager.setSignalingListener new OnSignalingListener @Override public void onReceiveNewInvitation SignalingInfo info // info contains the incoming call invitation. @Override public void onInviteeAccepted SignalingInfo info // info indicates that the call was accepted. @Override public void onInviteeRejected SignalingInfo info // info indicates that the call was rejected. @Override public void onInvitationCancelled SignalingInfo info // info indicates that the invitation was cancelled. @Override public void onInvitationTimeout SignalingInfo info // info indicates that the invitation timed out. @Override public void onInviteeAcceptedByOtherDevice SignalingInfo info // info indicates that another device accepted the call. @Override public void onInviteeRejectedByOtherDevice SignalingInfo info // info indicates that another device rejected the call. @Override public void onHangup SignalingInfo info // info indicates that the call ended. @Override public void onRoomParticipantConnected RoomCallingInfo room // room contains the participant that joined. @Override public void onRoomParticipantDisconnected RoomCallingInfo room // room contains the participant that left. @Override public void onStreamChange String streamInfo // streamInfo describes the media stream change. ; | Callback | When it is called | What your app should do | | | | | | onReceiveNewInvitation | A new call invitation arrives. | Save the SignalingInfo , show the incoming call UI, and let the user accept or reject it. | | onInviteeAccepted , onInviteeRejected | An invitee accepts or rejects. | Update that member's call status. In a group call, do not affect the other members. | | onInvitationCancelled , onInvitationTimeout , onHangup | An invitation is cancelled or times out, or either party hangs up. | Close the matching call UI, disconnect from the media room, and release local resources. | | onInviteeAcceptedByOtherDevice , onInviteeRejectedByOtherDevice | Another device signed in to the same account accepts or rejects. | End the incoming call UI on this device so that two devices do not handle the same invitation. | | onRoomParticipantConnected , onRoomParticipantDisconnected | A member joins or leaves the media room. | Update the member's status in a group call. | | onStreamChange | The server sends media stream change information. | Parse the string according to your server integration, then update the media stream. |" }, { "path": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", @@ -3021,7 +3021,7 @@ "description": "Restore a call invitation that was received before the Android application started or resumed.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling retrieving-call-information restore-pending-invitation", - "content": "Use getSignalingInvitationInfoStartApp to retrieve an unhandled call invitation when the application starts or resumes. OpenIMClient.getInstance .signalingManager.getSignalingInvitationInfoStartApp new OnBase @Override public void onSuccess SignalingInfo info if info = null && info.getInvitation = null && info.getInvitation .getRoomID = null && info.getInvitation .getRoomID .isEmpty restoreIncomingCall info ; @Override public void onError int code, String error clearExpiredIncomingCall ; ; The success callback returns an invitation snapshot at the time of the call; it does not connect the call. Continue handling cancellation, timeout, and acceptance of the call invitation yourself." + "content": "Use getSignalingInvitationInfoStartApp to retrieve an unhandled call invitation when the application starts or resumes. OpenIMClient.getInstance .signalingManager.getSignalingInvitationInfoStartApp new OnBase @Override public void onSuccess SignalingInfo info // Validate the invitation and roomID in info before using it. @Override public void onError int code, String error // code and error describe why the query failed. ; The success callback returns an invitation snapshot at the time of the call; it does not connect the call. Continue handling cancellation, timeout, and acceptance of the call invitation yourself." }, { "path": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", @@ -3029,7 +3029,7 @@ "description": "Use the Android SDK to retrieve an active call room by group ID.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling retrieving-call-information get-room-by-group-id", - "content": "signalingGetRoomByGroupID takes a group ID, not roomID , even when the call uses a custom roomID . OpenIMClient.getInstance .signalingManager.signalingGetRoomByGroupID new OnBase @Override public void onSuccess RoomCallingInfo room if room.getRoomID = null && room.getRoomID .isEmpty renderParticipants room.getParticipant ; @Override public void onError int code, String error showNoActiveGroupCall ; , groupID ; The success callback returns a RoomCallingInfo snapshot containing the room ID, original invitation, participants, group ID, token, and connection address. If there is no active call in the group, the API can return an error or an empty room. Clear locally saved call state and room credentials, and do not attempt to join the old room." + "content": "signalingGetRoomByGroupID takes a group ID, not roomID , even when the call uses a custom roomID . OpenIMClient.getInstance .signalingManager.signalingGetRoomByGroupID new OnBase @Override public void onSuccess RoomCallingInfo room // room contains a snapshot of the room, invitation, and current participants. @Override public void onError int code, String error // code and error describe why the query failed. , groupID ; The success callback returns a RoomCallingInfo snapshot containing the room ID, original invitation, participants, group ID, token, and connection address. When a successful result has no valid roomID , no usable room information was returned. The code and error in an error callback only describe the query failure; they do not establish that the group has no active call." }, { "path": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", @@ -3037,7 +3037,7 @@ "description": "Use the Android SDK to retrieve fresh join credentials for a known room ID.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling retrieving-call-information get-token-by-room-id", - "content": "When you know the roomID but need new join credentials, call signalingGetTokenByRoomID . OpenIMClient.getInstance .signalingManager.signalingGetTokenByRoomID new OnBase @Override public void onSuccess SignalingCertificate credentials if credentials.getToken = null && credentials.getRoomID = null joinMediaRoom credentials.getRoomID , credentials.getToken , credentials.getLiveURL ; @Override public void onError int code, String error showCredentialError code, error ; , roomID ; The success callback returns SignalingCertificate , which provides the token and liveURL required to join the audio/video room. A room token is a short lived sensitive credential. Keep it in memory and do not write it to logs, URLs, analytics events, or persistent storage." + "content": "When you know the roomID but need new join credentials, call signalingGetTokenByRoomID . OpenIMClient.getInstance .signalingManager.signalingGetTokenByRoomID new OnBase @Override public void onSuccess SignalingCertificate credentials // credentials provides the roomID, token, and liveURL for joining a media room. @Override public void onError int code, String error // code and error describe the failure. , roomID ; The success callback returns SignalingCertificate , which provides the token and liveURL required to join the audio/video room. A room token is a short lived sensitive credential. Keep it in memory and do not write it to logs, URLs, analytics events, or persistent storage." }, { "path": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", @@ -3045,7 +3045,7 @@ "description": "Send and receive custom signaling data in an Android SDK call room.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android calling sending-custom-signals send-a-custom-signal", - "content": "Use signalingSendCustomSignal to send small pieces of call related application information to a call room, such as a raised hand action, layout hint, or temporary state update. It is not suitable for chat content, large data, or files. Send a signal Both roomID and customInfo are required strings. Define a stable schema and serialize structured data as JSON. JSONObject signal = new JSONObject ; signal.put \"version\", 1 ; signal.put \"eventID\", eventID ; signal.put \"type\", \"hand raised\" ; signal.put \"userID\", currentUserID ; signal.put \"sentAt\", System.currentTimeMillis ; OpenIMClient.getInstance .signalingManager.signalingSendCustomSignal new OnBase @Override public void onSuccess String result markSignalSent eventID ; @Override public void onError int code, String error showSignalError code, error ; , roomID, signal.toString ; The success callback only confirms that the send request completed; it does not mean that other participants received or processed the signal. Include a protocol version and a unique eventID in customInfo so receivers can identify duplicate messages. Do not include large files, chat history, long lived state, or sensitive credentials. Receive a signal When a custom signal arrives, OnSignalingListener.onReceiveCustomSignal receives CustomSignalingInfo . Confirm that it belongs to the active room and validate its format before updating the UI. @Override public void onReceiveCustomSignal CustomSignalingInfo info if info == null || activeRoomID.equals info.getRoomID return; CallSignal signal = parseAndValidateCallSignal info.getCustomInfo ; String mergeID = info.getRoomID + \":\" + signal.getEventID ; if hasAppliedSignal mergeID return; applyCallSignal signal ; If your application needs to avoid duplicate processing, include a unique event ID in the custom signal and record processed events on the receiving side. Messages may not arrive in send order, so do not rely on arrival order to determine application state. Register onReceiveCustomSignal together with the other call callbacks in the listener shown in Handle call events /sdk/android/calling/managing calls/handle call events . SignalingManager retains only one listener; registering another one replaces the existing call callbacks. Do not grant host, payment, or privacy permissions based only on custom client signals. Store and validate these trusted states on your backend; after reconnecting, restore long lived state from a room query or your backend." + "content": "Use signalingSendCustomSignal to send small pieces of call related application information to a call room, such as a raised hand action, layout hint, or temporary state update. It is not suitable for chat content, large data, or files. Send a signal Both roomID and customInfo are required strings. Define a stable schema and serialize structured data as JSON. JSONObject signal = new JSONObject ; signal.put \"version\", 1 ; signal.put \"eventID\", eventID ; signal.put \"type\", \"hand raised\" ; signal.put \"userID\", currentUserID ; signal.put \"sentAt\", System.currentTimeMillis ; OpenIMClient.getInstance .signalingManager.signalingSendCustomSignal new OnBase @Override public void onSuccess String result // The signaling request completed. @Override public void onError int code, String error // code and error describe the failure. , roomID, signal.toString ; The success callback only confirms that the send request completed; it does not mean that other participants received or processed the signal. Include a protocol version and a unique eventID in customInfo so receivers can identify duplicate messages. Do not include large files, chat history, long lived state, or sensitive credentials. Receive a signal When a custom signal arrives, OnSignalingListener.onReceiveCustomSignal receives CustomSignalingInfo . Confirm that it belongs to the active room and validate its format before updating the UI. @Override public void onReceiveCustomSignal CustomSignalingInfo info // Check info.getRoomID , then parse info.getCustomInfo using your application protocol. If your application needs to avoid duplicate processing, include a unique event ID in the custom signal and record processed events on the receiving side. Messages may not arrive in send order, so do not rely on arrival order to determine application state. Register onReceiveCustomSignal together with the other call callbacks in the listener shown in Handle call events /sdk/android/calling/managing calls/handle call events . SignalingManager retains only one listener; registering another one replaces the existing call callbacks. Do not grant host, payment, or privacy permissions based only on custom client signals. Store and validate these trusted states on your backend; after reconnecting, restore long lived state from a room query or your backend." }, { "path": "/sdk/android/events/overview-events", @@ -3061,7 +3061,7 @@ "description": "Configure Android SDK logging, write application logs, and upload logs.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android logger", - "content": "OpenIM Android SDK logs help diagnose initialization, connection, and business API problems. Development and staging builds can use more detailed output. Production builds should reduce log volume and must avoid recording tokens, complete message bodies, raw file URLs, call room credentials, and private user fields. Configure logging during initialization Configure logging when calling initSDK : File dataDirectory = new File application.getFilesDir , \"openim\" ; File logDirectory = new File application.getFilesDir , \"openim logs\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn; config.isLogStandardOutput = BuildConfig.DEBUG; config.logFilePath = logDirectory.getAbsolutePath ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; | Field | Description | | | | | logLevel | Controls verbosity with a LogLevel constant. Available values include DebugWithSQL , Debug , Info , Warn , Error , Panic , and Fatal . | | isLogStandardOutput | Writes SDK logs to Android standard output when enabled; use it for development diagnostics. | | logFilePath | Optional log directory. Keep it within application writable storage and manage its size and retention. | Use Debug for ordinary development diagnostics. Enable DebugWithSQL temporarily and only when diagnosing database problems. Production builds normally use Warn or Error and disable unnecessary standard output. Write application logs Use logs to write application logs to the SDK log: OpenIMClient.getInstance .logs LogLevel.Error, ChatRepository.class.getSimpleName , 184, \"send message failed\", errorMessage, \"conversationID\", conversationID, \"clientMsgID\", clientMsgID ; currentClassName and currentLineNum identify the call site. msgStr is a short action description, and errStr is the error information. Warn , Error , Panic , and Fatal require a non empty error string. Pass trailing extra values as key value pairs and include only non sensitive identifiers needed for diagnosis. The older logs overload with OnBase and Map parameters is deprecated and should not be used in new code. Upload logs Use uploadLogs to upload client logs to the server, primarily when a user actively submits diagnostic logs. String cancelID = UUID.randomUUID .toString ; OpenIMClient.getInstance .uploadLogs new OnBase @Override public void onSuccess String data showLogUploadCompleted ; @Override public void onError int code, String error showLogUploadError code, error ; , new ArrayList< , 2000, // line cancelID, \"support ticket 42\", // ex new UploadLogProgress @Override public void onProgress long current, long total updateLogUploadProgress current, total ; ; | Parameter | Description | | | | | params | Legacy parameter that the current SDK does not use. Pass an empty list, such as new ArrayList< . | | line | Number of log lines configured for this upload. | | cancelID | Stable identifier for this upload, such as an application generated UUID. | | ex | Diagnostic context attached to the task, such as a support ticket ID. It must not contain credentials or private data. | | UploadLogProgress | Reports current progress and total work for the upload interface. | The success callback means that the log upload request completed. Use operationID to locate an SDK call Public methods in the OpenIM Android SDK do not accept operationID . Each SDK call generates an operationID automatically. operationID identifies only one SDK call; it is not a user identity, permission credential, business idempotency key, or business ID. When investigating a problem, find the operationID near the failed or unexpected call in the client SDK logs. It identifies the related log records for that SDK call. When providing logs to support, also include the time of the issue, user ID, action name, and any relevant conversationID , clientMsgID , groupID , or roomID to help locate the records. Related pages Implement for the Android environment /sdk/android/getting started/environment specific implementation Authenticate and manage a session /sdk/android/getting started/authenticate and manage session Send a message /sdk/android/message/sending messages/send message" + "content": "OpenIM Android SDK logs help diagnose initialization, connection, and business API problems. Development and staging builds can use more detailed output. Production builds should reduce log volume and must avoid recording tokens, complete message bodies, raw file URLs, call room credentials, and private user fields. Configure logging during initialization Configure logging when calling initSDK : File dataDirectory = new File application.getFilesDir , \"openim\" ; File logDirectory = new File application.getFilesDir , \"openim logs\" ; InitConfig config = new InitConfig apiAddr, wsAddr, dataDirectory.getAbsolutePath ; config.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn; config.isLogStandardOutput = BuildConfig.DEBUG; config.logFilePath = logDirectory.getAbsolutePath ; boolean initialized = OpenIMClient.getInstance .initSDK application, config, connectionListener ; | Field | Description | | | | | logLevel | Controls verbosity with a LogLevel constant. Available values include DebugWithSQL , Debug , Info , Warn , Error , Panic , and Fatal . | | isLogStandardOutput | Writes SDK logs to Android standard output when enabled; use it for development diagnostics. | | logFilePath | Optional log directory. Keep it within application writable storage and manage its size and retention. | Use Debug for ordinary development diagnostics. Enable DebugWithSQL temporarily and only when diagnosing database problems. Production builds normally use Warn or Error and disable unnecessary standard output. Write application logs Use logs to write application logs to the SDK log: OpenIMClient.getInstance .logs LogLevel.Error, ChatRepository.class.getSimpleName , 184, \"send message failed\", errorMessage, \"conversationID\", conversationID, \"clientMsgID\", clientMsgID ; currentClassName and currentLineNum identify the call site. msgStr is a short action description, and errStr is the error information. Warn , Error , Panic , and Fatal require a non empty error string. Pass trailing extra values as key value pairs and include only non sensitive identifiers needed for diagnosis. The older logs overload with OnBase and Map parameters is deprecated and should not be used in new code. Upload logs Use uploadLogs to upload client logs to the server, primarily when a user actively submits diagnostic logs. String cancelID = UUID.randomUUID .toString ; OpenIMClient.getInstance .uploadLogs new OnBase @Override public void onSuccess String data // The log upload request completed. @Override public void onError int code, String error // code and error describe the failure. , new ArrayList< , 2000, // line cancelID, \"support ticket 42\", // ex new UploadLogProgress @Override public void onProgress long current, long total // current and total indicate upload progress. ; | Parameter | Description | | | | | params | Legacy parameter that the current SDK does not use. Pass an empty list, such as new ArrayList< . | | line | Number of log lines configured for this upload. | | cancelID | Stable identifier for this upload, such as an application generated UUID. | | ex | Diagnostic context attached to the task, such as a support ticket ID. It must not contain credentials or private data. | | UploadLogProgress | Reports current progress and total work for the upload interface. | The success callback means that the log upload request completed. Use operationID to locate an SDK call Public methods in the OpenIM Android SDK do not accept operationID . Each SDK call generates an operationID automatically. operationID identifies only one SDK call; it is not a user identity, permission credential, business idempotency key, or business ID. When investigating a problem, find the operationID near the failed or unexpected call in the client SDK logs. It identifies the related log records for that SDK call. When providing logs to support, also include the time of the issue, user ID, action name, and any relevant conversationID , clientMsgID , groupID , or roomID to help locate the records. Related pages Implement for the Android environment /sdk/android/getting started/environment specific implementation Authenticate and manage a session /sdk/android/getting started/authenticate and manage session Send a message /sdk/android/message/sending messages/send message" }, { "path": "/sdk/flutter/overview", From 21036155853d1ec4ed1bee8f95d224ac97fd215b Mon Sep 17 00:00:00 2001 From: chan <1499188352@qq.com> Date: Thu, 20 Aug 2026 12:23:26 +0800 Subject: [PATCH 12/12] chore(docs): include Android in native SDK structure sync - Add Android SDK source metadata to the structure synchronizer. - Include Android in the default structure sync command and tests. - Update the architecture documentation for Android content synchronization. --- docs/ARCHITECTURE.md | 2 +- package.json | 2 +- scripts/__tests__/sync-client-sdk-structure.test.mjs | 6 +++++- scripts/sync-client-sdk-structure.mjs | 12 ++++++++++-- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 9b60d47aae..48ac20df72 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -81,7 +81,7 @@ Docker 与普通 Node.js 环境使用 Next.js `standalone` 输出,`scripts/pre `pnpm content:sync` 依次: -1. 从已审核的中文 SDK MDX 构建 WASM、iOS 和 Flutter 中文运行时数据。 +1. 从已审核的中文 SDK MDX 构建 WASM、Android、iOS 和 Flutter 中文运行时数据。 2. 重建中英文搜索索引。 该命令不会自动修改路由和导航。结构性调整必须显式维护 `routes.json`、`navigation.json` 和审核数据;需要刷新 frontmatter 元数据时,运行 `pnpm content:metadata` 并审查 diff。`pnpm structure:report` 会先执行该元数据同步,确保报告中的发布状态与正文一致。 diff --git a/package.json b/package.json index 6c2f78b478..631a3fd882 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "sdk:zh:check": "node scripts/check-localized-sdk-content.mjs", "sdk:native:zh": "node scripts/build-client-sdk-zh-content.mjs android ios flutter", "sdk:native:zh:check": "node scripts/check-localized-sdk-content.mjs android ios flutter", - "sdk:native:structure:sync": "node scripts/sync-client-sdk-structure.mjs ios flutter", + "sdk:native:structure:sync": "node scripts/sync-client-sdk-structure.mjs android ios flutter", "sdk:native:routes:sync": "node scripts/sync-client-sdk-route-skeletons.mjs android ios flutter && node scripts/sync-content-metadata.mjs", "structure:sync": "node scripts/import-structure.mjs", "structure:report": "pnpm content:metadata && node scripts/structure-report.mjs && prettier --write docs/STRUCTURE_REPORT.md", diff --git a/scripts/__tests__/sync-client-sdk-structure.test.mjs b/scripts/__tests__/sync-client-sdk-structure.test.mjs index d1c9df5307..89c17ab96d 100644 --- a/scripts/__tests__/sync-client-sdk-structure.test.mjs +++ b/scripts/__tests__/sync-client-sdk-structure.test.mjs @@ -15,7 +15,7 @@ const wasmLabels = readJson('data/structure/wasm-navigation-labels.json'); test('mirrors every supported WASM path for native SDKs', () => { const wasmPaths = getClientSdkSidebarPaths(wasmSidebar); - for (const platform of ['ios', 'flutter']) { + for (const platform of ['android', 'ios', 'flutter']) { const mirrored = mirrorClientSdkSidebar(wasmSidebar, platform); const omitted = getOmittedClientSdkPaths(wasmSidebar, platform); assert.equal(mirrored.sidebarExpansion, wasmSidebar.sidebarExpansion); @@ -74,6 +74,10 @@ test('retains routes removed from the sidebar as historical omitted records', () }); test('uses current WASM vocabulary with a platform-specific overview label', () => { + const androidLabels = buildClientSdkNavigationLabels(wasmLabels, 'android'); + assert.equal(androidLabels['OpenIM SDK for WASM'], undefined); + assert.equal(androidLabels['OpenIM SDK for Android'], 'OpenIM Android SDK 概览'); + const labels = buildClientSdkNavigationLabels(wasmLabels, 'flutter'); assert.equal(labels['OpenIM SDK for WASM'], undefined); assert.equal(labels['OpenIM SDK for Flutter'], 'OpenIM Flutter SDK 概览'); diff --git a/scripts/sync-client-sdk-structure.mjs b/scripts/sync-client-sdk-structure.mjs index cc7b675b95..b028e58d56 100644 --- a/scripts/sync-client-sdk-structure.mjs +++ b/scripts/sync-client-sdk-structure.mjs @@ -8,6 +8,12 @@ import { getClientSdkSidebarPaths } from './lib/client-sdk-sidebar.mjs'; const root = process.cwd(); const sourceContracts = { + android: { + sdkKey: 'androidSdk', + sdkRepository: 'https://github.com/openimsdk/open-im-sdk-android-enterprise', + sdkTag: 'v3.8.4.0', + sdkCommit: 'f82b142c7d3b4b66ce20586adabc69de9cd61673', + }, ios: { sdkKey: 'iosSdk', sdkRepository: 'https://github.com/openimsdk/open-im-sdk-ios', @@ -28,6 +34,7 @@ const openimDocs = { }; const omittedSuffixesByPlatform = { + android: new Set(), flutter: new Set(), ios: new Set(), }; @@ -155,7 +162,8 @@ function toOmittedAuditPage({ page, path, platformId, docsSource, sdkSource, his } export function buildClientSdkNavigationLabels(wasmLabels, platformId) { - const displayName = platformId === 'ios' ? 'iOS' : 'Flutter'; + const displayName = + platformId === 'ios' ? 'iOS' : platformId === 'android' ? 'Android' : 'Flutter'; const labels = { ...wasmLabels }; delete labels['OpenIM SDK for WASM']; labels[`OpenIM SDK for ${displayName}`] = `OpenIM ${displayName} SDK 概览`; @@ -184,7 +192,7 @@ export function buildClientSdkNavigationLabels(wasmLabels, platformId) { async function main() { const requested = process.argv.slice(2).filter((value) => !value.startsWith('-')); - const platformIds = requested.length > 0 ? requested : ['ios', 'flutter']; + const platformIds = requested.length > 0 ? requested : ['android', 'ios', 'flutter']; const [wasmSidebar, wasmLabels] = await Promise.all([ readJson('data/structure/wasm-sidebar.json'), readJson('data/structure/wasm-navigation-labels.json'),