CameraX là thư viện Android Jetpack để làm việc với camera, cung cấp API đơn giản và nhất quán trên nền Camera2 phức tạp. Nó trừu tượng hóa sự khác biệt giữa hàng trăm mẫu thiết bị Android và đảm bảo hành vi camera nhất quán trên các phần cứng khác nhau. Theo Hướng dẫn Android Developer CameraX (2026), thư viện được sử dụng trong hơn 25.000 ứng dụng Google Play và hoạt động trên các thiết bị có API Level 21 trở lên.
Những điểm chính
CameraX là một thư viện trong bộ Android Jetpack, được Google phát hành lần đầu vào năm 2019 như một sự thay thế cho Camera API cũ và là một giải pháp thay thế đơn giản hóa cho Camera2 phức tạp. Triết lý cốt lõi của CameraX là “viết một lần, chạy trên mọi thiết bị”. Thư viện tự động xử lý sự khác biệt phần cứng: vị trí camera, độ phân giải hỗ trợ, hướng cảm biến và định dạng khả dụng — nhà phát triển không cần viết mã dành riêng cho thiết bị.
Kiến trúc CameraX được xây dựng trên các use case: Preview (hiển thị luồng camera trong Viewfinder), ImageCapture (chụp ảnh), ImageAnalysis (phân tích luồng khung hình cho ML) và VideoCapture (ghi video). Mỗi use case là một thành phần độc lập có thể kết hợp: chạy Preview cho kính ngắm và ImageAnalysis cho xử lý ML đồng thời. Theo Google (2026), CameraX được hỗ trợ trên 99% thiết bị Android với API 21+.
CameraX cung cấp khả năng chuyển đổi tự động giữa camera trước và sau, hỗ trợ xoay màn hình mà không cần tạo lại phiên, quản lý vòng đời tích hợp qua LifecycleOwner, liên kết use case với một quy trình Lifecycle duy nhất, hỗ trợ Camera2 Extensions cho chân dung, HDR và chế độ ban đêm, và TestableCameraX cho kiểm thử đơn vị mà không cần thiết bị thật.
CameraX định nghĩa bốn use case tiêu chuẩn, mỗi use case giải quyết một tác vụ camera cụ thể. Các use case có thể kết hợp: sự kết hợp phổ biến nhất là Preview + ImageCapture cho ứng dụng camera và Preview + ImageAnalysis cho máy quét ML.
| Use Case | Mục đích | Lớp |
|---|---|---|
| Preview | Hiển thị luồng camera thời gian thực | PreviewView |
| ImageCapture | Chụp ảnh với cài đặt flash và độ phân giải | ImageCapture |
| ImageAnalysis | Phân tích từng khung hình cho xử lý ML | ImageAnalysis |
| VideoCapture | Ghi video với mic (từ 1.1.0-beta) | VideoCapture |
Use case Preview hiển thị luồng video camera trong PreviewView — một View đặc biệt từ thư viện CameraX. PreviewView tự động thích ứng với tỷ lệ khung hình của camera, hỗ trợ ScaleType (FillCenter, FitCenter) và xoay màn hình mà không cần tạo lại use case. Nhà phát triển chỉ cần liên kết Preview với Lifecycle qua ProcessCameraProvider.
Use case ImageAnalysis gửi từng khung hình camera đến một trình xử lý để phân tích: nhận dạng văn bản, phát hiện khuôn mặt, quét mã QR. Trình phân tích nhận khung hình ở định dạng YUV_420_888 — không gian màu phổ quát của Android. Chế độ hoạt động (BLOCKING hoặc NON_BLOCKING) kiểm soát hàng đợi khung hình: BLOCKING chờ phân tích trước đó hoàn thành, NON_BLOCKING bỏ qua khung hình khi bị trễ.
Use case ImageCapture chụp ảnh từ camera với cài đặt flash, độ phân giải và nén. Các định dạng JPEG và RAW được hỗ trợ (trên thiết bị tương thích). ImageCapture lưu ảnh chụp không đồng bộ qua OnImageCapturedCallback hoặc trực tiếp vào tệp qua ImageCapture.OutputFileOptions.
Use case VideoCapture được thêm vào CameraX 1.1.0 (beta) và cho phép ghi video lên đến 4K ở 30 FPS. Use case tự động đồng bộ với Preview: hình ảnh trong kính ngắm khớp với những gì đang được ghi vào tệp. VideoCapture sử dụng MediaCodec và MediaMuxer bên trong, ẩn đi sự phức tạp của việc cấu hình codec video và container MP4.
CameraX và Camera2 là hai cách tiếp cận để làm việc với camera trong Android. Camera2 là API cấp thấp cung cấp toàn quyền kiểm soát thiết bị. CameraX là một lớp trừu tượng cấp cao tự động hóa các kịch bản điển hình. Sự lựa chọn giữa chúng phụ thuộc vào yêu cầu của dự án.
| Đặc điểm | CameraX | Camera2 |
|---|---|---|
| Cấp độ API | Cao (use case) | Thấp (kiểm soát hoàn toàn) |
| Mã dành riêng cho thiết bị | Không cần | Cần cho mỗi thiết bị |
| Liên kết Lifecycle | Tự động | Thủ công |
| Tiện ích mở rộng | Tích hợp sẵn (HDR, Portrait, Night) | Cần triển khai OEM |
| Độ phức tạp triển khai | 15–30 dòng mã | 100–300 dòng mã |
| Hỗ trợ API | API 21+ | API 21+ |
| Linh hoạt | Kịch bản tiêu chuẩn | Mọi kịch bản |
Sử dụng CameraX cho các tác vụ tiêu chuẩn: camera trong ứng dụng, máy quét QR, xử lý luồng ML. Sử dụng Camera2 khi cần kiểm soát phơi sáng thủ công, chụp RAW với kiểm soát thông số hoàn toàn, hoặc làm việc với nhiều camera đồng thời.
Hãy xem xét thiết lập hoàn chỉnh CameraX trong ứng dụng Android sử dụng ba use case chính: Preview, ImageCapture và ImageAnalysis.
Mã liên kết CameraX với vòng đời Activity qua ProcessCameraProvider. Đầu tiên, một phiên bản của nhà cung cấp được yêu cầu, sau đó các use case được tạo và liên kết được thực hiện.
val cameraProviderFuture =
ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider = cameraProviderFuture.get()
// Tạo Preview
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(
binding.viewFinder.surfaceProvider
)
}
// Tạo ImageCapture
val imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
// Liên kết với Lifecycle
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}, ContextCompact.getMainExecutor(this))
Mã Kotlin nhận ProcessCameraProvider qua một future, tạo các use case Preview và ImageCapture, và liên kết chúng với vòng đời Activity hiện tại. CameraX tự động xử lý xoay màn hình, chuyển đổi camera và giải phóng tài nguyên khi đóng Activity.
Hãy thêm use case ImageAnalysis để xử lý từng khung hình của luồng camera, ví dụ để tích hợp với ML Kit.
val imageAnalysis = ImageAnalysis.Builder()
.setBackpressureStrategy(
ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST
)
.build()
imageAnalysis.setAnalyzer(
ContextCompact.getMainExecutor(this)
) { imageProxy ->
// Chuyển đổi YUV sang Bitmap cho ML Kit
val bitmap = ImageUtils.yuvToBitmap(imageProxy)
val inputImage = InputImage.fromBitmap(bitmap)
// Bắt đầu nhận dạng văn bản ML Kit
recognizer.process(inputImage)
.addOnSuccessListener { result ->
// Xử lý kết quả
processTextResult(result)
}
.addOnCompleteListener {
imageProxy.close()
}
}
ImageAnalysis với chiến lược KEEP_ONLY_LATEST chỉ xử lý khung hình khả dụng mới nhất, bỏ qua các khung hình cũ nếu trình phân tích không theo kịp. Mỗi khung hình được chuyển đổi từ YUV sang Bitmap cho ML Kit, sau đó nhận dạng văn bản được khởi chạy. Gọi imageProxy.close() là bắt buộc — nếu không CameraX sẽ ngừng cung cấp khung hình mới.
CameraX Extensions là một mô-đun thêm các chế độ chụp nâng cao: chân dung (làm mờ hậu cảnh), HDR (dải động mở rộng), chế độ ban đêm (chụp thiếu sáng), tự động chỉnh sửa (làm đẹp da) và chế độ làm đẹp. Các tiện ích mở rộng chỉ được kích hoạt trên các thiết bị mà nhà sản xuất camera đã cung cấp triển khai OEM.
Trước khi sử dụng CameraX Extensions, bạn phải kiểm tra xem tiện ích mở rộng có khả dụng trên thiết bị hiện tại không. Google khuyên bạn nên kiểm tra qua ExtensionsManager.isExtensionAvailable.
val extensionsManager =
ExtensionsManager.getInstance(this)
if (extensionsManager.isExtensionAvailable(
cameraProvider,
CameraSelector.DEFAULT_BACK_CAMERA,
ExtensionMode.BOKEH
)) {
// Bật chế độ chân dung
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}
Mã kiểm tra hỗ trợ cho tiện ích mở rộng BOKEH (chân dung) qua ExtensionsManager và bật nó nếu có triển khai OEM. CameraX tự động chuyển đổi cài đặt camera cho chế độ chân dung. Nếu tiện ích mở rộng không khả dụng, ứng dụng tiếp tục hoạt động ở chế độ tiêu chuẩn mà không bị treo.
CameraX Extensions giải quyết một trong những vấn đề chính của phát triển Android: phân mảnh camera. Trên các thiết bị khác nhau, chế độ chân dung được triển khai khác nhau — một số sử dụng ống kính kép, số khác sử dụng làm mờ bằng phần mềm. CameraX trừu tượng hóa sự khác biệt này: nhà phát triển bật chế độ BOKEH, và thư viện tự xác định cách triển khai trên thiết bị cụ thể. Google duy trì danh sách các đối tác OEM đã được xác minh: Samsung, Xiaomi, OPPO, vivo, Google Pixel.
Khi làm việc với CameraX, điều quan trọng là xem xét các giới hạn về số lượng use case đồng thời: trên hầu hết các thiết bị, tối đa 3 use case có thể chạy cùng lúc. Ví dụ, Preview + ImageCapture + ImageAnalysis hoạt động trên tất cả các thiết bị hiện đại, nhưng Preview + ImageCapture + VideoCapture có thể không được hỗ trợ trên các mẫu giá rẻ. CameraX cung cấp phương thức ProcessCameraProvider.checkAvailability() để kiểm tra tính tương thích của tổ hợp use case trước khi liên kết, giúp tránh treo khi chạy.
CameraX tích hợp với Jetpack Navigation qua CameraXFragment hoặc PreviewView tương thích Compose. Đối với Compose, phần tử AndroidView được sử dụng, trong đó PreviewView được nhúng. CameraX xử lý chính xác xoay màn hình và thay đổi cấu hình mà không mất trạng thái phiên camera — chỉ cần chỉ định LifecycleOwner, thư viện sẽ tự động tạo lại liên kết use case khi thiết bị xoay.
Để kiểm tra CameraX mà không cần thiết bị thật, Google cung cấp TestableCameraX — một thư viện mô phỏng hành vi camera trong kiểm thử đơn vị. TestableCameraX cho phép mô phỏng khung hình camera, kiểm tra hoạt động ImageAnalysis và tính chính xác của ImageCapture mà không cần thiết bị vật lý. Điều này tăng tốc đáng kể đường ống CI/CD cho các dự án làm việc với camera.
Câu hỏi thường gặp
Android 5.0 (API 21) trở lên. CameraX bao phủ 99% thiết bị Android đang hoạt động. Các tiện ích mở rộng (Portrait, HDR) yêu cầu API 23+ và hỗ trợ OEM cho chế độ cụ thể.
Có, use case ImageAnalysis chuyển từng khung hình đến trình phân tích. Các khung hình được chuyển đổi từ YUV_420_888 sang InputImage cho ML Kit. Đây là mẫu tiêu chuẩn để tạo máy quét ML.
CameraX là API cấp cao với kiến trúc use case, liên kết Lifecycle tự động và xử lý khác biệt dành riêng cho thiết bị. Camera2 là API cấp thấp cung cấp toàn quyền kiểm soát camera với lượng lớn mã boilerplate.
Có, use case VideoCapture được thêm vào CameraX 1.1.0-beta. Nó ghi video với mic và đồng bộ với Preview. Đối với các kịch bản phức tạp hơn, hãy sử dụng Camera2 trực tiếp.
Qua CameraSelector: DEFAULT_BACK_CAMERA hoặc DEFAULT_FRONT_CAMERA. Để chuyển đổi, gọi cameraProvider.bindToLifecycle() với bộ chọn mới — CameraX sẽ tự động khởi động lại phiên.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm