From 05d6be550a0fb7509289ee5c5ea055e5b2c633b6 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Thu, 26 Oct 2023 23:07:56 +0200 Subject: [PATCH] Make camera id optional If no camera id is provided, use the first camera available. --- app/src/cli.c | 6 ------ .../com/genymobile/scrcpy/CameraCapture.java | 21 ++++++++++++++++++- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/app/src/cli.c b/app/src/cli.c index 3b85187e..94733ffe 100644 --- a/app/src/cli.c +++ b/app/src/cli.c @@ -2199,12 +2199,6 @@ parse_args_with_getopt(struct scrcpy_cli_args *args, int argc, char *argv[], return false; } - if (!opts->camera_id) { - LOGE("Camera id must be specified by --camera-id=ID " - "(list the available ids with --list-cameras)"); - return false; - } - if (!opts->camera_size) { LOGE("Camera size must be specified by --camera-size=WIDTHxHEIGHT"); return false; diff --git a/server/src/main/java/com/genymobile/scrcpy/CameraCapture.java b/server/src/main/java/com/genymobile/scrcpy/CameraCapture.java index 199ced98..2f3e2e06 100644 --- a/server/src/main/java/com/genymobile/scrcpy/CameraCapture.java +++ b/server/src/main/java/com/genymobile/scrcpy/CameraCapture.java @@ -7,6 +7,7 @@ import android.annotation.TargetApi; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCaptureSession; import android.hardware.camera2.CameraDevice; +import android.hardware.camera2.CameraManager; import android.hardware.camera2.CaptureFailure; import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.params.OutputConfiguration; @@ -49,12 +50,30 @@ public class CameraCapture extends SurfaceCapture { cameraExecutor = new HandlerExecutor(cameraHandler); try { - cameraDevice = openCamera(explicitCameraId); + String cameraId = selectCamera(explicitCameraId); + if (cameraId == null) { + throw new IOException("No matching camera found"); + } + + Ln.i("Using camera '" + cameraId + "'"); + cameraDevice = openCamera(cameraId); } catch (CameraAccessException | InterruptedException e) { throw new IOException(e); } } + private String selectCamera(String explicitCameraId) throws CameraAccessException { + if (explicitCameraId != null) { + return explicitCameraId; + } + + CameraManager cameraManager = ServiceManager.getCameraManager(); + + String[] cameraIds = cameraManager.getCameraIdList(); + // Use the first one + return cameraIds.length > 0 ? cameraIds[0] : null; + } + @Override public void start(Surface surface) throws IOException { try {