くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

AndroidでCameraXを使ってみる(プレビューの表示)

ひさびさにAndroid Jetpackのページを見ていたら、
CameraXなるものがあったので試してみたときの備忘録。

CameraXとは?

公式ドキュメントの説明はこんな感じ。

CameraX は、カメラアプリの開発を簡単に行うための Jetpack サポート ライブラリです。ほとんどの Androidバイスで機能する、使いやすく一貫性のある API サーフェスを提供するほか、Android 5.0(API レベル 21)への下位互換性も備えています。

CameraX は camera2 の機能を利用する一方で、ライフサイクルに対応した、シンプルなユースケース ベースのアプローチを使用します。また、デバイスの互換性に関する問題が解消されるため、コードベースにデバイス固有のコードを含める必要がありません。これらの機能により、カメラ機能をアプリに追加する際に作成する必要があるコードの量を減らすことができます。

カメラ関係は、Camera APIcamera2があったけど、Callbackが多くかなり大変。。

サンプルを見ると、かなり簡単に使えるのっぽいので、良さげな感じ。

使ってみる

公式のチュートリアルがあるので、そちらを参考にやってみた。

build.gradleの設定

設定する箇所は2つ。

  1. compileOptionsでJavaVersion.VERSION_1_8を指定
  2. dependenciesにライブラリを追加
// build.gradle
android {
  compileOptions {
      sourceCompatibility JavaVersion.VERSION_1_8
      targetCompatibility JavaVersion.VERSION_1_8
  }
}

dependencies {
  // CameraX core library using camera2 implementation
  implementation "androidx.camera:camera-camera2:1.0.0-rc01"
  // CameraX Lifecycle Library
  implementation "androidx.camera:camera-lifecycle:1.0.0-rc01"
  // CameraX View class
  implementation "androidx.camera:camera-view:1.0.0-alpha20"
}

AndroidManifext.xmlの設定

カメラを使うので、以下を追加しておく。

<uses-feature android:name="android.hardware.camera.any" />
<uses-permission android:name="android.permission.CAMERA" />

activity_main.xmlの設定

ActivityのレイアウトXMLはこんな感じ。
プレビュー用のPreviewViewが提供されているので、それを使う。

<!-- activity_main.xml -->
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity">

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

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity

カメラ画像のプレビューを表示するのはこんな感じ。すごく簡単。。(´ω`)
※RuntimePermission系の処理は省略。

public class MainActiivty extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    startCamera();
  }

  private void startCamera() {
    ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);

    cameraProviderFuture.addListener(() -> {
      try {
        // Used to bind the lifecycle of cameras to the lifecycle owner
        ProcessCameraProvider cameraProvider = cameraProviderFuture.get();

        // Preview
        PreviewView previewView = findViewById(R.id.viewFinder);
        Preview preview = new Preview.Builder().build();
        preview.setSurfaceProvider(previewView.getSurfaceProvider());

        // Select back camera as a default
        CameraSelector cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA;

        // Unbind use cases before rebinding
        cameraProvider.unbindAll();

        // Bind use cases to camera
        cameraProvider.bindToLifecycle(this, cameraSelector, preview);
      } catch (ExecutionException | InterruptedException e) {
          Log.e(TAG, e.getLocalizedMessage(), e);
      }
    }, ContextCompat.getMainExecutor(this));
  }
}

これでカメラの画像が表示される(´ω`)
プレビューするだけでも、数段のコールバックが必要だったのに。。(´ω`)

キャプチャとか画像解析の機能もあるので、かなり簡単になってる印象。
いろいろ試してみたい(´ω`)

以上!!

参考にしたサイトさま