Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

プレビューを実装する

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

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

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 の公式サンプルアプリ