Taking Picture while using Camera in PreviewView

495 Views Asked by At

I'm having trouble taking a photo of the current camera image. The camera image is displayed in the view and when a button is pressed, the photo should be saved or processed later on.

I'm working with the CameraX API and Android 12 (API level 31).


import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.camera.core.Camera;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.ImageCapture;
import androidx.camera.core.ImageCaptureException;
import androidx.camera.core.Preview;
import androidx.camera.lifecycle.ProcessCameraProvider;
import androidx.camera.view.PreviewView;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import com.google.common.util.concurrent.ListenableFuture;

import java.io.File;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;

public class MainActivity extends AppCompatActivity {

    private PreviewView viewFinder;
    private ProcessCameraProvider cameraProvider;
    private Camera camera;

    private ImageCapture imageCapture;

    private static final int  CAMERA_PERMISSION_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewFinder = findViewById(R.id.viewFinder);
        startCamera();

        Button takePictureButton = findViewById(R.id.takePictureButton);
        takePictureButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                takePicture();
            }
        });

    }

    private void startCamera() {

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
            // Berechtigung wurde erteilt, öffnen Sie die Kamera.
        } else {
            // Fordern Sie die Berechtigung an.
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_CODE);
        }

        ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);
        cameraProviderFuture.addListener(() -> {
            try {
                // Verfügbare Kamera-Provider abrufen
                cameraProvider = cameraProviderFuture.get();
                // Kamera-Vorschau konfigurieren und starten
                bindPreview();
            } catch (ExecutionException | InterruptedException e) {
                // handle error
            }
        }, ContextCompat.getMainExecutor(this));
    }

    private void bindPreview() {
        imageCapture =
                new ImageCapture.Builder()
                        .setTargetRotation(viewFinder.getDisplay().getRotation())

                        .build();
        Preview preview = new Preview.Builder().build();
        preview.setSurfaceProvider(viewFinder.getSurfaceProvider());
        // 
        CameraSelector cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA;
        // bind
        camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture);
    }

    private void takePicture() {
        Executor cameraExecutor = ContextCompat.getMainExecutor(this);
        ImageCapture.OutputFileOptions outputFileOptions =
                new ImageCapture.OutputFileOptions.Builder(new File(getExternalMediaDirs()[0], "photo.jpg")).build();
        imageCapture.takePicture(outputFileOptions, cameraExecutor,
                new ImageCapture.OnImageSavedCallback() {
                    @Override
                    public void onImageSaved(ImageCapture.OutputFileResults outputFileResults) {
                        System.out.println("SAVED");
                        Toast.makeText(MainActivity.this, "Photo saved", Toast.LENGTH_SHORT).show();
                    }
                    @Override
                    public void onError(ImageCaptureException error) {
                        System.out.println("not saved");
                        Toast.makeText(MainActivity.this, "Error saving photo", Toast.LENGTH_SHORT).show();
                        System.out.println(error);
                    }
                }
        );

    }

}

I am getting the following error, and the camera image freezes and restarts again.



/ImageCapture: Send image capture request [current, pending] = [0, 1]
D/ImageCapture: issueTakePicture
D/Camera2CameraImpl: {Camera@bcf4c18[id=0]} Issue capture request
D/CaptureSession: Issuing capture request.
D/EGL_emulation: app_time_stats: avg=20.36ms min=1.77ms max=477.02ms count=39
E/CameraCaptureSession: Session 0: Exception while stopping repeating: 
    android.hardware.camera2.CameraAccessException: CAMERA_ERROR (3): cancelRequest:507: Camera 0: Error clearing streaming request: Function not implemented (-38)
        at android.hardware.camera2.CameraManager.throwAsPublicException(CameraManager.java:1179)
...

I am getting the following error, and the camera image freezes and restarts again.

0

There are 0 best solutions below