CameraXの概要
従来のカメラAPIではなくCameraXを使う理由を学びます。
「CameraXの概要」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全4レッスンが含まれています。
なぜCameraXなのか
Androidアプリにカメラを追加するのは、以前は大変な作業でした。従来のandroid.hardware.camera2 APIは高機能ですが非常に冗長で、実際に使われている数千種類のデバイスによって動作も異なります。
CameraXはCamera2の上に構築されたJetpackライブラリで、シンプルでライフサイクルに対応した、一貫性のあるAPIを提供します。このコースではCameraXを使ってライブプレビューを表示し、写真を撮影し、動画を録画します。
CameraXが解決する課題
CameraXは、次の3つの目標を中心に設計されています。
- 使いやすさ — Camera2よりボイラープレートコードが大幅に少なくなります。
- 一貫性 — Googleが大規模なデバイスラボでテストしているため、癖のあるデバイスでも予測可能に動作します。
- ライフサイクル対応 — 画面のライフサイクルに合わせてカメラが自動的に開始・停止するため、カメラの解放漏れを防げます。
必要なもの(プレビュー、写真、動画)を何かとして記述すれば、現在のデバイスでそれをどのように実行するかはCameraXが判断します。
3つの基本的なユースケース
CameraXはユースケースを中心に構成されています。ユースケースとは、カメラ機能をひとまとまりにしたものです。主なものは次の3つです。
Preview— カメラが捉えている映像を画面に表示します。ImageCapture— 写真を撮影します。VideoCapture— 動画を録画します。
必要なユースケースを作成し、カメラにまとめてバインドします。
// You create the use cases you need:
val preview = Preview.Builder().build()
val imageCapture = ImageCapture.Builder().build()
// Later you bind them to a lifecycle and a camera.依存関係の追加
CameraXはいくつかのアーティファクトとして提供されています。これらをモジュールのbuild.gradle.ktsに追加します。一般的な構成では、コアライブラリ、camera2バックエンド、ライフサイクル連携、ビュー用ヘルパーを追加します。
競合を避けるため、すべてのCameraXアーティファクトで同じバージョンを使用してください。
dependencies {
val cameraxVersion = "1.3.4"
implementation("androidx.camera:camera-core:$cameraxVersion")
implementation("androidx.camera:camera-camera2:$cameraxVersion")
implementation("androidx.camera:camera-lifecycle:$cameraxVersion")
implementation("androidx.camera:camera-view:$cameraxVersion")
implementation("androidx.camera:camera-video:$cameraxVersion")
}権限の宣言
カメラを使用するには、AndroidManifest.xmlでCAMERA権限を宣言する必要があります。動画も録画する場合は、RECORD_AUDIOが必要になることがあります。
これらは実行時権限です。宣言するだけでは不十分で、実行時にもユーザーへ許可を求める必要があります(詳しくは後のレッスンで扱います)。
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-feature
android:name="android.hardware.camera.any"
android:required="false" />CameraProvider
CameraXへのエントリーポイントはProcessCameraProviderです。ユースケースをカメラと画面のライフサイクルに接続します。
getInstance()で非同期に取得すると、ListenableFutureが返されます。Kotlinでは、コルーチン内でawait()できます。
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.core.ExperimentalGetImage
suspend fun Context.getCameraProvider(): ProcessCameraProvider {
return ProcessCameraProvider.getInstance(this).await()
}ユースケースとライフサイクルのバインド
プロバイダーを取得したら、ユースケースをLifecycleOwnerとCameraSelector(前面カメラまたは背面カメラ)にバインドします。
バインドはライフサイクルに対応しているため、画面が表示されるとCameraXが自動的にカメラを開き、表示されなくなると閉じます。手動で後処理を行う必要はありません。
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
lifecycleOwner,
cameraSelector,
preview,
imageCapture
)カメラの選択
CameraSelectorは、使用する物理カメラをCameraXに伝えます。最も一般的なのは、デフォルトの背面カメラと前面カメラです。
特定の特性を必須にするカスタムセレクターも作成できますが、ほとんどのアプリではデフォルトで十分です。
// Back camera (most common for photos)
val back = CameraSelector.DEFAULT_BACK_CAMERA
// Front camera (selfies, video calls)
val front = CameraSelector.DEFAULT_FRONT_CAMERA
// Toggle between them by swapping the selector and re-binding.PreviewView:表示サーフェス
CameraXはライブプレビューをPreviewViewに描画します。これは通常のAndroid Viewで、サーフェス、拡大縮小、回転を自動的に処理します。
Jetpack ComposeではAndroidViewを使って組み込みます。これにより、コンポーザブル内に従来のViewを配置できます。次のレッスンで詳しく設定します。
AndroidView(
factory = { context ->
PreviewView(context).apply {
scaleType = PreviewView.ScaleType.FILL_CENTER
}
},
modifier = Modifier.fillMaxSize()
)ライフサイクル対応の実践
CameraXの最大の実用上の利点は、ライフサイクルに対応していることです。Camera2では、onResumeで手動でカメラを開き、onPauseで解放する必要がありました。これを忘れると、クラッシュやカメラが動かなくなる問題が発生します。
CameraXでは、いったんbindToLifecycleを呼び出せば、フレームワークがすべて処理します。ユーザーが別の画面へ移動するとカメラは自動的に解放され、戻ると再び開きます。
// No manual open/close needed.
// bindToLifecycle ties the camera to the screen's
// lifecycle, so it follows onStart/onStop for you.
cameraProvider.bindToLifecycle(lifecycleOwner, selector, preview)頭の中に描くモデル
コースの残りでは、次の流れを意識してください。
ProcessCameraProviderを取得します。- 必要なユースケース(
Preview、ImageCapture、VideoCapture)を構築します。 CameraSelectorを選択します。bindToLifecycleで全体を接続します。
CameraXの機能はすべて、この4つの手順を応用したものです。
クイックチェック
CameraXの基本を理解できているか確認しましょう。
まとめ
CameraXの全体像を理解できました。
- CameraXはCamera2を、よりシンプルで一貫性があり、ライフサイクルに対応したAPIでラップします。
- ユースケース(
Preview、ImageCapture、VideoCapture)を中心に構成されています。 - CameraXのアーティファクトを追加し、
CAMERA権限を宣言し、ProcessCameraProviderを取得してbindToLifecycleします。 CameraSelectorで前面カメラと背面カメラを選択し、PreviewViewで映像を表示します。
次は、実際のライブプレビューを画面に表示します。
よくある質問
「CameraXの概要」レッスンは無料ですか?
はい。「CameraXの概要」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全4レッスンが含まれています。
「CameraXの概要」で何を学びますか?
従来のカメラAPIではなくCameraXを使う理由を学びます。 ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Android Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「CameraXの概要」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAndroid Academyレッスンでコードを書いて実行できますか?
はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- CameraXの概要
- カメラプレビューを表示する
- 写真を撮影する
- 動画を録画する