簡體   English   中英

如何在 Java 中使用 CameraX 設置取景器?

[英]How to set viewfinder using CameraX in Java?

我一直在開發一個需要使用 CameraX 預覽 stream 的應用程序,但它也需要一個取景器。 我已經成功實現了預覽,但是對於取景器部分,我可以在網上找到的大多數代碼都在 Kotlin 中,我作為新手似乎無法有效地將其轉換為基於 java 的代碼。 任何幫助將非常感激。

我的 XML 預覽代碼:

<androidx.camera.view.PreviewView
    android:id="@+id/previewView"
    android:layout_width="match_parent"
    android:layout_height="675dp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/toolbar">

我的 CameraX 預覽代碼:

 PreviewView mCameraView;
 Camera camera;
 void startCamera() {
    mCameraView = findViewById(R.id.previewView);

    cameraProviderFuture = ProcessCameraProvider.getInstance(this);

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

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

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

    preview.setSurfaceProvider(mCameraView.createSurfaceProvider());
    camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview);

    }

    private int degreesToFirebaseRotation(int degrees) {
    switch (degrees) {
        case 0:
            return FirebaseVisionImageMetadata.ROTATION_0;
        case 90:
            return FirebaseVisionImageMetadata.ROTATION_90;
        case 180:
            return FirebaseVisionImageMetadata.ROTATION_180;
        case 270:
            return FirebaseVisionImageMetadata.ROTATION_270;
        default:
            throw new IllegalArgumentException(
                    "Rotation must be 0, 90, 180, or 270.");
    }
}

對不起,奇怪的縮進,如果問題很愚蠢。 提前致謝。

您還需要將預覽用例綁定到生命周期所有者。

preview.setSurfaceProvider(mCameraView.createSurfaceProvider());
cameraProvider.unbindAll();
Camera camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview);
// Do stuff with camera

雖然這個問題可能早已不復存在,但我希望它能給跟進的人提供線索。

First I believe you should have seen this sample code from Google: https://developer.android.com/codelabs/camerax-getting-started where the so-called viewFinder is actually the id of a component in the xml layout file, ie你的R.id.previewView

由於 Google 示例使用了kotlin-android-extensions插件,因此您可以在 kotlin 代碼中直接使用組件的 id。

在本機 kotlin 代碼中找不到它並不罕見。 這是 Google 示例的 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">

   <Button
       android:id="@+id/camera_capture_button"
       android:layout_width="100dp"
       android:layout_height="100dp"
       android:layout_marginBottom="50dp"
       android:scaleType="fitCenter"
       android:text="Take Photo"
       app:layout_constraintLeft_toLeftOf="parent"
       app:layout_constraintRight_toRightOf="parent"
       app:layout_constraintBottom_toBottomOf="parent"
       android:elevation="2dp" />

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

</androidx.constraintlayout.widget.ConstraintLayout>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM