0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

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の依存関係に追加

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

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

Kotlinコード(MainActivity.kt

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. 画像の撮影を追加するには?

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

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

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

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端末で動作が保証されるため、これからのカメラ開発のデファクトスタンダードと言えます。


🔗 参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?