Full demo project. Covers all Agora RTC APIs using Java/Kotlin + XML layouts. Default project for video, screen sharing, beauty, or extension demos.
./gradlew assembleDebug # build debug APK
./gradlew installDebug # build + install to connected device
./gradlew test # unit tests
./gradlew connectedAndroidTest # instrumented tests (device required)See README.md — Obtain an App Id.
Controlled via gradle.properties:
simpleFilter = true— enables the C++ video extension module (agora-simple-filter). Requires OpenCV and Agora C++ SDK headers. See README for setup.streamEncrypt = true— enables the custom stream encryption module (agora-stream-encrypt). Requires Agora C++ SDK headers. See README for setup.
Both are false by default. Do not enable unless the feature explicitly requires it.
- Do NOT add audio-only cases that require
voice-sdkexclusivity — useAPIExample-Audio/instead. - Do NOT use Jetpack Compose — this project is XML + ViewBinding only.
- Each case Fragment must create and destroy its own
RtcEngineinstance. - Always call
engine.leaveChannel()beforeRtcEngine.destroy()inonDestroy(). - Call
RtcEngine.destroy()viahandler.post(RtcEngine::destroy)— direct call blocks the main thread (ANR). - All
IRtcEngineEventHandlercallbacks run on a background thread — userunOnUIThread()for UI updates. - Always call
checkOrRequestPermission()beforejoinChannel(). setParameters(...)is required in every case for backend reporting — do not omit it.- Always null-check
getPrivateCloudConfig()before callingsetLocalAccessPoint()— returns null on non-private-cloud builds.
| Skill | Path | Description |
|---|---|---|
| upsert-case | .agent/skills/upsert-case/ |
Add a new case or modify an existing one |
| query-cases | .agent/skills/query-cases/ |
Query and browse existing cases |
| review-case | .agent/skills/review-case/ |
Review a case against project red lines |
ARCHITECTURE.md— full directory layout, case registration internals, navigation details