CameraView
📸 A well documented, high-level Android interface that makes capturing pictures and videos easy, addressing all of the common issues and needs. Real-time filters, gestures, watermarks, frame processing, RAW, output of any size.
Top Related Projects
[DEPRECATED] Easily integrate Camera features into your Android app
Making Camera for Android more friendly. 📸
Library for Android Camera 1 and 2 APIs. Massively increase stability and reliability of photo and video capture on all Android devices.
Library for Android Camera 1 and 2 APIs. Massively increase stability and reliability of photo and video capture on all Android devices.
Image Cropping Library for Android, optimized for Camera / Gallery.
Quick Overview
CameraView is an Android library that simplifies the process of integrating camera functionality into Android applications. It provides a high-level, easy-to-use API for capturing photos and videos, with support for advanced features like real-time filters, gestures, and frame processing.
Pros
- Easy integration with a simple, declarative API
- Supports a wide range of camera features and functionalities
- Actively maintained and regularly updated
- Extensive documentation and examples available
Cons
- Limited to Android platform only
- May have a steeper learning curve for developers new to camera APIs
- Some advanced features might require additional setup or configuration
Code Examples
- Basic camera setup:
class MainActivity : AppCompatActivity() {
private lateinit var camera: CameraView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
camera = findViewById(R.id.camera)
camera.setLifecycleOwner(this)
}
}
- Capturing a picture:
camera.takePicture()
.toBitmap()
.subscribe { bitmap ->
// Process the captured bitmap
}
- Recording a video:
camera.takeVideo(File(getExternalFilesDir(null), "video.mp4"))
.subscribe { result ->
when (result) {
is VideoResult.Success -> {
// Video recorded successfully
}
is VideoResult.Failure -> {
// Handle failure
}
}
}
- Applying a filter:
camera.filter = Filters.GRAYSCALE
Getting Started
- Add the dependency to your app's
build.gradle
:
dependencies {
implementation 'com.otaliastudios:cameraview:2.7.2'
}
- Add CameraView to your layout:
<com.otaliastudios.cameraview.CameraView
android:id="@+id/camera"
android:layout_width="match_parent"
android:layout_height="match_parent" />
- Initialize and use CameraView in your Activity or Fragment:
class MainActivity : AppCompatActivity() {
private lateinit var camera: CameraView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
camera = findViewById(R.id.camera)
camera.setLifecycleOwner(this)
}
}
Competitor Comparisons
[DEPRECATED] Easily integrate Camera features into your Android app
Pros of CameraView (Google)
- Developed and maintained by Google, potentially offering better long-term support
- Simpler API with fewer features, which may be easier for beginners to use
- Integrates well with other Google libraries and Android components
Cons of CameraView (Google)
- Less actively maintained, with fewer updates and contributions
- Limited feature set compared to CameraView (natario1)
- Lacks advanced functionality like video recording and frame processing
Code Comparison
CameraView (Google):
CameraView cameraView = findViewById(R.id.camera_view);
cameraView.takePicture();
CameraView (natario1):
CameraView cameraView = findViewById(R.id.camera_view);
cameraView.addCameraListener(new CameraListener() {
@Override
public void onPictureTaken(PictureResult result) {
// Process the captured image
}
});
cameraView.takePicture();
The code comparison shows that while Google's CameraView offers a simpler API for taking pictures, natario1's CameraView provides more control and flexibility with its listener-based approach and additional features.
Making Camera for Android more friendly. 📸
Pros of Fotoapparat
- Written in Kotlin, providing better null safety and more concise code
- Offers a more functional programming approach with its DSL-like API
- Includes built-in support for QR code scanning
Cons of Fotoapparat
- Less actively maintained, with fewer recent updates
- Smaller community and fewer contributors compared to CameraView
- Limited documentation and examples available
Code Comparison
CameraView:
cameraView.setLifecycleOwner(this)
cameraView.addCameraListener(object : CameraListener() {
override fun onPictureTaken(result: PictureResult) {
// Handle the captured image
}
})
Fotoapparat:
val fotoapparat = Fotoapparat(
context = this,
view = cameraView,
scaleType = ScaleType.CenterCrop
)
fotoapparat.takePicture()
.toBitmap()
.whenAvailable { bitmapPhoto ->
// Handle the captured image
}
Both libraries offer easy-to-use APIs for camera functionality in Android apps. CameraView provides a more traditional object-oriented approach with listeners, while Fotoapparat uses a functional style with coroutines and DSL-like syntax. CameraView has a larger community and more frequent updates, making it potentially more reliable for long-term projects. However, Fotoapparat's Kotlin-first approach and built-in QR code scanning feature may appeal to developers working on specific use cases or preferring a more modern programming style.
Library for Android Camera 1 and 2 APIs. Massively increase stability and reliability of photo and video capture on all Android devices.
Pros of CameraKit
- More comprehensive documentation and examples
- Wider range of features, including face detection and QR code scanning
- Active community support and regular updates
Cons of CameraKit
- Larger library size, potentially impacting app performance
- Steeper learning curve due to more complex API
- Some users report occasional stability issues on certain devices
Code Comparison
CameraKit:
cameraKitView.start();
cameraKitView.captureImage(new CameraKitView.ImageCallback() {
@Override
public void onImage(CameraKitView view, byte[] photo) {
// Process captured image
}
});
CameraView:
cameraView.takePicture();
cameraView.addCameraListener(new CameraListener() {
@Override
public void onPictureTaken(PictureResult result) {
// Process captured image
}
});
Both libraries offer similar basic functionality for capturing images, but CameraKit provides more advanced features out of the box. CameraView has a simpler API, which may be preferable for projects with basic camera requirements. CameraKit's additional features come at the cost of a larger library size and potentially more complex implementation. The choice between the two depends on the specific needs of your project, balancing feature richness with simplicity and performance considerations.
Library for Android Camera 1 and 2 APIs. Massively increase stability and reliability of photo and video capture on all Android devices.
Pros of CameraKit
- More comprehensive documentation and examples
- Wider range of features, including face detection and QR code scanning
- Active community support and regular updates
Cons of CameraKit
- Larger library size, potentially impacting app performance
- Steeper learning curve due to more complex API
- Some users report occasional stability issues on certain devices
Code Comparison
CameraKit:
cameraKitView.start();
cameraKitView.captureImage(new CameraKitView.ImageCallback() {
@Override
public void onImage(CameraKitView view, byte[] photo) {
// Process captured image
}
});
CameraView:
cameraView.takePicture();
cameraView.addCameraListener(new CameraListener() {
@Override
public void onPictureTaken(PictureResult result) {
// Process captured image
}
});
Both libraries offer similar basic functionality for capturing images, but CameraKit provides more advanced features out of the box. CameraView has a simpler API, which may be preferable for projects with basic camera requirements. CameraKit's additional features come at the cost of a larger library size and potentially more complex implementation. The choice between the two depends on the specific needs of your project, balancing feature richness with simplicity and performance considerations.
Image Cropping Library for Android, optimized for Camera / Gallery.
Pros of Android-Image-Cropper
- Specialized for image cropping with advanced features like aspect ratio control and rotation
- Lightweight and focused on a single task, potentially easier to integrate for specific cropping needs
- Includes built-in UI components for cropping, reducing development time
Cons of Android-Image-Cropper
- Limited to image cropping functionality, lacking camera capture features
- Less actively maintained, with fewer recent updates compared to CameraView
- May require additional libraries or components for full camera functionality
Code Comparison
Android-Image-Cropper:
CropImage.activity(imageUri)
.setGuidelines(CropImageView.Guidelines.ON)
.setAspectRatio(1, 1)
.start(this);
CameraView:
cameraView.setLifecycleOwner(this);
cameraView.addCameraListener(new CameraListener() {
@Override
public void onPictureTaken(PictureResult result) {
// Process the captured image
}
});
The code snippets demonstrate the primary focus of each library. Android-Image-Cropper provides a straightforward way to initiate image cropping, while CameraView offers more comprehensive camera control and capture functionality. CameraView's approach is more suitable for applications requiring full camera integration, whereas Android-Image-Cropper excels in post-capture image manipulation.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
⠀
Post-processing videos or want to reduce video size before uploading? Take a look at our Transcoder.
Like the project, make profit from it, or simply want to thank back? Please consider sponsoring me or donating!
Need support, consulting, or have any other business-related question? Feel free to get in touch.
CameraView
CameraView is a well documented, high-level library that makes capturing pictures and videos easy, addressing most of the common issues and needs, and still leaving you with flexibility where needed.
api 'com.otaliastudios:cameraview:2.7.2'
- Fast & reliable
- Gestures support [docs]
- Real-time filters [docs]
- Camera1 or Camera2 powered engine [docs]
- Frame processing support [docs]
- Watermarks & animated overlays [docs]
- OpenGL powered preview [docs]
- Take high-quality content with
takePicture
andtakeVideo
[docs] - Take super-fast snapshots with
takePictureSnapshot
andtakeVideoSnapshot
[docs] - Smart sizing: create a
CameraView
of any size [docs] - Control HDR, flash, zoom, white balance, exposure, location, grid drawing & more [docs]
- RAW pictures support [docs]
- Lightweight
- Works down to API level 15
- Well tested
⠀
⠀
Support
If you like the project, make profit from it, or simply want to thank back, please consider sponsoring me through the GitHub Sponsors program! You can have your company logo here, get private support hours or simply help me push this forward. If you prefer, you can also donate to our OpenCollective page.
CameraView is trusted and supported by ShareChat, a social media app with over 100 million downloads.
Feel free to contact me for support, consulting or any other business-related question.
Thanks to all our project backers... [become a backer]
...and to all our project sponsors! [become a sponsor]
Setup
Please read the official website for setup instructions and documentation. You might also be interested in our changelog or in the v1 migration guide. Using CameraView is extremely simple:
<com.otaliastudios.cameraview.CameraView
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:cameraPictureSizeMinWidth="@integer/picture_min_width"
app:cameraPictureSizeMinHeight="@integer/picture_min_height"
app:cameraPictureSizeMaxWidth="@integer/picture_max_width"
app:cameraPictureSizeMaxHeight="@integer/picture_max_height"
app:cameraPictureSizeMinArea="@integer/picture_min_area"
app:cameraPictureSizeMaxArea="@integer/picture_max_area"
app:cameraPictureSizeSmallest="false|true"
app:cameraPictureSizeBiggest="false|true"
app:cameraPictureSizeAspectRatio="@string/video_ratio"
app:cameraVideoSizeMinWidth="@integer/video_min_width"
app:cameraVideoSizeMinHeight="@integer/video_min_height"
app:cameraVideoSizeMaxWidth="@integer/video_max_width"
app:cameraVideoSizeMaxHeight="@integer/video_max_height"
app:cameraVideoSizeMinArea="@integer/video_min_area"
app:cameraVideoSizeMaxArea="@integer/video_max_area"
app:cameraVideoSizeSmallest="false|true"
app:cameraVideoSizeBiggest="false|true"
app:cameraVideoSizeAspectRatio="@string/video_ratio"
app:cameraSnapshotMaxWidth="@integer/snapshot_max_width"
app:cameraSnapshotMaxHeight="@integer/snapshot_max_height"
app:cameraFrameProcessingMaxWidth="@integer/processing_max_width"
app:cameraFrameProcessingMaxHeight="@integer/processing_max_height"
app:cameraFrameProcessingFormat="@integer/processing_format"
app:cameraFrameProcessingPoolSize="@integer/processing_pool_size"
app:cameraFrameProcessingExecutors="@integer/processing_executors"
app:cameraVideoBitRate="@integer/video_bit_rate"
app:cameraAudioBitRate="@integer/audio_bit_rate"
app:cameraGestureTap="none|autoFocus|takePicture"
app:cameraGestureLongTap="none|autoFocus|takePicture"
app:cameraGesturePinch="none|zoom|exposureCorrection|filterControl1|filterControl2"
app:cameraGestureScrollHorizontal="none|zoom|exposureCorrection|filterControl1|filterControl2"
app:cameraGestureScrollVertical="none|zoom|exposureCorrection|filterControl1|filterControl2"
app:cameraEngine="camera1|camera2"
app:cameraPreview="glSurface|surface|texture"
app:cameraPreviewFrameRate="@integer/preview_frame_rate"
app:cameraPreviewFrameRateExact="false|true"
app:cameraFacing="back|front"
app:cameraHdr="on|off"
app:cameraFlash="on|auto|torch|off"
app:cameraWhiteBalance="auto|cloudy|daylight|fluorescent|incandescent"
app:cameraMode="picture|video"
app:cameraAudio="on|off|mono|stereo"
app:cameraGrid="draw3x3|draw4x4|drawPhi|off"
app:cameraGridColor="@color/grid_color"
app:cameraPlaySounds="true|false"
app:cameraVideoMaxSize="@integer/video_max_size"
app:cameraVideoMaxDuration="@integer/video_max_duration"
app:cameraVideoCodec="deviceDefault|h264|h263"
app:cameraAutoFocusResetDelay="@integer/autofocus_delay"
app:cameraAutoFocusMarker="@string/cameraview_default_autofocus_marker"
app:cameraUseDeviceOrientation="true|false"
app:cameraFilter="@string/real_time_filter"
app:cameraPictureMetering="true|false"
app:cameraPictureSnapshotMetering="false|true"
app:cameraPictureFormat="jpeg|dng"
app:cameraRequestPermissions="true|false"
app:cameraExperimental="false|true">
<!-- Watermark! -->
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:src="@drawable/watermark"
app:layout_drawOnPreview="true|false"
app:layout_drawOnPictureSnapshot="true|false"
app:layout_drawOnVideoSnapshot="true|false"/>
</com.otaliastudios.cameraview.CameraView>
Top Related Projects
[DEPRECATED] Easily integrate Camera features into your Android app
Making Camera for Android more friendly. 📸
Library for Android Camera 1 and 2 APIs. Massively increase stability and reliability of photo and video capture on all Android devices.
Library for Android Camera 1 and 2 APIs. Massively increase stability and reliability of photo and video capture on all Android devices.
Image Cropping Library for Android, optimized for Camera / Gallery.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot