# camera-samples **Repository Path**: mirrors_android/camera-samples ## Basic Information - **Project Name**: camera-samples - **Description**: Multiple samples showing the best practices in camera APIs on Android. - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-08 - **Last Updated**: 2026-07-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Android Camera Samples Catalog A single, stand-alone Android app that showcases the **Camera2** and **CameraX** APIs through a catalog of small, self-contained, **Compose-first** samples. Each sample focuses on one feature and reuses a shared camera-scaffolding layer, so adding a new sample means writing the feature — not the boilerplate. ## Screenshots The home catalog in the "Console" theme — a violet accent, monospace metadata, a bordered featured card, and a dense 2-column grid. The filter pills narrow the catalog by category, and samples are grouped CameraX-first, Camera2 below.

Home catalog — all samples     Home catalog — the ML category

## How to run 1. Clone the repository. 2. Open it in a recent Android Studio. 3. Run the `app` configuration on a device or emulator. Camera-dependent samples (extensions, slow-motion, ML) behave best on a physical device; emulators with a virtual camera cover the basics. No Firebase / `google-services.json` is required. ## Samples Filter the catalog by category (**Images / Video / ML / Graphics / Extensions / Controls**) on the home screen. Within each view, **CameraX** samples are listed first and **Camera2** below. | Sample | API | What it shows | | --- | --- | --- | | Take a Photo | CameraX / Camera2 | Preview, tap-to-focus, capture a still | | Take a Video | CameraX (Recorder) / Camera2 (MediaRecorder) | Record video to `DCIM/Camera` | | Pause/Resume | CameraX (Recorder) | Pause and resume a recording mid-capture | | Slow Motion | Camera2 | High-speed (constrained) recording | | HDR Video | CameraX / Camera2 | Record & play back 10-bit HDR video (`DynamicRange` / `DynamicRangeProfiles`) | | Video Stabilization | CameraX | Steadier footage via preview + video stabilization | | Flip While Recording | CameraX | Switch front/back cameras without interrupting the recording | | QR Scanner | CameraX / Camera2 + ML Kit | Real-time barcode/QR detection with overlay | | Image Labeling | CameraX + ML Kit | Real-time on-device labels via `ImageAnalysis` | | Luminosity | CameraX | Scene-brightness meter from the `ImageAnalysis` Y plane | | Green Screen | CameraX + ML Kit | Concurrent cameras: segment the front-camera subject over the live back camera | | Extensions | CameraX / Camera2 | Night / Bokeh / HDR / Face Retouch / Auto | | Ultra HDR | CameraX | Gain-map Ultra HDR (`JPEG_R`) capture + a viewer to compare SDR / gain map / Ultra HDR | | Effects | CameraX | Live color filters (grayscale, sepia, invert, …) via `ImageAnalysis` + `ColorMatrix` | | Viewfinder Effects | Camera2 | Real-time frame processing on the live preview | | Concurrent Camera | CameraX | Front + back preview at once (picture-in-picture) | | RAW / DNG | Camera2 | `RAW_SENSOR` → DNG via `DngCreator`, then an in-app viewer/editor (re-expose, re-white-balance) | | Zoom & Torch | CameraX / Camera2 | Zoom ratio slider + torch toggle | | Exposure | CameraX | Exposure-compensation slider | | Low-Light Boost | CameraX | Brighten dark scenes with `CameraControl` low-light boost | | Feature Combination | CameraX | Query & apply CameraX feature-group combos (HDR, 60fps, stabilization, Ultra HDR) | | Manual Controls | Camera2 | Manual ISO / shutter / focus distance | Samples that depend on optional hardware (extensions, high-speed recording, manual sensor) detect support at runtime and show a friendly "not supported on this device" state instead of crashing. ## Architecture Every sample is a Gradle **library module** under `samples/{api}-{feature}/` (package `com.android.{api}.{feature}`) exposing a single `{Api}{Feature}Screen()` composable. It follows the layered, unidirectional pattern in [android_architecture.md](android_architecture.md): - **`{Feature}UiState`** — a `sealed interface` of states (`Initial`, feature states, `Error`). - **`{Feature}ViewModel`** — a `@HiltViewModel` exposing a single `StateFlow`; no Android/lifecycle references. - **`{Feature}Controller`** — a `@Stable` state-holder that owns the camera SDK lifecycle, created with a `remember{Feature}Controller(...)` composable. - **`{Feature}Screen`** — collects state with `collectAsStateWithLifecycle`, wraps everything in the shared scaffold, and renders with a `when(state)`. ### Shared modules The scaffolding that used to be copy-pasted into every sample lives in three shared modules, so a new sample focuses only on its feature: - **`:core-theme`** — the design system: the Material 3 color scheme with the violet "Console" accent, Space Grotesk / Space Mono typography (via Google Fonts), and the `AISampleCatalogTheme` wrapper. - **`:core-camera`** — camera plumbing: `BaseCamera2Controller` (background thread, open/close, viewfinder transform, tap-to-focus, session creation), `Camera2Preview` / `CameraXPreview`, `ImageUtils` (`Image`/`ImageProxy` → `Bitmap`), `MediaStoreSaver`, `rememberDisplayRotation()`, and `CameraPermissions`. It re-exports the common CameraX/Camera2 libraries. - **`:core-ui`** — API-agnostic Compose chrome: `CameraSampleScaffold` (permission flow + surface), the viewfinder HUD (`FocusIndicator` reticle, `RuleOfThirdsGrid`, `ViewfinderTitleChip`, `TorchChip`), `ShutterButton` / `RecordButton` / `CameraControlsBar` / `ScrimIconButton`, `ValueSlider` / `ZoomControls`, `CapturedImagePreview` / `CapturedVideoPreview` / `VideoPlayer`, the `SettingsOverlay` menu, and the loading / error / unsupported state views. It re-exports `:core-camera` and `:core-theme`. A sample is registered in one place — a `SampleCatalogItem` in [SampleCatalog.kt](app/src/main/java/com/android/camera/catalog/domain/SampleCatalog.kt) — and the app's `NavHost` is derived from that list automatically. ## Adding a new sample Use the generator, which scaffolds a working (preview-only) compose-first module and wires it into the build and catalog: ```bash ./gradlew createSample \ -PsampleName="camera2-flash" \ -PscreenName="Camera2FlashScreen" \ -Ptitle="Camera2 • Flash" \ -Pdesc="Toggle the flash with Camera2" \ -Ptype="camera2" # camera2 (default) or camerax ./gradlew spotlessApply # format the generated files ``` Then implement the feature in the generated `Controller` / `Screen` and re-sync Gradle. ## Code style The project is formatted with [Spotless](https://github.com/diffplug/spotless) (ktlint + Apache license headers). Run `./gradlew spotlessApply` before committing.