how to show captured image using CameraX api on top of previewView or in other activity?

Viewed 322

this is main activity where camerax api is implemented.

MainActivity.java

public class MainActivity extends AppCompatActivity {
private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;
private ImageCapture imageCapture;
private Executor executor;
PreviewView previewView;
Button button;

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

    previewView = findViewById(R.id.previewview);
    button = findViewById(R.id.button);

    cameraProviderFuture = ProcessCameraProvider.getInstance(this);

    //asking for hardware use permission
    Dexter.withContext(this)
            .withPermissions(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE)
            .withListener(new MultiplePermissionsListener() {
                @Override
                public void onPermissionsChecked(MultiplePermissionsReport multiplePermissionsReport) {
                    if(multiplePermissionsReport.areAllPermissionsGranted()){
                        startCam();
                    }
                    if(multiplePermissionsReport.isAnyPermissionPermanentlyDenied()){

                    }
                }

                @Override
                public void onPermissionRationaleShouldBeShown(List<PermissionRequest> list, PermissionToken permissionToken) {
                    permissionToken.continuePermissionRequest();
                }
            }).check();
}

public void startCam(){
    cameraProviderFuture.addListener(() -> {
        try {
            ProcessCameraProvider cameraProvider = cameraProviderFuture.get();

            Preview preview = new Preview.Builder().build();

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

            preview.setSurfaceProvider(previewView.getSurfaceProvider());

            imageCapture = new ImageCapture.Builder().setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY).build();

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

            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.US);
                    File file = new File(getBatchDirectoryName(), mDateFormat.format(new Date())+ ".jpg");

                    ImageCapture.OutputFileOptions outputFileOptions = new ImageCapture.OutputFileOptions.Builder(file).build();

                    executor = Executors.newSingleThreadExecutor();

                    imageCapture.takePicture(outputFileOptions, executor, new ImageCapture.OnImageSavedCallback () {
                        @Override
                        public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {

                            
                        }
                        @Override
                        public void onError(@NonNull ImageCaptureException error) {
                            error.printStackTrace();
                        }
                    });
                }
            });

        } catch (ExecutionException | InterruptedException e) {
            // No errors need to be handled for this Future.
            // This should never be reached.
        }
    }, ContextCompat.getMainExecutor(this));

}

public String getBatchDirectoryName() {

    String folder_path = "";
    folder_path = Environment.getExternalStorageDirectory().toString() + "/images";
    File dir = new File(folder_path);
    if (!dir.exists()) {
        dir.mkdirs();
    }

    return folder_path;
}
}

this is second activity where i want to show captured image in imageview. image should come from MainActivity via intent may be or any solution will be appreciated. one reading from internal storage can be implemeted but i want first one and i need some clarification on second one as well.

dashboard.java

public class dashboard extends AppCompatActivity {

ImageView imageView;
Button capturebtn, classifybtn;

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

    imageView = findViewById(R.id.imview);
    capturebtn = findViewById(R.id.captureim);
    classifybtn = findViewById(R.id.classifyim);

    capturebtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(dashboard.this, MainActivity.class));
        }
    });
    
}
}
0 Answers
Related