CameraX คือไลบรารี Android Jetpack สำหรับทำงานกับกล้อง โดยมี API ที่เรียบง่ายและสอดคล้องกันบน Camera2 ที่ซับซ้อน มันทำการ abstraction ความแตกต่างระหว่างอุปกรณ์ Android หลายร้อยรุ่น และรับประกันพฤติกรรมของกล้องที่เหมือนกันบนฮาร์ดแวร์ต่าง ๆ ตาม Android Developer CameraX Guide (2026) ไลบรารีนี้ถูกใช้ในแอป Google Play กว่า 25,000 รายการและทำงานบนอุปกรณ์ที่มี API Level 21 ขึ้นไป
ประเด็นสำคัญ
CameraX คือไลบรารีในชุด Android Jetpack ซึ่งเปิดตัวครั้งแรกโดย Google ในปี 2019 เพื่อแทนที่ Camera API ที่เลิกใช้งานแล้วและเป็นทางเลือกที่เรียบง่ายกว่า Camera2 ที่ซับซ้อน ปรัชญาหลักของ CameraX คือ “เขียนครั้งเดียว ทำงานได้บนทุกอุปกรณ์” ไลบรารีจัดการความแตกต่างของฮาร์ดแวร์โดยอัตโนมัติ: ตำแหน่งกล้อง, ความละเอียดที่รองรับ, ทิศทางเซนเซอร์ และรูปแบบที่มีให้ — นักพัฒนาไม่จำเป็นต้องเขียนโค้ดเฉพาะอุปกรณ์
สถาปัตยกรรมของ CameraX สร้างขึ้นบน use cases: Preview (แสดงฟีดกล้องใน Viewfinder), ImageCapture (ถ่ายภาพ), ImageAnalysis (วิเคราะห์สตรีมเฟรมสำหรับ ML) และ VideoCapture (บันทึกวิดีโอ) แต่ละ use case เป็นคอมโพเนนต์อิสระที่สามารถรวมกันได้: เรียกใช้ Preview สำหรับช่องมองภาพและ ImageAnalysis สำหรับการประมวลผล ML พร้อมกัน ตามข้อมูลของ Google (2026) CameraX รองรับบน 99% ของอุปกรณ์ Android ที่มี API 21+
CameraX มีการสลับระหว่างกล้องหน้าและหลังโดยอัตโนมัติ, รองรับการหมุนหน้าจอโดยไม่ต้องสร้างเซสชันใหม่, การจัดการวงจรชีวิตในตัวผ่าน LifecycleOwner, การผูก use cases กับกระบวนการ Lifecycle เดียว, รองรับ Camera2 Extensions สำหรับภาพบุคคล, HDR และโหมดกลางคืน, และ TestableCameraX สำหรับการทดสอบหน่วยโดยไม่ต้องใช้อุปกรณ์จริง
CameraX กำหนด use case มาตรฐานสี่แบบ โดยแต่ละแบบแก้ปัญหาเฉพาะของกล้อง Use cases สามารถรวมกันได้: การรวมที่นิยมที่สุดคือ Preview + ImageCapture สำหรับแอปกล้องและ Preview + ImageAnalysis สำหรับสแกนเนอร์ ML
| Use Case | วัตถุประสงค์ | คลาส |
|---|---|---|
| Preview | แสดงฟีดกล้องแบบเรียลไทม์ | PreviewView |
| ImageCapture | ถ่ายภาพด้วยการตั้งค่าแฟลชและความละเอียด | ImageCapture |
| ImageAnalysis | วิเคราะห์แต่ละเฟรมสำหรับการประมวลผล ML | ImageAnalysis |
| VideoCapture | บันทึกวิดีโอด้วยไมโครโฟน (ตั้งแต่ 1.1.0-beta) | VideoCapture |
Use case Preview แสดงสตรีมวิดีโอจากกล้องใน PreviewView — View พิเศษจากไลบรารี CameraX PreviewView ปรับให้เข้ากับอัตราส่วนภาพของกล้องโดยอัตโนมัติ, รองรับ ScaleType (FillCenter, FitCenter) และการหมุนหน้าจอโดยไม่ต้องสร้าง use case ใหม่ นักพัฒนาเพียงแค่ผูก Preview กับ Lifecycle ผ่าน ProcessCameraProvider
Use case ImageAnalysis ส่งแต่ละเฟรมจากกล้องไปยังตัวจัดการเพื่อวิเคราะห์: การรู้จำข้อความ, การตรวจจับใบหน้า, การสแกน QR โค้ด ตัววิเคราะห์รับเฟรมในรูปแบบ YUV_420_888 — พื้นที่สีสากลของ Android โหมดการทำงาน (BLOCKING หรือ NON_BLOCKING) ควบคุมคิวเฟรม: BLOCKING รอให้การวิเคราะห์ก่อนหน้าเสร็จสิ้น, NON_BLOCKING ข้ามเฟรมเมื่อเกิดความล่าช้า
Use case ImageCapture ถ่ายภาพจากกล้องด้วยการตั้งค่าแฟลช, ความละเอียดและการบีบอัด รองรับรูปแบบ JPEG และ RAW (บนอุปกรณ์ที่เข้ากันได้) ImageCapture บันทึกภาพแบบอะซิงโครนัสผ่าน OnImageCapturedCallback หรือโดยตรงไปยังไฟล์ผ่าน ImageCapture.OutputFileOptions
Use case VideoCapture ถูกเพิ่มใน CameraX 1.1.0 (เบต้า) และอนุญาตให้บันทึกวิดีโอสูงถึง 4K ที่ 30 FPS Use case จะซิงโครไนซ์กับ Preview โดยอัตโนมัติ: ภาพในช่องมองภาพตรงกับสิ่งที่กำลังบันทึกลงในไฟล์ VideoCapture ใช้ MediaCodec และ MediaMuxer ภายใน ซ่อนความซับซ้อนของการกำหนดค่าโคเดกวิดีโอและคอนเทนเนอร์ MP4
CameraX และ Camera2 เป็นสองแนวทางในการทำงานกับกล้องใน Android Camera2 เป็น API ระดับต่ำที่ให้การควบคุมอุปกรณ์อย่างสมบูรณ์ CameraX เป็น abstraction ระดับสูงที่ทำให้สถานการณ์ทั่วไปเป็นอัตโนมัติ การเลือกระหว่างพวกเขาขึ้นอยู่กับความต้องการของโปรเจกต์
| คุณลักษณะ | CameraX | Camera2 |
|---|---|---|
| ระดับ API | สูง (use case) | ต่ำ (ควบคุมสมบูรณ์) |
| โค้ดเฉพาะอุปกรณ์ | ไม่จำเป็น | จำเป็นสำหรับแต่ละอุปกรณ์ |
| การผูกวงจรชีวิต | อัตโนมัติ | ด้วยตนเอง |
| ส่วนขยาย | ในตัว (HDR, Portrait, Night) | ต้องมีการimplement OEM |
| ความซับซ้อนในการimplement | 15–30 บรรทัดโค้ด | 100–300 บรรทัดโค้ด |
| การรองรับ API | API 21+ | API 21+ |
| ความยืดหยุ่น | สถานการณ์มาตรฐาน | ทุกสถานการณ์ |
ใช้ CameraX สำหรับงานมาตรฐาน: กล้องในแอป, สแกนเนอร์ QR, การประมวลผลสตรีม ML ใช้ Camera2 เมื่อต้องการการควบคุมค่าแสงด้วยตนเอง, การถ่าย RAW ด้วยการควบคุมพารามิเตอร์อย่างสมบูรณ์, หรือการทำงานกับกล้องหลายตัวพร้อมกัน
มาดูการตั้งค่า CameraX ในแอปพลิเคชัน Android โดยใช้ use case หลักทั้งสาม: Preview, ImageCapture และ ImageAnalysis
โค้ดผูก CameraX กับวงจรชีวิตของ Activity ผ่าน ProcessCameraProvider ก่อนอื่นจะขออินสแตนซ์ของ provider จากนั้นสร้าง use cases และดำเนินการผูก
val cameraProviderFuture =
ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider = cameraProviderFuture.get()
// การสร้าง Preview
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(
binding.viewFinder.surfaceProvider
)
}
// การสร้าง ImageCapture
val imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
// การผูกกับ Lifecycle
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}, ContextCompact.getMainExecutor(this))
โค้ด Kotlin รับ ProcessCameraProvider ผ่าน future, สร้าง use cases Preview และ ImageCapture และผูกกับวงจรชีวิตของ Activity ปัจจุบัน CameraX จัดการการหมุนหน้าจอ, การสลับกล้อง และการปล่อยทรัพยากรเมื่อปิด Activity โดยอัตโนมัติ
มาเพิ่ม use case ImageAnalysis สำหรับการประมวลผลแต่ละเฟรมของสตรีมกล้อง เช่น เพื่อรวมกับ ML Kit
val imageAnalysis = ImageAnalysis.Builder()
.setBackpressureStrategy(
ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST
)
.build()
imageAnalysis.setAnalyzer(
ContextCompact.getMainExecutor(this)
) { imageProxy ->
// การแปลง YUV เป็น Bitmap สำหรับ ML Kit
val bitmap = ImageUtils.yuvToBitmap(imageProxy)
val inputImage = InputImage.fromBitmap(bitmap)
// เริ่มการรู้จำข้อความ ML Kit
recognizer.process(inputImage)
.addOnSuccessListener { result ->
// การประมวลผลผลลัพธ์
processTextResult(result)
}
.addOnCompleteListener {
imageProxy.close()
}
}
ImageAnalysis ด้วย กลยุทธ์ KEEP_ONLY_LATEST ประมวลผลเฉพาะเฟรมล่าสุดที่พร้อมใช้งาน ข้ามเฟรมที่ล้าสมัยหากตัววิเคราะห์ตามไม่ทัน แต่ละเฟรมถูกแปลงจาก YUV เป็น Bitmap สำหรับ ML Kit หลังจากนั้นเริ่มการรู้จำข้อความ การเรียก imageProxy.close() เป็นสิ่งจำเป็น — มิฉะนั้น CameraX จะหยุดส่งเฟรมใหม่
CameraX Extensions คือโมดูลที่เพิ่มโหมดการถ่ายภาพขั้นสูง: ภาพบุคคล (เบลอพื้นหลัง), HDR (ช่วงไดนามิกที่ขยาย), โหมดกลางคืน (ถ่ายในที่แสงน้อย), รีทัชอัตโนมัติ (ปรับผิว) และโหมดความงาม ส่วนขยายจะเปิดใช้งานเฉพาะบนอุปกรณ์ที่ผู้ผลิตกล้องมีการimplement OEM
ก่อนใช้ CameraX Extensions คุณต้องตรวจสอบว่าส่วนขยายพร้อมใช้งานบนอุปกรณ์ปัจจุบันหรือไม่ Google แนะนำให้ตรวจสอบผ่าน ExtensionsManager.isExtensionAvailable
val extensionsManager =
ExtensionsManager.getInstance(this)
if (extensionsManager.isExtensionAvailable(
cameraProvider,
CameraSelector.DEFAULT_BACK_CAMERA,
ExtensionMode.BOKEH
)) {
// การเปิดใช้งานโหมดภาพบุคคล
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}
โค้ดตรวจสอบการรองรับส่วนขยาย BOKEH (ภาพบุคคล) ผ่าน ExtensionsManager และเปิดใช้งานหากมีการimplement OEM CameraX จะเปลี่ยนการตั้งค่ากล้องสำหรับโหมดภาพบุคคลโดยอัตโนมัติ หากส่วนขยายไม่พร้อมใช้งาน แอปจะทำงานต่อในโหมดมาตรฐานโดยไม่หยุดทำงาน
CameraX Extensions แก้ปัญหาหลักอย่างหนึ่งของการพัฒนา Android: การแตกแยกของกล้อง บนอุปกรณ์ต่าง ๆ โหมดภาพบุคคลถูกimplement แตกต่างกัน — บางรุ่นใช้เลนส์คู่ บางรุ่นใช้การเบลอด้วยซอฟต์แวร์ CameraX abstraction ความแตกต่างนี้: นักพัฒนาเปิดโหมด BOKEH และไลบรารีจะกำหนดวิธีimplement บนอุปกรณ์เฉพาะ Google ดูแลรักษารายชื่อพันธมิตร OEM ที่ผ่านการตรวจสอบ: Samsung, Xiaomi, OPPO, vivo, Google Pixel
เมื่อทำงานกับ CameraX สิ่งสำคัญคือต้องพิจารณาข้อจำกัดเกี่ยวกับจำนวน use cases พร้อมกัน: บนอุปกรณ์ส่วนใหญ่สามารถเรียกใช้ use case ได้สูงสุด 3 รายการพร้อมกัน ตัวอย่างเช่น Preview + ImageCapture + ImageAnalysis ทำงานบนอุปกรณ์สมัยใหม่ทั้งหมด แต่ Preview + ImageCapture + VideoCapture อาจไม่รองรับบนรุ่นประหยัด CameraX มีเมธอด ProcessCameraProvider.checkAvailability() ซึ่งตรวจสอบความเข้ากันได้ของชุด use case ก่อนผูก ช่วยหลีกเลี่ยงการหยุดทำงานขณะรันไทม์
CameraX รวมกับ Jetpack Navigation ผ่าน CameraXFragment หรือ PreviewView ที่เข้ากันได้กับ Compose สำหรับ Compose จะใช้องค์ประกอบ AndroidView ซึ่ง PreviewView ถูกฝังอยู่ CameraX จัดการการหมุนหน้าจอและการเปลี่ยนแปลงการกำหนดค่าได้อย่างถูกต้องโดยไม่สูญเสียสถานะเซสชันกล้อง — เพียงระบุ LifecycleOwner ไลบรารีจะสร้างการผูก use case ใหม่โดยอัตโนมัติเมื่อหมุนอุปกรณ์
สำหรับการทดสอบ CameraX โดยไม่ต้องใช้อุปกรณ์จริง Google มี TestableCameraX — ไลบรารีที่จำลองพฤติกรรมกล้องในการทดสอบหน่วย TestableCameraX อนุญาตให้จำลองเฟรมกล้อง, ทดสอบการทำงานของ ImageAnalysis และความถูกต้องของ ImageCapture โดยไม่ต้องใช้อุปกรณ์จริง สิ่งนี้ช่วยเร่งไปป์ไลน์ CI/CD สำหรับโปรเจกต์ที่ทำงานกับกล้องได้อย่างมาก
คำถามที่พบบ่อย
Android 5.0 (API 21) ขึ้นไป CameraX ครอบคลุม 99% ของอุปกรณ์ Android ที่ใช้งานอยู่ ส่วนขยาย (Portrait, HDR) ต้องการ API 23+ และการรองรับ OEM สำหรับโหมดเฉพาะ
ได้, use case ImageAnalysis ส่งแต่ละเฟรมไปยังตัววิเคราะห์ เฟรมถูกแปลงจาก YUV_420_888 เป็น InputImage สำหรับ ML Kit นี่คือรูปแบบมาตรฐานสำหรับการสร้างสแกนเนอร์ ML
CameraX คือ API ระดับสูงที่มีสถาปัตยกรรม use case, การผูกวงจรชีวิตอัตโนมัติ และการจัดการความแตกต่างเฉพาะอุปกรณ์ Camera2 คือ API ระดับต่ำที่ให้การควบคุมกล้องอย่างสมบูรณ์ด้วยโค้ด boilerplate จำนวนมาก
ได้, use case VideoCapture ถูกเพิ่มใน CameraX 1.1.0-beta บันทึกวิดีโอด้วยไมโครโฟนและซิงโครไนซ์กับ Preview สำหรับสถานการณ์ที่ซับซ้อนกว่านี้ ให้ใช้ Camera2 โดยตรง
ผ่าน CameraSelector: DEFAULT_BACK_CAMERA หรือ DEFAULT_FRONT_CAMERA ในการสลับ ให้เรียก cameraProvider.bindToLifecycle() ด้วยตัวเลือกใหม่ — CameraX จะเริ่มเซสชันใหม่โดยอัตโนมัติ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม