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