Add OnCameraBoundListener and support for landscape orientation to CameraXPreviewHelper
PiperOrigin-RevId: 572054649
This commit is contained in:
parent
3dd6480705
commit
3adc068e97
|
@ -59,6 +59,14 @@ import javax.microedition.khronos.egl.EGLSurface;
|
|||
* <p>{@link CameraX} connects to the camera and provides video frames.
|
||||
*/
|
||||
public class CameraXPreviewHelper extends CameraHelper {
|
||||
/** Listener invoked when the camera instance is available. */
|
||||
public interface OnCameraBoundListener {
|
||||
/**
|
||||
* Called after CameraX has been bound to the lifecycle and the camera instance is available.
|
||||
*/
|
||||
public void onCameraBound(Camera camera);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides an Executor that wraps a single-threaded Handler.
|
||||
*
|
||||
|
@ -130,6 +138,10 @@ public class CameraXPreviewHelper extends CameraHelper {
|
|||
// the source is CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN.
|
||||
private int cameraTimestampSource = CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN;
|
||||
|
||||
@Nullable private OnCameraBoundListener onCameraBoundListener = null;
|
||||
|
||||
private boolean isLandscapeOrientation = false;
|
||||
|
||||
/**
|
||||
* Initializes the camera and sets it up for accessing frames, using the default 1280 * 720
|
||||
* preview size.
|
||||
|
@ -211,7 +223,7 @@ public class CameraXPreviewHelper extends CameraHelper {
|
|||
* @param targetSize a predefined constant {@link #TARGET_SIZE}. If set to {@code null}, the
|
||||
* helper will default to 1280 * 720.
|
||||
*/
|
||||
private void startCamera(
|
||||
public void startCamera(
|
||||
Context context,
|
||||
LifecycleOwner lifecycleOwner,
|
||||
CameraFacing cameraFacing,
|
||||
|
@ -237,9 +249,11 @@ public class CameraXPreviewHelper extends CameraHelper {
|
|||
// (https://developer.android.com/training/camerax/configuration#specify-resolution):
|
||||
// "Express the resolution Size in the coordinate frame after rotating the supported sizes by
|
||||
// the target rotation."
|
||||
// Since we only support portrait orientation, we unconditionally transpose width and height.
|
||||
// Transpose width and height if using portrait orientation.
|
||||
Size rotatedSize =
|
||||
new Size(/* width= */ targetSize.getHeight(), /* height= */ targetSize.getWidth());
|
||||
isLandscapeOrientation
|
||||
? new Size(/* width= */ targetSize.getWidth(), /* height= */ targetSize.getHeight())
|
||||
: new Size(/* width= */ targetSize.getHeight(), /* height= */ targetSize.getWidth());
|
||||
|
||||
cameraProviderFuture.addListener(
|
||||
() -> {
|
||||
|
@ -325,15 +339,22 @@ public class CameraXPreviewHelper extends CameraHelper {
|
|||
cameraProvider.unbindAll();
|
||||
|
||||
// Bind use case(s) to camera.
|
||||
final Camera boundCamera;
|
||||
if (imageCaptureBuilder != null) {
|
||||
imageCapture = imageCaptureBuilder.build();
|
||||
camera =
|
||||
boundCamera =
|
||||
cameraProvider.bindToLifecycle(
|
||||
lifecycleOwner, cameraSelector, preview, imageCapture);
|
||||
imageCaptureExecutorService = Executors.newSingleThreadExecutor();
|
||||
isImageCaptureEnabled = true;
|
||||
} else {
|
||||
camera = cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview);
|
||||
boundCamera = cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview);
|
||||
}
|
||||
CameraXPreviewHelper.this.camera = boundCamera;
|
||||
OnCameraBoundListener listener = onCameraBoundListener;
|
||||
if (listener != null) {
|
||||
ContextCompat.getMainExecutor(context)
|
||||
.execute(() -> listener.onCameraBound(boundCamera));
|
||||
}
|
||||
},
|
||||
mainThreadExecutor);
|
||||
|
@ -462,6 +483,26 @@ public class CameraXPreviewHelper extends CameraHelper {
|
|||
return frameSize;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether the device is in landscape orientation.
|
||||
*
|
||||
* <p>Must be called before {@link #startCamera}. Portrait orientation is assumed by default.
|
||||
*/
|
||||
public void setLandscapeOrientation(boolean landscapeOrientation) {
|
||||
this.isLandscapeOrientation = landscapeOrientation;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a listener that will be invoked when CameraX is bound.
|
||||
*
|
||||
* <p>The listener will be invoked on the main thread after the next call to {@link #startCamera}.
|
||||
* The {@link Camera} instance can be used to get camera info and control the camera (e.g. zoom
|
||||
* level).
|
||||
*/
|
||||
public void setOnCameraBoundListener(@Nullable OnCameraBoundListener listener) {
|
||||
this.onCameraBoundListener = listener;
|
||||
}
|
||||
|
||||
private void updateCameraCharacteristics() {
|
||||
if (cameraCharacteristics != null) {
|
||||
// Queries camera timestamp source. It should be one of REALTIME or UNKNOWN
|
||||
|
|
Loading…
Reference in New Issue
Block a user