public synchronized void takePicture(@NonNull PictureCallback pictureCallback) {
if (camera != null && cameraExecutor != null) {
this.pictureCallback = pictureCallback;
handler.post(() -> {
startImageCapture(cameraSelector);
imageCapture.takePicture( <<<----
not going further than here Executors.
newSingleThreadExecutor(),
new ImageCapture.OnImageCapturedCallback() {
@Override
public void onCaptureSuccess(@NonNull ImageProxy image) {
<<<<----- never called synchronized (cameraLock) {
int width, height;
final byte[] data =
imageToByteArray(image);
width = image.getWidth();
height = image.getHeight();
int rotation = image.getImageInfo().getRotationDegrees();
image.close();
callOnPictureTakenCallback(data, width, height, rotation);
Log.
d(
TAG, "takePicture took: " + (System.
currentTimeMillis() - begin) + " ms");
}
}
@Override
public void onError(@NonNull ImageCaptureException exception) {
<<<<----- only called when on back pressed String message = "";
switch (exception.getImageCaptureError()) {
case ImageCapture.
ERROR_UNKNOWN:
message = "An unknown error occurred.\n";
break;
case ImageCapture.
ERROR_CAPTURE_FAILED:
message = "Capture request failed.\n";
break;
case ImageCapture.
ERROR_INVALID_CAMERA:
message = "ImageCapture use case not bound to a valid camera.\n";
break;
case ImageCapture.
ERROR_CAMERA_CLOSED:
message = "Image capture request cannot be completed, camera is closed.\n";
break;
case ImageCapture.
ERROR_FILE_IO:
message = "Error while attempting to read or write a file.\n";
break;
}
message += exception.getMessage();
pictureCallback.onPictureTakenError(Error.
IMAGE_CAPTURE_ERROR, message);
}
}
});
});
}
}