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