> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stmlink.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> 对外开放的服务端接口有两组前缀，都用同一套鉴权：`/server/v1/...`（SRTC 与 SMeeting 的主接口）和 `/stm/srvapi/v1/...`（SMeeting 的用户体系，服务端极简对接会用到）。鉴权是 app_id + nonce + timestamp + signature 四个请求头，用 app_key 做 HMAC-SHA256 签名，只能从业务方自己的后端调用。除这两组前缀外的接口均为内部接口，不要建议客户调用。 Public server APIs use two path prefixes with the same authentication: `/server/v1/...` (the main APIs of both SRTC and SMeeting) and `/stm/srvapi/v1/...` (the SMeeting user system, used by server-side low-code integration). Authenticate with four request headers, app_id + nonce + timestamp + signature, where signature is HMAC-SHA256 keyed with app_key; call these APIs only from the customer's own backend. Any other path is internal: never suggest calling it.
> app_key 是服务端密钥，绝不能出现在客户端代码、前端配置或移动 App 里。客户端加入频道用的 token 必须由业务方后端签发后下发（SRTC 走 `/server/v1/channel/grant`，SMeeting 走 `/stm/srvapi/v1/member/grant`）。 app_key is a server-side secret and must never appear in client code, frontend config, or a mobile app. The token a client uses to join must be issued by the customer's backend and passed down to the client (SRTC: `/server/v1/channel/grant`; SMeeting: `/stm/srvapi/v1/member/grant`).
> SRTC 与 SMeeting 是上下两层不同的产品，术语不通用：SRTC 是音视频底座，说「频道 channel」「加入 / 退出」；SMeeting 建在 SRTC 之上，说「房间 room」「会议 meeting」「进入 / 退出」。回答时按用户所在的层用对应术语，不要把「房间」「会议」安到 SRTC 的接口上，也不要用「频道」「加入 / 离开」描述 SMeeting 的概念（接口标识符原样保留）。 SRTC and SMeeting are two separate layers with different terminology. SRTC is the audio/video foundation: it has channels, and users join and leave a channel. SMeeting is built on top of SRTC: it has rooms and meetings, and members enter and exit a meeting. Answer in the terms of the layer the user is working with: never apply "room" or "meeting" to SRTC APIs, and never describe SMeeting concepts in prose with "channel", "join", or "leave" (API identifiers such as `force_join` keep their literal names).
> 同一能力在各端 SDK 里的包名、类名、方法名并不相同。写示例代码时请使用文档中该端自己的 API，不要把一个端的写法套到另一个端上。苹果平台每个产品都有两套 SDK（Swift 原生与 Objective-C），两套 API 不能混用。 Package, class, and method names differ between platform SDKs for the same capability. In sample code, use the API documented for that platform; never carry one platform's code over to another. On Apple platforms each product ships two SDKs (native Swift and Objective-C) whose APIs must not be mixed.

# Meeting events overview

> How SMeeting Android splits ongoing events into Engine, IM, device, room, member, message, media, and raw-frame interfaces, their lifecycles and callback threads, and which interface to register for each need. Read this before registering in-meeting events.

SMeeting Android splits ongoing events by scope into Engine, IM, device, room, member, message, media, and other interfaces. Most events are registered through nullable properties on `MeetingEngine`; events for a single remote video are registered through a parameter of the subscribe method.

## Usage notes

* Engine, IM, camera device, and mic device events share the `MeetingEngine` lifecycle; assigning `null` stops new dispatches.
* Room, member, message, and media events are bound to the current meeting and cleared automatically when you exit the meeting; reassign them for the next meeting.
* `MeetingRemoteVideoEvent` is passed in with a single remote subscription and stops dispatching after you unsubscribe or exit the meeting.
* Callbacks stay on the actual source thread of SRTC, IM, or the network and are not switched to the Android main thread automatically.
* Local and remote raw-frame callbacks run on high-frequency media threads; don't perform blocking operations in them.
* Each event group provides a corresponding `MeetingXxxSimpleEvent` empty implementation, so you only override the methods you actually care about.

## Registration example

```kotlin theme={null}
engine.engineEvent = object : MeetingEngineSimpleEvent() {
    override fun onError(errorCode: Int, message: String?) {
        // Log global runtime errors
    }
}

engine.userEvent = object : MeetingUserSimpleEvent() {
    override fun onUserEnter(uid: String) {
        // Refresh the member list
    }
}
```

## Choosing an event interface

| Event interface | When to use |
| - | - |
| [MeetingEngineEvent](/en/meeting/android/api-reference/MeetingEngineEvent) | Global Engine runtime errors |
| [MeetingImEvent](/en/meeting/android/api-reference/MeetingImEvent) | IM connection, reconnection, calls, and reminders |
| [MeetingCameraDeviceEvent](/en/meeting/android/api-reference/MeetingCameraDeviceEvent) | Camera list, disconnection, and runtime errors |
| [MeetingMicDeviceEvent](/en/meeting/android/api-reference/MeetingMicDeviceEvent) | Mic list and invalidation of the current device |
| [MeetingScreenCaptureEvent](/en/meeting/android/api-reference/MeetingScreenCaptureEvent) | Android local screen capture state |
| [MeetingRoomEvent](/en/meeting/android/api-reference/MeetingRoomEvent) | Room configuration, connection, recording, sharing, sub-meetings, and sign-in |
| [MeetingUserEvent](/en/meeting/android/api-reference/MeetingUserEvent) | Members, roles, permissions, device state, waiting room, and tracks |
| [MeetingMessageEvent](/en/meeting/android/api-reference/MeetingMessageEvent) | Chat, system messages, and app extension messages |
| [MeetingMediaEvent](/en/meeting/android/api-reference/MeetingMediaEvent) | Media connection, remote frames, statistics, volume, and network quality |
| [MeetingLocalVideoFrameEvent](/en/meeting/android/api-reference/MeetingLocalVideoFrameEvent) | Local YUV video frames |
| [MeetingLocalAudioFrameEvent](/en/meeting/android/api-reference/MeetingLocalAudioFrameEvent) | Local PCM audio frames |
| [MeetingRemoteVideoEvent](/en/meeting/android/api-reference/MeetingRemoteVideoEvent) | Receive and stutter state of a single remote video |
