プレビューを実装する

アプリにプレビューを追加する場合は、PreviewView を使用します。これは、適切な表示に合わせて切り抜き、サイズ変更、回転ができる View です。

画像プレビューは、カメラがアクティブになったときに PreviewView 内のサーフェスにストリーミングされます。

注: OpenGL レンダリングを実行するなど、SurfaceTexture に直接アクセスする必要がある場合は、SurfaceTexture を手動で作成するをご覧ください。

PreviewView を使用する

PreviewView を使用して CameraX のプレビューを実装するには、以下の手順(後のセクションで説明)を行います。

  1. 必要に応じて CameraXConfig.Provider を設定します。
  2. レイアウトに PreviewView を追加します。
  3. CameraProvider をリクエストします。
  4. View を作成するときは、CameraProvider を確認します。
  5. カメラを選択してライフサイクルとユースケースをバインドします。

PreviewView の使用には、いくつかの制限事項があります。PreviewView を使用する場合、次のいずれの操作も実行できません。

  • SurfaceTexture を作成し、TextureViewPreviewSurfaceProvider に設定する。
  • TextureView から SurfaceTexture を取得し、PreviewSurfaceProvider に設定する。
  • SurfaceView から Surface を取得し、PreviewSurfaceProvider に設定する。

これらのうちいずれかの操作が行われた場合には、PreviewPreviewView へのフレームのストリーミングを停止します。

[オプション] CameraXConfig.Provider を設定する

CameraX が初期化されるタイミングを細かく制御するには、Application クラスに CameraXConfig.Provider インターフェースを実装します。ほとんどのアプリでは、このレベルの制御は必要ありません。

Kotlin

import androidx.camera.camera2.Camera2Config
import androidx.camera.core.CameraXConfig

public class MyCameraXApplication : Application(),  CameraXConfig.Provider {
  override fun getCameraXConfig(): CameraXConfig {
    return Camera2Config.defaultConfig()
  }
}

Java

import androidx.camera.camera2.Camera2Config;
import androidx.camera.core.CameraXConfig;

public class MyCameraXApplication extends Application implements CameraXConfig.Provider {
    @NonNull
    @Override
    public CameraXConfig getCameraXConfig() {
        return Camera2Config.defaultConfig();
    }
}

PreviewView をレイアウトに追加する

次のサンプルは、レイアウト内の PreviewView を示しています。

<FrameLayout
    android:id="@+id/container">
        <androidx.camera.view.PreviewView
            android:id="@+id/previewView" />
</FrameLayout>

CameraProvider をリクエストする

次のコードは、CameraProvider をリクエストする方法を示しています。

Kotlin

import androidx.camera.lifecycle.ProcessCameraProvider
import com.google.common.util.concurrent.ListenableFuture

class MainActivity : AppCompatActivity() {
    private lateinit var cameraProviderFuture : ListenableFuture<ProcessCameraProvider>
    override fun onCreate(savedInstanceState: Bundle?) {
        cameraProviderFuture = ProcessCameraProvider.getInstance(this)
    }
}

Java

import androidx.camera.lifecycle.ProcessCameraProvider
import com.google.common.util.concurrent.ListenableFuture

public class MainActivity extends AppCompatActivity {
    private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        cameraProviderFuture = ProcessCameraProvider.getInstance(this);
    }
}

CameraProvider が利用可能かどうかを確認する

CameraProvider をリクエストした後、ビューの作成時に初期化が成功したことを確認します。次のコードに、その方法を示します。

Kotlin

cameraProviderFuture.addListener(Runnable {
    val cameraProvider = cameraProviderFuture.get()
    bindPreview(cameraProvider)
}, ContextCompat.getMainExecutor(this))

Java

cameraProviderFuture.addListener(() -> {
    try {
        ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
        bindPreview(cameraProvider);
    } catch (ExecutionException | InterruptedException e) {
        // No errors need to be handled for this Future.
        // This should never be reached.
    }
}, ContextCompat.getMainExecutor(this));

たとえば、このサンプルで使用される bindPreview 関数については、カメラを選択してライフサイクルとユースケースをバインドするに示されているコードをご覧ください。

カメラを選択してライフサイクルとユースケースをバインドする

CameraProvider を作成して確認したら、次のようにします。

  1. Preview を作成します。
  2. 希望のカメラの LensFacing オプションを指定します。
  3. 選択したカメラとユースケースをライフサイクルにバインドします。
  4. PreviewPreviewView に接続します。

次のコードに、例を示します。

Kotlin

fun bindPreview(cameraProvider : ProcessCameraProvider) {
    var preview : Preview = Preview.Builder()
            .build()

    var cameraSelector : CameraSelector = CameraSelector.Builder()
          .requireLensFacing(CameraSelector.LENS_FACING_BACK)
          .build()

    preview.setSurfaceProvider(previewView.createSurfaceProvider())

    var camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)
}

Java

void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {
    Preview preview = new Preview.Builder()
            .build();

    CameraSelector cameraSelector = new CameraSelector.Builder()
            .requireLensFacing(CameraSelector.LENS_FACING_BACK)
            .build();

    preview.setSurfaceProvider(previewView.createSurfaceProvider());

    Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview);
}

これでカメラ プレビューの実装は完了です。アプリをビルドし、プレビューがアプリに表示され、意図したとおりに動作することを確認します。

参考情報

CameraX について詳しくは、以下の参考情報をご確認ください。

Codelab

  • CameraX のスタートガイド
  • コードサンプル

  • CameraX の公式サンプルアプリ