CameraX: その概要、CameraX APIとカメラの仕組み

著者: IT Sectr 公開日: 2026-03-26 読了時間: 8 分

CameraXは、複雑なCamera2の上にシンプルで一貫性のあるAPIを提供するAndroid Jetpackライブラリです。何百ものAndroidデバイスモデル間の違いを抽象化し、異なるハードウェアでもカメラの一貫した動作を保証します。Android Developer CameraX Guide (2026)によると、このライブラリは25,000以上のGoogle Playアプリで使用され、API Level 21以上のデバイスで動作します。

重要ポイント

  • CameraXは、Preview、ImageCapture、ImageAnalysisのユースケースAPIを備えたAndroidカメラ用Jetpackライブラリ
  • ユースケースアーキテクチャにより、手動でのセッション管理やカメラ状態の制御から開発者を解放
  • CameraX Extensionsは、対応デバイスでポートレートモード、HDR、夜間撮影を追加
  • タイプセーフティ — CameraXはProcessCameraProviderを通じてユースケースの互換性をチェック
  • 互換性 — Android 5.0(API 21)以降の99%のAndroidデバイスに対応

CameraXとは?

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のユースケース

CameraXは4つの標準ユースケースを定義しており、それぞれが特定のカメラタスクを解決します。ユースケースは組み合わせ可能です:最も一般的な組み合わせは、カメラアプリ向けのPreview + ImageCaptureとMLスキャナー向けのPreview + ImageAnalysisです。

ユースケース目的クラス
Previewリアルタイムのカメラフィード表示PreviewView
ImageCaptureフラッシュと解像度設定で写真撮影ImageCapture
ImageAnalysisML処理のための各フレーム分析ImageAnalysis
VideoCaptureマイク付き動画録画(1.1.0-beta以降)VideoCapture

Preview

Previewユースケースは、CameraXライブラリの特別なViewであるPreviewViewにカメラの動画ストリームを表示します。PreviewViewは自動的にカメラのアスペクト比に適応し、ScaleType(FillCenter、FitCenter)とユースケースを再作成しない画面回転をサポートします。開発者はProcessCameraProviderを介してPreviewをLifecycleにバインドするだけです。

ImageAnalysis

ImageAnalysisユースケースは、分析のために各カメラフレームをハンドラーに送信します:テキスト認識、顔検出、QRコードスキャン。アナライザーは、ユニバーサルなAndroid色空間であるYUV_420_888形式でフレームを受信します。動作モード(BLOCKINGまたはNON_BLOCKING)はフレームキューを制御します:BLOCKINGは前の分析の完了を待機し、NON_BLOCKINGは遅延時にフレームをスキップします。

ImageCapture

ImageCaptureユースケースは、フラッシュ、解像度、圧縮設定でカメラから写真を撮影します。JPEGおよびRAW形式がサポートされています(対応デバイス)。ImageCaptureは、OnImageCapturedCallbackを介して非同期的に、またはImageCapture.OutputFileOptionsを介して直接ファイルにスナップショットを保存します。

VideoCapture — 動画録画

VideoCaptureユースケースはCameraX 1.1.0(ベータ)で追加され、30 FPSで最大4Kの動画録画が可能です。このユースケースは自動的にPreviewと同期します:ビューファインダーの画像はファイルに録画されているものと一致します。VideoCaptureは内部でMediaCodecとMediaMuxerを使用し、ビデオコーデックとMP4コンテナの設定の複雑さを隠蔽します。

CameraX vs Camera2

CameraXとCamera2は、Androidでカメラを操作する2つのアプローチです。Camera2はデバイスを完全に制御できる低レベルAPIです。CameraXは典型的なシナリオを自動化する高レベルの抽象化です。どちらを選ぶかはプロジェクトの要件によって異なります。

特性CameraXCamera2
APIレベル高(ユースケース)低(完全制御)
デバイス固有コード不要デバイスごとに必要
ライフサイクルバインディング自動手動
拡張機能内蔵(HDR、Portrait、Night)OEM実装が必要
実装の複雑さ15–30行のコード100–300行のコード
APIサポートAPI 21+API 21+
柔軟性標準シナリオあらゆるシナリオ

標準的なタスクにはCameraXを使用します:アプリ内カメラ、QRスキャナー、MLストリーム処理。手動露出制御、完全なパラメータ制御によるRAW撮影、または複数カメラの同時使用が必要な場合はCamera2を使用します。

Kotlinコード例

3つの主要ユースケース(Preview、ImageCapture、ImageAnalysis)を使用したAndroidアプリでのCameraXの完全なセットアップを見てみましょう。

ProcessCameraProviderのセットアップ

このコードは、ProcessCameraProviderを介してCameraXをActivityのライフサイクルにバインドします。まずプロバイダーのインスタンスを要求し、次にユースケースを作成してバインドを実行します。

kotlin
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終了時のリソース解放を自動的に処理します。

ML処理のためのImageAnalysis

カメラストリームのフレームごとの処理のためにImageAnalysisユースケースを追加しましょう。例えばML Kitとの統合です。

kotlin
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

CameraX Extensionsは、高度な撮影モードを追加するモジュールです:ポートレート(背景ぼかし)、HDR(拡張ダイナミックレンジ)、ナイトモード(低照度撮影)、自動レタッチ(肌補正)、ビューティーモード。拡張機能は、カメラメーカーがOEM実装を提供しているデバイスでのみ有効になります。

拡張機能の確認と有効化

CameraX Extensionsを使用する前に、現在のデバイスで拡張機能が利用可能かどうかを確認する必要があります。GoogleはExtensionsManager.isExtensionAvailableで確認することを推奨しています。

kotlin
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パイプラインが大幅に高速化されます。

よくある質問

CameraXはどのAndroidバージョンから動作しますか?

Android 5.0(API 21)以降。CameraXはアクティブなAndroidデバイスの99%をカバーしています。拡張機能(Portrait、HDR)にはAPI 23+と特定モードのOEMサポートが必要です。

CameraXはML Kitと併用できますか?

はい、ImageAnalysisユースケースが各フレームをアナライザーに渡します。フレームはML Kit用にYUV_420_888からInputImageに変換されます。これはMLスキャナーを作成する標準的なパターンです。

CameraXとCamera2の違いは何ですか?

CameraXはユースケースアーキテクチャ、自動ライフサイクルバインディング、デバイス固有の違いの処理を備えた高レベルAPIです。Camera2は大量のボイラープレートコードを伴う完全なカメラ制御を提供する低レベルAPIです。

CameraXは動画録画をサポートしていますか?

はい、VideoCaptureユースケースはCameraX 1.1.0-betaで追加されました。マイク付きの動画を録画し、Previewと同期します。より複雑なシナリオには、Camera2を直接使用してください。

フロントカメラとリアカメラを切り替えるには?

CameraSelectorを使用:DEFAULT_BACK_CAMERAまたはDEFAULT_FRONT_CAMERA。切り替えるには、新しいセレクターでcameraProvider.bindToLifecycle()を呼び出します—CameraXが自動的にセッションを再起動します。

まとめ

  • CameraXはユースケースアーキテクチャ(Preview、ImageCapture、ImageAnalysis、VideoCapture)を備えたAndroidカメラ用Jetpackライブラリ
  • ユースケースは1つのセッションで組み合わせ可能:ML用のPreview + ImageAnalysis、または写真用のPreview + ImageCapture
  • ライフサイクルバインディングは画面回転やActivity状態変更時にカメラリソースを自動管理
  • CameraX Extensionsは対応デバイスでポートレートモード、HDR、夜間撮影を追加
  • 互換性 — デバイス固有コード不要でAPI 21以降の99%のAndroidデバイスに対応
  • ML Kit統合 — ImageAnalysisにより各フレームをリアルタイム分析
  • 標準タスクにはCameraXが最適、完全制御が必要な場合はCamera2を使用

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください