CameraX 是一個 Jetpack 支持庫,旨在幫助您簡化相機應用的開發工作。它提供一致且易於使用的 API 界面,適用於大多數 Android 設備,並可向後兼容至 Android 5.0(API 級別 21)。
雖然它利用的是 camera2 的功能,但使用的是更爲簡單且基於用例的方法,該方法具有生命週期感知能力。它還解決了設備兼容性問題,因此您無需在代碼庫中包含設備專屬代碼。這些功能減少了將相機功能添加到應用時需要編寫的代碼量。
最後,藉助 CameraX,開發者只需兩行代碼就能利用與預安裝的相機應用相同的相機體驗和功能。 CameraX Extensions 是可選插件,通過該插件,您可以在支持的設備上向自己的應用中添加人像、HDR、夜間模式和美顏等效果。
權限
<uses-permission android:name="android.permission.CAMERA" />
引入
// 添加 CameraX core
implementation "androidx.camera:camera-core:1.0.0-alpha06"
// 添加 CameraX Camera2 API 互操作支持
implementation "androidx.camera:camera-camera2:1.0.0-alpha06"
// 添加 CameraX 擴展功能
implementation "androidx.camera:camera-extensions:1.0.0-alpha03"
注意:minSdkVersion至少爲21
預覽
//預覽配置
val previewConfig = with(PreviewConfig.Builder()) {
//FRONT爲前置攝像頭,BACK爲後置
setLensFacing(CameraX.LensFacing.BACK)
//設置默認比例,目前有RATIO_4_3和RATIO_16_9兩種
setTargetAspectRatio(AspectRatio.RATIO_16_9)
//設置自適應旋轉角度
setTargetRotation(windowManager.defaultDisplay.rotation)
build()
}
//預覽用例
val preview = Preview(previewConfig)
//設置監聽器獲取預覽更新
preview.setOnPreviewOutputUpdateListener { previewOutput ->
textureView.surfaceTexture = previewOutput.surfaceTexture
}
//綁定到組件生命週期
CameraX.bindToLifecycle(this, preview)
ImageAnalysis
//圖片分析
val imageAnalysisConfig = with(ImageAnalysisConfig.Builder()) {
//設置自適應旋轉角度
setTargetRotation(windowManager.defaultDisplay.rotation)
//ACQUIRE_LATEST_IMAGE獲取隊列中的最新圖像,並丟棄所有比最新圖像更舊的圖像
//ACQUIRE_NEXT_IMAGE獲取隊列中的下一張圖像
setImageReaderMode(ImageAnalysis.ImageReaderMode.ACQUIRE_NEXT_IMAGE)
//設置隊列的長度
setImageQueueDepth(2)
build()
}
val imageAnalysis = ImageAnalysis(imageAnalysisConfig)
//只能在主線程使用
imageAnalysis.setAnalyzer({
it.run()
}, { image, rotationDegrees ->
})
拍照
//拍照配置
val imageCaptureConfig = with(ImageCaptureConfig.Builder()){
setTargetRotation(windowManager.defaultDisplay.rotation)
//MIN_LATENCY優化照片拍攝的延遲時間,MAX_QUALITY優化照片質量
setCaptureMode(ImageCapture.CaptureMode.MAX_QUALITY)
//設置閃光燈,默認自動
setFlashMode(FlashMode.AUTO)
build()
}
//拍照用例
val imageCapture = ImageCapture(imageCaptureConfig)
此方法用於爲拍攝的圖片提供內存緩衝區。
imageCapture.takePicture({
it.run()
},object :ImageCapture.OnImageCapturedListener(){
override fun onCaptureSuccess(image: ImageProxy?, rotationDegrees: Int) {
super.onCaptureSuccess(image, rotationDegrees)
}
override fun onError(
imageCaptureError: ImageCapture.ImageCaptureError,
message: String,
cause: Throwable?
) {
super.onError(imageCaptureError, message, cause)
}
})
此方法將拍攝的圖片保存到提供的文件位置。
val path = getExternalFilesDir(Environment.DIRECTORY_PICTURES)!!.absolutePath
val file = File(path,"image2.png")
//拍照
photograph.setOnClickListener {
imageCapture.takePicture(file,{
it.run()
},object :ImageCapture.OnImageSavedListener{
override fun onImageSaved(file: File) {
println("MainActivity:onImageSaved:${file.absolutePath}")
}
override fun onError(
imageCaptureError: ImageCapture.ImageCaptureError,
message: String,
cause: Throwable?
) {
println("MainActivity:onError:$message")
}
})
}
擴展程序
預覽擴展
val previewBuilder = PreviewConfig.Builder()
//散景擴展功能
val bokehPreviewExtender = BokehPreviewExtender.create(previewBuilder)
if (bokehPreviewExtender.isExtensionAvailable) {
bokehPreviewExtender.enableExtension()
}
//HDR擴展功能
val hdrPreviewExtender = HdrPreviewExtender.create(previewBuilder)
if (hdrPreviewExtender.isExtensionAvailable) {
hdrPreviewExtender.enableExtension()
}
//美顏
val beautyPreviewExtender = BeautyPreviewExtender.create(previewBuilder)
if (beautyPreviewExtender.isExtensionAvailable) {
beautyPreviewExtender.enableExtension()
}
//夜晚模式
val nightPreviewExtender = NightPreviewExtender.create(previewBuilder)
if (nightPreviewExtender.isExtensionAvailable) {
nightPreviewExtender.enableExtension()
}
//自動模式
val autoPreviewExtender = AutoPreviewExtender.create(previewBuilder)
if (autoPreviewExtender.isExtensionAvailable) {
autoPreviewExtender.enableExtension()
}
拍照擴展
val imageCapturebuilder = ImageCaptureConfig.Builder()
//拍照擴展
val bokehImageCaptureExtender = BokehImageCaptureExtender.create(imageCapturebuilder)
if (bokehImageCaptureExtender.isExtensionAvailable) {
bokehImageCaptureExtender.enableExtension()
}
val hdrImageCaptureExtender = HdrImageCaptureExtender.create(imageCapturebuilder)
if (hdrImageCaptureExtender.isExtensionAvailable) {
hdrImageCaptureExtender.enableExtension()
}
val beautyImageCaptureExtender = BeautyImageCaptureExtender.create(imageCapturebuilder)
if (beautyImageCaptureExtender.isExtensionAvailable) {
beautyImageCaptureExtender.enableExtension()
}
val nightImageCaptureExtender = NightImageCaptureExtender.create(imageCapturebuilder)
if (nightImageCaptureExtender.isExtensionAvailable) {
nightImageCaptureExtender.enableExtension()
}
val autoImageCaptureExtender = AutoImageCaptureExtender.create(imageCapturebuilder)
if (autoImageCaptureExtender.isExtensionAvailable) {
autoImageCaptureExtender.enableExtension()
}