Android Studioで始めるCameraX API入門【2025年版】

# Android Studioで始めるCameraX API入門【2025年版】

CameraXは、Jetpackの一部として提供されるAndroid用のカメラライブラリで、幅広いAndroidデバイスで一貫したカメラ機能を簡単に実装できます。本記事では、CameraXの基本的な使い方を、サンプルコードとともに紹介します。

---

## ✅ 対象読者

- Android Studioでカメラ機能を組み込みたい開発者
- Camera2は難しそう…と思っている人
- Jetpackライブラリを活用したい人

---

## 📦 1. CameraXとは？

CameraXは、Android Jetpackの一部であり、カメラ機能を簡単に実装できるライブラリです。

- カメラデバイスの互換性を抽象化
- Camera2 APIベース
- Lifecycle-awareな設計
- 撮影・プレビュー・画像解析などを簡単に統合可能

---

## ⚙️ 2. セットアップ手順

### Step 1: `build.gradle`の依存関係に追加

```groovy
dependencies {
    def camerax_version = "1.3.0" // 最新バージョンを確認してください

    implementation "androidx.camera:camera-core:$camerax_version"
    implementation "androidx.camera:camera-camera2:$camerax_version"
    implementation "androidx.camera:camera-lifecycle:$camerax_version"
    implementation "androidx.camera:camera-view:$camerax_version"
    implementation "androidx.camera:camera-extensions:$camerax_version"
}
```

---

## 📸 3. 基本的なCameraX構成

CameraXには3つの主なユースケースがあります：

- **Preview**（プレビュー）
- **ImageCapture**（写真撮影）
- **ImageAnalysis**（画像解析）

---

## 🧱 4. カメラプレビューを表示するサンプル

### レイアウトファイル（`activity_main.xml`）

```xml
<androidx.camera.view.PreviewView
    android:id="@+id/viewFinder"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
```

### Kotlinコード（`MainActivity.kt`）

```kotlin
class MainActivity : AppCompatActivity() {

    private lateinit var viewFinder: PreviewView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewFinder = findViewById(R.id.viewFinder)

        if (allPermissionsGranted()) {
            startCamera()
        } else {
            ActivityCompat.requestPermissions(
                this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS)
        }
    }

    private fun startCamera() {
        val cameraProviderFuture = ProcessCameraProvider.getInstance(this)

        cameraProviderFuture.addListener({
            val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()

            val preview = Preview.Builder().build().also {
                it.setSurfaceProvider(viewFinder.surfaceProvider)
            }

            val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

            try {
                cameraProvider.unbindAll()
                cameraProvider.bindToLifecycle(
                    this, cameraSelector, preview)
            } catch(exc: Exception) {
                Log.e(TAG, "カメラのバインドに失敗", exc)
            }

        }, ContextCompat.getMainExecutor(this))
    }

    private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all {
        ContextCompat.checkSelfPermission(baseContext, it) == PackageManager.PERMISSION_GRANTED
    }

    companion object {
        private const val TAG = "CameraXBasic"
        private const val REQUEST_CODE_PERMISSIONS = 10
        private val REQUIRED_PERMISSIONS = arrayOf(Manifest.permission.CAMERA)
    }
}
```

---

## 📷 5. 画像の撮影を追加するには？

```kotlin
val imageCapture = ImageCapture.Builder().build()

cameraProvider.bindToLifecycle(
    this, cameraSelector, preview, imageCapture)
```

撮影ボタンなどから以下を呼び出します：

```kotlin
val photoFile = File(
    outputDirectory,
    SimpleDateFormat(FILENAME_FORMAT, Locale.US)
        .format(System.currentTimeMillis()) + ".jpg")

val outputOptions = ImageCapture.OutputFileOptions.Builder(photoFile).build()

imageCapture.takePicture(
    outputOptions, ContextCompat.getMainExecutor(this),
    object : ImageCapture.OnImageSavedCallback {
        override fun onError(exc: ImageCaptureException) {
            Log.e(TAG, "写真の保存に失敗", exc)
        }

        override fun onImageSaved(output: ImageCapture.OutputFileResults) {
            val savedUri = Uri.fromFile(photoFile)
            Log.d(TAG, "写真を保存: $savedUri")
        }
    }
)
```

---

## 📚 6. よくあるエラーと対処法

| エラー | 対処法 |
|-------|--------|
| Camera access failed | 実機でテストしているか確認 |
| `SurfaceProvider is null` | `PreviewView`の初期化を確認 |
| `Permission denied` | カメラパーミッションが許可されているかチェック |

---

## 🚀 まとめ

CameraXを使えば、複雑なCamera2 APIを扱わずに高機能なカメラアプリを作成できます。プレビュー、撮影、解析などを素早く統合でき、ほとんどのAndroid端末で動作が保証されるため、これからのカメラ開発のデファクトスタンダードと言えます。

---

## 🔗 参考リンク

- [公式ドキュメント (Jetpack CameraX)](https://developer.android.com/training/camerax)
- [GitHubサンプル](https://github.com/android/camera-samples)