Mengimplementasikan pratinjau

Saat menambahkan pratinjau ke aplikasi Anda, gunakan PreviewView, yang merupakan View yang dapat dipangkas, diskalakan, dan diputar untuk memperoleh tampilan yang tepat.

Pratinjau gambar melakukan streaming ke permukaan di dalam PreviewView saat kamera mulai aktif.

Menggunakan PreviewView

Mengimplementasikan pratinjau untuk CameraX menggunakan PreviewView melibatkan langkah-langkah berikut, yang dibahas di bagian selanjutnya:

  1. Secara opsional, konfigurasikan CameraXConfig.Provider.
  2. Tambahkan PreviewView ke tata letak Anda.
  3. Minta ProcessCameraProvider.
  4. Pada pembuatan View, periksa ProcessCameraProvider.
  5. Pilih kamera, lalu ikatkan siklus proses dan kasus penggunaannya.

Penggunaan PreviewView memiliki beberapa batasan. Saat menggunakan PreviewView, Anda tidak dapat melakukan hal-hal berikut:

  • Membuat SurfaceTexture untuk ditetapkan pada TextureView dan Preview.SurfaceProvider.
  • Mengambil SurfaceTexture dari TextureView dan menetapkannya pada Preview.SurfaceProvider.
  • Mendapatkan Surface dari SurfaceView dan menetapkannya pada Preview.SurfaceProvider.

Jika salah satu dari hal tersebut terjadi, maka Preview akan menghentikan streaming frame ke PreviewView.

[Opsional] Mengonfigurasi CameraXConfig.Provider

Jika menginginkan kontrol presisi pada saat CameraX diinisialisasi, Anda dapat mengimplementasikan antarmuka CameraXConfig.Provider dalam class Application. Perlu diketahui bahwa sebagian besar aplikasi tidak memerlukan level kontrol ini.

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();
    }
}

Menambahkan PreviewView ke tata letak

Contoh berikut menunjukkan PreviewView dalam tata letak:

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

Meminta CameraProvider

Kode berikut menunjukkan cara meminta file 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);
    }
}

Memeriksa ketersediaan CameraProvider

Setelah meminta CameraProvider, verifikasi bahwa inisialisasinya berhasil saat tampilan dibuat. Kode berikut menunjukkan cara melakukannya:

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));

Untuk contoh fungsi bindPreview yang digunakan dalam contoh ini, lihat kode yang diberikan di bagian berikutnya.

Memilih kamera serta mengikat siklus proses dan kasus penggunaan

Setelah membuat dan mengonfirmasi CameraProvider, lakukan langkah berikut:

  1. Buat Preview.
  2. Tentukan opsi LensFacing kamera yang diinginkan.
  3. Ikatkan kamera yang dipilih dan kasus penggunaan ke siklus proses.
  4. Hubungkan Preview ke PreviewView.

Kode berikut menampilkan contoh:

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.getSurfaceProvider())

    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.getSurfaceProvider());

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

Kini Anda telah selesai menerapkan pratinjau kamera. Buat aplikasi dan konfirmasi bahwa pratinjau muncul di aplikasi dan fungsi Anda seperti yang Anda harapkan.

Referensi lainnya

Untuk mempelajari lebih lanjut tentang CameraX, lihat referensi tambahan berikut.

Codelab

  • Mulai Menggunakan CameraX
  • Contoh kode

  • Contoh aplikasi CameraX resmi