CameraX PreviewView showing nothing

Mad Scientist :

I followed these tutorials: https://developer.android.com/training/camerax/preview, https://proandroiddev.com/update-android-camerax-4a44c3e4cdcc First time I ran app the preview worked, but after I rotated screen all broke. I reinstalled app, but the preview doesn't work anymore

public class ScanActivity extends AppCompatActivity {


private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;

private PreviewView cameraView;
private Preview imagePreview;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_scan);
    cameraView = findViewById(R.id.cameraView);
    cameraProviderFuture = ProcessCameraProvider.getInstance(this);
    if(isPermissionsGranted()){
        cameraView.post(new Runnable() {
            @Override
            public void run() {
                startCamera();
            }
        });
    }
    else{
        ActivityCompat.requestPermissions(ScanActivity.this,
                new String[]{Manifest.permission.CAMERA},PERMISSION_REQUEST_CODE);
    }
}

private void startCamera(){
  imagePreview = new Preview.Builder()
           .setTargetRotation(cameraView.getDisplay().getRotation())
           .build();
  imagePreview.setSurfaceProvider(cameraView.getPreviewSurfaceProvider());
  final CameraSelector cameraSelector = new CameraSelector.Builder()
                            .requireLensFacing(CameraSelector.LENS_FACING_BACK)
                            .build();
  cameraProviderFuture.addListener(() -> {
      try {
          ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
          cameraProvider.bindToLifecycle(ScanActivity.this,cameraSelector,imagePreview);
      } catch (ExecutionException|InterruptedException e) {
          e.printStackTrace();
      }
  },ContextCompat.getMainExecutor(this));

}

}

Husayn Hakeem :

A use case shouldn't be built before the camera is initialized, which is what ProcessCameraProvider.getInstance() does asynchronously. So what you may be running into is the Preview use case being built before the initialization is done, which is why the preview doesn't work. Your code should instead look like this.

cameraProviderFuture.addListener(() -> {
    try {
        ProcessCameraProvider cameraProvider = cameraProviderFuture.get(context);
        Preview preview = new Preview.Builder().build();
        preview.setSurfaceProvider(previewView.getSurfaceProvider());   
        cameraProvider.bindToLifecycle(lifecycleOwner, selector, preview);
    } catch (Exception exception) {
        exception.printStackTrace();
    }
}, ContextCompat.getMainExecutor(context));

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=393656&siteId=1