From b3810562527858a3b3d98ffa6e9c9c5b0f4a9a8e Mon Sep 17 00:00:00 2001 From: liyujie <2352380935@qq.com> Date: Thu, 28 Aug 2025 12:04:14 +0000 Subject: [PATCH] [1/4]解决USB摄像头打开相机预览界面绿屏 --- android/frameworks/base/core/java/android/hardware/Camera.java | 1 android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/AndroidCamera2AgentImpl.java | 18 +++++++++ android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java | 11 +++++ android/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h | 2 android/frameworks/base/api/current.txt | 1 android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraAgentImpl.java | 50 ++++++++++++++++--------- 6 files changed, 64 insertions(+), 19 deletions(-) diff --git a/android/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h b/android/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h index 3a709c9..2c8de7d 100644 --- a/android/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h +++ b/android/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h @@ -214,7 +214,7 @@ static const int32_t MAX_DEFAULT_FPS = 30; // Minimum FPS for a size to be listed in supported preview/video sizes // Set to slightly less than 30.0 to have some tolerance margin - static constexpr double MIN_PREVIEW_RECORD_FPS = 29.97; + static constexpr double MIN_PREVIEW_RECORD_FPS = 20.03; // Maximum frame duration for a size to be listed in supported preview/video sizes static constexpr int64_t MAX_PREVIEW_RECORD_DURATION_NS = 1e9 / MIN_PREVIEW_RECORD_FPS; diff --git a/android/frameworks/base/api/current.txt b/android/frameworks/base/api/current.txt index b6856db..4b5c312 100644 --- a/android/frameworks/base/api/current.txt +++ b/android/frameworks/base/api/current.txt @@ -16063,6 +16063,7 @@ @Deprecated public static class Camera.CameraInfo { ctor @Deprecated public Camera.CameraInfo(); field @Deprecated public static final int CAMERA_FACING_BACK = 0; // 0x0 + field @Deprecated public static final int CAMERA_FACING_EXTERNAL = 2; // 0x2 field @Deprecated public static final int CAMERA_FACING_FRONT = 1; // 0x1 field @Deprecated public boolean canDisableShutterSound; field @Deprecated public int facing; diff --git a/android/frameworks/base/core/java/android/hardware/Camera.java b/android/frameworks/base/core/java/android/hardware/Camera.java index 33e51c9..2a31ff8 100644 --- a/android/frameworks/base/core/java/android/hardware/Camera.java +++ b/android/frameworks/base/core/java/android/hardware/Camera.java @@ -321,6 +321,7 @@ */ public static final int CAMERA_FACING_FRONT = 1; + public static final int CAMERA_FACING_EXTERNAL = 2; /** * The direction that the camera faces. It should be * CAMERA_FACING_BACK or CAMERA_FACING_FRONT. diff --git a/android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/AndroidCamera2AgentImpl.java b/android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/AndroidCamera2AgentImpl.java index 2fc4ad3..1da6ed0 100644 --- a/android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/AndroidCamera2AgentImpl.java +++ b/android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/AndroidCamera2AgentImpl.java @@ -1292,6 +1292,7 @@ private final int mNumberOfCameras; private final int mFirstBackCameraId; private final int mFirstFrontCameraId; + private final int mFirstExternalCameraId; public AndroidCamera2DeviceInfo(CameraManager cameraManager, String[] cameraIds, int numberOfCameras) { @@ -1301,6 +1302,7 @@ int firstBackId = NO_DEVICE; int firstFrontId = NO_DEVICE; + int firstExternalId = NO_DEVICE; for (int id = 0; id < cameraIds.length; ++id) { try { int lensDirection = cameraManager.getCameraCharacteristics(cameraIds[id]) @@ -1313,12 +1315,17 @@ lensDirection == CameraCharacteristics.LENS_FACING_FRONT) { firstFrontId = id; } + if (firstFrontId == NO_DEVICE && + lensDirection == CameraCharacteristics.LENS_FACING_EXTERNAL) { + firstExternalId = id; + } } catch (CameraAccessException ex) { Log.w(TAG, "Couldn't get characteristics of camera '" + id + "'", ex); } } mFirstBackCameraId = firstBackId; mFirstFrontCameraId = firstFrontId; + mFirstExternalCameraId = firstExternalId; } @Override @@ -1347,6 +1354,11 @@ return mFirstFrontCameraId; } + @Override + public int getFirstExternalCameraId() { + return mFirstExternalCameraId; + } + private static class AndroidCharacteristics2 extends Characteristics { private CameraCharacteristics mCameraInfo; @@ -1367,6 +1379,12 @@ } @Override + public boolean isFacingExternal() { + return mCameraInfo.get(CameraCharacteristics.LENS_FACING) + .equals(CameraCharacteristics.LENS_FACING_EXTERNAL); + } + + @Override public int getSensorOrientation() { return mCameraInfo.get(CameraCharacteristics.SENSOR_ORIENTATION); } diff --git a/android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraAgentImpl.java b/android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraAgentImpl.java index 345e3dc..7e652eb 100644 --- a/android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraAgentImpl.java +++ b/android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraAgentImpl.java @@ -39,6 +39,7 @@ import java.io.IOException; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.StringTokenizer; @@ -126,29 +127,31 @@ } private static class AndroidCameraDeviceInfo implements CameraDeviceInfo { - private final Camera.CameraInfo[] mCameraInfos; + private final HashMap<Integer, Camera.CameraInfo> mCameraInfos; private final int mNumberOfCameras; private final int mFirstBackCameraId; private final int mFirstFrontCameraId; + private final int mFirstExternalCameraId; - private AndroidCameraDeviceInfo(Camera.CameraInfo[] info, int numberOfCameras, - int firstBackCameraId, int firstFrontCameraId) { - + private AndroidCameraDeviceInfo(HashMap<Integer, Camera.CameraInfo> info, int numberOfCameras, + int firstBackCameraId, int firstFrontCameraId, int firstExternalCameraId) { mCameraInfos = info; mNumberOfCameras = numberOfCameras; mFirstBackCameraId = firstBackCameraId; mFirstFrontCameraId = firstFrontCameraId; + mFirstExternalCameraId = firstExternalCameraId; } public static AndroidCameraDeviceInfo create() { int numberOfCameras; - Camera.CameraInfo[] cameraInfos; + HashMap<Integer, Camera.CameraInfo> cameraInfos; try { numberOfCameras = Camera.getNumberOfCameras(); - cameraInfos = new Camera.CameraInfo[numberOfCameras]; + Log.d(TAG, "create with number " + numberOfCameras); + cameraInfos = new HashMap<Integer, Camera.CameraInfo>(); for (int i = 0; i < numberOfCameras; i++) { - cameraInfos[i] = new Camera.CameraInfo(); - Camera.getCameraInfo(i, cameraInfos[i]); + cameraInfos.put(i, new Camera.CameraInfo()); + Camera.getCameraInfo(i, cameraInfos.get(i)); } } catch (RuntimeException ex) { Log.e(TAG, "Exception while creating CameraDeviceInfo", ex); @@ -157,28 +160,29 @@ int firstFront = NO_DEVICE; int firstBack = NO_DEVICE; + int firstExternal = NO_DEVICE; // Get the first (smallest) back and first front camera id. for (int i = numberOfCameras - 1; i >= 0; i--) { - if (cameraInfos[i].facing == Camera.CameraInfo.CAMERA_FACING_BACK) { + if (cameraInfos.get(i).facing == Camera.CameraInfo.CAMERA_FACING_BACK) { firstBack = i; - } else { - if (cameraInfos[i].facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { - firstFront = i; - } + } else if (cameraInfos.get(i).facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { + firstFront = i; + } + else if (cameraInfos.get(i).facing == Camera.CameraInfo.CAMERA_FACING_EXTERNAL) { + firstExternal = i; } } - return new AndroidCameraDeviceInfo(cameraInfos, numberOfCameras, firstBack, firstFront); + return new AndroidCameraDeviceInfo(cameraInfos, numberOfCameras, firstBack, firstFront, firstExternal); } @Override public Characteristics getCharacteristics(int cameraId) { - if (mCameraInfos == null || mCameraInfos.length == 0 || mCameraInfos.length <= cameraId) { - return null; - } - Camera.CameraInfo info = mCameraInfos[cameraId]; + Camera.CameraInfo info = mCameraInfos.get(cameraId); if (info != null) { return new AndroidCharacteristics(info); + } else if (!mCameraInfos.isEmpty()){ + return new AndroidCharacteristics(mCameraInfos.get(0)); } else { return null; } @@ -199,6 +203,11 @@ return mFirstFrontCameraId; } + @Override + public int getFirstExternalCameraId() { + return mFirstExternalCameraId; + } + private static class AndroidCharacteristics extends Characteristics { private Camera.CameraInfo mCameraInfo; @@ -217,6 +226,11 @@ } @Override + public boolean isFacingExternal() { + return mCameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_EXTERNAL; + } + + @Override public int getSensorOrientation() { return mCameraInfo.orientation; } diff --git a/android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java b/android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java index 72a641e..3991e7b 100644 --- a/android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java +++ b/android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java @@ -52,6 +52,12 @@ int getFirstFrontCameraId(); /** + * @return The first (lowest) ID of the external cameras or {@code NO_DEVICE} + * if not available. + */ + int getFirstExternalCameraId(); + + /** * Device characteristics for a single camera. */ public abstract class Characteristics { @@ -68,6 +74,11 @@ public abstract boolean isFacingFront(); /** + * @return Whether the camera faces the device's screen. + * */ + public abstract boolean isFacingExternal(); + + /** * @return The camera sensor orientation, or the counterclockwise angle * from its natural position that the device must be held at * for the sensor to be right side up (in degrees, always a -- Gitblit v1.6.2