From 786ff4f4ca2374bdd9177f2e24b503d43e7a3b93 Mon Sep 17 00:00:00 2001
From: liyujie <2352380935@qq.com>
Date: Thu, 28 Aug 2025 12:04:21 +0000
Subject: [PATCH] [4/4]解决USB摄像头打开相机预览界面绿屏

---
 android/packages/apps/Camera2/src/com/android/camera/ButtonManager.java |   89 +++++++++++++++++++++++++++++++++++---------
 1 files changed, 70 insertions(+), 19 deletions(-)

diff --git a/android/packages/apps/Camera2/src/com/android/camera/ButtonManager.java b/android/packages/apps/Camera2/src/com/android/camera/ButtonManager.java
old mode 100755
new mode 100644
index 4a37e47..5d72131
--- a/android/packages/apps/Camera2/src/com/android/camera/ButtonManager.java
+++ b/android/packages/apps/Camera2/src/com/android/camera/ButtonManager.java
@@ -33,6 +33,12 @@
 import com.android.camera.widget.ModeOptions;
 import com.android.camera2.R;
 
+import android.util.Log;
+import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraCharacteristics;
+import com.android.camera.one.OneCamera.Facing;
+
 /**
  * A  class for generating pre-initialized
  * {@link #android.widget.ImageButton}s.
@@ -51,6 +57,10 @@
     public static final int BUTTON_GRID_LINES = 10;
     public static final int BUTTON_EXPOSURE_COMPENSATION = 11;
     public static final int BUTTON_COUNTDOWN = 12;
+
+    public static final int ZERO_CAMERA = 0;
+    public static final int ONE_CAMERA = 1;
+    public static final int TWO_CAMERAS = 2;
 
     /** For two state MultiToggleImageButtons, the off index. */
     public static final int OFF = 0;
@@ -101,7 +111,8 @@
 
     private final AppController mAppController;
 
-    private static final String ANDROID_UVC_PROPERTY = "ro.camera.uvcfacing";
+    private CameraManager mCameraManager;
+    private static String TAG = "ButtonManager";
 
     /**
      * Get a new global ButtonManager.
@@ -114,6 +125,7 @@
 
         mSettingsManager = app.getSettingsManager();
         mSettingsManager.addListener(this);
+        mCameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
     }
 
     /**
@@ -361,27 +373,66 @@
                 initializeHdrPlusFlashButton(button, cb, preCb, R.array.camera_flashmode_icons);
                 break;
             case BUTTON_CAMERA:
-                String uvcProperty = SystemProperties.get(ANDROID_UVC_PROPERTY, "");
-                if(uvcProperty.equals("null") || uvcProperty.equals("")){
-                    initializeCameraButton(button, cb,
-                            preCb, R.array.camera_id_icons);
+                String[] cameraIds = new String[]{};
+                int front_num = 0;
+                int back_num = 0;
+                int external_num = 0;
+                try {
+                    cameraIds = mCameraManager.getCameraIdList();
+                    for (String cameraId : cameraIds) {
+                        CameraCharacteristics characteristics = mCameraManager
+                            .getCameraCharacteristics(cameraId);
+                        if (characteristics.get(CameraCharacteristics.LENS_FACING) ==
+                                CameraCharacteristics.LENS_FACING_FRONT) {
+                            front_num = front_num + 1;
+                        } else if (characteristics.get(CameraCharacteristics.LENS_FACING) ==
+                                CameraCharacteristics.LENS_FACING_BACK) {
+                            back_num = back_num + 1;
+                        } else if (characteristics.get(CameraCharacteristics.LENS_FACING) ==
+                                CameraCharacteristics.LENS_FACING_EXTERNAL) {
+                            external_num = external_num + 1;
+                        }
+                    }
                 }
-                else if (uvcProperty.equals("back")) {
-                    initializeCameraButton(button, cb,
-                            preCb, R.array.camera_id_icons_with_front_external);
+                catch (CameraAccessException ex) {
+                    Log.e(TAG, "Unable to read camera list.", ex);
                 }
-                else if (uvcProperty.equals("front")) {
-                    initializeCameraButton(button, cb,
-                            preCb, R.array.camera_id_icons_with_back_external);
+                if (front_num == ONE_CAMERA && back_num == ZERO_CAMERA) {
+                    if (external_num == ONE_CAMERA) {
+                        initializeCameraButton(button, cb,
+                                preCb, R.array.camera_id_icon_front_with_external);
+                    } else if (external_num == TWO_CAMERAS) {
+                        initializeCameraButton(button, cb,
+                                preCb, R.array.camera_id_icon_front_with_double_external);
+                    }
+                } else if (front_num == ZERO_CAMERA && back_num == ONE_CAMERA) {
+                    if (external_num == ONE_CAMERA) {
+                        initializeCameraButton(button, cb,
+                                preCb, R.array.camera_id_icon_back_with_external);
+                    } else if (external_num == TWO_CAMERAS) {
+                        initializeCameraButton(button, cb,
+                                preCb, R.array.camera_id_icon_back_with_double_external);
+                    }
+                } else if (front_num == ONE_CAMERA && back_num == ONE_CAMERA) {
+                    if (external_num == ZERO_CAMERA) {
+                        initializeCameraButton(button, cb,
+                                preCb, R.array.camera_id_icons);
+                    } else if (external_num == ONE_CAMERA) {
+                        initializeCameraButton(button, cb,
+                                preCb, R.array.camera_id_icons_with_external);
+                    } else if (external_num == TWO_CAMERAS) {
+                        initializeCameraButton(button, cb,
+                                preCb, R.array.camera_id_icons_with_double_external);
+                    }
+                } else {
+                    switch (cameraIds.length) {
+                        case TWO_CAMERAS:
+                            initializeCameraButton(button, cb,
+                                    preCb, R.array.camera_id_icons_external_double);
+                            break;
+                    }
                 }
-                else if (uvcProperty.equals("external")) {
-                    initializeCameraButton(button, cb,
-                            preCb, R.array.camera_id_icons_with_external);
-                }
-                else if (uvcProperty.equals("external-only")) {
-                    initializeCameraButton(button, cb,
-                            preCb, R.array.camera_id_icons_with_only_external);
-                }
+
                 break;
             case BUTTON_HDR_PLUS:
                 initializeHdrPlusButton(button, cb, preCb, R.array.pref_camera_hdr_plus_icons);

--
Gitblit v1.6.2