1. HOME
  2. ブログ
  3. エンジニアになろう!
  4. CameraXでプレビューから写真撮影までしてみた
CameraXでプレビューから写真撮影までしてみた

CameraXでプレビューから写真撮影までしてみた

CameraX で写真を撮ってみよう!

鈴木先生

(株)ライトコードの鈴木です!

CameraX」は、カメラ機能を簡単に実装できる API です。

カメラ機能を実装するなら Camera2API の方が主流でしたが、遅延処理とコールバックが必須なため、実装に手間がかかるのが難でした…。

でも、CameraX なら「ロジックの実装」だけで良いんです!

今回は、CameraX を使ったプレビューと撮影の実装方法をご紹介します!

CameraX を利用するための準備

まずは、依存関係の設定と権限の付与を行いましょう!

ライブラリを追加

build.gradle に、CameraX のライブラリを追加します。

パーミッションを追加

次に、AndroidManifest.xml に、パーミッションの追加をしてください。

他の権限と同じく、カメラ機能を使用する前には権限が付与されているかの確認が必要なので、権限を求める実装を行ってください。

CameraX を実装

UseCase クラスで用途を決める

一口にカメラ機能といっても、「写真や動画の撮影」「プレビュー表示」「画像解析」など利用方法は様々です。

CameraX では、各機能を UseCase クラスで管理しており、以下の子クラスがあります。

  1. Preview クラス(プレビュー)
  2. ImageCapture クラス(画像撮影)
  3. ImageAnalysis クラス(画像解析)
  4. VideoCapture クラス(動画撮影)

実装の流れ

どのクラスも、実装の流れは以下のような感じです。

  1. 実装したい機能のクラスを決める
  2. リスナーの設定
  3. ライフサイクルに紐付け

さて、それではさっそく実装していきましょう!

プレビュー機能を実装

プレビュー機能を実装するには「Preview クラス」を使います。

オプション設定

まずは、PreviewView をレイアウトに配置します。

コードでの取得と、プレビューする時のオプションを設定していきます。

PreviewView はカスタムビューで、元は SurfaceView です。

ライフサイクルの紐付け

次に、ProcessCameraProvider クラスのインスタンスを作成し、カメラのライフサイクルと紐づけをします。

これで「ホーム」や「戻る」ボタンで別画面に行っても、いつでも再開できるようになります。

以上で、プレビュー表示は完了です!

撮影機能を実装

写真を撮影したい時は「ImageCapture クラス」を使います。

「自動ホワイトバランス」「自動露出」「オートフォーカス」なども、このクラスで実装できますよ。

オプションを設定

最初に、撮影する際のオプションを設定しましょう。

下記の様に設定すると、「自動でフラッシュ撮影」かつ「画質よりも低遅延を優先する」ようになります。

撮影の処理

次に、撮影の処理をします。

今回は、「ボタンを押したら撮影し、test.jpg というファイル名で出力される」ようにしました。

画像の保存に成功した時には Toast を出力し、保存に失敗したらログを出力します。

これで撮影処理も完了です!

takePicture メソッドは3つある

ちなみに、撮影用の takePicture メソッドは3種類あります。

  1. メモリ内アクセス用に静止画撮影
  2. ファイルに保存
  3. メタデータとファイルに保存

引数を変更することで選択できるので、適宜使い分けてください。

さいごに

今回は、CameraX を使ったプレビューと撮影の実装方法を紹介しました。

Camera X はとても簡単に実装できるので、カメラ機能を実装したことがない人でも扱いやすい API だと思います。

また、「基本的なカメラ機能なら CameraX」「手動露出など高度な機能を使いたい時は Camera2API」というように、目的によって使い分けるのが良いでしょう。

ただ、CameraX はまだベータ版なので、プロダクト導入はまだまだ先になりそうです。

ベータ版からリリースまでの間にどんな改良がなされるのか、注目の API ですね!

こちらの記事もオススメ!

書いた人はこんな人

たかやん(エンジニア)
たかやん(エンジニア)
グンマー帝国から密出国してきてるブタ。
東京人多い...

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア