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..b057a03176 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx @@ -0,0 +1,35 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/accept-call' +--- + +After receiving the original `SignalingInfo` from `onReceiveNewInvitation`, pass it to `signalingAccept()`: + +```java +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. 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..cb20fc06dd --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx @@ -0,0 +1,33 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/cancel-call' +--- + +Before an invitation is accepted, the inviter can call `signalingCancel()`: + +```java +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`. 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..9bbff00310 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx @@ -0,0 +1,86 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/handle-call-events' +--- + +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) { + // 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. | 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..f45e7e4d8d --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx @@ -0,0 +1,33 @@ +--- +title: 'Hang up a call' +description: 'Hang up an established call 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/calling/managing-calls/hang-up-call' +--- + +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) { + // 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. 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..3ab7676e5b --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx @@ -0,0 +1,33 @@ +--- +title: 'Reject a call' +description: 'Reject a call invitation 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/calling/managing-calls/reject-call' +--- + +When the user declines an incoming call, pass the original `SignalingInfo` to `signalingReject()`: + +```java +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). 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..2df5982d7d --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx @@ -0,0 +1,52 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/start-group-call' +--- + +`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(); +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). 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..b2fc68df1f --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx @@ -0,0 +1,80 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/start-single-call' +--- + +`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: + +```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(); +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). 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..e0dc94ef3f --- /dev/null +++ b/content/docs/chat/sdk/android/calling/overview-calling.mdx @@ -0,0 +1,53 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/overview-calling' +--- + +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) | 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..e1446175d0 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx @@ -0,0 +1,35 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/retrieving-call-information/get-room-by-group-id' +--- + +`signalingGetRoomByGroupID()` takes a group ID, not `roomID`, even when the call uses a custom `roomID`. + +```java +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. 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..bfb730d17a --- /dev/null +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx @@ -0,0 +1,35 @@ +--- +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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/retrieving-call-information/get-token-by-room-id' +--- + +When you know the `roomID` but need new join credentials, call `signalingGetTokenByRoomID()`. + +```java +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. 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..e89a6159ce --- /dev/null +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx @@ -0,0 +1,32 @@ +--- +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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/retrieving-call-information/restore-pending-invitation' +--- + +Use `getSignalingInvitationInfoStartApp()` to retrieve an unhandled call invitation when the application starts or resumes. + +```java +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. 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..5679711cb1 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx @@ -0,0 +1,62 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/sending-custom-signals/send-a-custom-signal' +--- + +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. + +```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) { + // 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. + +```java +@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. 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..80a6016489 --- /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 a 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' +--- + +`messageManager.clearConversationAndDeleteAllMsg()` clears the messages in a conversation while keeping its entry. + +```java +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`. 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..bd6af0269d --- /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 a group mention state for a 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/clear-group-mentions' +--- + +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( + 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. 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..d552948c84 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx @@ -0,0 +1,33 @@ +--- +title: 'Delete a conversation and its messages' +description: 'Use deleteConversationAndDeleteAllMsg() to delete a 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' +--- + +`deleteConversationAndDeleteAllMsg()` deletes a conversation and all of its messages. + +```java +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. 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..347f21b0ac --- /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 signed-in 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 total unread count for the signed-in account. + +```java +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. 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..a71f2ab8b3 --- /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 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) { + // 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. 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..ab5071a438 --- /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 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' +--- + +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( + 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. 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..de9a148456 --- /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 a 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) { + // 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. 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..ef25b0c797 --- /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 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) { + // 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. 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..fc4af7e8a1 --- /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 a 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) { + // 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`. 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..2e1fb2845c --- /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 a 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 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( + 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. 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..e9cc7d7cbd --- /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 a 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) { + // 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. 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..95d4a315f7 --- /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 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) { + // 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. 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..a67ca96cbc --- /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 a 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) { + // 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. 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..2c5d94c955 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/overview-conversation.mdx @@ -0,0 +1,72 @@ +--- +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-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` 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. 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..d8bb2c3628 --- /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 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' +--- + +`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( + 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`. 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..fe40e343cd --- /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 a 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' +--- + +`getConversationIDBySessionType()` returns a `conversationID` from the chat target `sourceId` and conversation type `sessionType`. + +```java +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. 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..4d7ae4394d --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx @@ -0,0 +1,33 @@ +--- +title: 'Get conversations by ID' +description: 'Use getMultipleConversation() to retrieve 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()` to retrieve multiple conversations by `conversationIDs`. `conversationIDs` is the list of conversation IDs to query. + +```java +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`. 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..c21e08842f --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx @@ -0,0 +1,65 @@ +--- +title: 'Get the conversation list' +description: 'Use getConversationListSplit() to retrieve the signed-in 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. + +## Retrieve a page + +```java +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: + +```java +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. 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..74bdf7b2e5 --- /dev/null +++ b/content/docs/chat/sdk/android/events/overview-events.mdx @@ -0,0 +1,117 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +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. 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. + +```java +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: + +```java +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. 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..0f982276b8 --- /dev/null +++ b/content/docs/chat/sdk/android/file-uploads/upload-file.mdx @@ -0,0 +1,84 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/file-uploads/upload-file' +--- + +`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. | + +```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) { + // 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. 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..b1f2156e59 --- /dev/null +++ b/content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx @@ -0,0 +1,189 @@ +--- +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() { + // 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 + +```java +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 + +```java +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 + +```java +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: + +```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..2047842058 --- /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: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: + +```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..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 @@ -1,18 +1,110 @@ --- 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'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) 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..fd6083dc82 --- /dev/null +++ b/content/docs/chat/sdk/android/group/change-group-mute.mdx @@ -0,0 +1,21 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/change-group-mute' +--- + +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). + +```java +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); +``` 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..7a78473783 --- /dev/null +++ b/content/docs/chat/sdk/android/group/create-group.mdx @@ -0,0 +1,28 @@ +--- +title: '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: 'published' +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`, including the new group's `groupID`. + +```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) { /* 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 new file mode 100644 index 0000000000..5c20442b0d --- /dev/null +++ b/content/docs/chat/sdk/android/group/dismiss-group.mdx @@ -0,0 +1,23 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/dismiss-group' +--- + +`dismissGroup()` dismisses the specified group and is available only to its owner. + +```java +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. 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..3b125342ad --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx @@ -0,0 +1,23 @@ +--- +title: '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: 'published' +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 current user must have permission to approve the application. + +```java +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). 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 new file mode 100644 index 0000000000..5fa230d153 --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/delete-group-requests.mdx @@ -0,0 +1,29 @@ +--- +title: 'Delete group applications' +description: 'Use deleteGroupRequests to delete specified group application records in a batch.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/delete-group-requests' +--- + +`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. + +```java +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()`. 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..77d88a11b1 --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx @@ -0,0 +1,25 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-applicant' +--- + +Configure pagination and filters in `GetGroupApplicationListAsApplicantReq`, then call `getSendGroupApplicationList()`. + +```java +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`. 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..8913e2670c --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx @@ -0,0 +1,23 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-recipient' +--- + +Pass `GetGroupApplicationListAsRecipientReq` to set pagination and filters. You can set `offset`, `count`, `groupIDs`, and `handleResults`. + +```java +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); +``` 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..9b7a7e7d02 --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx @@ -0,0 +1,23 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/refuse-group-application' +--- + +The reject operation also takes the application's `groupID`, the applicant's `userID`, and a handling message. + +```java +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. 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..cfc924d017 --- /dev/null +++ b/content/docs/chat/sdk/android/group/join-group.mdx @@ -0,0 +1,23 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/join-group' +--- + +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. + +```java +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. 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..45784625c4 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx @@ -0,0 +1,21 @@ +--- +title: '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: 'published' +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 mute-all setting](/sdk/android/group/change-group-mute). + +```java +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); +``` 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..a9a434bb4b --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx @@ -0,0 +1,21 @@ +--- +title: '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: 'published' +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. 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() { + @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 new file mode 100644 index 0000000000..75594b113e --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx @@ -0,0 +1,23 @@ +--- +title: 'Remove group members' +description: 'Use kickGroupMember to remove specified members from a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +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. + +```java +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`. 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..64a32d60ab --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx @@ -0,0 +1,28 @@ +--- +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: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-avatar' +--- + +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. + +```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) { /* 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`. 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..2010f86800 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx @@ -0,0 +1,26 @@ +--- +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: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-extension' +--- + +The `SetGroupMemberInfo.ex` string stores extra group member information and can contain a JSON string with additional member information. + +```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) { /* 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 new file mode 100644 index 0000000000..640b46230e --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx @@ -0,0 +1,28 @@ +--- +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: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-nickname' +--- + +All group member profile changes use `setGroupMemberInfo()`. Set the `groupID`, `userID`, and `nickname` in the request. + +```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) { /* 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). 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..bc85b9135b --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx @@ -0,0 +1,28 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-role-level' +--- + +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). + +```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) { /* 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`. 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..6c760180bf --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx @@ -0,0 +1,23 @@ +--- +title: 'Transfer group ownership' +description: 'Use transferGroupOwner to transfer group ownership to a specified member.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/transfer-group-owner' +--- + +`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. + +```java +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. 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..a91af52aa7 --- /dev/null +++ b/content/docs/chat/sdk/android/group/overview-group.mdx @@ -0,0 +1,105 @@ +--- +title: 'Group overview' +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-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/overview-group' +--- + +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: + +```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 new file mode 100644 index 0000000000..ac751d0e2d --- /dev/null +++ b/content/docs/chat/sdk/android/group/quit-group.mdx @@ -0,0 +1,23 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/quit-group' +--- + +`quitGroup()` only removes the current signed-in user. It does not dismiss the group or remove other members. + +```java +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. 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..ccc5c15bb4 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx @@ -0,0 +1,22 @@ +--- +title: 'Get group members' +description: 'Use getGroupMemberList to retrieve group members by role and page.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-list' +--- + +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. + +```java +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); +``` 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..f831753cbc --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx @@ -0,0 +1,24 @@ +--- +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: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin' +--- + +Use `getGroupMemberOwnerAndAdmin()` when you need to display or check members with management roles. + +```java +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`. 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..a9e4d79a54 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx @@ -0,0 +1,22 @@ +--- +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: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/get-specified-group-members-info' +--- + +`getGroupMembersInfo()` accepts one `groupID` and a list of target user IDs. It returns the users' `GroupMembersInfo` profiles within that group. + +```java +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); +``` 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..318acae5c0 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx @@ -0,0 +1,23 @@ +--- +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: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/get-users-in-group' +--- + +`getUsersInGroup()` returns the IDs among the supplied candidates that currently belong to the specified group. It does not return member profiles. + +```java +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. 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..9f3138c6e3 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx @@ -0,0 +1,24 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/search-group-members' +--- + +Provide a keyword list, switches for user ID and group nickname matching, and pagination parameters. + +```java +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. 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..0bf9762fca --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx @@ -0,0 +1,23 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-groups/get-joined-group-list-page' +--- + +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>() { + @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`. 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..790133dd69 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx @@ -0,0 +1,21 @@ +--- +title: 'Get group information' +description: 'Use getGroupsInfo to retrieve the latest profiles for specified groups.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-groups/get-specified-groups-info' +--- + +The `groupIDs` parameter of `getGroupsInfo()` is the list of group IDs to query. The method returns a list of `GroupInfo` objects. + +```java +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); +``` 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..551b32aea2 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx @@ -0,0 +1,21 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-groups/is-join-group' +--- + +`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() { + @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 new file mode 100644 index 0000000000..4f0b47e6e0 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx @@ -0,0 +1,23 @@ +--- +title: 'Search groups' +description: 'Use searchGroups to search locally available groups by group ID or name.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-groups/search-groups' +--- + +`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. + +```java +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. 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..b6ece380fc --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-announcement.mdx @@ -0,0 +1,27 @@ +--- +title: 'Publish a group announcement' +description: 'Publish or update a group announcement through GroupInfo.notification.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-announcement' +--- + +Create a `GroupInfo` containing the `groupID` and `notification`, then call `setGroupInfo()`. + +```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) { /* 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. 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..88a5baac90 --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-extension.mdx @@ -0,0 +1,25 @@ +--- +title: 'Set group extra data' +description: 'Store application-defined group data in GroupInfo.ex.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +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. Submitting a new value replaces the previous content. + +```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) { /* 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 new file mode 100644 index 0000000000..bab2deac1f --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-join-verification.mdx @@ -0,0 +1,27 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-join-verification' +--- + +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`. + +```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) { /* 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. 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..1778db16f9 --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx @@ -0,0 +1,25 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-member-friend-permission' +--- + +`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. + +```java +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. */ } +}); +``` 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..3d85875a97 --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx @@ -0,0 +1,27 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-member-profile-access' +--- + +`lookMemberInfo` is an integer switch: `0` disables access and `1` enables it. Submit only the `groupID` and this permission field when changing the setting. + +```java +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. 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..b81a530b27 --- /dev/null +++ b/content/docs/chat/sdk/android/group/update-group-profile.mdx @@ -0,0 +1,28 @@ +--- +title: '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: 'published' +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 contains the `groupID` and the fields being changed. Submit only the fields for the current update. + +```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) { /* 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. diff --git a/content/docs/chat/sdk/android/logger.mdx b/content/docs/chat/sdk/android/logger.mdx index 71d8632250..ee847ce5ac 100644 --- a/content/docs/chat/sdk/android/logger.mdx +++ b/content/docs/chat/sdk/android/logger.mdx @@ -1,18 +1,120 @@ --- -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 logs, 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 + +Configure logging when calling `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 logs + +Use `logs()` to write application logs to the SDK log: + +```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 logs + +Use `uploadLogs()` to upload client logs to the server, primarily when a user actively submits diagnostic logs. + +```java +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) 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..1017150980 --- /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-17' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/composing-messages/get-typing-status' +--- + +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(); + // 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). 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..350e84de9e --- /dev/null +++ b/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx @@ -0,0 +1,60 @@ +--- +title: 'Update typing status' +description: 'Report the current conversation typing state with the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-17' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/composing-messages/update-typing-status' +--- + +Set `focus` to `true` when typing starts. Set it to `false` when typing ends, the input field loses focus, or the conversation screen closes. + +```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) { + // code and error describe why the report failed. + } + }, + conversationID, + true +); +``` + +Clear the state promptly when typing ends: + +```java +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: + +```java +@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). 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..46a14a3b8d --- /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) +); +``` + +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 new file mode 100644 index 0000000000..6bbbf011e0 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx @@ -0,0 +1,18 @@ +--- +title: 'Create a contact card message' +description: 'Use createCardMessage to create a contact card message.' +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-card-message' +--- + +`CardElem` stores the display profile for the user represented by the card. + +```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 new file mode 100644 index 0000000000..a3e337a2e2 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create a custom message' +description: 'Use createCustomMessage to carry application-defined JSON content.' +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-custom-message' +--- + +Your application defines `data`, `extension`, and `description`. Receiving clients must parse them according to the same application protocol. + +```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 new file mode 100644 index 0000000000..0283423238 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx @@ -0,0 +1,18 @@ +--- +title: 'Create an emoji message' +description: 'Use createFaceMessage to create a custom emoji message.' +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-face-message' +--- + +`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-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..247642e42a --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx @@ -0,0 +1,19 @@ +--- +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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-file' +--- + +```java +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. 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..0009ae6dc1 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx @@ -0,0 +1,18 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-url' +--- + +`FileElem` should contain the remote URL, file name, and file size. + +```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 new file mode 100644 index 0000000000..4f3094d8d8 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx @@ -0,0 +1,18 @@ +--- +title: 'Create a forwarded message' +description: 'Use createForwardMessage to create a forwarded copy of a message.' +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-forward-message' +--- + +Pass the source `Message`. The returned message must still be delivered to the target conversation through a send API. + +```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 new file mode 100644 index 0000000000..c7aef18986 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx @@ -0,0 +1,19 @@ +--- +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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-file' +--- + +```java +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. 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..d021cddb3d --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx @@ -0,0 +1,19 @@ +--- +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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-url' +--- + +Prepare the original, large, and thumbnail `PictureInfo` values before creating the message. + +```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 new file mode 100644 index 0000000000..91ecdcb675 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx @@ -0,0 +1,19 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-location-message' +--- + +Use decimal degrees for latitude and longitude. The description is displayed in a map view or message list. + +```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 new file mode 100644 index 0000000000..9b8ce0b139 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx @@ -0,0 +1,19 @@ +--- +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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-merger-message' +--- + +Pass the message list, title, and summary list. + +```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 new file mode 100644 index 0000000000..00980f1c3a --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create a reply message' +description: 'Use createQuoteMessage to reply while quoting an existing message.' +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-quote-message' +--- + +A quote message stores the complete quoted `Message`. + +```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 new file mode 100644 index 0000000000..838d8707db --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx @@ -0,0 +1,19 @@ +--- +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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-file' +--- + +```java +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. 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..eec46a25b8 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx @@ -0,0 +1,18 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-url' +--- + +`createSoundMessageByURL()` accepts a `SoundElem` that already contains the remote URL, duration, and file size. + +```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 new file mode 100644 index 0000000000..0277086122 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx @@ -0,0 +1,19 @@ +--- +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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-text-at-message' +--- + +Pass the text, mentioned user IDs, the `AtUserInfo` list, and an optional quoted message. + +```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 new file mode 100644 index 0000000000..94cd4f20ab --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx @@ -0,0 +1,18 @@ +--- +title: 'Create a text message' +description: 'Use createTextMessage to create a text Message.' +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-text-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/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..d75a82d83c --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx @@ -0,0 +1,23 @@ +--- +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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-file' +--- + +```java +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. 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..b3383c24e6 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx @@ -0,0 +1,18 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-url' +--- + +Populate `VideoElem` with the remote video and thumbnail information, then create the message. + +```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 new file mode 100644 index 0000000000..8ba10115dd --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx @@ -0,0 +1,18 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/clear-all-local-messages' +--- + +This operation only clears the current device's local cache. It does not delete server records. + +```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 new file mode 100644 index 0000000000..b9b3dff3e5 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx @@ -0,0 +1,18 @@ +--- +title: 'Clear all saved messages' +description: 'Use deleteAllMsgFromLocalAndSvr to clear local and server-side messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/clear-all-messages' +--- + +This is a high-impact operation. Ask for confirmation before calling it, then clear the local conversation display after it completes. + +```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 new file mode 100644 index 0000000000..1056e39c5c --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx @@ -0,0 +1,18 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/delete-local-message' +--- + +This operation does not affect message records on other devices or for other users. + +```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 new file mode 100644 index 0000000000..a6c66032b8 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx @@ -0,0 +1,53 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-17' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/delete-saved-messages' +--- + +## 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. | + +```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. + +When synchronization is enabled, other clients can receive the deleted message through `OnAdvanceMsgListener.onMsgDeleted`: + +```java +@Override +public void onMsgDeleted(Message 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 new file mode 100644 index 0000000000..a2249c6591 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx @@ -0,0 +1,41 @@ +--- +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-17' +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. 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`: + +```java +@Override +public void onDeleteUserAllMsgsInConv(DeleteUserAllMsgsListenerMsg event) { + // 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 new file mode 100644 index 0000000000..217a1ad77a --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx @@ -0,0 +1,21 @@ +--- +title: 'View pinned messages' +description: 'Use getConversationPinnedMsgs to retrieve pinned messages in a conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-17' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/get-pinned-messages' +--- + +The success callback returns the messages currently pinned in the specified conversation. + +```java +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); +``` 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..9a286488a3 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx @@ -0,0 +1,18 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/insert-local-group-message' +--- + +Pass the group ID and sender ID. The message is not synchronized to other devices. + +```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 new file mode 100644 index 0000000000..4ce57cedd2 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx @@ -0,0 +1,18 @@ +--- +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: 'published' +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` 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 new file mode 100644 index 0000000000..030e50312e --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx @@ -0,0 +1,31 @@ +--- +title: '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: 'published' +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. 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. + +After a message is modified, other clients receive the complete modified `Message` through `OnAdvanceMsgListener.onMessageModified`: + +```java +@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. 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..5a23139796 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx @@ -0,0 +1,31 @@ +--- +title: '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: 'published' +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. 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 revocation request completed. Other clients receive the revocation notification through `OnAdvanceMsgListener.onRecvMessageRevokedV2`. + +`RevokedInfo` contains the `clientMsgID`, revoker, and revocation time: + +```java +@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. 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..ddd254244d --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx @@ -0,0 +1,18 @@ +--- +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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/set-message-local-ex' +--- + +`localEx` is suitable for local information such as a download path or playback state. It is not synchronized to other users. + +```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 new file mode 100644 index 0000000000..1092150c6b --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx @@ -0,0 +1,36 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-17' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/set-message-pinned' +--- + +Pass `true` as the final argument to pin the message or `false` to unpin it: + +```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. + +When pinned messages change, `OnAdvanceMsgListener.onChangedPinnedMsg` returns the corresponding `conversationID` and current list of pinned messages: + +```java +@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). 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..0ca2f465cc --- /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-17' +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) { + // 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. 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..6399741753 --- /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-17' +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 group-message read receipts through `OnAdvanceMsgListener.onRecvGroupMessageReadReceipt`: + +```java +@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). diff --git a/content/docs/chat/sdk/android/message/overview-message.mdx b/content/docs/chat/sdk/android/message/overview-message.mdx index 66a452f77f..a91558fa41 100644 --- a/content/docs/chat/sdk/android/message/overview-message.mdx +++ b/content/docs/chat/sdk/android/message/overview-message.mdx @@ -1,18 +1,148 @@ --- -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' --- - +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 +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. 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..eaba350577 --- /dev/null +++ b/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx @@ -0,0 +1,20 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/receiving-messages/receive-custom-business-messages' +--- + +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) { /* 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 new file mode 100644 index 0000000000..18bb9381a9 --- /dev/null +++ b/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx @@ -0,0 +1,21 @@ +--- +title: 'Receive messages' +description: 'Use OnAdvanceMsgListener to receive new, offline, and online-only messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +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 messages. + +```java +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. */ } +}); +``` 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..25527d29a1 --- /dev/null +++ b/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx @@ -0,0 +1,21 @@ +--- +title: 'Find messages by ID' +description: 'Use findMessageList to retrieve message records with SearchParams.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +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. + +```java +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); +``` 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..38da1d3b69 --- /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-17' +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(); + // 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). 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..a5825c8d54 --- /dev/null +++ b/content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx @@ -0,0 +1,18 @@ +--- +title: 'Load newer messages' +description: 'Use getAdvancedHistoryMessageListReverse to load messages after a starting point.' +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-newer-messages' +--- + +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. + +```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 new file mode 100644 index 0000000000..fbd73af2c6 --- /dev/null +++ b/content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx @@ -0,0 +1,18 @@ +--- +title: 'Load older messages' +description: 'Use getAdvancedHistoryMessageList to load conversation history by page.' +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-older-messages' +--- + +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`. + +```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 new file mode 100644 index 0000000000..e781838770 --- /dev/null +++ b/content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx @@ -0,0 +1,19 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/searching-messages/search-messages' +--- + +Search by conversation, keywords, senders, message types, time range, and pagination parameters. Pass `null` for `conversationID` to search across all local conversations. + +```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 new file mode 100644 index 0000000000..96c9639a0d --- /dev/null +++ b/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx @@ -0,0 +1,18 @@ +--- +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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/sending-messages/send-message-not-oss' +--- + +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 new file mode 100644 index 0000000000..76bc9e15a9 --- /dev/null +++ b/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx @@ -0,0 +1,21 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/sending-messages/send-message' +--- + +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() { + @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 new file mode 100644 index 0000000000..68aa02ed59 --- /dev/null +++ b/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx @@ -0,0 +1,22 @@ +--- +title: '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: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/sending-messages/set-msg-send-progress-listener' +--- + +Use `OnMsgSendCallback.onProgress()` to receive progress updates for the current message. + +```java +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); +``` 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..97e888f616 --- /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) { + // 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`: + +```java +@Override +public void onBlacklistAdded(BlacklistInfo 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 new file mode 100644 index 0000000000..af0ef12bc4 --- /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. + +## 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) { + // 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). 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..3431e0543a --- /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) { + // 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`: + +```java +@Override +public void onBlacklistDeleted(BlacklistInfo user) { + // 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 new file mode 100644 index 0000000000..ae27e28403 --- /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) { + // 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. 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..3c2bb621c7 --- /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) { + // 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). 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..5db03cf6b1 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx @@ -0,0 +1,72 @@ +--- +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) { + // 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`: + +```java +@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). 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..83a79cd241 --- /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) { + // 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). 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..9e2f35456c --- /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) { + // 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. 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..d60fc6b8b1 --- /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) { + // 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. 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..64d3fe4ad9 --- /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) { + // 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). 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..5a73ec7122 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx @@ -0,0 +1,69 @@ +--- +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) { + // 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`: + +```java +@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. +} +``` 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..3749d3407d --- /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) { + // 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. 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..fe4900cb82 --- /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) { + // 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. 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..95e464df36 --- /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) { + // 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). 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..4af6f0c892 --- /dev/null +++ b/content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx @@ -0,0 +1,30 @@ +--- +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-18' +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) { + // 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`. 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..d7625e4900 --- /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-18' +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) { + // 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: + +```java +@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). 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..3e3ffd3307 --- /dev/null +++ b/content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx @@ -0,0 +1,37 @@ +--- +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-18' +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) { + // 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. 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 0cfecbbd0d..2545b4ffc7 100644 --- a/content/docs/chat/sdk/android/user/overview-user.mdx +++ b/content/docs/chat/sdk/android/user/overview-user.mdx @@ -1,18 +1,63 @@ --- -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 current-user profiles, public user profiles, account settings, 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-19' version: 'v4' platform: 'android' sourcePath: '/sdk/android/user/overview-user' --- - +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: + +```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). +- 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). 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..fac0a79ef4 --- /dev/null +++ b/content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx @@ -0,0 +1,42 @@ +--- +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-18' +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) { + // 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. | 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..5c54f53e93 --- /dev/null +++ b/content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx @@ -0,0 +1,75 @@ +--- +title: 'Get specified user profiles' +description: 'Retrieve public user profiles in batches by userID using PublicUserInfo.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-19' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/user-profile/get-users-info' +--- + +`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"); + +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) 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 new file mode 100644 index 0000000000..dd8f7d6c6d --- /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-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/user-profile/set-global-message-reception' +--- + +Use `UserInfoReq` to set `globalRecvMsgOpt`. + +```java +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. 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..34680bc7e0 --- /dev/null +++ b/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx @@ -0,0 +1,60 @@ +--- +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-18' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/user-profile/set-self-info' +--- + +Set only the fields that must change on `UserInfoReq`. + +```java +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: + +```java +@Override +public void onSelfInfoUpdated(UserInfo info) { + // Handle the current user's profile change. +} +``` 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..5b9627bfce --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx @@ -0,0 +1,28 @@ +--- +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) { + // 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),根据邀请方、其他设备或房间参与者返回的事件更新通话界面和状态。 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..3a1bb193e3 --- /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) { + // 信令操作已完成。 + } + + @Override + public void onError(int code, String error) { + // 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..f38367a353 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx @@ -0,0 +1,79 @@ +--- +title: '处理通话事件' +description: '集中设置 Android SDK 的通话邀请、参与者和媒体流 listener。' +sourcePath: '/sdk/android/calling/managing-calls/handle-call-events' +--- + +在应用的通话状态管理处注册一次 `OnSignalingListener`。SDK 通过这些回调通知来电、接听、拒绝、取消、超时、挂断以及成员进出房间;应用据此更新通话界面和本地通话状态。 + +`SignalingManager` 同时只保留一个 listener,重复调用 `setSignalingListener()` 会替换之前的 listener。退出登录或切换账号时,先停止更新旧账号的通话状态,再为新账号设置 listener。 + +```java +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` | 服务端发送媒体流变化信息。 | 按接入服务端实际约定解析字符串,再更新媒体流。 | 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..717d26082b --- /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) { + // 信令操作已完成。 + } + + @Override + public void onError(int code, String 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 new file mode 100644 index 0000000000..39d902dd4b --- /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) { + // 拒绝信令请求已完成。 + } + + @Override + public void onError(int code, String error) { + // code 和 error 说明失败原因。 + } + }, + signalingInfo +); +``` + +成功回调只表示拒绝信令请求完成。发起端随后通过 `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..c1ed966cf9 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx @@ -0,0 +1,45 @@ +--- +title: '发起群聊通话' +description: '使用 Android SDK 发起群聊音视频通话。' +sourcePath: '/sdk/android/calling/managing-calls/start-group-call' +--- + +`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(); +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)。 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..21aae71ce3 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx @@ -0,0 +1,73 @@ +--- +title: '发起单聊通话' +description: '使用 Android SDK 发起单聊音视频通话。' +sourcePath: '/sdk/android/calling/managing-calls/start-single-call' +--- + +`signalingInvite()` 发起单聊通话。Android SDK 负责通话信令,应用仍需使用返回的房间凭据接入实时音视频媒体引擎。 + +## 参数说明 + +调用方法: + +```java +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` 时必填 | + +```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.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)。 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..b7de4c5455 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx @@ -0,0 +1,28 @@ +--- +title: '查询群组通话房间' +description: '使用 Android SDK 按群组 ID 查询进行中的通话房间。' +sourcePath: '/sdk/android/calling/retrieving-call-information/get-room-by-group-id' +--- + +`signalingGetRoomByGroupID()` 的参数是群组 ID,不是 `roomID`,即使通话使用了自定义 `roomID`。 + +```java +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` 只说明查询失败原因,不能据此判断群组没有进行中的通话。 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..a91a9b4008 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx @@ -0,0 +1,28 @@ +--- +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) { + // credentials 提供 roomID、token 和 liveURL,用于接入媒体房间。 + } + + @Override + public void onError(int code, String error) { + // code 和 error 说明失败原因。 + } + }, + 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 new file mode 100644 index 0000000000..0497310575 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx @@ -0,0 +1,25 @@ +--- +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) { + // 使用前校验 info 中 invitation 和 roomID 是否有效。 + } + + @Override + public void onError(int code, String error) { + // 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 new file mode 100644 index 0000000000..6d33e53556 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx @@ -0,0 +1,55 @@ +--- +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) { + // 信令发送请求已完成。 + } + + @Override + public void onError(int code, String error) { + // code 和 error 说明失败原因。 + } + }, + roomID, + signal.toString() +); +``` + +成功回调只表示发送请求已完成,不表示其他参与者已收到或处理该信令。建议在 `customInfo` 中包含协议版本和唯一的 `eventID`,以便接收方识别重复消息。不要放入大文件、聊天记录、长期状态或敏感凭据。 + +## 接收信令 + +收到自定义信令时,`OnSignalingListener.onReceiveCustomSignal` 会返回 `CustomSignalingInfo`。先确认它属于当前房间并校验数据格式,再更新界面: + +```java +@Override +public void onReceiveCustomSignal(CustomSignalingInfo info) { + // 先检查 info.getRoomID(),再按业务协议解析 info.getCustomInfo()。 +} +``` + +如果业务需要避免重复处理,可以在自定义信令中携带唯一事件 ID,并在接收端记录已处理的事件。消息可能不会按发送顺序到达,因此不要依赖到达顺序决定业务状态。 + +将 `onReceiveCustomSignal` 与其他通话回调一起注册到[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)中的 listener。`SignalingManager` 只保留一个 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..c17874dd5c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx @@ -0,0 +1,26 @@ +--- +title: '清空会话消息' +description: '使用 messageManager.clearConversationAndDeleteAllMsg() 保留会话入口并清空其消息。' +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) { + // 请求已完成,消息已清空。 + } + + @Override + public void onError(int code, String error) { + // code 和 error 说明失败原因。 + } + } +); +``` + +成功回调后,会话入口仍然保留,但当前账号下的消息会被清除。需要更新会话列表时,可重新查询会话或通过 `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..2b1d774d92 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx @@ -0,0 +1,26 @@ +--- +title: '重置群聊 @ 状态' +description: '使用 resetConversationGroupAtType() 将指定会话的群聊 @ 状态重置为普通状态。' +sourcePath: '/sdk/android/conversation/managing-conversations/clear-group-mentions' +--- + +群聊消息中有人 @ 当前用户或 @ 全体成员时,`groupAtType` 用于标记会话列表中的提醒状态。当前用户阅读相关消息后,调用 `resetConversationGroupAtType()` 清除该会话 `groupAtType` 的 @ 提醒状态,并更新会话列表 UI。 + +```java +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)。 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..d48cd24c17 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx @@ -0,0 +1,28 @@ +--- +title: '删除会话及消息' +description: '使用 deleteConversationAndDeleteAllMsg() 删除指定会话及其全部消息。' +sourcePath: '/sdk/android/conversation/managing-conversations/delete-conversation-with-messages' +--- + +`deleteConversationAndDeleteAllMsg()` 删除指定会话及其全部消息。 + +```java +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)。 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..4ca7d475bf --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx @@ -0,0 +1,28 @@ +--- +title: '获取消息总未读数' +description: '使用 getTotalUnreadMsgCount() 获取当前账号的总未读数。' +sourcePath: '/sdk/android/conversation/managing-conversations/get-total-unread-count' +--- + +`getTotalUnreadMsgCount()` 返回当前账号所有会话的总未读数。 + +```java +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)。 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..0e73b7c1f2 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx @@ -0,0 +1,28 @@ +--- +title: '隐藏会话' +description: '使用 hideConversation() 从当前账号的会话列表隐藏入口。' +sourcePath: '/sdk/android/conversation/managing-conversations/hide-a-conversation' +--- + +`hideConversation()` 只隐藏当前登录用户的会话入口,不会删除单聊关系、退出群组或影响其他用户。 + +```java +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)。 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..25fb7a0af4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx @@ -0,0 +1,28 @@ +--- +title: '标记会话已读' +description: '使用 messageManager.markConversationMessageAsRead() 将指定会话的消息标记为已读。' +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) { + // 请求已完成。 + } + + @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)。 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..3977f9a9e0 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx @@ -0,0 +1,27 @@ +--- +title: '置顶或取消置顶会话' +description: '使用 pinConversation() 设置指定会话的置顶状态。' +sourcePath: '/sdk/android/conversation/managing-conversations/pin-conversation' +--- + +```java +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)。 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..2018155250 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx @@ -0,0 +1,27 @@ +--- +title: '设置阅后即焚时长' +description: '使用 setConversationBurnDuration() 设置阅后即焚模式的消息保留时长。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-burn-duration' +--- + +```java +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)。 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..68be86e62d --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx @@ -0,0 +1,27 @@ +--- +title: '设置会话草稿' +description: '使用 setConversationDraft() 保存会话草稿。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-conversation-draft' +--- + +用户离开聊天页、切换会话或输入框内容变化时,可以使用 `setConversationDraft()` 保存草稿。输入过程中先维护编辑器状态并对保存调用做防抖;离开页面前再提交一次最新文本。 + +```java +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` 接收。 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..96b30a70e8 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx @@ -0,0 +1,27 @@ +--- +title: '设置会话扩展字段' +description: '使用 setConversationEx() 设置指定会话的业务扩展字符串。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-conversation-extension' +--- + +`ex` 是用于保存会话扩展信息的字符串,可以传入 JSON 字符串或其他业务约定格式的字符串。 + +```java +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)。 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..a153598fab --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx @@ -0,0 +1,33 @@ +--- +title: '定期删除服务端消息' +description: '使用 setConversation() 启用、关闭并配置会话的服务端消息定期删除策略。' +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) { + // 请求已完成。 + } + + @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)。 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..4e0de26696 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx @@ -0,0 +1,31 @@ +--- +title: '设置会话消息接收方式' +description: '使用 setConversationRecvMessageOpt() 设置单个会话的消息接收与通知方式。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-message-receive-option' +--- + +```java +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)。 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..23ab5b2bef --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx @@ -0,0 +1,27 @@ +--- +title: '开启或关闭阅后即焚' +description: '使用 setOneConversationPrivateChat() 设置会话的阅后即焚模式。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-private-chat' +--- + +```java +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)。 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..a2ddb74481 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/overview-conversation.mdx @@ -0,0 +1,65 @@ +--- +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`。 | + +## 会话数据 + +| 字段 | 说明 | +| --- | --- | +| `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。 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..65e3f3d9f8 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx @@ -0,0 +1,29 @@ +--- +title: '查询指定会话' +description: '使用 getOneConversation() 按用户或群组获取一个会话。' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversation-by-target' +--- + +`getOneConversation()` 按用户或群组获取一个会话信息,适用于从通讯录、用户资料或群资料进入聊天页的场景。单聊传对方用户 ID,群聊传群组 ID。 + +```java +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`。 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..37858ffe2b --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx @@ -0,0 +1,19 @@ +--- +title: '生成会话 ID' +description: '使用 getConversationIDBySessionType() 按聊天目标计算会话 ID。' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversation-id' +--- + +`getConversationIDBySessionType()` 根据聊天目标 `sourceId` 和会话类型 `sessionType` 获取 `conversationID`。 + +```java +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)。 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..357f7d05a6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx @@ -0,0 +1,26 @@ +--- +title: '按 ID 批量获取会话' +description: '使用 getMultipleConversation() 按 conversationID 批量获取会话。' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversations-by-id' +--- + +使用 `getMultipleConversation()` 根据 `conversationIDs` 查询多个会话。`conversationIDs` 是待查询的会话 ID 列表。 + +```java +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`。 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..e8cd75de07 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx @@ -0,0 +1,58 @@ +--- +title: '获取会话列表' +description: '使用 getConversationListSplit() 分页获取当前账号的会话列表。' +sourcePath: '/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list' +--- + +会话列表属于当前登录用户。每条 `ConversationInfo` 包含会话标识、未读数、最后一条消息、置顶和草稿等状态。 + +## 分页获取会话 + +```java +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: + +```java +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()` 设置后即可接收会话变化。 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..0a6b57bccc --- /dev/null +++ b/content/zh/docs/chat/sdk/android/events/overview-events.mdx @@ -0,0 +1,110 @@ +--- +title: '事件概览' +description: '集中设置 Android SDK listener,并按业务领域分发连接、同步和数据事件。' +sourcePath: '/sdk/android/events/overview-events' +--- + +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 只处理其所属业务的事件,例如消息、会话、好友和通话。 + +```java +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 还应包含会话列表、未读数和输入状态回调;下面只展示初始化同步相关的回调: + +```java +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` 提供当前同步进度;同步完成后重新查询当前界面需要的数据,失败时更新同步失败状态并等待重试或连接恢复。 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..ee439a6438 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx @@ -0,0 +1,77 @@ +--- +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) { + // 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。 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..101796ca85 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx @@ -0,0 +1,182 @@ +--- +title: '认证与管理登录会话' +description: '使用 OpenIM Android SDK 初始化、登录、查询登录状态、处理连接回调并退出当前账号。' +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. 分别等待登录回调成功与 `onConnectSuccess()`,再开放依赖连接的业务操作。 +6. 主动退出或切换账号时调用 `logout()`,完成后清理当前账号的应用状态。 + +下文中的 `apiAddr`、`wsAddr`、`userID` 和 `token` 均由可信后端提供。 + +## 初始化并处理连接生命周期 + +在 `Application` 生命周期内创建数据目录、初始化 SDK,并传入连接 listener。应用应保存连接状态,但不要在回调中记录 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() { + // 连接建立中。 + } + + @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 组合覆盖设置。 + +## 登录当前用户 + +```java +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()`,也不要仅凭某一个回调同时推断登录与连接状态。 + +## 查询登录状态 + +```java +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 + +```java +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 时可以调用: + +```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..5d6855fa37 --- /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)。确认登录回调成功且 `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..84c03d92b4 --- /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:3.8.3@aar' + implementation 'io.openim:core-sdk:3.8.3-patch15@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..604bbe7487 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/getting-started/send-first-message.mdx @@ -0,0 +1,103 @@ +--- +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 步:确认可以发送 + +两个账号登录后,发送方的登录回调成功且 `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` 其中之一。 + +## 验证成功 + +- 发送方调用 `sendMessage()` 后触发 `onSuccess()` 回调。 +- 接收方进入 `onRecvNewMessage()`,并看到文本消息。 + +## 下一步 + +- [认证与管理登录会话](/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..b5c807f503 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx @@ -0,0 +1,14 @@ +--- +title: '设置群组全员禁言' +description: '使用 changeGroupMute 开启或关闭群组全员禁言。' +sourcePath: '/sdk/android/group/change-group-mute' +--- + +使用 `changeGroupMute()` 切换全员禁言。`true` 开启,`false` 关闭;成员级禁言见[禁言或解除禁言群成员](/sdk/android/group/managing-group-members/change-group-member-mute)。 + +```java +OpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() { + @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 new file mode 100644 index 0000000000..238068cd67 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/create-group.mdx @@ -0,0 +1,21 @@ +--- +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) { /* 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 new file mode 100644 index 0000000000..32c538ae0b --- /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) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 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..252bfbc24e --- /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) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } +}, groupID, applicantUserID, "欢迎加入"); +``` + +同意后,通过[群组概览](/sdk/android/group/overview-group)中的相关事件接收申请状态和成员变化通知。 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 new file mode 100644 index 0000000000..67e9aaafff --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/group-applications/delete-group-requests.mdx @@ -0,0 +1,22 @@ +--- +title: '删除入群申请' +description: '使用 deleteGroupRequests 批量删除指定的入群申请记录。' +sourcePath: '/sdk/android/group/group-applications/delete-group-requests' +--- + +`deleteGroupRequests()` 接收 `DeleteGroupRequestsReq`,可传入多个 `SimpleGroupRequests` 批量删除申请记录。每个 `SimpleGroupRequests` 包含 `fromUserID` 和 `groupID`:`fromUserID` 为申请人的用户 ID,`groupID` 为申请加入的群组 ID。 + +```java +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()`。 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..6a65a6c501 --- /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) { /* items 是当前页申请记录。 */ } + @Override public void onError(int code, String error) { /* code 和 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..38870c29f6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx @@ -0,0 +1,16 @@ +--- +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) { /* 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 new file mode 100644 index 0000000000..1b8ef8f83a --- /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) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } +}, groupID, applicantUserID, "当前群组人数已满"); +``` + +拒绝成功后,通过 `onGroupApplicationRejected` 接收通知,也可以重新调用查询 API 获取最新申请列表。 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..78e0fb8d9c --- /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` 表示入群来源:`2` 表示邀请,`3` 表示搜索,`4` 表示二维码;带扩展数据时使用五参数重载。 + +```java +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` 接收通知。 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..4b162bbdc8 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx @@ -0,0 +1,14 @@ +--- +title: '设置群成员禁言' +description: '使用 changeGroupMemberMute 设置指定成员的禁言时长。' +sourcePath: '/sdk/android/group/managing-group-members/change-group-member-mute' +--- + +`seconds` 为禁言时长,单位为秒;传 `0` 解除成员禁言。该操作与[全员禁言](/sdk/android/group/change-group-mute)相互独立。 + +```java +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); +``` 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..5baa8dac9c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx @@ -0,0 +1,14 @@ +--- +title: '邀请用户加入群组' +description: '使用 inviteUserToGroup 邀请一组用户加入指定群组。' +sourcePath: '/sdk/android/group/managing-group-members/invite-user-to-group' +--- + +传入群 ID、待邀请用户 ID 列表和邀请说明。调用成功表示邀请请求已提交;用户实际加入后通过 `onGroupMemberAdded` 接收通知。 + +```java +OpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() { + @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 new file mode 100644 index 0000000000..c7bb5b8a43 --- /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) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 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..155a745e9a --- /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) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } +}); +``` + +修改成功后,通过 `onGroupMemberInfoChanged` 接收成员资料变化通知。 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..85a98db672 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx @@ -0,0 +1,19 @@ +--- +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) { /* 请求已完成。 */ } + @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 new file mode 100644 index 0000000000..8659860c89 --- /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) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } +}); +``` + +修改成功后,通过[群组概览](/sdk/android/group/overview-group)中的 `onGroupMemberInfoChanged` 接收成员资料变化通知。 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..52b02664c0 --- /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`。转让群主请使用[转让群主](/sdk/android/group/managing-group-members/transfer-group-owner)。 + +```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) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 error 说明失败原因。 */ } +}); +``` + +角色修改成功后,通过 `onGroupMemberInfoChanged` 接收成员资料变化通知。 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..da192770c1 --- /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' +--- + +`transferGroupOwner()` 接收 `groupID` 和 `newOwnerUserID` 两个参数:`groupID` 为要转让群主的群组 ID,`newOwnerUserID` 为新群主的用户 ID,该用户必须是该群的成员。 + +```java +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)获取最新资料。 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..744a7f8ac8 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/overview-group.mdx @@ -0,0 +1,98 @@ +--- +title: '群组概览' +description: '了解 Android SDK 中的群组概念、核心数据类型和主要能力。' +sourcePath: '/sdk/android/group/overview-group' +--- + +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`,接收群资料、成员和入群申请的变化。下面示例根据回调刷新相应的群组、成员或申请界面: + +```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 new file mode 100644 index 0000000000..d066b7dc1e --- /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) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 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..27e88ce289 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx @@ -0,0 +1,15 @@ +--- +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) { /* 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 new file mode 100644 index 0000000000..014f7368ad --- /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) { /* members 是查询到的成员资料。 */ } + @Override public void onError(int code, String error) { /* code 和 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..34a5b5dbcf --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx @@ -0,0 +1,15 @@ +--- +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) { /* 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 new file mode 100644 index 0000000000..779d413231 --- /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) { /* 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)。 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..5554b60717 --- /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) { /* 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 new file mode 100644 index 0000000000..9da28c409c --- /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' +--- + +`offset` 从 `0` 开始,后续页按上一页返回的条目数推进;返回为空时停止加载。 + +```java +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` 接收通知。 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..63b3a10b74 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx @@ -0,0 +1,14 @@ +--- +title: '查询指定群组资料' +description: '使用 getGroupsInfo 批量查询指定群组的最新资料。' +sourcePath: '/sdk/android/group/retrieving-groups/get-specified-groups-info' +--- + +`getGroupsInfo()` 的 `groupIDs` 参数为要查询的群组 ID 列表,返回结果为 `GroupInfo` 列表。 + +```java +OpenIMClient.getInstance().groupManager.getGroupsInfo(new OnBase>() { + @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 new file mode 100644 index 0000000000..3770d43528 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx @@ -0,0 +1,14 @@ +--- +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) { /* 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 new file mode 100644 index 0000000000..711584e69e --- /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) { /* 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) 确定。 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..0863cec592 --- /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' +--- + +构造包含 `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) { /* 请求已完成。 */ } + @Override public void onError(int code, String error) { /* code 和 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..e37eb1816d --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx @@ -0,0 +1,18 @@ +--- +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) { /* 请求已完成。 */ } + @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 new file mode 100644 index 0000000000..593a15445e --- /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) { /* 请求已完成。 */ } + @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 new file mode 100644 index 0000000000..4446cc3fe7 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx @@ -0,0 +1,18 @@ +--- +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) { /* 请求已完成。 */ } + @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 new file mode 100644 index 0000000000..80ed04d3c1 --- /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) { /* 请求已完成。 */ } + @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 new file mode 100644 index 0000000000..18fa56304b --- /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) { /* 请求已完成。 */ } + @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 new file mode 100644 index 0000000000..5a41a470c6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/logger.mdx @@ -0,0 +1,113 @@ +--- +title: '日志' +description: '配置 Android SDK 日志、写入应用诊断信息并上传日志。' +sourcePath: '/sdk/android/logger' +--- + +OpenIM Android SDK 日志用于定位初始化、连接和业务 API 调用问题。开发和预发布环境可以输出较详细的信息;生产环境应减少日志量,并避免记录 Token、完整消息正文、原始文件 URL、通话房间凭据和用户隐私字段。 + +## 初始化日志配置 + +在调用 `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()` 可将客户端日志上传至服务器,主要使用场景是用户主动提交诊断日志。 + +```java +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) 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..876c389c15 --- /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(); + // typing 表示该用户当前输入状态。 + } + + @Override + public void onError(int code, String error) { + // code 和 error 说明失败原因。 + } + }, + conversationID, + userID +); +``` + +成功回调返回平台 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 new file mode 100644 index 0000000000..164f46a3c3 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx @@ -0,0 +1,53 @@ +--- +title: '上报输入状态' +description: '使用 Android SDK 上报当前会话的输入状态。' +sourcePath: '/sdk/android/message/composing-messages/update-typing-status' +--- + +进入输入状态时,将 `focus` 设为 `true`;输入结束、输入框失去焦点或退出会话时,将其设为 `false`。 + +```java +conversationManager.changeInputState( + new OnBase() { + @Override + public void onSuccess(String data) { + // 输入状态已上报 + } + + @Override + public void onError(int code, String error) { + // code 和 error 说明上报失败原因。 + } + }, + conversationID, + true +); +``` + +输入结束时及时清除状态: + +```java +conversationManager.changeInputState(callback, conversationID, false); +``` + +避免频繁重复上报相同状态。成功回调表示上报请求已经完成。 + +其他客户端通过 `OnConversationListener.onConversationUserInputStatusChanged` 接收输入状态变化。Android SDK 以字符串形式返回事件载荷,应在校验 JSON 后再解析: + +```java +@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)。 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..f2e48fd9b4 --- /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) +); +``` + +实体范围必须对应最终回复正文。`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-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..2497938947 --- /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' +--- + +`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..b0df73bd91 --- /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' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .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 new file mode 100644 index 0000000000..474514464c --- /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-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-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..24fd6a258a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx @@ -0,0 +1,12 @@ +--- +title: '使用本地路径创建图片消息' +description: '使用绝对路径创建图片消息。' +sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-file' +--- + +```java +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 new file mode 100644 index 0000000000..47a1e6358f --- /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-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-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..9fc9b32b93 --- /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..a60d9fd428 --- /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`。 + +```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..476cbf4958 --- /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(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 new file mode 100644 index 0000000000..fde2b58811 --- /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-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-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..3ec208f970 --- /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..f4ba2f887b --- /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()` 只创建待发送的 `Message`,不会发送消息。 + +```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..ed009dbd59 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx @@ -0,0 +1,16 @@ +--- +title: '使用本地路径创建视频消息' +description: '使用视频和缩略图的绝对路径创建视频消息。' +sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-file' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessageFromFullPath( + 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 new file mode 100644 index 0000000000..91cb67dec4 --- /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/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 new file mode 100644 index 0000000000..38569554d7 --- /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..12a2130f0c --- /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..d06bf194b3 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx @@ -0,0 +1,46 @@ +--- +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` 接收删除的消息: + +```java +@Override +public void onMsgDeleted(Message 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 new file mode 100644 index 0000000000..3703f43b58 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx @@ -0,0 +1,34 @@ +--- +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 只用于群聊,可删除指定用户在目标群会话中的全部消息。调用者没有操作权限时,通过 `onError` 返回错误。 + +其他客户端通过 `OnAdvanceMsgListener.onDeleteUserAllMsgsInConv` 接收删除通知。回调参数包含对应的 `conversationID` 和 `userID`: + +```java +@Override +public void onDeleteUserAllMsgsInConv(DeleteUserAllMsgsListenerMsg event) { + // 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 new file mode 100644 index 0000000000..757e5b193b --- /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) { /* messages 是置顶消息。 */ } + @Override public void onError(int code, String error) { /* code 和 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..d9264d7ef0 --- /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` 是接收者用户 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 new file mode 100644 index 0000000000..c30a9b1579 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx @@ -0,0 +1,24 @@ +--- +title: '修改消息' +description: '修改支持编辑的消息内容,并处理其他客户端收到的消息修改事件。' +sourcePath: '/sdk/android/message/managing-messages/modify-a-message' +--- + +`modifyMessage` 用于修改会话中已经存在的消息。通常应以原消息为基础修改支持编辑的内容,并保留其他字段。 + +```java +messageManager.modifyMessage(callback, modifyRequest); +``` + +成功回调表示修改请求已经完成。 + +消息修改后,其他客户端通过 `OnAdvanceMsgListener.onMessageModified` 接收修改后的完整 `Message`: + +```java +@Override +public void onMessageModified(Message message) { + // message 是修改后的消息。 +} +``` + +`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 new file mode 100644 index 0000000000..b522330e0d --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx @@ -0,0 +1,24 @@ +--- +title: '撤回消息' +description: '撤回已发送消息,并处理其他客户端收到的撤回通知。' +sourcePath: '/sdk/android/message/managing-messages/revoke-a-message' +--- + +撤回会使其他客户端把原消息显示为撤回状态。调用失败时,通过错误回调获取错误码和错误信息。 + +```java +messageManager.revokeMessageV2(callback, conversationID, clientMsgID); +``` + +成功回调表示撤回请求已经完成。其他客户端通过 `OnAdvanceMsgListener.onRecvMessageRevokedV2` 接收撤回通知。 + +`RevokedInfo` 包含 `clientMsgID`、撤回者和撤回时间: + +```java +@Override +public void onRecvMessageRevokedV2(RevokedInfo info) { + // info 包含被撤回消息的信息。 +} +``` + +接收端应把对应消息更新为撤回状态,而不是直接从列表删除。`MessageManager` 只能设置一个 `OnAdvanceMsgListener`;如果应用还需要处理其他消息事件,请在同一个 listener 中实现相应回调。设置方法见[事件概览](/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 new file mode 100644 index 0000000000..6e64c0b8a9 --- /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..f8dfe734d2 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx @@ -0,0 +1,29 @@ +--- +title: '置顶或取消置顶消息' +description: '设置会话消息的置顶状态,并处理置顶消息变化事件。' +sourcePath: '/sdk/android/message/managing-messages/set-message-pinned' +--- + +最后一个参数为 `true` 时置顶消息,为 `false` 时取消置顶: + +```java +messageManager.setConversationPinnedMsg( + callback, + conversationID, + clientMsgID, + true +); +``` + +成功回调表示设置请求完成,不代表置顶变化事件已经到达。 + +置顶消息发生变化时,`OnAdvanceMsgListener.onChangedPinnedMsg` 返回对应的 `conversationID` 和当前置顶消息列表: + +```java +@Override +public void onChangedPinnedMsg(ChangedPinnedMsg event) { + // event.getMsgs() 是置顶状态发生变化的消息。 +} +``` + +`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 new file mode 100644 index 0000000000..0a0b29d80d --- /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) { + // members 是已读该消息的成员资料。 + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } + } +); +``` + +成功回调返回当前页 `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 new file mode 100644 index 0000000000..d0230101ca --- /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` 接收群消息已读回执: + +```java +@Override +public void onRecvGroupMessageReadReceipt(GroupMessageReceipt receipt) { + // receipt 包含群消息已读回执。 +} +``` + +需要查询某条群消息的已读或未读成员时,使用[查询群消息已读成员](/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 new file mode 100644 index 0000000000..65117066cc --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/overview-message.mdx @@ -0,0 +1,131 @@ +--- +title: '消息概览' +description: '了解 Android SDK 的 Message 模型、消息生命周期和消息监听。' +sourcePath: '/sdk/android/message/overview-message' +--- + +Android SDK 使用 `Message` 表示一条消息。消息创建、发送、接收、查询和状态变更是不同阶段;创建 `Message` 不会发送消息,发送成功也不代表其他客户端已经完成接收。 + +消息列表通常以 `clientMsgID` 作为客户端去重和更新键,并结合当前会话上下文判断消息属于单聊还是群聊。`Message` 本身不包含 `conversationID`,会话 ID 来自当前会话、历史查询参数或消息事件上下文。 + +## 消息处理流程 + +| 阶段 | Android API 或回调 | 说明 | +| ---- | ------------------------------------------ | ----------------------------------------------------------------- | +| 创建 | `MessageManager.create*Message()` | 创建待发送的 `Message` 对象,不写入服务端,也不会触发新消息回调。 | +| 发送 | `sendMessage()` 或 `sendMessageNotOss()` | 单聊传入 `recvUid`,群聊传入 `recvGid`。 | +| 接收 | `OnAdvanceMsgListener` | 处理实时、离线、在线消息以及撤回、删除和已读回执等变化。 | +| 查询 | 历史消息、按 ID 查找或搜索 API | 查询结果是调用时的消息快照,不代替实时消息监听。 | +| 更新 | 撤回、删除、修改、置顶、已读和本地扩展 API | 分别处理 API 结果、对应事件和必要的列表重新查询。 | + +```java +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` 同步相关回调;必要时重新查询消息列表。 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..1105d06bf1 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx @@ -0,0 +1,13 @@ +--- +title: '接收自定义业务消息' +description: '使用 setCustomBusinessListener 接收独立于普通聊天消息的业务回调。' +sourcePath: '/sdk/android/message/receiving-messages/receive-custom-business-messages' +--- + +自定义业务回调携带字符串,业务侧应按约定格式解析,不要将其直接当作 `Message` 渲染。 + +```java +messageManager.setCustomBusinessListener(new OnCustomBusinessListener() { + @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 new file mode 100644 index 0000000000..c4701ccacb --- /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` 仅接收在线消息。 + +```java +messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { + @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 new file mode 100644 index 0000000000..94c143ea5f --- /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` 列表查询消息。 + +```java +messageManager.findMessageList(new OnBase() { + @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 new file mode 100644 index 0000000000..dc71530a3d --- /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(); + // 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)。 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..a1a6b9355f --- /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' +--- + +该方法用于从消息定位点向后读取下一页历史消息。此类方向历史分页使用 `ViewType.History`。 + +```java +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 new file mode 100644 index 0000000000..31e810cd30 --- /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`,后续将上一页边界消息作为起点。普通历史消息使用 `ViewType.History`,按返回的 `clientMsgID` 去重。 + +```java +messageManager.getAdvancedHistoryMessageList(callback, conversationID, startMessage, 20, ViewType.History); +``` 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..70944a40e1 --- /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 时使用该方法,无需再次上传媒体文件。 + +```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..6d6cb7aa56 --- /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`。通过 `OnMsgSendCallback` 处理发送成功、失败和媒体进度。 + +```java +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); +``` 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..6ecbf1cc18 --- /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' +--- + +通过 `OnMsgSendCallback.onProgress()` 获取当前消息的发送进度。 + +```java +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); +``` 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..0dd6271128 --- /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) { + // 拉黑用户成功 + } + + @Override + public void onError(int code, String error) { + // 处理错误 + } + }, + targetUserID, + "{\"source\":\"profile-menu\"}" +); +``` + +第二个参数是目标 `userID`,第三个参数是可选扩展字符串。无需扩展信息时可使用不带 `ex` 的重载。成功 callback 表示拉黑请求完成,不表示事件已经到达。 + +黑名单是单向关系:被拉黑用户不能向当前用户发送消息,但当前用户是否允许继续向对方发送消息由业务层决定。`ex` 是用于保存黑名单扩展信息的字符串,也可以存储 JSON 字符串。 + +拉黑状态变化时,可通过 `OnFriendshipListener` 接收 `onBlacklistAdded`: + +```java +@Override +public void onBlacklistAdded(BlacklistInfo 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..52e3fcd1c9 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx @@ -0,0 +1,48 @@ +--- +title: '获取黑名单列表' +description: '使用 getBlacklist() 获取当前用户的黑名单。' +sourcePath: '/sdk/android/user/blacklist/get-blacklist' +--- + +黑名单记录当前用户主动拉黑的用户,可用于黑名单设置页、资料卡中的关系状态和聊天入口限制。 + +## 获取黑名单 + +完成 SDK 初始化并登录后,调用 `getBlacklist()` 获取当前账号的完整黑名单。返回空列表表示当前没有黑名单用户。 + +```java +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 接收通知。 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..af99abdf23 --- /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) { + // 取消拉黑成功 + } + + @Override + public void onError(int code, String error) { + // 处理错误 + } + }, + targetUserID +); +``` + +成功 callback 表示取消拉黑请求完成。黑名单发生变化时,通过 `onBlacklistDeleted` 接收通知;需要重新获取列表时,调用[获取黑名单列表](/sdk/android/user/blacklist/get-blacklist)。 + +取消拉黑时,可通过 `OnFriendshipListener` 接收 `onBlacklistDeleted`: + +```java +@Override +public void onBlacklistDeleted(BlacklistInfo user) { + // 处理已移除的黑名单记录 +} +``` 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..14c95f66a6 --- /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) { + // 接受好友申请成功 + } + + @Override + public void onError(int code, String error) { + // 处理错误 + } + }, + applicantUserID, + "已通过" +); +``` + +`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 new file mode 100644 index 0000000000..cac36cfec3 --- /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) { + // 好友申请发送成功 + } + + @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)。 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..bd7817ffa9 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx @@ -0,0 +1,65 @@ +--- +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) { + // 使用 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` 接收以下回调: + +```java +@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)。 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..9fce165d8a --- /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) { + // 使用 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)相同。 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..1c2baefc6e --- /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) { + // 拒绝好友申请成功 + } + + @Override + public void onError(int code, String error) { + // 处理错误 + } + }, + applicantUserID, + "暂不添加" +); +``` + +`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 new file mode 100644 index 0000000000..81ca1c5198 --- /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) { + // 使用 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)。 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..a0bc1951f4 --- /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) { + // 删除好友成功 + } + + @Override + public void onError(int code, String error) { + // 处理错误 + } + }, + friendUserID +); +``` + +成功 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 new file mode 100644 index 0000000000..7e4819996e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx @@ -0,0 +1,62 @@ +--- +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) { + // 使用 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` 接收以下回调: + +```java +@Override +public void onFriendAdded(FriendInfo friend) { + // 处理新增好友 +} + +@Override +public void onFriendInfoChanged(FriendInfo friend) { + // 处理好友资料变化 +} + +@Override +public void onFriendDeleted(FriendInfo friend) { + // 处理好友删除 +} +``` 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..d321c492c9 --- /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) { + // 使用 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)。 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..dce3022ce9 --- /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) { + // 使用 results 显示搜索结果 + } + + @Override + public void onError(int code, String error) { + // 处理错误 + } + }, + Collections.singletonList(keyword.trim()), + true, + true, + true +); +``` + +`keywordList` 当前只传一个非空关键词。后面的三个布尔值依次控制是否匹配用户 ID、昵称和好友备注,至少应启用一种匹配方式。需要同时搜索多个字段时,将对应开关设为 `true`。 + +成功 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 new file mode 100644 index 0000000000..ae1aaaf11c --- /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) { + // 更新好友资料成功 + } + + @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)。 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..abf5da56ae --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx @@ -0,0 +1,23 @@ +--- +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) { + // 使用 states 显示在线状态 + } + + @Override + public void onError(int code, String error) { + // 处理错误 + } + } +); +``` + +成功 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 new file mode 100644 index 0000000000..37648be7e8 --- /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) { + // 使用 states 显示在线状态 + } + + @Override + public void onError(int code, String error) { + // 处理错误 + } + }, + userIDs +); +``` + +调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 `List`,每项包含 `userID`、`status` 和 `platformIDs`。 + +## 状态字段 + +| 字段 | 说明 | +| ------------- | ------------------------------------------ | +| `userID` | 目标用户 ID。 | +| `status` | 在线状态值,具体枚举含义以服务端契约为准。 | +| `platformIDs` | 当前在线的平台 ID 列表。 | + +用户在线状态变化时,可通过 `OnUserListener` 接收 `onUserStatusChanged`: + +```java +@Override +public void onUserStatusChanged(UsersOnlineStatus 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 new file mode 100644 index 0000000000..0c873559b9 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx @@ -0,0 +1,30 @@ +--- +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) { + // 取消订阅成功 + } + + @Override + public void onError(int code, String error) { + // 处理错误 + } + }, + userIDs +); +``` + +成功 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 new file mode 100644 index 0000000000..f7dd51cfe6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/overview-user.mdx @@ -0,0 +1,58 @@ +--- +title: '用户概览' +description: '了解 Android SDK 中的当前用户资料、公开用户资料、账号设置和在线状态。' +sourcePath: '/sdk/android/user/overview-user' +--- + +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) | + +## 状态更新 + +用户相关状态变化需要设置用户监听器;具体回调说明见下方对应能力页: + +```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/online-status/subscribe-users-online-status)。 +- 好友、好友申请和黑名单变化:见[关系链概览](/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 new file mode 100644 index 0000000000..31e6c15683 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx @@ -0,0 +1,35 @@ +--- +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) { + // 使用 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)。 | 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..6755c632af --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/user-profile/get-users-info.mdx @@ -0,0 +1,68 @@ +--- +title: '获取指定用户资料' +description: '按 userID 批量查询应用用户公开资料(PublicUserInfo)。' +sourcePath: '/sdk/android/user/user-profile/get-users-info' +--- + +`getUsersInfo()` 按 `userID` 查询应用用户的公开资料,适合展示好友候选人和陌生人资料卡。 + +## 查询公开资料 + +调用 `getUsersInfo()` 并传入要查询的用户 ID 列表,即可获取这些用户的公开资料。调用前应去除空值和重复 ID,并控制单次请求数量。 + +```java +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) 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 new file mode 100644 index 0000000000..58ea33f7b6 --- /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) { + // 设置全局消息接收方式成功 + } + + @Override + public void onError(int code, String error) { + // 处理错误 + } + }, + request +); +``` + +| 数值 | 含义 | +| ---- | ------------------------ | +| `0` | 正常接收消息并允许通知。 | +| `1` | 屏蔽消息。 | +| `2` | 接收消息但不提示。 | + +如果产品只提供“全局免打扰”开关,可以在 `0` 和 `2` 之间切换;`1` 会停止接收消息,应单独展示。单个会话的接收方式由会话 API 管理。 + +成功 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 new file mode 100644 index 0000000000..2ca6a98eac --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/user-profile/set-self-info.mdx @@ -0,0 +1,53 @@ +--- +title: '更新当前用户资料' +description: '使用 setSelfInfo() 更新当前用户的昵称、头像或扩展资料。' +sourcePath: '/sdk/android/user/user-profile/set-self-info' +--- + +使用 `UserInfoReq` 只设置实际需要修改的字段。 + +```java +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`: + +```java +@Override +public void onSelfInfoUpdated(UserInfo info) { + // 处理当前用户资料变化 +} +``` diff --git a/data/structure/android-content-audit.json b/data/structure/android-content-audit.json new file mode 100644 index 0000000000..d815b63702 --- /dev/null +++ b/data/structure/android-content-audit.json @@ -0,0 +1,6164 @@ +{ + "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-18", + "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": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-18", + "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 + }, + { + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.createGroup" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.createGroup" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupInfo" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupInfo" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupInfo" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupInfo.setNeedVerification" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupInfo.setNeedVerification" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupInfo.setLookMemberInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupInfo.setLookMemberInfo" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupInfo.setApplyMemberFriend" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupInfo.setApplyMemberFriend" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.changeGroupMute" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.changeGroupMute" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.joinGroup" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.joinGroup" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.quitGroup" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.quitGroup" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.dismissGroup" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.dismissGroup" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupsInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupsInfo" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getJoinedGroupListPage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getJoinedGroupListPage" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.isJoinGroup" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.isJoinGroup" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.searchGroups" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.searchGroups" + ], + "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": "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" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "structure-only", + "reviewer": "Codex", + "reviewedAt": "2026-08-18", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "概览页已删除,相关操作分别在具体 API 页面中说明。" + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { + "status": "pending", + "evidence": [], + "reason": null + } + } + }, + "redirectTo": null, + "notes": [ + "2026-08-18:概览页不包含独立 API,已删除;子菜单仅保留具体操作页面,不保留旧地址重定向。" + ] + }, + { + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getRecvGroupApplicationList" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getRecvGroupApplicationList" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getSendGroupApplicationList" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getSendGroupApplicationList" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.acceptGroupApplication" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.acceptGroupApplication" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.refuseGroupApplication" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.refuseGroupApplication" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "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": [ + "deleteGroupRequests" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.deleteGroupRequests" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "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": "概览页已删除,相关操作分别在具体 API 页面中说明。" + } + }, + "en": { + "reviewStatus": "deferred", + "reviewer": null, + "reviewedAt": null, + "exampleVerification": { + "status": "pending", + "evidence": [], + "reason": null + } + } + }, + "redirectTo": null, + "notes": [ + "2026-08-18:概览页不包含独立 API,已删除;子菜单仅保留具体操作页面,不保留旧地址重定向。" + ] + }, + { + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupMemberList" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupMemberList" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupMembersInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupMembersInfo" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getUsersInGroup" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getUsersInGroup" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupMemberOwnerAndAdmin" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupMemberOwnerAndAdmin" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.searchGroupMembers" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.searchGroupMembers" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.inviteUserToGroup" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.inviteUserToGroup" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.kickGroupMember" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.kickGroupMember" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.transferGroupOwner" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.transferGroupOwner" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.changeGroupMemberMute" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.changeGroupMemberMute" + ], + "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": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-19", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "本页仅提供 Android SDK 能力导航,不包含独立 API 调用示例;具体调用和验证证据在对应任务页维护。" + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-19", + "exampleVerification": { + "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." + } + } + }, + "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-10", + "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 准备项。", + "2026-08-19:中文正文将登录回调术语统一为“回调”。", + "2026-08-19:英文正文同步中文的回调术语与接入流程说明。" + ] + }, + { + "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": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-19", + "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-19", + "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 坐标。", + "2026-08-19:根据 Maven Central 元数据将依赖固定为 android-sdk 3.8.3 与 core-sdk 3.8.3-patch15。", + "2026-08-19:英文正文同步固定的 Maven Central 依赖版本。" + ] + }, + { + "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-19", + "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:逐页核对初始化、登录状态、连接回调、Token 失效、强制下线、退出与释放边界。", + "2026-08-19:中文正文将回调术语统一为“回调”。", + "2026-08-19:将账号级回调说明改为直接描述切换账号时的状态清理要求。", + "2026-08-19:将 listener 集中注册说明链接至事件概览。", + "2026-08-19:移除 Java wrapper 和 Core 等内部实现表述。", + "2026-08-19:精简快速开始示例,移除应用状态、页面和日志处理调用。", + "2026-08-19:英文正文同步精简后的回调示例、事件概览链接和账号状态说明。" + ] + }, + { + "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-19", + "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-19", + "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:逐页核对文本消息创建、单聊与群聊目标、离线推送信息、发送回调、接收 listener 和 clientMsgID 合并规则。", + "2026-08-19:中文正文将登录回调术语统一为“回调”。", + "2026-08-19:删除验证成功列表中与前文重复的单聊和群聊参数说明。", + "2026-08-19:明确发送验证项对应 sendMessage() 的成功回调。", + "2026-08-19:英文正文同步精简后的验证项。" + ] + }, + { + "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" + ], + "sdkMethods": [ + "setOnUserListener" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-19", + "exampleVerification": { + "status": "verified", + "evidence": [ + "UserInfoManager.setOnUserListener", + "OnUserListener" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-19", + "exampleVerification": { + "status": "verified", + "evidence": [ + "UserInfoManager.setOnUserListener", + "OnUserListener" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "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-19", + "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-19", + "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-19", + "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-19", + "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-19", + "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-19", + "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-19", + "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-19", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-18", + "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-19", + "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-19", + "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-19", + "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-19", + "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/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-19", + "exampleVerification": { + "status": "verified", + "evidence": [ + "UserInfoManager.unsubscribeOnlineUsersStatus" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-19", + "exampleVerification": { + "status": "verified", + "evidence": [ + "UserInfoManager.unsubscribeOnlineUsersStatus" + ], + "reason": null + } + } + }, + "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-19", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "概览页不包含代码示例。" + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-19", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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-20", + "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", + "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" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setAdvancedMsgListener", + "Message", + "MessageType", + "OnAdvanceMsgListener" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setAdvancedMsgListener", + "Message", + "MessageType", + "OnAdvanceMsgListener" + ], + "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-17", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createTextMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-17", + "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" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-17", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createTextAtMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createTextAtMessage" + ], + "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": "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", + "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" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createImageMessage" + ], + "reason": null + } + }, + "en": { + "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-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": [ + "createImageMessageFromFullPath" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createImageMessageFromFullPath" + ], + "reason": null + } + }, + "en": { + "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-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-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createImageMessageByURL" + ], + "reason": null + } + }, + "en": { + "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", + "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": [ + "createSoundMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createSoundMessage" + ], + "reason": null + } + }, + "en": { + "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-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": [ + "createSoundMessageFromFullPath" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createSoundMessageFromFullPath" + ], + "reason": null + } + }, + "en": { + "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-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-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createSoundMessageByURL" + ], + "reason": null + } + }, + "en": { + "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-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": [ + "createVideoMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createVideoMessage" + ], + "reason": null + } + }, + "en": { + "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-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": [ + "createVideoMessageFromFullPath" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createVideoMessageFromFullPath" + ], + "reason": null + } + }, + "en": { + "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-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-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createVideoMessageByURL" + ], + "reason": null + } + }, + "en": { + "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-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": [ + "createFileMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFileMessage" + ], + "reason": null + } + }, + "en": { + "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-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": [ + "createFileMessageFromFullPath" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFileMessageFromFullPath" + ], + "reason": null + } + }, + "en": { + "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-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-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFileMessageByURL" + ], + "reason": null + } + }, + "en": { + "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-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": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createCardMessage" + ], + "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": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createLocationMessage" + ], + "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-17", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFaceMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-17", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFaceMessage" + ], + "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-17", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createQuoteMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-17", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createQuoteMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "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/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" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createAdvancedTextMessage", + "RichMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createAdvancedTextMessage", + "RichMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "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/models/RichMessage.java" + ], + "sdkMethods": [ + "createAdvancedQuoteMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-17", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createAdvancedQuoteMessage", + "RichMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-17", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createAdvancedQuoteMessage", + "RichMessage" + ], + "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": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createForwardMessage" + ], + "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-17", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createMergerMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-17", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createMergerMessage" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.sendMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.sendMessage" + ], + "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-17", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.sendMessageNotOss" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-17", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.sendMessageNotOss" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OnMsgSendCallback" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OnMsgSendCallback" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OnAdvanceMsgListener" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OnAdvanceMsgListener" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setCustomBusinessListener", + "OnCustomBusinessListener.onRecvCustomBusinessMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setCustomBusinessListener", + "OnCustomBusinessListener.onRecvCustomBusinessMessage" + ], + "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-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getAdvancedHistoryMessageList" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getAdvancedHistoryMessageList" + ], + "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-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getAdvancedHistoryMessageListReverse" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getAdvancedHistoryMessageListReverse" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.findMessageList" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.findMessageList" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "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/models/Messages.java" + ], + "sdkMethods": [ + "fetchSurroundingMessages" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.fetchSurroundingMessages", + "Messages.getData" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.changeInputState", + "OnConversationListener.onConversationUserInputStatusChanged" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.getInputState" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteMessages", + "OnAdvanceMsgListener.onMsgDeleted" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteUserAllMessagesInConv", + "OnAdvanceMsgListener.onDeleteUserAllMsgsInConv" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.revokeMessageV2", + "OnAdvanceMsgListener.onRecvMessageRevokedV2" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.modifyMessage", + "OnAdvanceMsgListener.onMessageModified" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getConversationPinnedMsgs" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setConversationPinnedMsg", + "OnAdvanceMsgListener.onChangedPinnedMsg" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setConversationPinnedMsg", + "OnAdvanceMsgListener.onChangedPinnedMsg" + ], + "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-17", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.insertSingleMessageToLocalStorage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-17", + "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-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteAllMsgFromLocal" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteAllMsgFromLocal" + ], + "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-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteAllMsgFromLocalAndSvr" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteAllMsgFromLocalAndSvr" + ], + "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-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setMessageLocalEx" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setMessageLocalEx" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "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/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" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.sendGroupMessageReadReceipt", + "OnAdvanceMsgListener.onRecvGroupMessageReadReceipt" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.sendGroupMessageReadReceipt", + "OnAdvanceMsgListener.onRecvGroupMessageReadReceipt" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "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/models/GroupMembersInfo.java" + ], + "sdkMethods": [ + "getGroupMessageReaderList" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getGroupMessageReaderList" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getGroupMessageReaderList" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OpenIMClient.uploadFile", + "OnPutFileListener", + "PutArgs" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OpenIMClient.uploadFile", + "OnPutFileListener", + "PutArgs" + ], + "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": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "Conceptual overview without a code example." + } + } + }, + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingInvite", + "SignalingInvitationInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingInvite", + "SignalingInvitationInfo" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingInviteInGroup", + "SignalingInvitationInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingInviteInGroup", + "SignalingInvitationInfo" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingAccept" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingAccept" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingReject" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingReject" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingCancel" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingCancel" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingHungUp" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingHungUp" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.setSignalingListener", + "_SignalingListener" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.setSignalingListener", + "_SignalingListener" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.getSignalingInvitationInfoStartApp" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.getSignalingInvitationInfoStartApp" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingGetRoomByGroupID", + "RoomCallingInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingGetRoomByGroupID", + "RoomCallingInfo" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingGetTokenByRoomID", + "SignalingCertificate" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingGetTokenByRoomID", + "SignalingCertificate" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingSendCustomSignal", + "OnSignalingListener.onReceiveCustomSignal" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingSendCustomSignal", + "OnSignalingListener.onReceiveCustomSignal" + ], + "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": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.setOnConversationListener", + "OnConversationListener" + ], + "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-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OpenIMClient.logs", + "OpenIMClient.uploadLogs", + "InitConfig", + "LogLevel" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-20", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OpenIMClient.logs", + "OpenIMClient.uploadLogs", + "InitConfig", + "LogLevel" + ], + "reason": null + } + } + }, + "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 new file mode 100644 index 0000000000..ca575fe192 --- /dev/null +++ b/data/structure/android-navigation-labels.json @@ -0,0 +1,411 @@ +{ + "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 your profile": "更新当前用户资料", + "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": "好友", + "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": "查询已订阅用户状态", + "Unsubscribe from user status": "取消订阅用户状态", + "unsubscribe-users-online-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": "入群申请", + "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": "拒绝入群申请", + "Delete group applications": "删除入群申请", + "delete-group-requests": "删除入群申请", + "Retrieving group members": "查询群成员", + "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": "创建图片消息", + "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 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": "创建合并消息", + "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 查找消息", + "Load message context": "读取消息上下文", + "load-message-context": "读取消息上下文", + "Search messages": "搜索消息", + "search-messages": "搜索消息", + "Typing status": "输入状态", + "composing-messages": "输入状态", + "Update typing status": "上报输入状态", + "update-typing-status": "上报输入状态", + "Get typing status": "查询输入状态", + "get-typing-status": "查询输入状态", + "Managing messages": "管理消息", + "managing-messages": "管理消息", + "Delete a local message": "删除本地消息", + "delete-local-message": "删除本地消息", + "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": "查询会话置顶消息", + "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": "设置消息本地扩展", + "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 merged forward message": "创建合并转发消息", + "Send an uploaded media message": "发送不经 OSS 的消息", + "Load message history": "加载历史消息", + "Load message history in reverse": "反向加载历史消息", + "Report typing status": "上报输入状态", + "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": "设置消息本地扩展", + "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..5c363cb3a6 --- /dev/null +++ b/data/structure/android-sidebar.json @@ -0,0 +1,622 @@ +{ + "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" + }, + { + "path": "/sdk/android/user/user-profile/set-friend-add-permission", + "navigationTitle": "Set friend request permissions" + }, + { + "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" + }, + { + "path": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "navigationTitle": "Unsubscribe from user status" + } + ] + } + ] + }, + { + "id": "relationships", + "title": "Relationships", + "children": [ + { + "path": "/sdk/android/user/overview-relationships", + "navigationTitle": "Relationship overview" + }, + { + "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/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" + }, + { + "path": "/sdk/android/group/group-applications/delete-group-requests", + "navigationTitle": "Delete group applications" + } + ] + }, + { + "id": "group/retrieving-group-members", + "title": "Retrieving group members", + "children": [ + { + "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", + { + "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", + { + "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", + { + "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", + { + "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" + ] + }, + { + "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", + { + "path": "/sdk/android/message/retrieving-messages/load-message-context", + "navigationTitle": "Load message context" + }, + "/sdk/android/message/searching-messages/search-messages" + ] + }, + { + "id": "message/composing-messages", + "title": "Typing status", + "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", + { + "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", + "/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": "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" + } + ] + } + ] + }, + { + "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..e26d1cb2df 100644 --- a/data/structure/chat-pages.json +++ b/data/structure/chat-pages.json @@ -1,6531 +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": "/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/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/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/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/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/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": "/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": "/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": "/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": "/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": "/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": "/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": "/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": "/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": "/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": "/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": "/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": "/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-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/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-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/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-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/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-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/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-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/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-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/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/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/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/conversation/managing-conversation-groups/create-conversation-group", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/create-conversation-group", - "title": "Open_im_sdkCreateConversationGroup", + "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/conversation/managing-conversation-groups/create-conversation-group.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/overview.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", + "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/conversation/managing-conversation-groups/get-conversation-groups.mdx" + "contentFile": "content/docs/chat/sdk/ios/getting-started/before-you-start.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", + "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/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" + "contentFile": "content/docs/chat/sdk/ios/getting-started/environment-specific-implementation.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", + "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/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" + "contentFile": "content/docs/chat/sdk/ios/getting-started/authenticate-and-manage-session.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", + "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/conversation/managing-conversation-groups/update-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/getting-started/send-first-message.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", + "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/conversation/managing-conversation-groups/set-conversation-group-order.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/overview-user.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", + "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/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-users/retrieve-users.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", + "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/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile.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", + "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/conversation/managing-conversation-groups/delete-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile.mdx" }, { - "sourcePath": "/sdk/ios/group/overview-group", - "openimPath": "/sdk/ios/group/overview-group", - "title": "Group overview", + "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/overview-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception.mdx" }, { - "sourcePath": "/sdk/ios/group/create-group", - "openimPath": "/sdk/ios/group/create-group", - "title": "Create 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/create-group.mdx" - }, - { - "sourcePath": "/sdk/ios/group/update-group-profile", - "openimPath": "/sdk/ios/group/update-group-profile", - "title": "Update group profile", - "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/update-group-profile.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status.mdx" }, { - "sourcePath": "/sdk/ios/group/set-group-announcement", - "openimPath": "/sdk/ios/group/set-group-announcement", - "title": "Publish a group announcement", + "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": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/set-group-announcement.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status.mdx" }, { - "sourcePath": "/sdk/ios/group/set-group-extension", - "openimPath": "/sdk/ios/group/set-group-extension", - "title": "Set group extra data", + "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": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/set-group-extension.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status.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/friends/get-friend-list-page", + "openimPath": "/sdk/ios/user/friends/get-friend-list-page", + "title": "Get the friend list", "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/friends/get-friend-list-page.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/friends/search-friends", + "openimPath": "/sdk/ios/user/friends/search-friends", + "title": "Search friends", "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/friends/search-friends.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/friends/get-specified-friends-info", + "openimPath": "/sdk/ios/user/friends/get-specified-friends-info", + "title": "Get friend profiles", "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/friends/get-specified-friends-info.mdx" }, { - "sourcePath": "/sdk/ios/group/change-group-mute", - "openimPath": "/sdk/ios/group/change-group-mute", - "title": "Change group mute status", + "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/change-group-mute.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friends/check-friend.mdx" }, { - "sourcePath": "/sdk/ios/group/join-group", - "openimPath": "/sdk/ios/group/join-group", - "title": "Apply to join a group", + "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/join-group.mdx" - }, - { - "sourcePath": "/sdk/ios/group/quit-group", - "openimPath": "/sdk/ios/group/quit-group", - "title": "Leave a group", + "contentFile": "content/docs/chat/sdk/ios/user/friends/update-friends.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/group/quit-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friends/delete-friend.mdx" }, { - "sourcePath": "/sdk/ios/group/dismiss-group", - "openimPath": "/sdk/ios/group/dismiss-group", - "title": "Dismiss a group", + "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/dismiss-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/add-friend.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/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/retrieving-groups/get-specified-groups-info.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient.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/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/retrieving-groups/get-joined-group-list.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant.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/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/retrieving-groups/get-joined-group-list-page.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-unhandled-count.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/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/retrieving-groups/is-join-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/accept-friend-application.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-groups/search-groups", - "openimPath": "/sdk/ios/group/retrieving-groups/search-groups", - "title": "Search groups", + "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-groups/search-groups.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/refuse-friend-application.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/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/group-applications/overview-group-applications.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/delete-friend-requests.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/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/group-applications/get-group-application-list-as-recipient.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users.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/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/group-applications/get-group-application-list-as-applicant.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/block-user.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/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/group-applications/get-group-application-unhandled-count.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/unblock-user.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/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/group-applications/accept-group-application.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/overview-conversation.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/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/group-applications/refuse-group-application.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target.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/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/group-applications/delete-group-requests.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversation-id.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/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/retrieving-group-members/overview-retrieving-group-members.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id.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/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/retrieving-group-members/get-group-member-list.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list.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/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/group/retrieving-group-members/get-specified-group-members-info.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/pin-conversation.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/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/group/retrieving-group-members/get-users-in-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-conversation-extension.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/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/retrieving-group-members/get-group-member-owner-and-admin.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-conversation-draft.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/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/retrieving-group-members/search-group-members.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-receive-option.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/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/group/managing-group-members/invite-user-to-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/clear-group-mentions.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/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/group/managing-group-members/kick-group-member.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/mark-conversation-read.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/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/group/managing-group-members/set-group-member-nickname.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/get-total-unread-count.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/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/group/managing-group-members/set-group-member-role-level.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-private-chat.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/set-burn-duration", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", "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/set-burn-duration.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-message-destruct", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", "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-message-destruct.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-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/group/managing-group-members/transfer-group-owner.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-destruct-time.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/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/group/managing-group-members/change-group-member-mute.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/hide-a-conversation.mdx" }, { - "sourcePath": "/sdk/ios/message/overview-message", - "openimPath": "/sdk/ios/message/overview-message", - "title": "Overview", + "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/overview-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages.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/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-text-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/clear-conversation-messages.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/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-text-at-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/hide-all-conversations.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-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-text-at-all-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups.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-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-at-all-flag.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/create-conversation-group.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-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/get-at-all-tag.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups.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-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-custom-message.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-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-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-image-message-from-full-path.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-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-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-image-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/update-conversation-group.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-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-sound-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order.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-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-sound-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups.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/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-video-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-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/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-video-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/delete-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/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-file-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/overview-group.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/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-file-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/create-group.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/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/creating-messages/create-card-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/update-group-profile.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/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/creating-messages/create-location-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-announcement.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/group/set-group-extension", + "openimPath": "/sdk/ios/group/set-group-extension", + "title": "Set group extra data", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-face-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-extension.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/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/creating-messages/create-quote-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-join-verification.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/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/creating-messages/create-advanced-text-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-member-profile-access.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/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/creating-messages/create-markdown-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-member-friend-permission.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/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/creating-messages/create-forward-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/change-group-mute.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/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/creating-messages/create-merge-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/join-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/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/sending-messages/send-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/quit-group.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/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/sending-messages/send-message-not-oss.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/dismiss-group.mdx" }, { - "sourcePath": "/sdk/ios/message/receiving-messages/receive-messages", - "openimPath": "/sdk/ios/message/receiving-messages/receive-messages", - "title": "Receive messages", + "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/receiving-messages/receive-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-specified-groups-info.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/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/receiving-messages/custom-business-listener.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-joined-group-list.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/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/retrieving-messages/load-older-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-joined-group-list-page.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/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/retrieving-messages/load-newer-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/is-join-group.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/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/retrieving-messages/find-messages-by-id.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/search-groups.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/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/retrieving-messages/load-message-context.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/overview-group-applications.mdx" }, { - "sourcePath": "/sdk/ios/message/searching-messages/search-messages", - "openimPath": "/sdk/ios/message/searching-messages/search-messages", - "title": "Search messages", + "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/searching-messages/search-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-list-as-recipient.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/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/composing-messages/update-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-list-as-applicant.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/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/group/group-applications/get-group-application-unhandled-count.mdx" + }, + { + "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/composing-messages/get-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/accept-group-application.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/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/composing-messages/check-speech-to-text.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/refuse-group-application.mdx" }, { - "sourcePath": "/sdk/ios/message/composing-messages/transcribe-audio", - "openimPath": "/sdk/ios/message/composing-messages/transcribe-audio", - "title": "Transcribe audio", + "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/composing-messages/transcribe-audio.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/delete-group-requests.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-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/composing-messages/save-local-transcript.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members.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/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/delete-local-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-group-member-list.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/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/delete-saved-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-specified-group-members-info.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/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/delete-saved-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-users-in-group.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/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/delete-user-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/revoke-a-message", - "openimPath": "/sdk/ios/message/managing-messages/revoke-a-message", - "title": "Revoke a message", + "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/revoke-a-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/search-group-members.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/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-messages/modify-a-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/invite-user-to-group.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/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-messages/get-pinned-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/kick-group-member.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/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/message/managing-messages/set-message-pinned.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-nickname.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/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/message/managing-messages/insert-local-single-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-role-level.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/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/message/managing-messages/insert-local-group-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-avatar.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/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/message/managing-messages/clear-all-local-messages.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-extension.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/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/message/managing-messages/clear-all-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/transfer-group-owner.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/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/message/managing-messages/set-message-local-ex.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/change-group-member-mute.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/message/overview-message", + "openimPath": "/sdk/ios/message/overview-message", + "title": "Overview", "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/message/overview-message.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/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/message/managing-read-status/send-group-read-receipts.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-message.mdx" }, { - "sourcePath": "/sdk/ios/file-uploads/upload-file", - "openimPath": "/sdk/ios/file-uploads/upload-file", - "title": "Upload a file", + "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/file-uploads/upload-file.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-at-message.mdx" }, { - "sourcePath": "/sdk/ios/calling/overview-calling", - "openimPath": "/sdk/ios/calling/overview-calling", - "title": "Calling overview", + "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/overview-calling.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-at-all-message.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/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/managing-calls/start-single-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-at-all-flag.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/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/managing-calls/start-group-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/get-at-all-tag.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/accept-call", - "openimPath": "/sdk/ios/calling/managing-calls/accept-call", - "title": "Accept a call", + "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/managing-calls/accept-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-custom-message.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/reject-call", - "openimPath": "/sdk/ios/calling/managing-calls/reject-call", - "title": "Reject a call", + "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/calling/managing-calls/reject-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-image-message-from-full-path.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/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/calling/managing-calls/cancel-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-image-message-by-url.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-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/ios/calling/managing-calls/hang-up-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-sound-message-from-full-path.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-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/ios/calling/managing-calls/handle-call-events.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-sound-message-by-url.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-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/ios/calling/retrieving-call-information/restore-pending-invitation.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-video-message-from-full-path.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-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/ios/calling/retrieving-call-information/get-room-by-group-id.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-video-message-by-url.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/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/ios/calling/retrieving-call-information/get-token-by-room-id.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-file-message-from-full-path.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-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/ios/calling/sending-custom-signals/send-a-custom-signal.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-file-message-by-url.mdx" }, { - "sourcePath": "/sdk/ios/events/overview-events", - "openimPath": "/sdk/ios/events/overview-events", - "title": "Events overview", + "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/ios/events/overview-events.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-card-message.mdx" }, { - "sourcePath": "/sdk/ios/logger", - "openimPath": "/sdk/ios/logger", - "title": "Logger", + "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/ios/logger.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-location-message.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", - "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/channel/moderating-a-channel/freeze-and-unfreeze-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-face-message.mdx" }, { - "sourcePath": "/sdk/android/channel/overview-channel", - "openimPath": "/sdk/android/channel/overview-channel", - "title": "Overview", - "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/channel/overview-channel.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-quote-message.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-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/getting-started/send-first-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-advanced-text-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", - "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/message/adding-extra-data-to-a-message/add-extra-data-to-a-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-markdown-message.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", - "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/message/managing-a-message/generate-thumbnails-of-a-file-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-forward-message.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", - "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/message/managing-a-message/react-to-a-message-in-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-merge-message.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", - "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/message/managing-a-message/send-typing-indicators-to-other-members.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/sending-messages/send-message.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", - "context": "chat/sdk/android", + "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/message/managing-pinned-messages-in-group-channels/pin-a-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/sending-messages/send-message-not-oss.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/create-a-poll", - "openimPath": "/sdk/android/message/managing-polls/create-a-poll", - "title": "Create a poll", - "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/message/managing-polls/create-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/receiving-messages/receive-messages.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", - "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/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/receiving-messages/custom-business-listener.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", - "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/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-older-messages.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", - "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/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-newer-messages.mdx" }, { - "sourcePath": "/sdk/android/message/overview-message", - "openimPath": "/sdk/android/message/overview-message", - "title": "Overview", - "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/message/overview-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/find-messages-by-id.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-messages/retrieve-a-message", - "openimPath": "/sdk/android/message/retrieving-messages/retrieve-a-message", - "title": "Retrieve a message", - "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/message/retrieving-messages/retrieve-a-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-message-context.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", - "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/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/searching-messages/search-messages.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", - "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/message/sending-a-message/share-an-encrypted-file.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/update-typing-status.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/smart-throttling", - "openimPath": "/sdk/android/message/sending-a-message/smart-throttling", - "title": "Smart throttling", - "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/message/sending-a-message/smart-throttling.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/get-typing-status.mdx" }, { - "sourcePath": "/sdk/android/message/translating-messages/auto-translate-messages", - "openimPath": "/sdk/android/message/translating-messages/auto-translate-messages", - "title": "Auto-translate messages", - "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/message/translating-messages/auto-translate-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/check-speech-to-text.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", - "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/message/translating-messages/translate-messages-on-demand.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/transcribe-audio.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", - "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/message/using-message-threading/create-a-message-thread.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/save-local-transcript.mdx" }, { - "sourcePath": "/sdk/android/overview", - "openimPath": "/sdk/android/overview", - "title": "OpenIM SDK for Android", - "context": "chat/sdk/android", - "template": "overview", - "contentFile": "content/docs/chat/sdk/android/overview.mdx" + "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/ios/message/managing-messages/delete-local-message.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", - "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/push-notifications/managing-push-notifications/configure-push-notification-preferences.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-saved-message.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", - "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/push-notifications/managing-push-notifications/push-notification-translation.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-saved-messages.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/overview-push-notifications", - "openimPath": "/sdk/android/push-notifications/overview-push-notifications", - "title": "Overview", - "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/push-notifications/overview-push-notifications.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-user-messages.mdx" }, { - "sourcePath": "/sdk/android/report/overview-report", - "openimPath": "/sdk/android/report/overview-report", - "title": "Overview", - "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/report/overview-report.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/revoke-a-message.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", - "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/user/moderating-a-user/block-and-unblock-other-members.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/modify-a-message.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", - "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/user/moderating-a-user/mute-and-unmute-a-user.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/get-pinned-messages.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", - "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/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/set-message-pinned.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", - "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/user/retrieving-users/retrieve-members-who-have-read-a-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/insert-local-single-message.mdx" }, { - "sourcePath": "/sdk/android/application/authenticating-a-user/authentication", - "openimPath": "/sdk/android/application/authenticating-a-user/authentication", - "title": "Authentication", - "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/application/authenticating-a-user/authentication.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/insert-local-group-message.mdx" }, { - "sourcePath": "/sdk/android/application/overview-application", - "openimPath": "/sdk/android/application/overview-application", - "title": "Overview", - "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/application/overview-application.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/clear-all-local-messages.mdx" }, { - "sourcePath": "/sdk/android/application/understanding-rate-limits/rate-limits", - "openimPath": "/sdk/android/application/understanding-rate-limits/rate-limits", - "title": "Rate limits", - "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/application/understanding-rate-limits/rate-limits.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/clear-all-messages.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", - "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/channel/categorizing-channels/categorize-channels-by-custom-type.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/set-message-local-ex.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", - "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/channel/creating-a-channel/create-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-read-status/get-group-message-readers.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", - "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/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-read-status/send-group-read-receipts.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", - "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/channel/inviting-users-to-a-group-channel/invite-users-as-members.mdx" + "contentFile": "content/docs/chat/sdk/ios/file-uploads/upload-file.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", - "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/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/overview-calling.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", - "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/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/start-single-call.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", - "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/channel/managing-channel-metacounters/manage-channel-metacounters.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/start-group-call.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", - "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/channel/managing-channel-metadata/manage-channel-metadata.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/accept-call.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-channels/delete-a-channel", - "openimPath": "/sdk/android/channel/managing-channels/delete-a-channel", - "title": "Delete a channel", - "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/channel/managing-channels/delete-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/reject-call.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", - "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/channel/managing-channels/hide-or-archive-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/cancel-call.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", - "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/channel/managing-channels/refresh-all-data-related-to-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/hang-up-call.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", - "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/channel/managing-operators/register-and-remove-operators.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/handle-call-events.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", - "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/channel/retrieving-channels/retrieve-a-channel-by-url.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/restore-pending-invitation.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", - "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/channel/retrieving-channels/retrieve-a-list-of-channels.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/get-room-by-group-id.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", - "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/channel/searching-channels/filter-group-channels-by-user-ids.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/get-token-by-room-id.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", - "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/channel/searching-channels/search-group-channels-by-name-url-or-other-filters.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/sending-custom-signals/send-a-custom-signal.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", - "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/channel/searching-channels/search-open-channels-by-name-url-or-custom-types.mdx" + "contentFile": "content/docs/chat/sdk/ios/events/overview-events.mdx" }, { - "sourcePath": "/sdk/android/deprecated", - "openimPath": "/sdk/android/deprecated", - "title": "Deprecated", - "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/deprecated.mdx" + "contentFile": "content/docs/chat/sdk/ios/logger.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/overview", + "openimPath": "/sdk/android/overview", + "title": "OpenIM Android SDK overview", "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" + "template": "overview", + "contentFile": "content/docs/chat/sdk/android/overview.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/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/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/before-you-start.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/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/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx" }, { - "sourcePath": "/sdk/android/event-handler/overview-event-handler", - "openimPath": "/sdk/android/event-handler/overview-event-handler", - "title": "Event handler", + "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/event-handler/overview-event-handler.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx" }, { - "sourcePath": "/sdk/android/getting-started/collection-migration-guide", - "openimPath": "/sdk/android/getting-started/collection-migration-guide", - "title": "Collection migration guide", + "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/getting-started/collection-migration-guide.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/send-first-message.mdx" }, { - "sourcePath": "/sdk/android/getting-started/kotlin-extension", - "openimPath": "/sdk/android/getting-started/kotlin-extension", - "title": "Kotlin extension (KTX)", + "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/getting-started/kotlin-extension.mdx" + "contentFile": "content/docs/chat/sdk/android/user/overview-user.mdx" }, { - "sourcePath": "/sdk/android/getting-started/migration-guide", - "openimPath": "/sdk/android/getting-started/migration-guide", - "title": "Migration guide", + "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/getting-started/migration-guide.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx" }, { - "sourcePath": "/sdk/android/local-caching/overview-local-caching", - "openimPath": "/sdk/android/local-caching/overview-local-caching", - "title": "Local caching", + "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/local-caching/overview-local-caching.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.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/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/local-caching/using-group-channel-collection/group-channel-collection.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-self-info.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/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/local-caching/using-message-collection/message-collection.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx" }, { - "sourcePath": "/sdk/android/logger", - "openimPath": "/sdk/android/logger", - "title": "Logger", + "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/logger.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-friend-add-permission.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/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/categorizing-messages/categorize-messages-by-custom-type.mdx" + "contentFile": "content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.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/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/listing-changelogs/list-changelogs-of-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.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/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/message/managing-a-message/clear-the-chat-history-in-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.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/user/overview-relationships", + "openimPath": "/sdk/android/user/overview-relationships", + "title": "Relationship overview", "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/user/overview-relationships.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/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/managing-a-message/delete-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/get-friend-list-page.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/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/managing-a-message/display-open-graph-tags-in-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/search-friends.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/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/managing-a-message/update-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/get-friends-info.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/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/managing-pinned-messages-in-group-channels/list-pinned-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/check-friend.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/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/managing-pinned-messages-in-group-channels/unpin-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/update-friends.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/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/managing-polls/add-a-poll-option.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/delete-friend.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/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/managing-polls/cast-or-cancel-a-vote.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/add-friend.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/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/managing-polls/close-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.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/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/managing-polls/delete-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.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/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/managing-polls/delete-a-poll-option.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.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/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/managing-polls/list-changelogs-of-polls.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.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/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/managing-polls/retrieve-a-list-of-polls.mdx" + "contentFile": "content/docs/chat/sdk/android/user/blacklist/get-blacklist.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/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/managing-polls/retrieve-a-list-of-voters.mdx" + "contentFile": "content/docs/chat/sdk/android/user/blacklist/add-blacklist.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/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/managing-polls/retrieve-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/android/user/blacklist/remove-blacklist.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/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/managing-polls/retrieve-a-poll-option.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/overview-conversation.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/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/managing-polls/update-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.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/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/managing-polls/update-a-poll-option.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.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/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/managing-read-status-in-a-group-channel/get-read-status.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.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/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/managing-read-status-in-a-group-channel/mark-messages-as-read.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.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/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/managing-read-status-in-a-group-channel/mark-messages-as-unread.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.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/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/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.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/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/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.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/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/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.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/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/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.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/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/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.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/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/managing-scheduled-messages-in-group-channel/update-a-scheduled-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.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/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/receiving-messages-through-event-handler/receive-messages-in-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.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/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/receiving-messages-through-event-handler/receive-messages-in-an-open-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.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/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/retrieving-messages/retrieve-a-list-of-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.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/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/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.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/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-unread-count-in-a-group-channel/members-who-havent-received-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.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/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-unread-count-in-a-group-channel/unread-channels.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.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/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-unread-count-in-a-group-channel/unread-items.mdx" + "contentFile": "content/docs/chat/sdk/android/group/overview-group.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/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/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/group/create-group.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/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/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels.mdx" + "contentFile": "content/docs/chat/sdk/android/group/update-group-profile.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/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/sending-a-message/cancel-an-in-progress-file-upload.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-announcement.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/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/sending-a-message/send-a-critical-alert-message-to-ios-device-users.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-extension.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/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/sending-a-message/send-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-join-verification.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/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/sending-a-message/send-an-admin-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-member-profile-access.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/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/sending-a-message/spam-flood-protection.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-member-friend-permission.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/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/sending-a-message/track-file-upload-progress-using-a-handler.mdx" + "contentFile": "content/docs/chat/sdk/android/group/change-group-mute.mdx" }, { - "sourcePath": "/sdk/android/message/translating-messages/translation-engine", - "openimPath": "/sdk/android/message/translating-messages/translation-engine", - "title": "Translation engine", + "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/translating-messages/translation-engine.mdx" + "contentFile": "content/docs/chat/sdk/android/group/join-group.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/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/using-message-threading/list-replies-in-a-message-thread.mdx" + "contentFile": "content/docs/chat/sdk/android/group/quit-group.mdx" }, { - "sourcePath": "/sdk/android/migrating-to-sendbird", - "openimPath": "/sdk/android/migrating-to-openim", - "title": "Migrating to OpenIM", + "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/migrating-to-openim.mdx" + "contentFile": "content/docs/chat/sdk/android/group/dismiss-group.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/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/push-notifications/managing-push-notifications/push-notification-content-templates.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.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/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/push-notifications/managing-push-notifications/push-notification-tester.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.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/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/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.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/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/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/search-groups.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/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/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.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/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/push-notifications/multi-device-support/set-up-push-notifications-for-fcm.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.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/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/push-notifications/multi-device-support/set-up-push-notifications-for-hms.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/accept-group-application.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/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/report/creating-a-report/report-a-message-user-or-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/refuse-group-application.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/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/user/managing-user-metadata/manage-user-metadata.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/delete-group-requests.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/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/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.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/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/user/moderating-a-user/retrieve-a-list-of-muted-users.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx" }, { - "sourcePath": "/sdk/android/user/overview-user", - "openimPath": "/sdk/android/user/overview-user", - "title": "Overview", + "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/user/overview-user.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.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/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/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.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/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/user/retrieving-and-updating-user-information/update-user-profile.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.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/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/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.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/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/user/retrieving-users/retrieve-a-list-of-operators.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.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/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/user/retrieving-users/retrieve-a-list-of-users-in-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.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/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/user/retrieving-users/retrieve-a-list-of-users-in-an-application.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.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/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/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read.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/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/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" - }, - { - "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" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-custom-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", + "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/flutter/user/retrieving-and-updating-user-information/subscribe-user-status.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message.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-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/get-subscribed-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/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-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/unsubscribe-user-status.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.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", + "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/friends/get-friend-list-page.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message.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-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/search-friends.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.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-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/get-friends-info.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.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", + "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/check-friend.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message.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-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/update-friends.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.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-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/delete-friend.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.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", + "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/friend-applications/add-friend.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message.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-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/get-friend-application-list-as-recipient.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-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-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-applicant.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-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-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-unhandled-count.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-card-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-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/accept-friend-application.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-location-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-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/refuse-friend-application.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-face-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-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/moderating-a-user/retrieve-a-list-of-blocked-users.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-quote-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-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/block-user.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-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-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/unblock-user.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-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-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/conversation/overview-conversation.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-forward-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/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/retrieving-conversations/get-conversation-by-target.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-merger-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", + "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-id.mdx" + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message.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/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-conversations-by-id.mdx" + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.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/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/retrieve-conversation-list.mdx" + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.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-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/receiving-messages/receive-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/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-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-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/flutter/conversation/managing-conversations/set-conversation-draft.mdx" + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-older-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/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/android/message/retrieving-messages/load-newer-messages.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/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/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/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/flutter/conversation/managing-conversations/mark-conversation-read.mdx" + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.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/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/get-total-unread-count.mdx" + "contentFile": "content/docs/chat/sdk/android/message/searching-messages/search-messages.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/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/android/message/composing-messages/update-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/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-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-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/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-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/flutter/conversation/managing-conversations/hide-a-conversation.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-saved-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/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/delete-conversation-with-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.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/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/clear-conversation-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/revoke-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/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-conversation-groups/overview-conversation-groups.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/modify-a-message.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/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/create-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.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/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/get-conversation-groups.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.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-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-group-info-with-conversations.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-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/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-ids-by-conversation-id.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.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-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/update-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-local-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/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/set-conversation-group-order.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.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-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/add-conversations-to-groups.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.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/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/remove-conversations-from-groups.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.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/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/delete-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.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/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 5cfd03ac82..631a3fd882 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: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: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 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", "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..5b2bab00e7 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,17 +89,25 @@ 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/android/user/online-status/unsubscribe-users-online-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); 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, ); @@ -125,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`, ); 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..0d79f9b171 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,76 @@ 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'); + 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__/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/__tests__/wasm-commercial.test.mjs b/scripts/__tests__/wasm-commercial.test.mjs index 2e0fed8525..70266d7356 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,9 @@ const nonCommercialEvents = [ ]; const platformSymbolAliases = { + android: { + getConversationPinnedMsgs: 'getConversationPinnedMsg', + }, flutter: { getConversationGroupByConversationID: 'getConversationGroupIDsByConversationID', onHangup: 'OnHangUp', @@ -124,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([ @@ -143,6 +152,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 +214,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 +223,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', ); @@ -416,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', ); @@ -440,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', () => { @@ -494,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/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..a9e2951648 100644 --- a/scripts/sync-client-sdk-route-skeletons.mjs +++ b/scripts/sync-client-sdk-route-skeletons.mjs @@ -7,6 +7,58 @@ 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/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', + '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', + 'user/online-status/unsubscribe-users-online-status': 'Unsubscribe from user status', + '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', +}; + const conversationGroupTitles = { ios: { 'conversation/managing-conversation-groups/overview-conversation-groups': @@ -55,13 +107,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 +139,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 +157,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 +180,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 +192,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 +207,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 +228,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 +303,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-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'), 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..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; @@ -291,6 +293,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..6649482ee1 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: @@ -309,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[] { @@ -373,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/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..6124dbf351 --- /dev/null +++ b/src/generated/android-sdk-zh-content.json @@ -0,0 +1,1991 @@ +{ + "sourceContext": "chat/sdk/android", + "sourceRoot": "content/zh/docs/chat/sdk/android", + "pageCount": 146, + "manualPageCount": 146, + "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/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", + "/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/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/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", + "/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": "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", + "/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/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", + "/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/message/managing-read-status/send-group-read-receipts": "published", + "/sdk/android/message/managing-read-status/get-group-message-readers": "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 your profile": "更新当前用户资料", + "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": "好友", + "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": "查询已订阅用户状态", + "Unsubscribe from user status": "取消订阅用户状态", + "unsubscribe-users-online-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": "入群申请", + "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": "拒绝入群申请", + "Delete group applications": "删除入群申请", + "delete-group-requests": "删除入群申请", + "Retrieving group members": "查询群成员", + "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": "创建图片消息", + "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 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": "创建合并消息", + "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 查找消息", + "Load message context": "读取消息上下文", + "load-message-context": "读取消息上下文", + "Search messages": "搜索消息", + "search-messages": "搜索消息", + "Typing status": "输入状态", + "composing-messages": "输入状态", + "Update typing status": "上报输入状态", + "update-typing-status": "上报输入状态", + "Get typing status": "查询输入状态", + "get-typing-status": "查询输入状态", + "Managing messages": "管理消息", + "managing-messages": "管理消息", + "Delete a local message": "删除本地消息", + "delete-local-message": "删除本地消息", + "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": "查询会话置顶消息", + "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": "设置消息本地扩展", + "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 merged forward message": "创建合并转发消息", + "Send an uploaded media message": "发送不经 OSS 的消息", + "Load message history": "加载历史消息", + "Load message history in reverse": "反向加载历史消息", + "Report typing status": "上报输入状态", + "Get pinned messages in a conversation": "查询会话置顶消息", + "Insert a local one-to-one message": "插入本地单聊消息", + "Clear local and server messages": "清理全部消息", + "Set a local message extension": "设置消息本地扩展", + "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)。确认登录回调成功且 `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: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": [ + { + "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. 分别等待登录回调成功与 `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, + "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两个账号登录后,发送方的登录回调成功且 `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": [ + { + "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` 标识用户。用户相关 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, + "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## 查询公开资料\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": "#搜索添加好友" + }, + { + "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 // 使用 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": [ + { + "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` 只设置实际需要修改的字段。\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": [ + { + "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 // 设置全局消息接收方式成功\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 // 使用 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": [ + { + "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 // 使用 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 // 取消订阅成功\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": "取消订阅用户状态" + }, + "/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```", + "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 // 使用 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 // 使用 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 // 使用 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 // 更新好友资料成功\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 // 删除好友成功\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 // 好友申请发送成功\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 // 使用 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 // 使用 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 // 接受好友申请成功\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 // 拒绝好友申请成功\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": "黑名单记录当前用户主动拉黑的用户,可用于黑名单设置页、资料卡中的关系状态和聊天入口限制。\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": [ + { + "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 // 拉黑用户成功\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 // 取消拉黑成功\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", + "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## 会话数据\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": [ + { + "depth": 2, + "title": "会话标识", + "url": "#会话标识" + }, + { + "depth": 2, + "title": "会话数据", + "url": "#会话数据" + }, + { + "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。\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", + "title": "查询指定会话" + }, + "/sdk/android/conversation/retrieving-conversations/get-conversation-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": "使用 `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 // 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": [ + { + "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 // 请求已完成。\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 // 请求已完成。\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 // 请求已完成。\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 // 请求已完成。\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 // 请求已完成。\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 // 请求已完成。\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 // 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 // 请求已完成。\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 // 请求已完成。\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 // 请求已完成。\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 // 请求已完成,会话已隐藏。\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 // 请求已完成,会话及其消息已删除。\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 // 请求已完成,消息已清空。\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", + "title": "清空会话消息" + }, + "/sdk/android/group/overview-group": { + "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) { /* 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) { /* 请求已完成。 */ }\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) { /* 请求已完成。 */ }\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) { /* 请求已完成。 */ }\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) { /* 请求已完成。 */ }\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) { /* 请求已完成。 */ }\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) { /* 请求已完成。 */ }\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) { /* 请求已完成。 */ }\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) { /* 请求已提交。 */ }\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) { /* 请求已完成。 */ }\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) { /* 请求已完成。 */ }\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) { /* 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) { /* 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) { /* 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) { /* 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) { /* 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) { /* 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) { /* 请求已完成。 */ }\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) { /* 请求已完成。 */ }\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) { /* 请求已完成。 */ }\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) { /* 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) { /* 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) { /* 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) { /* 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) { /* 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) { /* 请求已完成。 */ }\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) { /* 请求已完成。 */ }\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) { /* 请求已完成。 */ }\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) { /* 请求已完成。 */ }\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) { /* 请求已完成。 */ }\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) { /* 请求已完成。 */ }\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) { /* 请求已完成。 */ }\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) { /* 请求已完成。 */ }\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 // 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": [ + { + "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()` 只创建待发送的 `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```", + "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": { + "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": "```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": "使用本地路径创建图片消息" + }, + "/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": { + "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": "```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": "使用本地路径创建音频消息" + }, + "/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": { + "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": "```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": "使用本地路径创建视频消息" + }, + "/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": { + "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": "```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": "使用本地路径创建文件消息" + }, + "/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": "`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`。\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-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实体范围必须对应最终回复正文。`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```", + "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`。通过 `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", + "title": "发送消息" + }, + "/sdk/android/message/sending-messages/send-message-not-oss": { + "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": "通过 `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) { /* 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) { /* payload 是自定义业务数据。 */ }\n});\n```", + "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`,后续将上一页边界消息作为起点。普通历史消息使用 `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": "加载历史消息" + }, + "/sdk/android/message/retrieving-messages/load-newer-messages": { + "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": "反向加载历史消息" + }, + "/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) { /* 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 // 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": [ + { + "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```", + "description": "使用 searchLocalMessages 搜索当前账号已同步到本地的消息。", + "headings": [], + "sourcePath": "/sdk/android/message/searching-messages/search-messages", + "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 // 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 // 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", + "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| 参数 | 类型 | 是否必填 | 说明 |\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": [ + { + "depth": 2, + "title": "参数说明", + "url": "#参数说明" + } + ], + "sourcePath": "/sdk/android/message/managing-messages/delete-saved-messages", + "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 // 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 // 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 // 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) { /* 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 // 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` 是接收者用户 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", + "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/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 // 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 // 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": [ + { + "depth": 2, + "title": "参数说明", + "url": "#参数说明" + } + ], + "sourcePath": "/sdk/android/message/managing-read-status/get-group-message-readers", + "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 // 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": [ + { + "depth": 2, + "title": "参数说明", + "url": "#参数说明" + }, + { + "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```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": [ + { + "depth": 2, + "title": "参数说明", + "url": "#参数说明" + } + ], + "sourcePath": "/sdk/android/calling/managing-calls/start-single-call", + "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 // 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 // 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 // 拒绝信令请求已完成。\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 // 信令操作已完成。\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 // 信令操作已完成。\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 // 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 // 使用前校验 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 // 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 // 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 // 信令发送请求已完成。\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": [ + { + "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;再次设置会覆盖之前设置的 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": [ + { + "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在调用 `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": [ + { + "depth": 2, + "title": "初始化日志配置", + "url": "#初始化日志配置" + }, + { + "depth": 2, + "title": "写入应用日志", + "url": "#写入应用日志" + }, + { + "depth": 2, + "title": "上传日志", + "url": "#上传日志" + }, + { + "depth": 2, + "title": "使用 operationID 定位一次 SDK 调用", + "url": "#使用-operationid-定位一次-sdk-调用" + }, + { + "depth": 2, + "title": "相关页面", + "url": "#相关页面" + } + ], + "sourcePath": "/sdk/android/logger", + "title": "日志" + } + } +} diff --git a/src/generated/navigation.json b/src/generated/navigation.json index 82f0673107..1411d08647 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,1634 +4368,1675 @@ { "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 your profile", + "href": "/sdk/android/user/user-profile/set-self-info", + "type": "page", + "children": [], + "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/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", + "title": "Online status", + "href": null, + "type": "folder", + "children": [ + { + "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": 255 + "minIndex": 140, + "navigationTitle": "Subscribe to user status" }, { - "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/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": 158 + "minIndex": 141, + "navigationTitle": "Refresh subscribed 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/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": 256 + "minIndex": 142, + "navigationTitle": "Unsubscribe from user status" } ], - "minIndex": 158 + "minIndex": 140 + } + ], + "minIndex": 134 + }, + { + "id": "relationships", + "segment": "relationships", + "title": "Relationships", + "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/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": 144, + "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": 145, + "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": 146, + "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": 147, + "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": 148, + "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": 149, + "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": 150, + "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": 151, + "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": 152, + "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": 153, + "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": 154, + "navigationTitle": "Reject a friend application" + } + ], + "minIndex": 150 } ], - "minIndex": 157 + "minIndex": 144 }, { - "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": 155 + }, + { + "id": "user/blacklist/add-blacklist", + "segment": "add-blacklist", + "title": "Block a user", + "href": "/sdk/android/user/blacklist/add-blacklist", + "type": "page", + "children": [], + "minIndex": 156, + "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": 157, + "navigationTitle": "Unblock a user" } ], - "minIndex": 248 + "minIndex": 155 } ], - "minIndex": 155 + "minIndex": 143 }, { - "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": 158 }, { - "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": 159, + "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": 160, + "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": 161, + "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": 162 } ], - "minIndex": 166 + "minIndex": 159 }, { - "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": 163, + "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": 164, + "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": 165 } ], - "minIndex": 164 + "minIndex": 163 }, { - "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": 166, + "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", + "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": 176 + "minIndex": 167, + "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": 168, + "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": 169, + "navigationTitle": "Track the total unread count" } ], - "minIndex": 162 + "minIndex": 166 }, { - "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": 170, + "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": 171, + "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": 172, + "navigationTitle": "Schedule server message deletion" } ], "minIndex": 170 }, { - "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": 173 + }, { - "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": 174, + "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": 175, + "navigationTitle": "Clear messages in a conversation" } ], - "minIndex": 168 + "minIndex": 173 } ], - "minIndex": 129 + "minIndex": 158 }, { - "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": 176, + "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", + "id": "group/create-group", + "segment": "create-group", + "title": "Create a group", + "href": "/sdk/android/group/create-group", "type": "page", "children": [], - "minIndex": 233 + "minIndex": 177, + "navigationTitle": "Create a group" }, { - "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", + "id": "group/update-group-profile", + "segment": "update-group-profile", + "title": "Update group profile", + "href": "/sdk/android/group/update-group-profile", "type": "page", "children": [], - "minIndex": 232 + "minIndex": 178, + "navigationTitle": "Update group profile" }, { - "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", + "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": 234 + "minIndex": 179, + "navigationTitle": "Publish a group announcement" }, { - "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", + "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": 236 - }, + "minIndex": 180, + "navigationTitle": "Set group extra data" + } + ], + "minIndex": 177 + }, + { + "id": "group/permissions", + "segment": "permissions", + "title": "Group permissions", + "href": null, + "type": "folder", + "children": [ { - "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/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": 231 + "minIndex": 181, + "navigationTitle": "Set group join verification" }, { - "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/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": 144 + "minIndex": 182, + "navigationTitle": "Set member profile access" }, { - "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-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": 235 + "minIndex": 183, + "navigationTitle": "Set member friend request permission" }, { - "id": "message/sending-a-message/smart-throttling", - "segment": "smart-throttling", - "title": "Smart throttling", - "href": "/sdk/android/message/sending-a-message/smart-throttling", + "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": 145 + "minIndex": 184, + "navigationTitle": "Change group mute status" } ], - "minIndex": 144 + "minIndex": 181 }, { - "id": "message/receiving-messages-through-event-handler", - "segment": "receiving-messages-through-event-handler", - "title": "Receiving messages through event handler", + "id": "group/joining-and-leaving", + "segment": "joining-and-leaving", + "title": "Joining and leaving groups", "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/join-group", + "segment": "join-group", + "title": "Apply to join a group", + "href": "/sdk/android/group/join-group", "type": "page", "children": [], - "minIndex": 223 + "minIndex": 185, + "navigationTitle": "Apply to join a group" }, { - "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", - "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": [ - { - "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/quit-group", + "segment": "quit-group", + "title": "Leave a group", + "href": "/sdk/android/group/quit-group", "type": "page", "children": [], - "minIndex": 148 + "minIndex": 186, + "navigationTitle": "Leave a group" }, { - "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/dismiss-group", + "segment": "dismiss-group", + "title": "Dismiss a group", + "href": "/sdk/android/group/dismiss-group", "type": "page", "children": [], - "minIndex": 238 + "minIndex": 187, + "navigationTitle": "Dismiss a group" } ], - "minIndex": 148 + "minIndex": 185 }, { - "id": "message/retrieving-messages", - "segment": "retrieving-messages", - "title": "Retrieving messages", + "id": "group/retrieving-groups", + "segment": "retrieving-groups", + "title": "Retrieving 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/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": 224 + "minIndex": 188, + "navigationTitle": "Get group information" }, { - "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/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": 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": 189, + "navigationTitle": "Get joined groups by page" + }, + { + "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": 190, + "navigationTitle": "Check group membership" + }, { - "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/retrieving-groups/search-groups", + "segment": "search-groups", + "title": "Search groups", + "href": "/sdk/android/group/retrieving-groups/search-groups", "type": "page", "children": [], - "minIndex": 143 + "minIndex": 191, + "navigationTitle": "Search groups" } ], - "minIndex": 143 + "minIndex": 188 }, { - "id": "message/managing-a-message", - "segment": "managing-a-message", - "title": "Managing a message", + "id": "group/group-applications", + "segment": "group-applications", + "title": "Group applications", "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", - "type": "page", - "children": [], - "minIndex": 195 - }, - { - "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/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": 198 + "minIndex": 192, + "navigationTitle": "Get received group applications" }, { - "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/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": 196 + "minIndex": 193, + "navigationTitle": "Get sent group applications" }, { - "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/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": 134 + "minIndex": 194, + "navigationTitle": "Accept a group application" }, { - "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/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": 194 + "minIndex": 195, + "navigationTitle": "Reject a group application" }, { - "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/delete-group-requests", + "segment": "delete-group-requests", + "title": "Delete group applications", + "href": "/sdk/android/group/group-applications/delete-group-requests", "type": "page", "children": [], - "minIndex": 135 - }, - { - "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", - "type": "page", - "children": [], - "minIndex": 197 - }, - { - "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", - "type": "page", - "children": [], - "minIndex": 133 + "minIndex": 196, + "navigationTitle": "Delete group applications" } ], - "minIndex": 133 + "minIndex": 192 }, { - "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", - "type": "page", - "children": [], - "minIndex": 138 - }, - { - "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": "Get group members", + "href": "/sdk/android/group/retrieving-group-members/get-group-member-list", "type": "page", "children": [], - "minIndex": 221 + "minIndex": 197, + "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 group member profiles", + "href": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", "type": "page", "children": [], - "minIndex": 216 + "minIndex": 198, + "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 users in a group", + "href": "/sdk/android/group/retrieving-group-members/get-users-in-group", "type": "page", "children": [], - "minIndex": 217 + "minIndex": 199, + "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 group owners and admins", + "href": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", "type": "page", "children": [], - "minIndex": 219 + "minIndex": 200, + "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": 201, + "navigationTitle": "Search group members" } ], - "minIndex": 138 + "minIndex": 197 }, { - "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": 202, + "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": 203, + "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 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": 204, + "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": 205, + "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 avatar", + "href": "/sdk/android/group/managing-group-members/set-group-member-avatar", "type": "page", "children": [], - "minIndex": 214 + "minIndex": 206, + "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 group member extra data", + "href": "/sdk/android/group/managing-group-members/set-group-member-extension", "type": "page", "children": [], - "minIndex": 215 + "minIndex": 207, + "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": 208, + "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": 209, + "navigationTitle": "Mute or unmute a group member" } ], - "minIndex": 139 + "minIndex": 202 + } + ], + "minIndex": 176 + }, + { + "id": "message", + "segment": "message", + "title": "Message", + "href": null, + "type": "folder", + "children": [ + { + "id": "message/overview-message", + "segment": "overview-message", + "title": "Message overview", + "href": "/sdk/android/message/overview-message", + "type": "page", + "children": [], + "minIndex": 210 }, { - "id": "message/mentioning-other-users-in-a-message", - "segment": "mentioning-other-users-in-a-message", - "title": "Mentioning other users in a message", + "id": "message/creating-messages", + "segment": "creating-messages", + "title": "Creating messages", "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", + "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": 140 - } - ], - "minIndex": 140 - }, - { - "id": "message/managing-polls", - "segment": "managing-polls", - "title": "Managing polls", - "href": null, - "type": "folder", - "children": [ + "minIndex": 211 + }, { - "id": "message/managing-polls/create-a-poll", - "segment": "create-a-poll", - "title": "Create a poll", - "href": "/sdk/android/message/managing-polls/create-a-poll", + "id": "message/creating-messages/create-text-at-message", + "segment": "create-text-at-message", + "title": "Create a mention message", + "href": "/sdk/android/message/creating-messages/create-text-at-message", "type": "page", "children": [], - "minIndex": 137 + "minIndex": 212 }, { - "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-custom-message", + "segment": "create-custom-message", + "title": "Create a custom message", + "href": "/sdk/android/message/creating-messages/create-custom-message", "type": "page", "children": [], - "minIndex": 209 + "minIndex": 213 }, { - "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-image-message", + "segment": "create-image-message", + "title": "Create an image message", + "href": "/sdk/android/message/creating-messages/create-image-message", "type": "page", "children": [], - "minIndex": 211 + "minIndex": 214, + "navigationTitle": "Create an image message" }, { - "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-image-message-by-file", + "segment": "create-image-message-by-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": 204 + "minIndex": 215, + "navigationTitle": "Create an image message from a path" }, { - "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-url", + "segment": "create-image-message-by-url", + "title": "Create an image message from URLs", + "href": "/sdk/android/message/creating-messages/create-image-message-by-url", "type": "page", "children": [], - "minIndex": 203 + "minIndex": 216 }, { - "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-sound-message", + "segment": "create-sound-message", + "title": "Create an audio message", + "href": "/sdk/android/message/creating-messages/create-sound-message", "type": "page", "children": [], - "minIndex": 201 + "minIndex": 217, + "navigationTitle": "Create an audio message" }, { - "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 local path", + "href": "/sdk/android/message/creating-messages/create-sound-message-by-file", "type": "page", "children": [], - "minIndex": 210 + "minIndex": 218, + "navigationTitle": "Create an audio message from a path" }, { - "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": 219 }, { - "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", + "segment": "create-video-message", + "title": "Create a video message", + "href": "/sdk/android/message/creating-messages/create-video-message", "type": "page", "children": [], - "minIndex": 205 + "minIndex": 220, + "navigationTitle": "Create a video message" }, { - "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-file", + "segment": "create-video-message-by-file", + "title": "Create a video message from local paths", + "href": "/sdk/android/message/creating-messages/create-video-message-by-file", "type": "page", "children": [], - "minIndex": 202 + "minIndex": 221, + "navigationTitle": "Create a video message from a path" }, { - "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-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": 207 + "minIndex": 222 }, { - "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", + "segment": "create-file-message", + "title": "Create a file message", + "href": "/sdk/android/message/creating-messages/create-file-message", "type": "page", "children": [], - "minIndex": 208 + "minIndex": 223, + "navigationTitle": "Create a file message" }, { - "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", + "id": "message/creating-messages/create-file-message-by-file", + "segment": "create-file-message-by-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": 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": [ + "minIndex": 224, + "navigationTitle": "Create a file message from a path" + }, { - "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-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": 225 }, { - "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-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": 226 }, { - "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-location-message", + "segment": "create-location-message", + "title": "Create a location message", + "href": "/sdk/android/message/creating-messages/create-location-message", "type": "page", "children": [], "minIndex": 227 }, { - "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-face-message", + "segment": "create-face-message", + "title": "Create an emoji message", + "href": "/sdk/android/message/creating-messages/create-face-message", "type": "page", "children": [], "minIndex": 228 }, { - "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-quote-message", + "segment": "create-quote-message", + "title": "Create a reply message", + "href": "/sdk/android/message/creating-messages/create-quote-message", "type": "page", "children": [], "minIndex": 229 }, { - "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", + "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": 230 - } - ], - "minIndex": 225 - }, - { - "id": "message/categorizing-messages", - "segment": "categorizing-messages", - "title": "Categorizing messages", - "href": null, - "type": "folder", - "children": [ + "minIndex": 230, + "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": 231, + "navigationTitle": "Create a rich reply" + }, { - "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", + "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": 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": [ + "minIndex": 232 + }, { - "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 message", + "href": "/sdk/android/message/creating-messages/create-merger-message", "type": "page", "children": [], - "minIndex": 132 + "minIndex": 233 } ], - "minIndex": 132 + "minIndex": 211 }, { - "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": 234 }, { - "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", - "type": "page", + "id": "message/sending-messages/send-message-not-oss", + "segment": "send-message-not-oss", + "title": "Send a message without OSS", + "href": "/sdk/android/message/sending-messages/send-message-not-oss", + "type": "page", "children": [], - "minIndex": 147 + "minIndex": 235 }, { - "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": 236, + "navigationTitle": "Track message sending progress" } ], - "minIndex": 146 + "minIndex": 234 }, { - "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": "message/receiving-messages/receive-messages", + "segment": "receive-messages", + "title": "Receive messages", + "href": "/sdk/android/message/receiving-messages/receive-messages", + "type": "page", + "children": [], + "minIndex": 237 + }, { - "id": "application/overview-application", - "segment": "overview-application", - "title": "Overview", - "href": "/sdk/android/application/overview-application", + "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": 160 + "minIndex": 238 }, { - "id": "application/authenticating-a-user", - "segment": "authenticating-a-user", - "title": "Authenticating a user", + "id": "message/retrieving-messages", + "segment": "retrieving-messages", + "title": "Retrieving messages", "href": null, "type": "folder", "children": [ { - "id": "application/authenticating-a-user/authentication", - "segment": "authentication", - "title": "Authentication", - "href": "/sdk/android/application/authenticating-a-user/authentication", + "id": "message/retrieving-messages/load-older-messages", + "segment": "load-older-messages", + "title": "Load older messages", + "href": "/sdk/android/message/retrieving-messages/load-older-messages", "type": "page", "children": [], - "minIndex": 159 - } - ], - "minIndex": 159 - }, - { - "id": "application/understanding-rate-limits", - "segment": "understanding-rate-limits", - "title": "Understanding rate limits", - "href": null, - "type": "folder", - "children": [ + "minIndex": 239 + }, { - "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-newer-messages", + "segment": "load-newer-messages", + "title": "Load newer messages", + "href": "/sdk/android/message/retrieving-messages/load-newer-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": 240 + }, { - "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/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": 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": 241 + }, { - "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/load-message-context", + "segment": "load-message-context", + "title": "Load message context", + "href": "/sdk/android/message/retrieving-messages/load-message-context", "type": "page", "children": [], - "minIndex": 182 + "minIndex": 242, + "navigationTitle": "Load message context" + }, + { + "id": "message/searching-messages/search-messages", + "segment": "search-messages", + "title": "Search messages", + "href": "/sdk/android/message/searching-messages/search-messages", + "type": "page", + "children": [], + "minIndex": 243 } ], - "minIndex": 182 + "minIndex": 239 }, { - "id": "event-handler/managing-user-event-handlers", - "segment": "managing-user-event-handlers", - "title": "Managing user event handlers", + "id": "message/composing-messages", + "segment": "composing-messages", + "title": "Typing status", "href": null, "type": "folder", "children": [ { - "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/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": 244, + "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": 183 + "minIndex": 245, + "navigationTitle": "Get typing status" } ], - "minIndex": 183 - } - ], - "minIndex": 181 - }, - { - "id": "push-notifications", - "segment": "push-notifications", - "title": "Push notifications", - "href": null, - "type": "folder", - "children": [ - { - "id": "push-notifications/overview-push-notifications", - "segment": "overview-push-notifications", - "title": "Overview", - "href": "/sdk/android/push-notifications/overview-push-notifications", - "type": "page", - "children": [], - "minIndex": 152 + "minIndex": 244 }, { - "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": 246 }, { - "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": 247, + "navigationTitle": "Delete saved messages" }, { - "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/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": 150 + "minIndex": 248, + "navigationTitle": "Delete messages from a user" }, { - "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/revoke-a-message", + "segment": "revoke-a-message", + "title": "Revoke a message", + "href": "/sdk/android/message/managing-messages/revoke-a-message", "type": "page", "children": [], - "minIndex": 240 + "minIndex": 249 }, { - "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/modify-a-message", + "segment": "modify-a-message", + "title": "Modify a message", + "href": "/sdk/android/message/managing-messages/modify-a-message", "type": "page", "children": [], - "minIndex": 241 + "minIndex": 250 }, { - "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/get-pinned-messages", + "segment": "get-pinned-messages", + "title": "View pinned messages", + "href": "/sdk/android/message/managing-messages/get-pinned-messages", "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": 251 + }, { - "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/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": 244 - } - ], - "minIndex": 244 - }, - { - "id": "push-notifications/multi-device-support", - "segment": "multi-device-support", - "title": "Multi device support", - "href": null, - "type": "folder", - "children": [ + "minIndex": 252 + }, + { + "id": "message/managing-messages/insert-local-single-message", + "segment": "insert-local-single-message", + "title": "Insert a local direct message", + "href": "/sdk/android/message/managing-messages/insert-local-single-message", + "type": "page", + "children": [], + "minIndex": 253 + }, { - "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/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": 245 + "minIndex": 254 }, { - "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/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": 246 + "minIndex": 255 + }, + { + "id": "message/managing-messages/clear-all-messages", + "segment": "clear-all-messages", + "title": "Clear all saved messages", + "href": "/sdk/android/message/managing-messages/clear-all-messages", + "type": "page", + "children": [], + "minIndex": 256 + }, + { + "id": "message/managing-messages/set-message-local-ex", + "segment": "set-message-local-ex", + "title": "Set local message extensions", + "href": "/sdk/android/message/managing-messages/set-message-local-ex", + "type": "page", + "children": [], + "minIndex": 257 } ], - "minIndex": 245 - } - ], - "minIndex": 150 - }, - { - "id": "report", - "segment": "report", - "title": "Report", - "href": null, - "type": "folder", - "children": [ - { - "id": "report/overview-report", - "segment": "overview-report", - "title": "Overview", - "href": "/sdk/android/report/overview-report", - "type": "page", - "children": [], - "minIndex": 153 + "minIndex": 246 }, { - "id": "report/creating-a-report", - "segment": "creating-a-report", - "title": "Creating a report", + "id": "message/group-message-read-status", + "segment": "group-message-read-status", + "title": "Group message read status", "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", + "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": 258, + "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": 247 + "minIndex": 259, + "navigationTitle": "View group message readers" } ], - "minIndex": 247 + "minIndex": 258 } ], - "minIndex": 153 + "minIndex": 210 + }, + { + "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" }, { - "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": 261 }, { - "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": 262, + "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": 189 + "minIndex": 263, + "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": 264, + "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": 265, + "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": 266, + "navigationTitle": "Cancel a call invitation" + }, + { + "id": "calling/managing-calls/hang-up-call", + "segment": "hang-up-call", + "title": "Hang up a call", + "href": "/sdk/android/calling/managing-calls/hang-up-call", + "type": "page", + "children": [], + "minIndex": 267, + "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": 268, + "navigationTitle": "Handle call events" } ], - "minIndex": 189 + "minIndex": 262 }, { - "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 invitation", + "href": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", "type": "page", "children": [], - "minIndex": 190 + "minIndex": 269, + "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": 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 room credentials", + "href": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "type": "page", + "children": [], + "minIndex": 271, + "navigationTitle": "Get room credentials" } ], - "minIndex": 190 + "minIndex": 269 + }, + { + "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": 272 } ], - "minIndex": 188 - }, - { - "id": "migrating-to-openim", - "segment": "migrating-to-openim", - "title": "Migrating to OpenIM", - "href": "/sdk/android/migrating-to-openim", - "type": "page", - "children": [], - "minIndex": 239 + "minIndex": 261 }, { - "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": 273, + "navigationTitle": "Events" }, { "id": "logger", "segment": "logger", - "title": "Logger", + "title": "Logging", "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": 274 } ], - "pageCount": 128 + "pageCount": 146, + "sidebarExpansion": "active-path" }, { "key": "chat/sdk/flutter", diff --git a/src/generated/routes.json b/src/generated/routes.json index fd73fe60f8..e3c98303bb 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,2316 +4261,2640 @@ "contextTitle": "SDKs · iOS · v4", "template": "guide", "status": "published", - "sourceIndex": 2234, + "sourceIndex": 3498, "contentFile": "content/docs/chat/sdk/ios/logger.mdx", "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": 2287, + "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": 3657, + "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": 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", + "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": 3658, + "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": 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", + "title": "Integrate for Android", + "description": "Add OpenIM Android SDK dependencies and network permissions to an Android project.", "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": 3659, + "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": 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", + "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": 3660, + "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": 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", + "title": "Send your first message", + "description": "Send and verify the first one-to-one text message 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": 3661, + "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": 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 current-user profiles, public user profiles, account settings, 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": 3662, + "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": 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": "Retrieve public user profiles in batches by userID using PublicUserInfo.", "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": 3663, + "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": 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", + "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": 3664, + "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": 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", + "title": "Update your 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": 3665, + "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": 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", + "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": 3666, + "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": 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": "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": 3667, + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-friend-add-permission.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": 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", + "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": 140, - "contentFile": "content/docs/chat/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message.mdx", + "status": "published", + "sourceIndex": 3668, + "contentFile": "content/docs/chat/sdk/android/user/online-status/subscribe-users-online-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": 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", + "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": 141, - "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx", + "status": "published", + "sourceIndex": 3669, + "contentFile": "content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.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": 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", + "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": "scaffold", - "sourceIndex": 142, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/retrieve-a-message.mdx", + "status": "published", + "sourceIndex": 3670, + "contentFile": "content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.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": 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": "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": 3671, + "contentFile": "content/docs/chat/sdk/android/user/overview-relationships.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": 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", + "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": 144, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/share-an-encrypted-file.mdx", + "status": "published", + "sourceIndex": 3672, + "contentFile": "content/docs/chat/sdk/android/user/friends/get-friend-list-page.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": 2303, + "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": 145, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/smart-throttling.mdx", + "status": "published", + "sourceIndex": 3673, + "contentFile": "content/docs/chat/sdk/android/user/friends/search-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": 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", + "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": 146, - "contentFile": "content/docs/chat/sdk/android/message/translating-messages/auto-translate-messages.mdx", + "status": "published", + "sourceIndex": 3674, + "contentFile": "content/docs/chat/sdk/android/user/friends/get-friends-info.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": 2305, + "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": 147, - "contentFile": "content/docs/chat/sdk/android/message/translating-messages/translate-messages-on-demand.mdx", + "status": "published", + "sourceIndex": 3675, + "contentFile": "content/docs/chat/sdk/android/user/friends/check-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": 2306, + "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": 148, - "contentFile": "content/docs/chat/sdk/android/message/using-message-threading/create-a-message-thread.mdx", + "status": "published", + "sourceIndex": 3676, + "contentFile": "content/docs/chat/sdk/android/user/friends/update-friends.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": 2307, + "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": "overview", - "status": "scaffold", - "sourceIndex": 149, - "contentFile": "content/docs/chat/sdk/android/overview.mdx", + "template": "guide", + "status": "published", + "sourceIndex": 3677, + "contentFile": "content/docs/chat/sdk/android/user/friends/delete-friend.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": 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", + "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": 150, - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences.mdx", + "status": "published", + "sourceIndex": 3678, + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/add-friend.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": 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", + "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": 151, - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/push-notification-translation.mdx", + "status": "published", + "sourceIndex": 3679, + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.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": 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", + "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": "guide", - "status": "scaffold", - "sourceIndex": 152, - "contentFile": "content/docs/chat/sdk/android/push-notifications/overview-push-notifications.mdx", + "status": "published", + "sourceIndex": 3680, + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.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": 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", + "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": 153, - "contentFile": "content/docs/chat/sdk/android/report/overview-report.mdx", + "status": "published", + "sourceIndex": 3681, + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.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": 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", + "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": "published", + "sourceIndex": 3682, + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx", + "navOrder": 154 + }, + { + "id": 2313, + "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": 155, - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/block-and-unblock-other-members.mdx", + "status": "published", + "sourceIndex": 3683, + "contentFile": "content/docs/chat/sdk/android/user/blacklist/get-blacklist.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": 2314, + "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": 156, - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/mute-and-unmute-a-user.mdx", + "status": "published", + "sourceIndex": 3684, + "contentFile": "content/docs/chat/sdk/android/user/blacklist/add-blacklist.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": 2315, + "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": 157, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user.mdx", + "status": "published", + "sourceIndex": 3685, + "contentFile": "content/docs/chat/sdk/android/user/blacklist/remove-blacklist.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": 2316, + "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": "scaffold", - "sourceIndex": 158, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message.mdx", + "status": "published", + "sourceIndex": 3686, + "contentFile": "content/docs/chat/sdk/android/conversation/overview-conversation.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": 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", + "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": 159, - "contentFile": "content/docs/chat/sdk/android/application/authenticating-a-user/authentication.mdx", + "status": "published", + "sourceIndex": 3687, + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.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": 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", + "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": 160, - "contentFile": "content/docs/chat/sdk/android/application/overview-application.mdx", + "status": "published", + "sourceIndex": 3688, + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.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": 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", + "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": 161, - "contentFile": "content/docs/chat/sdk/android/application/understanding-rate-limits/rate-limits.mdx", + "status": "published", + "sourceIndex": 3689, + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.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": 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", + "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": 162, - "contentFile": "content/docs/chat/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type.mdx", + "status": "published", + "sourceIndex": 3690, + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.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": 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", + "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": 163, - "contentFile": "content/docs/chat/sdk/android/channel/creating-a-channel/create-a-channel.mdx", + "status": "published", + "sourceIndex": 3691, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.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": 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", + "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": 164, - "contentFile": "content/docs/chat/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation.mdx", + "status": "published", + "sourceIndex": 3692, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.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": 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", + "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": 165, - "contentFile": "content/docs/chat/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members.mdx", + "status": "published", + "sourceIndex": 3693, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.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": 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", + "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": 166, - "contentFile": "content/docs/chat/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel.mdx", + "status": "published", + "sourceIndex": 3694, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.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": 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", + "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": 167, - "contentFile": "content/docs/chat/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel.mdx", + "status": "published", + "sourceIndex": 3695, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.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": 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", + "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": 168, - "contentFile": "content/docs/chat/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters.mdx", + "status": "published", + "sourceIndex": 3696, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.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": 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", + "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": 169, - "contentFile": "content/docs/chat/sdk/android/channel/managing-channel-metadata/manage-channel-metadata.mdx", + "status": "published", + "sourceIndex": 3697, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.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": 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", + "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": 170, - "contentFile": "content/docs/chat/sdk/android/channel/managing-channels/delete-a-channel.mdx", + "status": "published", + "sourceIndex": 3698, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.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": 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", + "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": 171, - "contentFile": "content/docs/chat/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel.mdx", + "status": "published", + "sourceIndex": 3699, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.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": 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", + "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": 172, - "contentFile": "content/docs/chat/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel.mdx", + "status": "published", + "sourceIndex": 3700, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.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": 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", + "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": 173, - "contentFile": "content/docs/chat/sdk/android/channel/managing-operators/register-and-remove-operators.mdx", + "status": "published", + "sourceIndex": 3701, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.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": 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", + "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": 174, - "contentFile": "content/docs/chat/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url.mdx", + "status": "published", + "sourceIndex": 3702, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.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": 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", + "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": 175, - "contentFile": "content/docs/chat/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels.mdx", + "status": "published", + "sourceIndex": 3703, + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.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": 2334, + "path": "/sdk/android/group/overview-group", + "relativePath": "sdk/android/group/overview-group", + "sourcePath": "/sdk/android/group/overview-group", + "title": "Group overview", + "description": "Understand group concepts, core data types, and main capabilities in the Android SDK.", "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": "published", + "sourceIndex": 3704, + "contentFile": "content/docs/chat/sdk/android/group/overview-group.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": 2335, + "path": "/sdk/android/group/create-group", + "relativePath": "sdk/android/group/create-group", + "sourcePath": "/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.", "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": "published", + "sourceIndex": 3705, + "contentFile": "content/docs/chat/sdk/android/group/create-group.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": 2336, + "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": "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": "scaffold", - "sourceIndex": 178, - "contentFile": "content/docs/chat/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types.mdx", + "status": "published", + "sourceIndex": 3706, + "contentFile": "content/docs/chat/sdk/android/group/update-group-profile.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": 2337, + "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": "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": "scaffold", - "sourceIndex": 179, - "contentFile": "content/docs/chat/sdk/android/deprecated.mdx", + "status": "published", + "sourceIndex": 3707, + "contentFile": "content/docs/chat/sdk/android/group/set-group-announcement.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": 2338, + "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": "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": "published", + "sourceIndex": 3708, + "contentFile": "content/docs/chat/sdk/android/group/set-group-extension.mdx", + "navOrder": 180 + }, + { + "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", + "title": "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": "scaffold", - "sourceIndex": 181, - "contentFile": "content/docs/chat/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler.mdx", + "status": "published", + "sourceIndex": 3709, + "contentFile": "content/docs/chat/sdk/android/group/set-group-join-verification.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": 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", + "title": "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": "scaffold", - "sourceIndex": 182, - "contentFile": "content/docs/chat/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler.mdx", + "status": "published", + "sourceIndex": 3710, + "contentFile": "content/docs/chat/sdk/android/group/set-group-member-profile-access.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": 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", + "title": "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": "scaffold", - "sourceIndex": 183, - "contentFile": "content/docs/chat/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler.mdx", + "status": "published", + "sourceIndex": 3711, + "contentFile": "content/docs/chat/sdk/android/group/set-group-member-friend-permission.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": 2342, + "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": "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": "scaffold", - "sourceIndex": 184, - "contentFile": "content/docs/chat/sdk/android/event-handler/overview-event-handler.mdx", + "status": "published", + "sourceIndex": 3712, + "contentFile": "content/docs/chat/sdk/android/group/change-group-mute.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": 2343, + "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": "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": "scaffold", - "sourceIndex": 185, - "contentFile": "content/docs/chat/sdk/android/getting-started/collection-migration-guide.mdx", + "status": "published", + "sourceIndex": 3713, + "contentFile": "content/docs/chat/sdk/android/group/join-group.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": 2344, + "path": "/sdk/android/group/quit-group", + "relativePath": "sdk/android/group/quit-group", + "sourcePath": "/sdk/android/group/quit-group", + "title": "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": "scaffold", - "sourceIndex": 186, - "contentFile": "content/docs/chat/sdk/android/getting-started/kotlin-extension.mdx", + "status": "published", + "sourceIndex": 3714, + "contentFile": "content/docs/chat/sdk/android/group/quit-group.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": 2345, + "path": "/sdk/android/group/dismiss-group", + "relativePath": "sdk/android/group/dismiss-group", + "sourcePath": "/sdk/android/group/dismiss-group", + "title": "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": "scaffold", - "sourceIndex": 187, - "contentFile": "content/docs/chat/sdk/android/getting-started/migration-guide.mdx", + "status": "published", + "sourceIndex": 3715, + "contentFile": "content/docs/chat/sdk/android/group/dismiss-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": 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", + "title": "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": "scaffold", - "sourceIndex": 188, - "contentFile": "content/docs/chat/sdk/android/local-caching/overview-local-caching.mdx", + "status": "published", + "sourceIndex": 3716, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.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": 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", + "title": "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": "scaffold", - "sourceIndex": 189, - "contentFile": "content/docs/chat/sdk/android/local-caching/using-group-channel-collection/group-channel-collection.mdx", + "status": "published", + "sourceIndex": 3717, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.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": 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", + "title": "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": "scaffold", - "sourceIndex": 190, - "contentFile": "content/docs/chat/sdk/android/local-caching/using-message-collection/message-collection.mdx", + "status": "published", + "sourceIndex": 3718, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.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": 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", + "title": "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": "scaffold", - "sourceIndex": 191, - "contentFile": "content/docs/chat/sdk/android/logger.mdx", + "status": "published", + "sourceIndex": 3719, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/search-groups.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": 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", + "title": "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": "scaffold", - "sourceIndex": 192, - "contentFile": "content/docs/chat/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type.mdx", + "status": "published", + "sourceIndex": 3720, + "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.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": 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", + "title": "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": "scaffold", - "sourceIndex": 193, - "contentFile": "content/docs/chat/sdk/android/message/listing-changelogs/list-changelogs-of-messages.mdx", + "status": "published", + "sourceIndex": 3721, + "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.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": 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", + "title": "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": "scaffold", - "sourceIndex": 194, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel.mdx", + "status": "published", + "sourceIndex": 3722, + "contentFile": "content/docs/chat/sdk/android/group/group-applications/accept-group-application.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": 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", + "title": "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": "scaffold", - "sourceIndex": 195, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/copy-a-message.mdx", + "status": "published", + "sourceIndex": 3723, + "contentFile": "content/docs/chat/sdk/android/group/group-applications/refuse-group-application.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": 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", + "title": "Delete group applications", + "description": "Use deleteGroupRequests to delete specified group application records in a batch.", "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": "published", + "sourceIndex": 3724, + "contentFile": "content/docs/chat/sdk/android/group/group-applications/delete-group-requests.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": 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", + "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": "scaffold", - "sourceIndex": 197, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message.mdx", + "status": "published", + "sourceIndex": 3725, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.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": 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", + "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": "scaffold", - "sourceIndex": 198, - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/update-a-message.mdx", + "status": "published", + "sourceIndex": 3726, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.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": 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", + "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": "scaffold", - "sourceIndex": 199, - "contentFile": "content/docs/chat/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages.mdx", + "status": "published", + "sourceIndex": 3727, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.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": 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", + "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": "scaffold", - "sourceIndex": 200, - "contentFile": "content/docs/chat/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message.mdx", + "status": "published", + "sourceIndex": 3728, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.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": 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", + "title": "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": "scaffold", - "sourceIndex": 201, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/add-a-poll-option.mdx", + "status": "published", + "sourceIndex": 3729, + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.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": 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", + "title": "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": "scaffold", - "sourceIndex": 202, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/cast-or-cancel-a-vote.mdx", + "status": "published", + "sourceIndex": 3730, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.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": 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", + "title": "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": "scaffold", - "sourceIndex": 203, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/close-a-poll.mdx", + "status": "published", + "sourceIndex": 3731, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.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": 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", + "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": "scaffold", - "sourceIndex": 204, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/delete-a-poll.mdx", + "status": "published", + "sourceIndex": 3732, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.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": 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", + "title": "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": "scaffold", - "sourceIndex": 205, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/delete-a-poll-option.mdx", + "status": "published", + "sourceIndex": 3733, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.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": 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", + "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": "scaffold", - "sourceIndex": 206, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/list-changelogs-of-polls.mdx", + "status": "published", + "sourceIndex": 3734, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.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": 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", + "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": "scaffold", - "sourceIndex": 207, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-list-of-polls.mdx", + "status": "published", + "sourceIndex": 3735, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.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": 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", + "title": "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": "scaffold", - "sourceIndex": 208, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-list-of-voters.mdx", + "status": "published", + "sourceIndex": 3736, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.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": 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", + "title": "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": "scaffold", - "sourceIndex": 209, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-poll.mdx", + "status": "published", + "sourceIndex": 3737, + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.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": 2368, + "path": "/sdk/android/message/overview-message", + "relativePath": "sdk/android/message/overview-message", + "sourcePath": "/sdk/android/message/overview-message", + "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": 210, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-poll-option.mdx", + "status": "published", + "sourceIndex": 3738, + "contentFile": "content/docs/chat/sdk/android/message/overview-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": 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", + "title": "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": "scaffold", - "sourceIndex": 211, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/update-a-poll.mdx", + "status": "published", + "sourceIndex": 3739, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-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": 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", + "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": "scaffold", - "sourceIndex": 212, - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/update-a-poll-option.mdx", + "status": "published", + "sourceIndex": 3740, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.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": 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", + "title": "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": "scaffold", - "sourceIndex": 213, - "contentFile": "content/docs/chat/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status.mdx", + "status": "published", + "sourceIndex": 3741, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-custom-message.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": 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", + "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": "scaffold", - "sourceIndex": 214, - "contentFile": "content/docs/chat/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read.mdx", + "status": "published", + "sourceIndex": 3742, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message.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": 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", + "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": "scaffold", - "sourceIndex": 215, - "contentFile": "content/docs/chat/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread.mdx", + "status": "published", + "sourceIndex": 3743, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.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": 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", + "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": "scaffold", - "sourceIndex": 216, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message.mdx", + "status": "published", + "sourceIndex": 3744, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.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": 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", + "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": "scaffold", - "sourceIndex": 217, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages.mdx", + "status": "published", + "sourceIndex": 3745, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message.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": 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", + "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": "scaffold", - "sourceIndex": 218, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message.mdx", + "status": "published", + "sourceIndex": 3746, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-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": 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", + "title": "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": "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": "published", + "sourceIndex": 3747, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-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": 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", + "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": "scaffold", - "sourceIndex": 220, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately.mdx", + "status": "published", + "sourceIndex": 3748, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-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": 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", + "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": "scaffold", - "sourceIndex": 221, - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message.mdx", + "status": "published", + "sourceIndex": 3749, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.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": 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", + "title": "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": "scaffold", - "sourceIndex": 222, - "contentFile": "content/docs/chat/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel.mdx", + "status": "published", + "sourceIndex": 3750, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.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": 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", + "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": "scaffold", - "sourceIndex": 223, - "contentFile": "content/docs/chat/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel.mdx", + "status": "published", + "sourceIndex": 3751, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-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": 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", + "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": "scaffold", - "sourceIndex": 224, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages.mdx", + "status": "published", + "sourceIndex": 3752, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.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": 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", + "title": "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": "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": "published", + "sourceIndex": 3753, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.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": 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", + "title": "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": "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": "published", + "sourceIndex": 3754, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-card-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": 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", + "title": "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": "scaffold", - "sourceIndex": 227, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels.mdx", + "status": "published", + "sourceIndex": 3755, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-location-message.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": 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", + "title": "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": "scaffold", - "sourceIndex": 228, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items.mdx", + "status": "published", + "sourceIndex": 3756, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-face-message.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": 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", + "title": "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": "scaffold", - "sourceIndex": 229, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel.mdx", + "status": "published", + "sourceIndex": 3757, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-quote-message.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": 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", + "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": "scaffold", - "sourceIndex": 230, - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels.mdx", + "status": "published", + "sourceIndex": 3758, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.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": 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", + "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": "scaffold", - "sourceIndex": 231, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload.mdx", + "status": "published", + "sourceIndex": 3759, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.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": 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", + "title": "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": "scaffold", - "sourceIndex": 232, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users.mdx", + "status": "published", + "sourceIndex": 3760, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-forward-message.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": 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", + "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": "scaffold", - "sourceIndex": 233, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/send-a-message.mdx", + "status": "published", + "sourceIndex": 3761, + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-merger-message.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": 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", + "title": "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": "scaffold", - "sourceIndex": 234, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/send-an-admin-message.mdx", + "status": "published", + "sourceIndex": 3762, + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message.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": 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", + "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": "scaffold", - "sourceIndex": 235, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/spam-flood-protection.mdx", + "status": "published", + "sourceIndex": 3763, + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.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": 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", + "title": "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": "scaffold", - "sourceIndex": 236, - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler.mdx", + "status": "published", + "sourceIndex": 3764, + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.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": 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", + "title": "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": "scaffold", - "sourceIndex": 237, - "contentFile": "content/docs/chat/sdk/android/message/translating-messages/translation-engine.mdx", + "status": "published", + "sourceIndex": 3765, + "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-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": 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", + "title": "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": "scaffold", - "sourceIndex": 238, - "contentFile": "content/docs/chat/sdk/android/message/using-message-threading/list-replies-in-a-message-thread.mdx", + "status": "published", + "sourceIndex": 3766, + "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.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": 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", + "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": "scaffold", - "sourceIndex": 239, - "contentFile": "content/docs/chat/sdk/android/migrating-to-openim.mdx", + "status": "published", + "sourceIndex": 3767, + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.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": 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", + "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": "scaffold", - "sourceIndex": 240, - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates.mdx", + "status": "published", + "sourceIndex": 3768, + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-newer-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": 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", + "title": "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": "scaffold", - "sourceIndex": 241, - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/push-notification-tester.mdx", + "status": "published", + "sourceIndex": 3769, + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.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": 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", + "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": "scaffold", - "sourceIndex": 242, - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm.mdx", + "status": "published", + "sourceIndex": 3770, + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.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": 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", + "title": "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": "scaffold", - "sourceIndex": 243, - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms.mdx", + "status": "published", + "sourceIndex": 3771, + "contentFile": "content/docs/chat/sdk/android/message/searching-messages/search-messages.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": 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", + "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": "scaffold", - "sourceIndex": 244, - "contentFile": "content/docs/chat/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered.mdx", + "status": "published", + "sourceIndex": 3772, + "contentFile": "content/docs/chat/sdk/android/message/composing-messages/update-typing-status.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": 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", + "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": "scaffold", - "sourceIndex": 245, - "contentFile": "content/docs/chat/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm.mdx", + "status": "published", + "sourceIndex": 3773, + "contentFile": "content/docs/chat/sdk/android/message/composing-messages/get-typing-status.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": 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", + "title": "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": "scaffold", - "sourceIndex": 246, - "contentFile": "content/docs/chat/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms.mdx", + "status": "published", + "sourceIndex": 3774, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-local-message.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": 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", + "title": "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": "scaffold", - "sourceIndex": 247, - "contentFile": "content/docs/chat/sdk/android/report/creating-a-report/report-a-message-user-or-channel.mdx", + "status": "published", + "sourceIndex": 3775, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.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": 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", + "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": "scaffold", - "sourceIndex": 248, - "contentFile": "content/docs/chat/sdk/android/user/managing-user-metadata/manage-user-metadata.mdx", + "status": "published", + "sourceIndex": 3776, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.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": 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", + "title": "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": "scaffold", - "sourceIndex": 250, - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx", + "status": "published", + "sourceIndex": 3777, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx", + "navOrder": 249 + }, + { + "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", + "title": "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": "published", + "sourceIndex": 3778, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/modify-a-message.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": 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", + "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": "scaffold", - "sourceIndex": 251, - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users.mdx", + "status": "published", + "sourceIndex": 3779, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.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": 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", + "title": "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": "scaffold", - "sourceIndex": 252, - "contentFile": "content/docs/chat/sdk/android/user/overview-user.mdx", + "status": "published", + "sourceIndex": 3780, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.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": 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", + "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": "scaffold", - "sourceIndex": 253, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants.mdx", + "status": "published", + "sourceIndex": 3781, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.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": 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", + "title": "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": "scaffold", - "sourceIndex": 254, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-and-updating-user-information/update-user-profile.mdx", + "status": "published", + "sourceIndex": 3782, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.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": 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", + "title": "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": "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": "published", + "sourceIndex": 3783, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.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": 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", + "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": "scaffold", - "sourceIndex": 256, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-operators.mdx", + "status": "published", + "sourceIndex": 3784, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.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": 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", + "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": "scaffold", - "sourceIndex": 257, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel.mdx", + "status": "published", + "sourceIndex": 3785, + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.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": 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", + "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": "scaffold", - "sourceIndex": 258, - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application.mdx", + "status": "published", + "sourceIndex": 3786, + "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.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": 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", + "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": "scaffold", - "sourceIndex": 259, - "contentFile": "content/docs/chat/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read.mdx", + "status": "published", + "sourceIndex": 3787, + "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx", "navOrder": 259 }, { - "id": 864, + "id": 2418, + "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": "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": "published", + "sourceIndex": 3788, + "contentFile": "content/docs/chat/sdk/android/file-uploads/upload-file.mdx", + "navOrder": 260 + }, + { + "id": 2419, + "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": "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": "published", + "sourceIndex": 3789, + "contentFile": "content/docs/chat/sdk/android/calling/overview-calling.mdx", + "navOrder": 261 + }, + { + "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", + "title": "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": "published", + "sourceIndex": 3790, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx", + "navOrder": 262 + }, + { + "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", + "title": "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": "published", + "sourceIndex": 3791, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx", + "navOrder": 263 + }, + { + "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", + "title": "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": "published", + "sourceIndex": 3792, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx", + "navOrder": 264 + }, + { + "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", + "title": "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": "published", + "sourceIndex": 3793, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx", + "navOrder": 265 + }, + { + "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", + "title": "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": "published", + "sourceIndex": 3794, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx", + "navOrder": 266 + }, + { + "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", + "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": "published", + "sourceIndex": 3795, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx", + "navOrder": 267 + }, + { + "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", + "title": "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": "published", + "sourceIndex": 3796, + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx", + "navOrder": 268 + }, + { + "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", + "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": "published", + "sourceIndex": 3797, + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx", + "navOrder": 269 + }, + { + "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", + "title": "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": "published", + "sourceIndex": 3798, + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx", + "navOrder": 270 + }, + { + "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", + "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": "published", + "sourceIndex": 3799, + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx", + "navOrder": 271 + }, + { + "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", + "title": "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": "published", + "sourceIndex": 3800, + "contentFile": "content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx", + "navOrder": 272 + }, + { + "id": 2431, + "path": "/sdk/android/events/overview-events", + "relativePath": "sdk/android/events/overview-events", + "sourcePath": "/sdk/android/events/overview-events", + "title": "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": "published", + "sourceIndex": 3801, + "contentFile": "content/docs/chat/sdk/android/events/overview-events.mdx", + "navOrder": 273 + }, + { + "id": 2432, + "path": "/sdk/android/logger", + "relativePath": "sdk/android/logger", + "sourcePath": "/sdk/android/logger", + "title": "Logging", + "description": "Configure Android SDK logging, write application logs, and upload logs.", + "product": "sdk", + "version": "v4", + "platform": "android", + "contextKey": "chat/sdk/android", + "contextTitle": "SDKs · Android · v4", + "template": "guide", + "status": "published", + "sourceIndex": 3802, + "contentFile": "content/docs/chat/sdk/android/logger.mdx", + "navOrder": 274 + }, + { + "id": 2129, "path": "/sdk/flutter/overview", "relativePath": "sdk/flutter/overview", "sourcePath": "/sdk/flutter/overview", @@ -6583,12 +6907,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", @@ -6601,12 +6925,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", @@ -6619,12 +6943,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", @@ -6637,12 +6961,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", @@ -6655,12 +6979,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", @@ -6673,12 +6997,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", @@ -6691,12 +7015,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", @@ -6709,12 +7033,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", @@ -6727,12 +7051,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", @@ -6745,12 +7069,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", @@ -6763,12 +7087,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", @@ -6781,12 +7105,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", @@ -6799,12 +7123,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", @@ -6817,12 +7141,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", @@ -6835,12 +7159,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", @@ -6853,12 +7177,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", @@ -6871,12 +7195,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", @@ -6889,12 +7213,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", @@ -6907,12 +7231,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", @@ -6925,12 +7249,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", @@ -6943,12 +7267,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", @@ -6961,12 +7285,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", @@ -6979,12 +7303,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", @@ -6997,12 +7321,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", @@ -7015,12 +7339,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", @@ -7033,12 +7357,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", @@ -7051,12 +7375,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", @@ -7069,12 +7393,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", @@ -7087,12 +7411,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", @@ -7105,12 +7429,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", @@ -7123,12 +7447,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", @@ -7141,12 +7465,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", @@ -7159,12 +7483,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", @@ -7177,12 +7501,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", @@ -7195,12 +7519,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", @@ -7213,12 +7537,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", @@ -7231,12 +7555,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", @@ -7249,12 +7573,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", @@ -7267,12 +7591,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", @@ -7285,12 +7609,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", @@ -7303,12 +7627,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", @@ -7321,12 +7645,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", @@ -7339,12 +7663,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", @@ -7357,12 +7681,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", @@ -7375,12 +7699,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", @@ -7393,12 +7717,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", @@ -7411,12 +7735,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", @@ -7429,12 +7753,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", @@ -7447,12 +7771,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", @@ -7465,12 +7789,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", @@ -7483,12 +7807,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", @@ -7501,12 +7825,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", @@ -7519,12 +7843,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", @@ -7537,12 +7861,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", @@ -7555,12 +7879,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", @@ -7573,12 +7897,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", @@ -7591,12 +7915,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", @@ -7609,12 +7933,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", @@ -7627,12 +7951,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", @@ -7645,12 +7969,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", @@ -7663,12 +7987,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", @@ -7681,12 +8005,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", @@ -7699,12 +8023,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", @@ -7717,12 +8041,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", @@ -7735,12 +8059,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", @@ -7753,12 +8077,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", @@ -7771,12 +8095,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", @@ -7789,12 +8113,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", @@ -7807,12 +8131,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", @@ -7825,12 +8149,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", @@ -7843,12 +8167,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", @@ -7861,12 +8185,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", @@ -7879,12 +8203,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", @@ -7897,12 +8221,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", @@ -7915,12 +8239,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", @@ -7933,12 +8257,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", @@ -7951,12 +8275,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", @@ -7969,12 +8293,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", @@ -7987,12 +8311,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", @@ -8005,12 +8329,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", @@ -8023,12 +8347,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", @@ -8041,12 +8365,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", @@ -8059,12 +8383,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", @@ -8077,12 +8401,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", @@ -8095,12 +8419,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", @@ -8113,12 +8437,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", @@ -8131,12 +8455,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", @@ -8149,12 +8473,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", @@ -8167,12 +8491,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", @@ -8185,12 +8509,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", @@ -8203,12 +8527,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", @@ -8221,12 +8545,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", @@ -8239,12 +8563,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", @@ -8257,12 +8581,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", @@ -8275,12 +8599,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", @@ -8293,12 +8617,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", @@ -8311,12 +8635,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", @@ -8329,12 +8653,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", @@ -8347,12 +8671,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", @@ -8365,12 +8689,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", @@ -8383,12 +8707,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", @@ -8401,12 +8725,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", @@ -8419,12 +8743,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", @@ -8437,12 +8761,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", @@ -8455,12 +8779,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", @@ -8473,12 +8797,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", @@ -8491,12 +8815,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", @@ -8509,12 +8833,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", @@ -8527,12 +8851,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", @@ -8545,12 +8869,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", @@ -8563,12 +8887,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", @@ -8581,12 +8905,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", @@ -8599,12 +8923,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", @@ -8617,12 +8941,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", @@ -8635,12 +8959,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", @@ -8653,12 +8977,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", @@ -8671,12 +8995,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", @@ -8689,12 +9013,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", @@ -8707,12 +9031,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", @@ -8725,12 +9049,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", @@ -8743,12 +9067,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", @@ -8761,12 +9085,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", @@ -8779,12 +9103,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", @@ -8797,12 +9121,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", @@ -8815,12 +9139,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", @@ -8833,12 +9157,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", @@ -8851,12 +9175,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", @@ -8869,12 +9193,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", @@ -8887,12 +9211,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", @@ -8905,12 +9229,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", @@ -8923,12 +9247,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", @@ -8941,12 +9265,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", @@ -8959,12 +9283,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", @@ -8977,12 +9301,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", @@ -8995,12 +9319,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", @@ -9013,12 +9337,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", @@ -9031,12 +9355,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", @@ -9049,12 +9373,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", @@ -9067,12 +9391,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", @@ -9085,12 +9409,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", @@ -9103,12 +9427,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", @@ -9121,12 +9445,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", @@ -9139,12 +9463,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", @@ -9157,12 +9481,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", @@ -9175,12 +9499,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", @@ -9193,12 +9517,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", @@ -9211,12 +9535,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", @@ -9229,12 +9553,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", @@ -9247,12 +9571,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", @@ -9265,12 +9589,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", @@ -9283,12 +9607,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", @@ -9301,12 +9625,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", @@ -9319,12 +9643,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", @@ -9337,12 +9661,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", @@ -9355,12 +9679,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", @@ -9373,12 +9697,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", @@ -9391,12 +9715,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", @@ -9409,7 +9733,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 7a8bb02473..649d2fc0c9 100644 --- a/src/generated/search-index-zh.json +++ b/src/generated/search-index-zh.json @@ -1896,1028 +1896,1172 @@ "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 。确认登录回调成功且 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: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 初始化、登录、查询登录状态、处理连接回调并退出当前账号。", + "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. 分别等待登录回调成功与 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", - "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 步:确认可以发送 两个账号登录后,发送方的登录回调成功且 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/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 中的当前用户资料、公开用户资料、账号设置和在线状态。", "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 和状态更新见 关系链概览 /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/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": "按 userID 批量查询应用用户公开资料(PublicUserInfo)。", "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 查询应用用户的公开资料,适合展示好友候选人和陌生人资料卡。 查询公开资料 调用 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/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 // 使用 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/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 只设置实际需要修改的字段。 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/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 // 设置全局消息接收方式成功 @Override public void onError int code, String error // 处理错误 , request ; | 数值 | 含义 | | | | | 0 | 正常接收消息并允许通知。 | | 1 | 屏蔽消息。 | | 2 | 接收消息但不提示。 | 如果产品只提供“全局免打扰”开关,可以在 0 和 2 之间切换; 1 会停止接收消息,应单独展示。单个会话的接收方式由会话 API 管理。 成功 callback 表示设置请求完成。" }, { - "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/user-profile/set-friend-add-permission", + "title": "设置好友添加权限", + "description": "设置其他用户向当前账号发起好友申请时的处理方式。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message managing-polls create-a-poll", - "content": "" + "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/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/subscribe-users-online-status", + "title": "订阅用户在线状态", + "description": "使用 subscribeUsersOnlineStatus() 订阅指定用户的在线状态。", "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 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 // 使用 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/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/online-status/get-subscribe-online-users-status", + "title": "查询已订阅用户状态", + "description": "使用 getSubscribeOnlineUsersStatus() 获取已订阅用户的在线状态。", "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 online-status get-subscribe-online-users-status", + "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/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/online-status/unsubscribe-users-online-status", + "title": "取消订阅用户状态", + "description": "使用 unsubscribeOnlineUsersStatus 取消指定用户的在线状态订阅。", "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 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 // 取消订阅成功 @Override public void onError int code, String error // 处理错误 , userIDs ; 成功 callback 表示取消订阅请求已完成。 需要再次跟踪用户状态时,重新调用 订阅用户在线状态 /sdk/android/user/online status/subscribe users online status 。" }, { - "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/overview-relationships", + "title": "关系链概览", + "description": "了解 Android SDK 中的好友、好友申请和黑名单 API。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message overview-message", - "content": "" + "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/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/get-friend-list-page", + "title": "分页获取好友列表", + "description": "使用 getFriendListPage() 分页获取当前用户的好友列表。", "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 get-friend-list-page", + "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/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/search-friends", + "title": "搜索好友", + "description": "使用 searchFriends() 搜索当前用户的好友。", "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 search-friends", + "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/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/get-friends-info", + "title": "查询指定好友资料", + "description": "使用 getFriendsInfo() 查询指定用户的好友关系资料。", "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 get-friends-info", + "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/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/friends/check-friend", + "title": "检查好友关系", + "description": "使用 checkFriend() 检查指定用户是否为当前用户的好友。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message sending-a-message smart-throttling", - "content": "" + "keywords": "sdk android v4 sdk android user friends check-friend", + "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/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/friends/update-friends", + "title": "更新好友资料", + "description": "使用 updateFriendsReq() 更新好友备注、置顶状态或扩展字段。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message translating-messages auto-translate-messages", - "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 // 更新好友资料成功 @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/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/friends/delete-friend", + "title": "删除好友", + "description": "使用 deleteFriend() 删除当前用户的一条好友关系。", "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 friends delete-friend", + "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/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/add-friend", + "title": "发送好友申请", + "description": "使用 addFriend() 向指定用户发送好友申请。", "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 add-friend", + "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/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/get-recv-friend-application-list", + "title": "获取收到的好友申请", + "description": "使用 getRecvFriendApplicationList() 分页查询当前用户收到的好友申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android overview", - "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 // 使用 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/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/friend-applications/get-send-friend-application-list", + "title": "获取发出的好友申请", + "description": "使用 getSendFriendApplicationList() 分页查询当前用户发出的好友申请。", "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 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 // 使用 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/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/friend-applications/accept-friend-application", + "title": "接受好友申请", + "description": "使用 acceptFriendApplication() 接受好友申请。", "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 friend-applications accept-friend-application", + "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/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/friend-applications/refuse-friend-application", + "title": "拒绝好友申请", + "description": "使用 refuseFriendApplication() 拒绝好友申请。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android push-notifications overview-push-notifications", - "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 // 拒绝好友申请成功 @Override public void onError int code, String error // 处理错误 , applicantUserID, \"暂不添加\" ; applicantUserID 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示拒绝好友申请请求完成;申请状态通过 OnFriendshipListener 通知, handleResult == 2 表示已拒绝。" }, { - "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/user/blacklist/get-blacklist", + "title": "获取黑名单列表", + "description": "使用 getBlacklist() 获取当前用户的黑名单。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android report overview-report", - "content": "" + "keywords": "sdk android v4 sdk android user blacklist get-blacklist", + "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/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/user/blacklist/add-blacklist", + "title": "拉黑用户", + "description": "使用 addBlacklist() 将用户加入当前账号黑名单。", "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 user blacklist add-blacklist", + "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/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/user/blacklist/remove-blacklist", + "title": "取消拉黑用户", + "description": "使用 removeBlacklist() 将用户移出当前账号黑名单。", "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 user blacklist remove-blacklist", + "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/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/overview-conversation", + "title": "会话概览", + "description": "了解 Android SDK 中 ConversationInfo、conversationID、会话设置和会话事件的职责。", "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 overview-conversation", + "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/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/get-conversation-by-target", + "title": "查询指定会话", + "description": "使用 getOneConversation() 按用户或群组获取一个会话。", "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 get-conversation-by-target", + "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/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/retrieving-conversations/get-conversation-id", + "title": "生成会话 ID", + "description": "使用 getConversationIDBySessionType() 按聊天目标计算会话 ID。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android application authenticating-a-user authentication", - "content": "" + "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversation-id", + "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/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/retrieving-conversations/get-conversations-by-id", + "title": "按 ID 批量获取会话", + "description": "使用 getMultipleConversation() 按 conversationID 批量获取会话。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android application overview-application", - "content": "" + "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 // conversations 是按 conversationIDs 查询到的会话快照。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , conversationIDs ; 成功回调返回 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/retrieving-conversations/retrieve-conversation-list", + "title": "获取会话列表", + "description": "使用 getConversationListSplit() 分页获取当前账号的会话列表。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android application understanding-rate-limits rate-limits", - "content": "" + "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 // 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/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/pin-conversation", + "title": "置顶或取消置顶会话", + "description": "使用 pinConversation() 设置指定会话的置顶状态。", "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 pin-conversation", + "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/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/set-conversation-extension", + "title": "设置会话扩展字段", + "description": "使用 setConversationEx() 设置指定会话的业务扩展字符串。", "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 set-conversation-extension", + "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/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/set-conversation-draft", + "title": "设置会话草稿", + "description": "使用 setConversationDraft() 保存会话草稿。", "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 set-conversation-draft", + "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/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/set-message-receive-option", + "title": "设置会话消息接收方式", + "description": "使用 setConversationRecvMessageOpt() 设置单个会话的消息接收与通知方式。", "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 set-message-receive-option", + "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/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/clear-group-mentions", + "title": "重置群聊 @ 状态", + "description": "使用 resetConversationGroupAtType() 将指定会话的群聊 @ 状态重置为普通状态。", "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 clear-group-mentions", + "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/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/mark-conversation-read", + "title": "标记会话已读", + "description": "使用 messageManager.markConversationMessageAsRead() 将指定会话的消息标记为已读。", "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 mark-conversation-read", + "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/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/get-total-unread-count", + "title": "获取消息总未读数", + "description": "使用 getTotalUnreadMsgCount() 获取当前账号的总未读数。", "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 get-total-unread-count", + "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/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/set-private-chat", + "title": "开启或关闭阅后即焚", + "description": "使用 setOneConversationPrivateChat() 设置会话的阅后即焚模式。", "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 set-private-chat", + "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/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/set-burn-duration", + "title": "设置阅后即焚时长", + "description": "使用 setConversationBurnDuration() 设置阅后即焚模式的消息保留时长。", "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 set-burn-duration", + "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/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/set-message-destruct", + "title": "定期删除服务端消息", + "description": "使用 setConversation() 启用、关闭并配置会话的服务端消息定期删除策略。", "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 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 // 请求已完成。 @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/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/conversation/managing-conversations/hide-a-conversation", + "title": "隐藏会话", + "description": "使用 hideConversation() 从当前账号的会话列表隐藏入口。", "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 conversation managing-conversations hide-a-conversation", + "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/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/conversation/managing-conversations/delete-conversation-with-messages", + "title": "删除会话及消息", + "description": "使用 deleteConversationAndDeleteAllMsg() 删除指定会话及其全部消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-operators register-and-remove-operators", - "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 // 请求已完成,会话及其消息已删除。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , conversationID ; 成功回调后清理当前消息列表和会话行。该操作不删除好友关系,也不退出或解散群组;聊天目标仍存在时,会话可能由新消息或同步重新生成。 需要更新会话列表时,可重新查询会话或通过 onConversationChanged 接收变化,监听器设置方式见 获取会话列表 /sdk/android/conversation/retrieving conversations/retrieve conversation list 。" }, { - "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/conversation/managing-conversations/clear-conversation-messages", + "title": "清空会话消息", + "description": "使用 messageManager.clearConversationAndDeleteAllMsg() 保留会话入口并清空其消息。", "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 conversation managing-conversations clear-conversation-messages", + "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/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/overview-group", + "title": "群组概览", + "description": "了解 Android SDK 中的群组概念、核心数据类型和主要能力。", "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 overview-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/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/create-group", + "title": "创建群组", + "description": "使用 createGroup 创建群资料并指定初始成员、管理员和群主。", "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 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 / group 包含新群组信息。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ;" }, { - "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/update-group-profile", + "title": "更新群名称、简介和头像", + "description": "使用 setGroupInfo 更新群名称、头像、简介和其他群资料字段。", "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 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 / 请求已完成。 / @Override public void onError int code, String error / code 和 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-announcement", + "title": "发布或更新群公告", + "description": "通过 GroupInfo.notification 发布或更新群公告。", "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-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 / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ; 公告的更新时间和更新人保存在 GroupInfo 的 notificationUpdateTime 、 notificationUserID 字段中;需要读取时查询群资料。" }, { - "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-extension", + "title": "设置群组扩展字段", + "description": "通过 GroupInfo.ex 保存应用定义的群组扩展数据。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android deprecated", - "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 / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ;" }, { - "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/set-group-join-verification", + "title": "设置入群验证方式", + "description": "通过 GroupInfo.needVerification 配置申请和邀请的入群验证规则。", "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 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 / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ; 该设置影响后续入群请求,不替代对已存在申请的同意或拒绝处理。" }, { - "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/set-group-member-profile-access", + "title": "设置成员资料查看权限", + "description": "通过 GroupInfo.lookMemberInfo 设置是否允许通过群组查看成员资料。", "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 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 / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ; 此开关约束通过群组入口获取成员资料的权限,不改变成员已经拥有的用户资料。" }, { - "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/set-group-member-friend-permission", + "title": "设置群内添加好友权限", + "description": "通过 GroupInfo.applyMemberFriend 设置是否允许从群成员发起好友申请。", "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 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 / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ;" }, { - "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/change-group-mute", + "title": "设置群组全员禁言", + "description": "使用 changeGroupMute 开启或关闭群组全员禁言。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android event-handler overview-event-handler", - "content": "" + "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 / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , groupID, true ;" }, { - "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/join-group", + "title": "申请加入群组", + "description": "使用 joinGroup 提交入群申请或加入请求。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android getting-started collection-migration-guide", - "content": "" + "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 / 请求已提交。 / @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/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/quit-group", + "title": "退出群组", + "description": "使用 quitGroup 让当前登录用户退出指定群组。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android getting-started kotlin-extension", - "content": "" + "keywords": "sdk android v4 sdk android group quit-group", + "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/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/dismiss-group", + "title": "解散群组", + "description": "使用 dismissGroup 解散当前用户有权限管理的群组。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android getting-started migration-guide", - "content": "" + "keywords": "sdk android v4 sdk android group dismiss-group", + "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/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/get-specified-groups-info", + "title": "查询指定群组资料", + "description": "使用 getGroupsInfo 批量查询指定群组的最新资料。", "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 get-specified-groups-info", + "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/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/retrieving-groups/get-joined-group-list-page", + "title": "分页获取已加入群组", + "description": "使用 getJoinedGroupListPage 分页读取当前账号已加入的群组。", "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 retrieving-groups get-joined-group-list-page", + "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/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/retrieving-groups/is-join-group", + "title": "检查是否已加入群组", + "description": "使用 isJoinGroup 查询当前登录用户是否已经加入指定群组。", "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 retrieving-groups is-join-group", + "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/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/retrieving-groups/search-groups", + "title": "搜索群组", + "description": "使用 searchGroups 按群 ID 或群名称搜索本地可查询的群组。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android logger", - "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 / 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/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/get-group-application-list-as-recipient", + "title": "获取收到的入群申请", + "description": "使用 getRecvGroupApplicationList 分页读取当前用户可处理的入群申请。", "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 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 / items 是当前页申请记录。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , request ;" }, { - "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/get-group-application-list-as-applicant", + "title": "获取发出的入群申请", + "description": "使用 getSendGroupApplicationList 分页读取当前用户发出的入群申请。", "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 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 / items 是当前页申请记录。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , request ; 申请被同意后,通过 onJoinedGroupAdded 接收加入群组通知。" }, { - "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/group-applications/accept-group-application", + "title": "接受入群申请", + "description": "使用 acceptGroupApplication 同意指定用户的入群申请。", "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 group-applications accept-group-application", + "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/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/group-applications/refuse-group-application", + "title": "拒绝入群申请", + "description": "使用 refuseGroupApplication 拒绝指定用户的入群申请。", "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 group-applications refuse-group-application", + "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/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/group-applications/delete-group-requests", + "title": "删除入群申请", + "description": "使用 deleteGroupRequests 批量删除指定的入群申请记录。", "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 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 / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , request ; 删除申请记录不等于拒绝申请。需要拒绝申请时,使用 refuseGroupApplication 。" }, { - "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-group-member-list", + "title": "分页查询群成员", + "description": "使用 getGroupMemberList 按角色和分页条件读取群成员。", "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-group-member-list", + "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/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-specified-group-members-info", + "title": "查询指定群成员资料", + "description": "使用 getGroupMembersInfo 批量读取指定成员在群内的资料。", "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-specified-group-members-info", + "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/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/get-users-in-group", + "title": "查询用户入群状态", + "description": "使用 getUsersInGroup 从候选用户中筛出当前在群内的用户 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 get-users-in-group", + "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/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/retrieving-group-members/get-group-member-owner-and-admin", + "title": "获取群主和管理员", + "description": "使用 getGroupMemberOwnerAndAdmin 查询群主和管理员成员资料。", "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 retrieving-group-members get-group-member-owner-and-admin", + "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/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/retrieving-group-members/search-group-members", + "title": "搜索群成员", + "description": "使用 searchGroupMembers 按用户 ID 或群昵称搜索群成员。", "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 retrieving-group-members search-group-members", + "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/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/invite-user-to-group", + "title": "邀请用户加入群组", + "description": "使用 inviteUserToGroup 邀请一组用户加入指定群组。", "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 invite-user-to-group", + "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/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/kick-group-member", + "title": "移除群成员", + "description": "使用 kickGroupMember 将指定成员移出群组。", "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 kick-group-member", + "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/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-nickname", + "title": "修改群内昵称", + "description": "使用 SetGroupMemberInfo.nickname 更新成员在指定群中的显示昵称。", "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-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 / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ; 修改成功后,通过 群组概览 /sdk/android/group/overview group 中的 onGroupMemberInfoChanged 接收成员资料变化通知。" }, { - "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-role-level", + "title": "设置管理员", + "description": "使用 SetGroupMemberInfo.roleLevel 设置成员的群内角色。", "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-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 / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ; 角色修改成功后,通过 onGroupMemberInfoChanged 接收成员资料变化通知。" }, { - "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/set-group-member-avatar", + "title": "更新群成员头像", + "description": "使用 SetGroupMemberInfo.faceURL 更新成员在群内展示的头像。", "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 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 / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ; 修改成功后,通过 onGroupMemberInfoChanged 接收成员资料变化通知。" }, { - "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/set-group-member-extension", + "title": "设置群成员扩展字段", + "description": "使用 SetGroupMemberInfo.ex 保存应用定义的群成员扩展数据。", "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 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 / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / ;" }, { - "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/group/managing-group-members/transfer-group-owner", + "title": "转让群主", + "description": "使用 transferGroupOwner 将群主身份转让给指定群成员。", "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 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 / 请求已完成。 / @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/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/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-poll", - "content": "" + "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 / 请求已完成。 / @Override public void onError int code, String error / code 和 error 说明失败原因。 / , groupID, userID, 3600L ;" }, { - "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/overview-message", + "title": "消息概览", + "description": "了解 Android SDK 的 Message 模型、消息生命周期和消息监听。", "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 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 // 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/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-text-message", + "title": "创建文本消息", + "description": "使用 createTextMessage 创建文本 Message。", "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-text-message", + "content": "createTextMessage 只创建待发送的 Message ,不会发送消息。 Message message = OpenIMClient.getInstance .messageManager.createTextMessage text ;" }, { - "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-text-at-message", + "title": "创建 @ 消息", + "description": "使用 createTextAtMessage 创建带成员提醒的文本消息。", "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-text-at-message", + "content": "传入文本、被 @ 用户 ID、 AtUserInfo 列表和可选引用消息。 Message message = OpenIMClient.getInstance .messageManager.createTextAtMessage text, userIDs, atUserInfos, quoteMessage ;" }, { - "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-custom-message", + "title": "创建自定义消息", + "description": "使用 createCustomMessage 承载业务定义的 JSON 消息。", "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-custom-message", + "content": "data 、 extension 和 description 由业务定义,接收端应按自己的协议解析。 Message message = OpenIMClient.getInstance .messageManager.createCustomMessage dataJson, extensionJson, description ;" }, { - "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-image-message", + "title": "创建图片消息", + "description": "使用相对于 SDK 初始化数据目录的路径创建图片消息。", "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-image-message", + "content": "Message message = OpenIMClient.getInstance .messageManager .createImageMessage imagePath ; 图片文件应位于 SDK 初始化时配置的数据目录内, imagePath 传入相对于该目录的路径。本方法只创建待发送对象,普通发送流程负责上传图片。" }, { - "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-image-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-unread", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-image-message-by-file", + "content": "Message message = OpenIMClient.getInstance .messageManager .createImageMessageFromFullPath absolutePath ; 绝对路径必须可读。本方法只创建待发送对象,普通发送流程负责上传图片。" }, { - "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-image-message-by-url", + "title": "使用 URL 创建图片消息", + "description": "使用 createImageMessageByURL 创建已上传资源的图片消息。", "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-image-message-by-url", + "content": "准备 PictureInfo 的原图、大图和缩略图信息后创建消息。 Message message = OpenIMClient.getInstance .messageManager.createImageMessageByURL sourceURL, sourcePicture, bigPicture, snapshotPicture ;" }, { - "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-sound-message", + "title": "创建音频消息", + "description": "使用相对于 SDK 初始化数据目录的路径创建音频消息。", "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-sound-message", + "content": "Message message = OpenIMClient.getInstance .messageManager .createSoundMessage soundPath, durationSeconds ; 音频文件应位于 SDK 初始化时配置的数据目录内, soundPath 传入相对于该目录的路径,时长单位为秒。本方法只创建待发送对象。" }, { - "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-sound-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-sound-message-by-file", + "content": "Message message = OpenIMClient.getInstance .messageManager .createSoundMessageFromFullPath absolutePath, durationSeconds ; 绝对路径必须可读,音频时长单位为秒。本方法只创建待发送对象。" }, { - "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-sound-message-by-url", + "title": "使用 URL 创建音频消息", + "description": "使用 SoundElem 创建已上传资源的音频消息。", "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-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/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-video-message", + "title": "创建视频消息", + "description": "使用相对于 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 message creating-messages create-video-message", + "content": "Message message = OpenIMClient.getInstance .messageManager.createVideoMessage videoPath, mimeType, durationSeconds, snapshotPath ; 视频和快照文件应位于 SDK 初始化时配置的数据目录内,两个路径均相对于该目录。视频时长单位为秒。本方法只创建待发送对象。" }, { - "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-video-message-by-file", + "title": "使用本地路径创建视频消息", + "description": "使用视频和缩略图的绝对路径创建视频消息。", "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-video-message-by-file", + "content": "Message message = OpenIMClient.getInstance .messageManager.createVideoMessageFromFullPath absoluteVideoPath, mimeType, durationSeconds, absoluteSnapshotPath ; 视频和缩略图的绝对路径必须可读,视频时长单位为秒。本方法只创建待发送对象。" }, { - "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-video-message-by-url", + "title": "使用 URL 创建视频消息", + "description": "使用 VideoElem 创建已上传资源的视频消息。", "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-video-message-by-url", + "content": "将远端视频及缩略图信息填入 VideoElem 后创建消息。 Message message = OpenIMClient.getInstance .messageManager.createVideoMessageByURL videoElem ;" }, { - "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-file-message", + "title": "创建文件消息", + "description": "使用相对于 SDK 初始化数据目录的路径创建文件消息。", "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-file-message", + "content": "Message message = OpenIMClient.getInstance .messageManager .createFileMessage filePath, fileName ; 文件应位于 SDK 初始化时配置的数据目录内, filePath 传入相对于该目录的路径, fileName 用于接收端展示。本方法只创建待发送对象。" }, { - "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-file-message-by-file", + "title": "使用本地路径创建文件消息", + "description": "使用绝对路径创建文件消息。", "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-file-message-by-file", + "content": "Message message = OpenIMClient.getInstance .messageManager .createFileMessageFromFullPath absolutePath, fileName ; 绝对路径必须可读,文件名与路径分别传入。本方法只创建待发送对象。" }, { - "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-file-message-by-url", + "title": "使用 URL 创建文件消息", + "description": "使用 FileElem 创建已上传资源的文件消息。", "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-file-message-by-url", + "content": "FileElem 应包含远端 URL、文件名和文件大小。 Message message = OpenIMClient.getInstance .messageManager.createFileMessageByURL fileElem ;" }, { - "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/creating-messages/create-card-message", + "title": "创建名片消息", + "description": "使用 createCardMessage 创建联系人名片消息。", "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 creating-messages create-card-message", + "content": "CardElem 保存名片用户的展示资料。 Message message = OpenIMClient.getInstance .messageManager.createCardMessage cardElem ;" }, { - "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/creating-messages/create-location-message", + "title": "创建位置消息", + "description": "使用 createLocationMessage 创建经纬度和描述位置消息。", "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 creating-messages create-location-message", + "content": "经纬度使用十进制度数,描述用于地图或列表展示。 Message message = OpenIMClient.getInstance .messageManager .createLocationMessage latitude, longitude, description ;" }, { - "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/creating-messages/create-face-message", + "title": "创建表情消息", + "description": "使用 createFaceMessage 创建自定义表情消息。", "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 creating-messages create-face-message", + "content": "data 保存表情 URL 等 JSON 数据。 Message message = OpenIMClient.getInstance .messageManager.createFaceMessage index, dataJson ;" }, { - "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/creating-messages/create-quote-message", + "title": "创建回复消息", + "description": "使用 createQuoteMessage 创建引用已有消息的回复。", "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 creating-messages create-quote-message", + "content": "引用消息保存被引用的完整 Message 。 Message message = OpenIMClient.getInstance .messageManager .createQuoteMessage replyText, quotedMessage ;" }, { - "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/creating-messages/create-advanced-text-message", + "title": "创建富文本消息", + "description": "使用 createAdvancedTextMessage 创建包含结构化实体范围的富文本消息。", "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 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/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/creating-messages/create-advanced-quote-message", + "title": "创建富文本回复", + "description": "使用 createAdvancedQuoteMessage 创建带富文本实体的引用回复消息。", "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 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 ; 实体范围必须对应最终回复正文。 type 、 url 和 info 的业务协议与 创建富文本消息 /sdk/android/message/creating messages/create advanced text message 相同。本方法只创建待发送对象,不会自动发送。" }, { - "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/creating-messages/create-forward-message", + "title": "创建转发消息", + "description": "使用 createForwardMessage 创建转发消息。", "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 creating-messages create-forward-message", + "content": "传入待转发的 Message ,创建结果仍需通过发送方法投递到目标会话。 Message message = OpenIMClient.getInstance .messageManager.createForwardMessage sourceMessage ;" }, { - "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/creating-messages/create-merger-message", + "title": "创建合并消息", + "description": "使用 createMergerMessage 将多条消息合并为一条摘要消息。", "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 creating-messages create-merger-message", + "content": "传入消息列表、标题和摘要列表。 Message message = OpenIMClient.getInstance .messageManager.createMergerMessage messages, title, summaries ;" }, { - "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/sending-messages/send-message", + "title": "发送消息", + "description": "使用 sendMessage 将 Message 发送到单聊或群聊。", "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 sending-messages send-message", + "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-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/sending-messages/send-message-not-oss", + "title": "发送不经 OSS 的消息", + "description": "使用 sendMessageNotOss 发送已经由业务上传资源的媒体消息。", "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 sending-messages send-message-not-oss", + "content": "消息中已有媒体 URL 时使用该方法,无需再次上传媒体文件。 messageManager.sendMessageNotOss callback, message, peerUserID, null, offlinePushInfo ;" }, { - "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/sending-messages/set-msg-send-progress-listener", + "title": "监听消息发送进度", + "description": "通过 OnMsgSendCallback 的进度回调更新媒体发送进度。", "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 sending-messages set-msg-send-progress-listener", + "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/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/receiving-messages/receive-messages", + "title": "接收消息", + "description": "使用 OnAdvanceMsgListener 接收新消息、离线消息和在线消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android message translating-messages translation-engine", - "content": "" + "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 / message 是新收到的消息。 / @Override public void onRecvOfflineNewMessage List messages / messages 是离线消息。 / ;" }, { - "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/receiving-messages/receive-custom-business-messages", + "title": "接收自定义业务消息", + "description": "使用 setCustomBusinessListener 接收独立于普通聊天消息的业务回调。", "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 receiving-messages receive-custom-business-messages", + "content": "自定义业务回调携带字符串,业务侧应按约定格式解析,不要将其直接当作 Message 渲染。 messageManager.setCustomBusinessListener new OnCustomBusinessListener @Override public void onRecvCustomBusinessMessage String payload / payload 是自定义业务数据。 / ;" }, { - "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/retrieving-messages/load-older-messages", + "title": "加载历史消息", + "description": "使用 getAdvancedHistoryMessageList 分页加载会话历史消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android migrating-to-openim", - "content": "" + "keywords": "sdk android v4 sdk android message retrieving-messages load-older-messages", + "content": "首次查询传 startMsg 为 null ,后续将上一页边界消息作为起点。普通历史消息使用 ViewType.History ,按返回的 clientMsgID 去重。 messageManager.getAdvancedHistoryMessageList callback, conversationID, startMessage, 20, ViewType.History ;" }, { - "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/retrieving-messages/load-newer-messages", + "title": "反向加载历史消息", + "description": "使用 getAdvancedHistoryMessageListReverse 加载起点之后的消息。", "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 retrieving-messages load-newer-messages", + "content": "该方法用于从消息定位点向后读取下一页历史消息。此类方向历史分页使用 ViewType.History 。 messageManager.getAdvancedHistoryMessageListReverse callback, conversationID, startMessage, 20, ViewType.History ;" }, { - "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/retrieving-messages/find-messages-by-id", + "title": "按 ID 查找消息", + "description": "使用 findMessageList 按 SearchParams 查询消息记录。", "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 retrieving-messages find-messages-by-id", + "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/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/retrieving-messages/load-message-context", + "title": "读取消息上下文", + "description": "使用 Android SDK 读取一条消息前后的上下文。", "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 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 ; // 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/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/searching-messages/search-messages", + "title": "搜索消息", + "description": "使用 searchLocalMessages 搜索当前账号已同步到本地的消息。", "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 searching-messages search-messages", + "content": "可按会话、关键词、发送者、消息类型、时间范围和分页参数搜索。 conversationID 传 null 表示全局搜索。 messageManager.searchLocalMessages callback, conversationID, keywords, 1, senderIDs, messageTypes, 0, 0, 0, 20 ;" }, { - "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/composing-messages/update-typing-status", + "title": "上报输入状态", + "description": "使用 Android SDK 上报当前会话的输入状态。", "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 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 // 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/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/composing-messages/get-typing-status", + "title": "查询输入状态", + "description": "使用 getInputState 查询指定用户在会话中的当前输入状态。", "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 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 ; // 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/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/delete-local-message", + "title": "删除本地消息", + "description": "使用 deleteMessageFromLocalStorage 仅删除当前设备的消息副本。", "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 delete-local-message", + "content": "该操作不影响其他设备和其他用户的消息记录。 messageManager.deleteMessageFromLocalStorage conversationID, clientMsgID, callback ;" }, { - "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/message/managing-messages/delete-saved-messages", + "title": "批量删除消息", + "description": "使用 Android SDK 批量删除当前账号在同一会话中的消息。", "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 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 // message 是已删除的消息。" }, { - "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/message/managing-messages/delete-user-messages", + "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 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 // event 包含受影响的会话和用户。" }, { - "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/message/managing-messages/revoke-a-message", + "title": "撤回消息", + "description": "撤回已发送消息,并处理其他客户端收到的撤回通知。", "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 message managing-messages revoke-a-message", + "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/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/message/managing-messages/modify-a-message", + "title": "修改消息", + "description": "修改支持编辑的消息内容,并处理其他客户端收到的消息修改事件。", "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 message managing-messages modify-a-message", + "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/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/message/managing-messages/get-pinned-messages", + "title": "查询会话置顶消息", + "description": "使用 getConversationPinnedMsgs 查询会话中的置顶消息。", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android user overview-user", - "content": "" + "keywords": "sdk android v4 sdk android message managing-messages get-pinned-messages", + "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/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/message/managing-messages/set-message-pinned", + "title": "置顶或取消置顶消息", + "description": "设置会话消息的置顶状态,并处理置顶消息变化事件。", "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 message managing-messages set-message-pinned", + "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/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/message/managing-messages/insert-local-single-message", + "title": "插入本地单聊消息", + "description": "使用 insertSingleMessageToLocalStorage 插入仅当前设备可见的单聊消息。", "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 message managing-messages insert-local-single-message", + "content": "该方法不向服务器发送消息。 receiver 是接收者用户 ID, sender 是发送者用户 ID。 messageManager.insertSingleMessageToLocalStorage callback, message, receiverUserID, senderUserID ;" }, { - "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/message/managing-messages/insert-local-group-message", + "title": "插入本地群聊消息", + "description": "使用 insertGroupMessageToLocalStorage 插入仅当前设备可见的群聊消息。", "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 message managing-messages insert-local-group-message", + "content": "传入群 ID 与发送者 ID,消息不会同步到其他设备。 messageManager.insertGroupMessageToLocalStorage callback, message, groupID, senderUserID ;" }, { - "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/message/managing-messages/clear-all-local-messages", + "title": "清理全部本地消息", + "description": "使用 deleteAllMsgFromLocal 清理当前设备的全部消息。", "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 message managing-messages clear-all-local-messages", + "content": "该操作只清理当前设备本地缓存,不删除服务端记录。 messageManager.deleteAllMsgFromLocal callback ;" }, { - "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/message/managing-messages/clear-all-messages", + "title": "清理全部消息", + "description": "使用 deleteAllMsgFromLocalAndSvr 清理本地和服务端消息。", "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 message managing-messages clear-all-messages", + "content": "这是高影响操作,产品层应二次确认,并在完成后清理本地会话展示。 messageManager.deleteAllMsgFromLocalAndSvr callback ;" }, { - "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/message/managing-messages/set-message-local-ex", + "title": "设置消息本地扩展", + "description": "使用 setMessageLocalEx 保存仅当前设备使用的消息扩展数据。", "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 message managing-messages set-message-local-ex", + "content": "localEx 适合保存下载路径、播放状态等本地信息,不会同步给其他用户。 messageManager.setMessageLocalEx callback, conversationID, clientMsgID, localExJson ;" }, { - "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/message/managing-read-status/send-group-read-receipts", + "title": "上报群消息已读", + "description": "使用 Android SDK 上报群消息已读回执。", "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 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 // 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 // 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", + "title": "上传文件", + "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 // 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", + "title": "音视频通话概览", + "description": "了解 Android SDK 的音视频通话信令、房间信息和事件边界。", + "context": "SDKs · Android · v4", + "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/calling/managing-calls/start-single-call", + "title": "发起单聊通话", + "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 // 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", + "title": "发起群聊通话", + "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 // 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", + "title": "接受通话", + "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 // 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", + "title": "拒绝通话", + "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 // 拒绝信令请求已完成。 @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", + "title": "取消通话邀请", + "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 // 信令操作已完成。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , activeInfo ; 必须传入发起时保存的完整 SignalingInfo ,不能只构造一个 roomID 。成功回调表示取消信令请求完成;应用还应结束本地等待接听状态,并释放尚未使用的媒体资源。远端通过 onInvitationCancelled 更新。" + }, + { + "path": "/sdk/android/calling/managing-calls/hang-up-call", + "title": "挂断通话", + "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 // 信令操作已完成。 @Override public void onError int code, String error // code 和 error 说明失败原因。 , signalingInfo ; 成功回调只表示挂断信令请求已完成,不代表本地资源已自动释放。应用应关闭通话界面、停止本地采集、断开媒体房间,并释放摄像头和麦克风。" + }, + { + "path": "/sdk/android/calling/managing-calls/handle-call-events", + "title": "处理通话事件", + "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 // 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", + "title": "恢复启动前收到的通话邀请", + "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 // 使用前校验 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", + "title": "查询群组通话房间", + "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 // 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", + "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 // 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", + "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 // 信令发送请求已完成。 @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", + "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;再次设置会覆盖之前设置的 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", + "title": "日志", + "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 // 日志上传请求已完成。 @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 8fd6d279f9..c0a6d33e58 100644 --- a/src/generated/search-index.json +++ b/src/generated/search-index.json @@ -1896,1028 +1896,1172 @@ "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.", + "path": "/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.", "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 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/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": "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 channel overview-channel", - "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/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 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: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", + "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 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 // 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", "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.", "context": "SDKs · Android · v4", "keywords": "sdk android v4 sdk android getting-started send-first-message", - "content": "" + "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/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": "User overview", + "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 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 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/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": "Get specified user profiles", + "description": "Retrieve public user profiles in batches by userID using PublicUserInfo.", "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 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/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": "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 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 // 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/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": "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 message managing-a-message send-typing-indicators-to-other-members", - "content": "" + "keywords": "sdk android v4 sdk android user user-profile set-self-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/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": "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 managing-pinned-messages-in-group-channels pin-a-message", - "content": "" + "keywords": "sdk android v4 sdk android user user-profile set-global-message-reception", + "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/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/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 message managing-polls create-a-poll", - "content": "" + "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/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/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 managing-scheduled-messages-in-group-channel create-a-scheduled-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 // 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/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/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 marking-messages-as-delivered-in-a-group-channel mark-messages-as-delivered", - "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 // 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/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/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 message mentioning-other-users-in-a-message mention-other-users-in-a-message", - "content": "" + "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 // 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/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/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 message overview-message", - "content": "" + "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/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/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-messages retrieve-a-message", - "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 // 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/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/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 searching-messages-in-a-group-channel search-messages-by-a-keyword", - "content": "" + "keywords": "sdk android v4 sdk android user friends search-friends", + "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/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/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 sending-a-message share-an-encrypted-file", - "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 // 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/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/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 sending-a-message smart-throttling", - "content": "" + "keywords": "sdk android v4 sdk android user friends check-friend", + "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/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/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 translating-messages auto-translate-messages", - "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 // 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/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/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 translating-messages translate-messages-on-demand", - "content": "" + "keywords": "sdk android v4 sdk android user friends delete-friend", + "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/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/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 using-message-threading create-a-message-thread", - "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 // 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/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/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 overview", - "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 // 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/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/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 push-notifications managing-push-notifications configure-push-notification-preferences", - "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 // 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/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/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 push-notifications managing-push-notifications push-notification-translation", - "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 // 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/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/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 push-notifications overview-push-notifications", - "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 // 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/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/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 report overview-report", - "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. 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/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/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 user moderating-a-user block-and-unblock-other-members", - "content": "" + "keywords": "sdk android v4 sdk android user blacklist add-blacklist", + "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/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/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 user moderating-a-user mute-and-unmute-a-user", - "content": "" + "keywords": "sdk android v4 sdk android user blacklist remove-blacklist", + "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/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/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 user retrieving-and-updating-user-information retrieve-the-online-status-of-a-user", - "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 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/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/get-conversation-by-target", + "title": "Open a conversation", + "description": "Use getOneConversation() to retrieve one conversation by user or group.", "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 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 // 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/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/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", + "description": "Use getConversationIDBySessionType() to resolve a conversation ID from a chat target.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android application authenticating-a-user authentication", - "content": "" + "keywords": "sdk android v4 sdk android conversation retrieving-conversations get-conversation-id", + "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/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/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", + "description": "Use getMultipleConversation() to retrieve conversations by conversationID.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android application overview-application", - "content": "" + "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 // 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/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/retrieving-conversations/retrieve-conversation-list", + "title": "Get the conversation list", + "description": "Use getConversationListSplit() to retrieve the signed-in account conversation list by page.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android application understanding-rate-limits rate-limits", - "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. 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/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/pin-conversation", + "title": "Pin or unpin a conversation", + "description": "Use pinConversation() to set the pinned state of a conversation.", "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 pin-conversation", + "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/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/set-conversation-extension", + "title": "Set conversation extra data", + "description": "Use setConversationEx() to set a conversation extension string.", "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 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 // 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/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/set-conversation-draft", + "title": "Set a conversation draft", + "description": "Use setConversationDraft() to save a conversation draft.", "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 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 // 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/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/set-message-receive-option", + "title": "Set conversation message reception", + "description": "Use setConversationRecvMessageOpt() to set message reception and notification behavior for one conversation.", "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 set-message-receive-option", + "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/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/clear-group-mentions", + "title": "Reset group mention status", + "description": "Use resetConversationGroupAtType() to reset a group mention state for a conversation.", "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 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 // 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/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/mark-conversation-read", + "title": "Mark a conversation as read", + "description": "Use messageManager.markConversationMessageAsRead() to mark conversation messages as read.", "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 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 // 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/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/get-total-unread-count", + "title": "Track the total unread count", + "description": "Use getTotalUnreadMsgCount() to retrieve the total unread count for the signed-in account.", "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 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 ; // 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/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/set-private-chat", + "title": "Enable or disable burn after reading", + "description": "Use setOneConversationPrivateChat() to configure burn-after-reading mode for a conversation.", "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 set-private-chat", + "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/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/set-burn-duration", + "title": "Set the burn duration", + "description": "Use setConversationBurnDuration() to set the burn-after-reading retention duration.", "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 set-burn-duration", + "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/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/set-message-destruct", + "title": "Schedule server message deletion", + "description": "Use setConversation() to configure scheduled server message deletion for a conversation.", "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 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 // 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/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/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", + "description": "Use hideConversation() to hide a conversation entry from the current account.", "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 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 // 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/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/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", + "description": "Use deleteConversationAndDeleteAllMsg() to delete a conversation and its messages.", "context": "SDKs · Android · v4", - "keywords": "sdk android v4 sdk android channel managing-operators register-and-remove-operators", - "content": "" + "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 // 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/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/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", + "description": "Use messageManager.clearConversationAndDeleteAllMsg() to keep a conversation entry while clearing its messages.", "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 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 // 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/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/overview-group", + "title": "Group overview", + "description": "Understand group concepts, core data types, and main capabilities in the Android SDK.", "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 overview-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/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/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 channel searching-channels filter-group-channels-by-user-ids", - "content": "" + "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 / group contains the new group profile. / @Override public void onError int code, String error / code and error describe the failure. / ;" }, { - "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/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 channel searching-channels search-group-channels-by-name-url-or-other-filters", - "content": "" + "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 / 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/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-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 channel searching-channels search-open-channels-by-name-url-or-custom-types", - "content": "" + "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 / 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/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-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 deprecated", - "content": "" + "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 / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / ;" }, { - "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/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 event-handler managing-channel-event-handlers add-or-remove-a-channel-event-handler", - "content": "" + "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 / 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/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/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 event-handler managing-connection-event-handlers add-or-remove-a-connection-event-handler", - "content": "" + "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 / 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/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/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 event-handler managing-user-event-handlers add-or-remove-a-user-event-handler", - "content": "" + "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 / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / ;" }, { - "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/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 event-handler overview-event-handler", - "content": "" + "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 / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / , groupID, true ;" }, { - "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/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 getting-started collection-migration-guide", - "content": "" + "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 / 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/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/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 getting-started kotlin-extension", - "content": "" + "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 / 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/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/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 getting-started migration-guide", - "content": "" + "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 / 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/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/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 local-caching overview-local-caching", - "content": "" + "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 / groups contains the requested group profiles. / @Override public void onError int code, String error / code and error describe the failure. / , groupIDs ;" }, { - "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/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 local-caching using-group-channel-collection group-channel-collection", - "content": "" + "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 / 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/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/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 local-caching using-message-collection message-collection", - "content": "" + "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 / 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/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/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 logger", - "content": "" + "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 / 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/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/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 message categorizing-messages categorize-messages-by-custom-type", - "content": "" + "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 / items contains the current page. / @Override public void onError int code, String error / code and error describe the failure. / , request ;" }, { - "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/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 message listing-changelogs list-changelogs-of-messages", - "content": "" + "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 / 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/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/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 message managing-a-message clear-the-chat-history-in-a-group-channel", - "content": "" + "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 / 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/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/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 message managing-a-message copy-a-message", - "content": "" + "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 / 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/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/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 message managing-a-message delete-a-message", - "content": "" + "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 / 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/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-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 message managing-a-message display-open-graph-tags-in-a-message", - "content": "" + "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 / 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/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-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 message managing-a-message update-a-message", - "content": "" + "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 / members contains the requested profiles. / @Override public void onError int code, String error / code and error describe the failure. / , groupID, userIDs ;" }, { - "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/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 message managing-pinned-messages-in-group-channels list-pinned-messages", - "content": "" + "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 / 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/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/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 message managing-pinned-messages-in-group-channels unpin-a-message", - "content": "" + "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 / 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/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/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 message managing-polls add-a-poll-option", - "content": "" + "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 / 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/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/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 message managing-polls cast-or-cancel-a-vote", - "content": "" + "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 / 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/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/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 message managing-polls close-a-poll", - "content": "" + "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 / 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/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-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 message managing-polls delete-a-poll", - "content": "" + "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 / 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/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-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 message managing-polls delete-a-poll-option", - "content": "" + "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 / 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/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/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 message managing-polls list-changelogs-of-polls", - "content": "" + "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 / 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/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/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 message managing-polls retrieve-a-list-of-polls", - "content": "" + "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 / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / ;" }, { - "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/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 message managing-polls retrieve-a-list-of-voters", - "content": "" + "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 / 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/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/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 message managing-polls retrieve-a-poll", - "content": "" + "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 / The request completed. / @Override public void onError int code, String error / code and error describe the failure. / , groupID, userID, 3600L ;" }, { - "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/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 managing-polls retrieve-a-poll-option", - "content": "" + "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 // 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/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-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 managing-polls update-a-poll", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-text-message", + "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/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-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 managing-polls update-a-poll-option", - "content": "" + "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/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-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 managing-read-status-in-a-group-channel get-read-status", - "content": "" + "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/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-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 managing-read-status-in-a-group-channel mark-messages-as-read", - "content": "" + "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/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-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 managing-read-status-in-a-group-channel mark-messages-as-unread", - "content": "" + "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/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-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 managing-scheduled-messages-in-group-channel cancel-a-scheduled-message", - "content": "" + "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/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-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 managing-scheduled-messages-in-group-channel list-all-scheduled-messages", - "content": "" + "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/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-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 managing-scheduled-messages-in-group-channel retrieve-a-scheduled-message", - "content": "" + "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/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-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 managing-scheduled-messages-in-group-channel retrieve-the-total-number-of-scheduled-messages", - "content": "" + "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/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-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 managing-scheduled-messages-in-group-channel send-a-scheduled-message-immediately", - "content": "" + "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/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-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 managing-scheduled-messages-in-group-channel update-a-scheduled-message", - "content": "" + "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/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-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 receiving-messages-through-event-handler receive-messages-in-a-group-channel", - "content": "" + "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/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-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 receiving-messages-through-event-handler receive-messages-in-an-open-channel", - "content": "" + "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/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-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 retrieving-messages retrieve-a-list-of-messages", - "content": "" + "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/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-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 retrieving-unread-count-in-a-group-channel members-who-havent-read-a-message", - "content": "" + "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/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/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 retrieving-unread-count-in-a-group-channel members-who-havent-received-a-message", - "content": "" + "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/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/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 retrieving-unread-count-in-a-group-channel unread-channels", - "content": "" + "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/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/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 retrieving-unread-count-in-a-group-channel unread-items", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-face-message", + "content": "data stores JSON such as an emoji URL. Message message = OpenIMClient.getInstance .messageManager.createFaceMessage index, dataJson ;" }, { - "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/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 retrieving-unread-count-in-a-group-channel unread-messages-in-a-channel", - "content": "" + "keywords": "sdk android v4 sdk android message creating-messages create-quote-message", + "content": "A quote message stores the complete quoted Message . Message message = OpenIMClient.getInstance .messageManager .createQuoteMessage replyText, quotedMessage ;" }, { - "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/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 retrieving-unread-count-in-a-group-channel unread-messages-in-all-channels", - "content": "" + "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/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/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 sending-a-message cancel-an-in-progress-file-upload", - "content": "" + "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 ; 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/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/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 sending-a-message send-a-critical-alert-message-to-ios-device-users", - "content": "" + "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. Message message = OpenIMClient.getInstance .messageManager.createMergerMessage messages, title, summaries ;" }, { - "path": "/sdk/android/message/sending-a-message/send-a-message", + "path": "/sdk/android/message/sending-messages/send-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.", + "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-a-message send-a-message", - "content": "" + "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 / 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-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/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-a-message send-an-admin-message", - "content": "" + "keywords": "sdk android v4 sdk android message sending-messages send-message-not-oss", + "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-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/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-a-message spam-flood-protection", - "content": "" + "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 / 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/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/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 sending-a-message track-file-upload-progress-using-a-handler", - "content": "" + "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 / message is the newly received message. / @Override public void onRecvOfflineNewMessage List messages / messages contains offline messages. / ;" }, { - "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/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 translating-messages translation-engine", - "content": "" + "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 / payload contains the custom business data. / ;" }, { - "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/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 using-message-threading list-replies-in-a-message-thread", - "content": "" + "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. Use ViewType.History for ordinary history loading and deduplicate returned messages by clientMsgID . messageManager.getAdvancedHistoryMessageList callback, conversationID, startMessage, 20, ViewType.History ;" }, { - "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/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 migrating-to-openim", - "content": "" + "keywords": "sdk android v4 sdk android message retrieving-messages load-newer-messages", + "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/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/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 push-notifications managing-push-notifications push-notification-content-templates", - "content": "" + "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 / result contains the matches. / @Override public void onError int code, String error / code and error describe the failure. / , searchParams ;" }, { - "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/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 push-notifications managing-push-notifications push-notification-tester", - "content": "" + "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 ; // 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/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/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 push-notifications managing-push-notifications set-up-push-notifications-for-fcm", - "content": "" + "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/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/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 push-notifications managing-push-notifications set-up-push-notifications-for-hms", - "content": "" + "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 // 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/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/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 push-notifications marking-push-notifications-as-delivered mark-push-notifications-as-delivered", - "content": "" + "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 ; // 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/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/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 push-notifications multi-device-support set-up-push-notifications-for-fcm", - "content": "" + "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/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/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 push-notifications multi-device-support set-up-push-notifications-for-hms", - "content": "" + "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 // message is the deleted message." }, { - "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/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 report creating-a-report report-a-message-user-or-channel", - "content": "" + "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 // event identifies the affected conversation and user." }, { - "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/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 user managing-user-metadata manage-user-metadata", - "content": "" + "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 // 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/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/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 user moderating-a-user retrieve-a-list-of-blocked-users", - "content": "" + "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 // 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/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/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 user moderating-a-user retrieve-a-list-of-muted-users", - "content": "" + "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 / messages contains pinned messages. / @Override public void onError int code, String error / code and error describe the failure. / , conversationID ;" }, { - "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/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 user overview-user", - "content": "" + "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 // 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/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/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 user retrieving-and-updating-user-information retrieve-the-latest-information-on-participants", - "content": "" + "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 is the recipient's user ID, and sender is the sender's user ID. messageManager.insertSingleMessageToLocalStorage callback, message, receiverUserID, senderUserID ;" }, { - "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/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 user retrieving-and-updating-user-information update-user-profile", - "content": "" + "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/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/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 user retrieving-users retrieve-a-list-of-members-and-operators-in-a-specific-order", - "content": "" + "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/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/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 user retrieving-users retrieve-a-list-of-operators", - "content": "" + "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/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/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 user retrieving-users retrieve-a-list-of-users-in-a-channel", - "content": "" + "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/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/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 user retrieving-users retrieve-a-list-of-users-in-an-application", - "content": "" + "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 // 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/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/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 marking-messages-as-read-in-a-group-channel mark-messages-as-read", - "content": "" + "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 // 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", + "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 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", + "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 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", + "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 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", + "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 // 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", + "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 // 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", + "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 // 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", + "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, 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", + "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 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", + "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": "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", + "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 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", + "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 // 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", + "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": "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", + "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. 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 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 // 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", diff --git a/src/lib/client-sdk-commercial.ts b/src/lib/client-sdk-commercial.ts index 0518e40313..7f0c125136 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,17 @@ 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: { + getConversationPinnedMsgs: 'getConversationPinnedMsg', + onHangup: 'OnHangUp', + onRecvGroupMessageReadReceipt: 'OnRecvGroupReadReceipt', + }, flutter: { getConversationGroupByConversationID: 'getConversationGroupIDsByConversationID', onHangup: 'OnHangUp', @@ -83,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 @@ -104,6 +116,10 @@ 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', + '/sdk/android/user/user-profile/set-friend-add-permission', ]); function applyCommercialConceptOverride( @@ -150,7 +166,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,