CameraXは、複雑なCamera2の上にシンプルで一貫性のあるAPIを提供するAndroid Jetpackライブラリです。何百ものAndroidデバイスモデル間の違いを抽象化し、異なるハードウェアでもカメラの一貫した動作を保証します。Android Developer CameraX Guide (2026)によると、このライブラリは25,000以上のGoogle Playアプリで使用され、API Level 21以上のデバイスで動作します。
重要ポイント
CameraXはAndroid Jetpackスイートのライブラリで、2019年にGoogleが最初にリリースした、非推奨のCamera APIの後継であり、複雑なCamera2の簡素化された代替品です。CameraXの基本哲学は「一度書けば、すべてのデバイスで動作する」です。ライブラリはハードウェアの違い(カメラの位置、サポートされる解像度、センサーの向き、利用可能な形式)を自動的に処理し、開発者はデバイス固有のコードを書く必要がありません。
CameraXのアーキテクチャはユースケースに基づいています:Preview(Viewfinderでのカメラフィード表示)、ImageCapture(写真撮影)、ImageAnalysis(MLのためのフレームストリーム分析)、VideoCapture(動画録画)。各ユースケースは独立したコンポーネントで、組み合わせることができます:ビューファインダー用のPreviewとML処理用のImageAnalysisを同時に実行できます。Google(2026)によると、CameraXはAPI 21+の99%のAndroidデバイスでサポートされています。
CameraXは、フロントカメラとリアカメラの自動切り替え、セッションを再作成しない画面回転のサポート、LifecycleOwnerによる組み込みライフサイクル管理、単一のLifecycleプロセスへのユースケースバインディング、ポートレート、HDR、ナイトモード用のCamera2 Extensionsのサポート、および実機不要の単体テスト用TestableCameraXを提供します。
CameraXは4つの標準ユースケースを定義しており、それぞれが特定のカメラタスクを解決します。ユースケースは組み合わせ可能です:最も一般的な組み合わせは、カメラアプリ向けのPreview + ImageCaptureとMLスキャナー向けのPreview + ImageAnalysisです。
| ユースケース | 目的 | クラス |
|---|---|---|
| Preview | リアルタイムのカメラフィード表示 | PreviewView |
| ImageCapture | フラッシュと解像度設定で写真撮影 | ImageCapture |
| ImageAnalysis | ML処理のための各フレーム分析 | ImageAnalysis |
| VideoCapture | マイク付き動画録画(1.1.0-beta以降) | VideoCapture |
Previewユースケースは、CameraXライブラリの特別なViewであるPreviewViewにカメラの動画ストリームを表示します。PreviewViewは自動的にカメラのアスペクト比に適応し、ScaleType(FillCenter、FitCenter)とユースケースを再作成しない画面回転をサポートします。開発者はProcessCameraProviderを介してPreviewをLifecycleにバインドするだけです。
ImageAnalysisユースケースは、分析のために各カメラフレームをハンドラーに送信します:テキスト認識、顔検出、QRコードスキャン。アナライザーは、ユニバーサルなAndroid色空間であるYUV_420_888形式でフレームを受信します。動作モード(BLOCKINGまたはNON_BLOCKING)はフレームキューを制御します:BLOCKINGは前の分析の完了を待機し、NON_BLOCKINGは遅延時にフレームをスキップします。
ImageCaptureユースケースは、フラッシュ、解像度、圧縮設定でカメラから写真を撮影します。JPEGおよびRAW形式がサポートされています(対応デバイス)。ImageCaptureは、OnImageCapturedCallbackを介して非同期的に、またはImageCapture.OutputFileOptionsを介して直接ファイルにスナップショットを保存します。
VideoCaptureユースケースはCameraX 1.1.0(ベータ)で追加され、30 FPSで最大4Kの動画録画が可能です。このユースケースは自動的にPreviewと同期します:ビューファインダーの画像はファイルに録画されているものと一致します。VideoCaptureは内部でMediaCodecとMediaMuxerを使用し、ビデオコーデックとMP4コンテナの設定の複雑さを隠蔽します。
CameraXとCamera2は、Androidでカメラを操作する2つのアプローチです。Camera2はデバイスを完全に制御できる低レベルAPIです。CameraXは典型的なシナリオを自動化する高レベルの抽象化です。どちらを選ぶかはプロジェクトの要件によって異なります。
| 特性 | CameraX | Camera2 |
|---|---|---|
| APIレベル | 高(ユースケース) | 低(完全制御) |
| デバイス固有コード | 不要 | デバイスごとに必要 |
| ライフサイクルバインディング | 自動 | 手動 |
| 拡張機能 | 内蔵(HDR、Portrait、Night) | OEM実装が必要 |
| 実装の複雑さ | 15–30行のコード | 100–300行のコード |
| APIサポート | API 21+ | API 21+ |
| 柔軟性 | 標準シナリオ | あらゆるシナリオ |
標準的なタスクにはCameraXを使用します:アプリ内カメラ、QRスキャナー、MLストリーム処理。手動露出制御、完全なパラメータ制御によるRAW撮影、または複数カメラの同時使用が必要な場合はCamera2を使用します。
3つの主要ユースケース(Preview、ImageCapture、ImageAnalysis)を使用したAndroidアプリでのCameraXの完全なセットアップを見てみましょう。
このコードは、ProcessCameraProviderを介してCameraXをActivityのライフサイクルにバインドします。まずプロバイダーのインスタンスを要求し、次にユースケースを作成してバインドを実行します。
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コードはfutureを介してProcessCameraProviderを取得し、PreviewとImageCaptureのユースケースを作成し、現在のActivityのライフサイクルにバインドします。CameraXは画面回転、カメラ切り替え、Activity終了時のリソース解放を自動的に処理します。
カメラストリームのフレームごとの処理のためにImageAnalysisユースケースを追加しましょう。例えばML Kitとの統合です。
val imageAnalysis = ImageAnalysis.Builder()
.setBackpressureStrategy(
ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST
)
.build()
imageAnalysis.setAnalyzer(
ContextCompact.getMainExecutor(this)
) { imageProxy ->
// ML Kit用のYUVからBitmapへの変換
val bitmap = ImageUtils.yuvToBitmap(imageProxy)
val inputImage = InputImage.fromBitmap(bitmap)
// ML Kitのテキスト認識の開始
recognizer.process(inputImage)
.addOnSuccessListener { result ->
// 結果の処理
processTextResult(result)
}
.addOnCompleteListener {
imageProxy.close()
}
}
KEEP_ONLY_LATEST戦略を使用したImageAnalysisは、最新の利用可能なフレームのみを処理し、アナライザーが追いつかない場合は古いフレームをスキップします。各フレームはML Kit用にYUVからBitmapに変換され、その後テキスト認識が開始されます。imageProxy.close()の呼び出しは必須です。そうしないとCameraXが新しいフレームの提供を停止します。
CameraX Extensionsは、高度な撮影モードを追加するモジュールです:ポートレート(背景ぼかし)、HDR(拡張ダイナミックレンジ)、ナイトモード(低照度撮影)、自動レタッチ(肌補正)、ビューティーモード。拡張機能は、カメラメーカーが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
)
}
コードはExtensionsManagerを介してBOKEH(ポートレート)拡張機能のサポートを確認し、OEM実装が利用可能な場合は有効にします。CameraXは自動的にポートレートモード用にカメラ設定を切り替えます。拡張機能が利用できない場合、アプリはクラッシュすることなく標準モードで動作を続けます。
CameraX ExtensionsはAndroid開発の主要な問題の一つであるカメラの断片化を解決します。デバイスによってポートレートモードの実装方法は異なります—デュアルレンズを使用するものもあれば、ソフトウェアによるぼかしを使用するものもあります。CameraXはこの違いを抽象化します:開発者がBOKEHモードを有効にすると、ライブラリ自体が特定のデバイスでの実装方法を決定します。Googleは検証済みOEMパートナーのリストを維持しています:Samsung、Xiaomi、OPPO、vivo、Google Pixel。
CameraXを使用する際は、同時ユースケース数の制限を考慮することが重要です:ほとんどのデバイスでは、最大3つのユースケースを同時に実行できます。例えば、Preview + ImageCapture + ImageAnalysisはすべての最新デバイスで動作しますが、Preview + ImageCapture + VideoCaptureは低価格モデルではサポートされない場合があります。CameraXはProcessCameraProvider.checkAvailability()メソッドを提供し、バインディング前にユースケースの組み合わせの互換性をチェックして、実行時クラッシュを防ぎます。
CameraXはCameraXFragmentまたはCompose互換のPreviewViewを介してJetpack Navigationと統合します。Composeの場合は、PreviewViewを埋め込むAndroidView要素が使用されます。CameraXはカメラセッションの状態を失うことなく、画面回転と設定変更を正しく処理します—LifecycleOwnerを指定するだけで、ライブラリはデバイスが回転したときに自動的にユースケースバインディングを再作成します。
実機なしでCameraXをテストするために、GoogleはTestableCameraXを提供しています—単体テストでカメラ動作をエミュレートするライブラリです。TestableCameraXを使用すると、物理デバイスなしでカメラフレームのシミュレーション、ImageAnalysisの動作テスト、ImageCaptureの正確性テストが可能です。これにより、カメラを扱うプロジェクトのCI/CDパイプラインが大幅に高速化されます。
よくある質問
Android 5.0(API 21)以降。CameraXはアクティブなAndroidデバイスの99%をカバーしています。拡張機能(Portrait、HDR)にはAPI 23+と特定モードのOEMサポートが必要です。
はい、ImageAnalysisユースケースが各フレームをアナライザーに渡します。フレームはML Kit用にYUV_420_888からInputImageに変換されます。これはMLスキャナーを作成する標準的なパターンです。
CameraXはユースケースアーキテクチャ、自動ライフサイクルバインディング、デバイス固有の違いの処理を備えた高レベルAPIです。Camera2は大量のボイラープレートコードを伴う完全なカメラ制御を提供する低レベルAPIです。
はい、VideoCaptureユースケースはCameraX 1.1.0-betaで追加されました。マイク付きの動画を録画し、Previewと同期します。より複雑なシナリオには、Camera2を直接使用してください。
CameraSelectorを使用:DEFAULT_BACK_CAMERAまたはDEFAULT_FRONT_CAMERA。切り替えるには、新しいセレクターでcameraProvider.bindToLifecycle()を呼び出します—CameraXが自動的にセッションを再起動します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。