Camposer

295 stars
by Lucas Ujizin

Camera Library for Android Jetpack Compose with easy camera control and image capture.

View on GitHub

Documentation

Camposer

Static Badge Static Badge

📸 A multiplatform camera library built with Jetpack Compose for taking photos, recording videos, controlling flash/torch, zooming, and more.


README image
README image

✨ Check out the sample projects

🚀 Quick Start

Add the dependencies to your module build.gradle.kts, then sync your project:

// Android
dependencies {
  implementation("io.github.ujizin:camposer:<version>")
}

// Kotlin Multiplatform
sourceSets {
  commonMain.dependencies {
    implementation("io.github.ujizin:camposer:<version>")
    // Required when you want to use code analysis features (e.g., QR code scanning).
    implementation("io.github.ujizin:camposer-code-scanner:<version>")
  }
}

🧩 Basic Usage

To show the CameraPreview composable, use the example below:

val controller = remember { CameraController() }
val cameraSession = rememberCameraSession(controller)
var camSelector by remember { mutableStateOf(CamSelector.Back) }
CameraPreview(
  cameraSession = cameraSession,
  camSelector = camSelector,
) {
  // Camera Preview UI
}

✨ Features

  • 📸 Take pictures
  • 🎥 Record videos
  • 🔍 Zoom
  • 🎯 Focus support (tap to focus)
  • ⚡ Flash mode
  • 🔦 Torch
  • 🎛️ Exposure compensation
  • 🖼️ Image/video quality controls
  • 🔭 Multi-camera lens support (Ultra-wide, Wide & Telephoto)
  • ⏱️ 30/60 FPS video recording
  • 🎬 Video stabilization (iOS only for now)
  • 🧠 Image analyzer (code scanner)

📚 Documentation

Visit the docs to learn more: ujizin.github.io/Camposer

🛠️ Usage Examples

📸 Taking Pictures

Use CameraSession and call takePicture:

// Capture into a temporary byte array
cameraSession.takePicture { result ->
  /* ... */
}

// Capture into a file
cameraSession.takePicture(fileName) { result -> /* ... */ }

🎥 Recording Videos

Set captureMode = CaptureMode.Video in CameraPreview, then call startRecording and stopRecording.

cameraSession.startRecording(fileName) { result ->
  /* ... */
}
cameraSession.stopRecording()

🔄 Switching Cameras

To switch cameras, pass camSelector to CameraPreview (as shown above) and update its state.

// Front camera
camSelector = CamSelector.Front

// Back camera
camSelector = CamSelector.Back

// Toggle camera selector
camSelector = camSelector.inverse

➕ More

To explore additional features, check the documentation.

Have fun code()! 👨‍💻

✨ Inspiration

Camposer includes features inspired by react-native-vision-camera.

📄 License

Copyright 2022 ujizin (Lucas Yuji) 

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Dispatch Newsletter
Be the first to discover new Compose libraries
Curated Insights
Digest in 5 minutes or less
Android Analysis
Entertaining takes on happenings
Insider Tips
From top Android developers
Hidden Gems
You won't find elsewhere
"
"I truly love this newsletter ❤️‍🔥 Spot on content and I know there's a lot of effort that goes behind it. Great work!"
theapache64
Staff Software Engineer @ Disney+ Hotstar
Join thousands of Android devs who look forward to Dispatch every week