liyujie
2025-08-28 b3810562527858a3b3d98ffa6e9c9c5b0f4a9a8e
[1/4]解决USB摄像头打开相机预览界面绿屏
6 files modified
83 ■■■■ changed files
android/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h 2 ●●● patch | view | raw | blame | history
android/frameworks/base/api/current.txt 1 ●●●● patch | view | raw | blame | history
android/frameworks/base/core/java/android/hardware/Camera.java 1 ●●●● patch | view | raw | blame | history
android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/AndroidCamera2AgentImpl.java 18 ●●●●● patch | view | raw | blame | history
android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraAgentImpl.java 50 ●●●●● patch | view | raw | blame | history
android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java 11 ●●●●● patch | view | raw | blame | history
android/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h
....@@ -214,7 +214,7 @@
214214 static const int32_t MAX_DEFAULT_FPS = 30;
215215 // Minimum FPS for a size to be listed in supported preview/video sizes
216216 // Set to slightly less than 30.0 to have some tolerance margin
217
- static constexpr double MIN_PREVIEW_RECORD_FPS = 29.97;
217
+ static constexpr double MIN_PREVIEW_RECORD_FPS = 20.03;
218218 // Maximum frame duration for a size to be listed in supported preview/video sizes
219219 static constexpr int64_t MAX_PREVIEW_RECORD_DURATION_NS = 1e9 / MIN_PREVIEW_RECORD_FPS;
220220
android/frameworks/base/api/current.txt
....@@ -16063,6 +16063,7 @@
1606316063 @Deprecated public static class Camera.CameraInfo {
1606416064 ctor @Deprecated public Camera.CameraInfo();
1606516065 field @Deprecated public static final int CAMERA_FACING_BACK = 0; // 0x0
16066
+ field @Deprecated public static final int CAMERA_FACING_EXTERNAL = 2; // 0x2
1606616067 field @Deprecated public static final int CAMERA_FACING_FRONT = 1; // 0x1
1606716068 field @Deprecated public boolean canDisableShutterSound;
1606816069 field @Deprecated public int facing;
android/frameworks/base/core/java/android/hardware/Camera.java
....@@ -321,6 +321,7 @@
321321 */
322322 public static final int CAMERA_FACING_FRONT = 1;
323323
324
+ public static final int CAMERA_FACING_EXTERNAL = 2;
324325 /**
325326 * The direction that the camera faces. It should be
326327 * CAMERA_FACING_BACK or CAMERA_FACING_FRONT.
android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/AndroidCamera2AgentImpl.java
....@@ -1292,6 +1292,7 @@
12921292 private final int mNumberOfCameras;
12931293 private final int mFirstBackCameraId;
12941294 private final int mFirstFrontCameraId;
1295
+ private final int mFirstExternalCameraId;
12951296
12961297 public AndroidCamera2DeviceInfo(CameraManager cameraManager,
12971298 String[] cameraIds, int numberOfCameras) {
....@@ -1301,6 +1302,7 @@
13011302
13021303 int firstBackId = NO_DEVICE;
13031304 int firstFrontId = NO_DEVICE;
1305
+ int firstExternalId = NO_DEVICE;
13041306 for (int id = 0; id < cameraIds.length; ++id) {
13051307 try {
13061308 int lensDirection = cameraManager.getCameraCharacteristics(cameraIds[id])
....@@ -1313,12 +1315,17 @@
13131315 lensDirection == CameraCharacteristics.LENS_FACING_FRONT) {
13141316 firstFrontId = id;
13151317 }
1318
+ if (firstFrontId == NO_DEVICE &&
1319
+ lensDirection == CameraCharacteristics.LENS_FACING_EXTERNAL) {
1320
+ firstExternalId = id;
1321
+ }
13161322 } catch (CameraAccessException ex) {
13171323 Log.w(TAG, "Couldn't get characteristics of camera '" + id + "'", ex);
13181324 }
13191325 }
13201326 mFirstBackCameraId = firstBackId;
13211327 mFirstFrontCameraId = firstFrontId;
1328
+ mFirstExternalCameraId = firstExternalId;
13221329 }
13231330
13241331 @Override
....@@ -1347,6 +1354,11 @@
13471354 return mFirstFrontCameraId;
13481355 }
13491356
1357
+ @Override
1358
+ public int getFirstExternalCameraId() {
1359
+ return mFirstExternalCameraId;
1360
+ }
1361
+
13501362 private static class AndroidCharacteristics2 extends Characteristics {
13511363 private CameraCharacteristics mCameraInfo;
13521364
....@@ -1367,6 +1379,12 @@
13671379 }
13681380
13691381 @Override
1382
+ public boolean isFacingExternal() {
1383
+ return mCameraInfo.get(CameraCharacteristics.LENS_FACING)
1384
+ .equals(CameraCharacteristics.LENS_FACING_EXTERNAL);
1385
+ }
1386
+
1387
+ @Override
13701388 public int getSensorOrientation() {
13711389 return mCameraInfo.get(CameraCharacteristics.SENSOR_ORIENTATION);
13721390 }
android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraAgentImpl.java
....@@ -39,6 +39,7 @@
3939
4040 import java.io.IOException;
4141 import java.util.Collections;
42
+import java.util.HashMap;
4243 import java.util.List;
4344 import java.util.StringTokenizer;
4445
....@@ -126,29 +127,31 @@
126127 }
127128
128129 private static class AndroidCameraDeviceInfo implements CameraDeviceInfo {
129
- private final Camera.CameraInfo[] mCameraInfos;
130
+ private final HashMap<Integer, Camera.CameraInfo> mCameraInfos;
130131 private final int mNumberOfCameras;
131132 private final int mFirstBackCameraId;
132133 private final int mFirstFrontCameraId;
134
+ private final int mFirstExternalCameraId;
133135
134
- private AndroidCameraDeviceInfo(Camera.CameraInfo[] info, int numberOfCameras,
135
- int firstBackCameraId, int firstFrontCameraId) {
136
-
136
+ private AndroidCameraDeviceInfo(HashMap<Integer, Camera.CameraInfo> info, int numberOfCameras,
137
+ int firstBackCameraId, int firstFrontCameraId, int firstExternalCameraId) {
137138 mCameraInfos = info;
138139 mNumberOfCameras = numberOfCameras;
139140 mFirstBackCameraId = firstBackCameraId;
140141 mFirstFrontCameraId = firstFrontCameraId;
142
+ mFirstExternalCameraId = firstExternalCameraId;
141143 }
142144
143145 public static AndroidCameraDeviceInfo create() {
144146 int numberOfCameras;
145
- Camera.CameraInfo[] cameraInfos;
147
+ HashMap<Integer, Camera.CameraInfo> cameraInfos;
146148 try {
147149 numberOfCameras = Camera.getNumberOfCameras();
148
- cameraInfos = new Camera.CameraInfo[numberOfCameras];
150
+ Log.d(TAG, "create with number " + numberOfCameras);
151
+ cameraInfos = new HashMap<Integer, Camera.CameraInfo>();
149152 for (int i = 0; i < numberOfCameras; i++) {
150
- cameraInfos[i] = new Camera.CameraInfo();
151
- Camera.getCameraInfo(i, cameraInfos[i]);
153
+ cameraInfos.put(i, new Camera.CameraInfo());
154
+ Camera.getCameraInfo(i, cameraInfos.get(i));
152155 }
153156 } catch (RuntimeException ex) {
154157 Log.e(TAG, "Exception while creating CameraDeviceInfo", ex);
....@@ -157,28 +160,29 @@
157160
158161 int firstFront = NO_DEVICE;
159162 int firstBack = NO_DEVICE;
163
+ int firstExternal = NO_DEVICE;
160164 // Get the first (smallest) back and first front camera id.
161165 for (int i = numberOfCameras - 1; i >= 0; i--) {
162
- if (cameraInfos[i].facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
166
+ if (cameraInfos.get(i).facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
163167 firstBack = i;
164
- } else {
165
- if (cameraInfos[i].facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
166
- firstFront = i;
167
- }
168
+ } else if (cameraInfos.get(i).facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
169
+ firstFront = i;
170
+ }
171
+ else if (cameraInfos.get(i).facing == Camera.CameraInfo.CAMERA_FACING_EXTERNAL) {
172
+ firstExternal = i;
168173 }
169174 }
170175
171
- return new AndroidCameraDeviceInfo(cameraInfos, numberOfCameras, firstBack, firstFront);
176
+ return new AndroidCameraDeviceInfo(cameraInfos, numberOfCameras, firstBack, firstFront, firstExternal);
172177 }
173178
174179 @Override
175180 public Characteristics getCharacteristics(int cameraId) {
176
- if (mCameraInfos == null || mCameraInfos.length == 0 || mCameraInfos.length <= cameraId) {
177
- return null;
178
- }
179
- Camera.CameraInfo info = mCameraInfos[cameraId];
181
+ Camera.CameraInfo info = mCameraInfos.get(cameraId);
180182 if (info != null) {
181183 return new AndroidCharacteristics(info);
184
+ } else if (!mCameraInfos.isEmpty()){
185
+ return new AndroidCharacteristics(mCameraInfos.get(0));
182186 } else {
183187 return null;
184188 }
....@@ -199,6 +203,11 @@
199203 return mFirstFrontCameraId;
200204 }
201205
206
+ @Override
207
+ public int getFirstExternalCameraId() {
208
+ return mFirstExternalCameraId;
209
+ }
210
+
202211 private static class AndroidCharacteristics extends Characteristics {
203212 private Camera.CameraInfo mCameraInfo;
204213
....@@ -217,6 +226,11 @@
217226 }
218227
219228 @Override
229
+ public boolean isFacingExternal() {
230
+ return mCameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_EXTERNAL;
231
+ }
232
+
233
+ @Override
220234 public int getSensorOrientation() {
221235 return mCameraInfo.orientation;
222236 }
android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java
....@@ -52,6 +52,12 @@
5252 int getFirstFrontCameraId();
5353
5454 /**
55
+ * @return The first (lowest) ID of the external cameras or {@code NO_DEVICE}
56
+ * if not available.
57
+ */
58
+ int getFirstExternalCameraId();
59
+
60
+ /**
5561 * Device characteristics for a single camera.
5662 */
5763 public abstract class Characteristics {
....@@ -68,6 +74,11 @@
6874 public abstract boolean isFacingFront();
6975
7076 /**
77
+ * @return Whether the camera faces the device's screen.
78
+ * */
79
+ public abstract boolean isFacingExternal();
80
+
81
+ /**
7182 * @return The camera sensor orientation, or the counterclockwise angle
7283 * from its natural position that the device must be held at
7384 * for the sensor to be right side up (in degrees, always a