android/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h
.. .. @@ -214,7 +214,7 @@ 214 214 static const int32_t MAX_DEFAULT_FPS = 30; 215 215 // Minimum FPS for a size to be listed in supported preview/video sizes 216 216 // 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;218 218 // Maximum frame duration for a size to be listed in supported preview/video sizes 219 219 static constexpr int64_t MAX_PREVIEW_RECORD_DURATION_NS = 1e9 / MIN_PREVIEW_RECORD_FPS; 220 220 android/frameworks/base/api/current.txt
.. .. @@ -16063,6 +16063,7 @@ 16063 16063 @Deprecated public static class Camera.CameraInfo { 16064 16064 ctor @Deprecated public Camera.CameraInfo(); 16065 16065 field @Deprecated public static final int CAMERA_FACING_BACK = 0; // 0x0 16066 + field @Deprecated public static final int CAMERA_FACING_EXTERNAL = 2; // 0x216066 16067 field @Deprecated public static final int CAMERA_FACING_FRONT = 1; // 0x1 16067 16068 field @Deprecated public boolean canDisableShutterSound; 16068 16069 field @Deprecated public int facing; android/frameworks/base/core/java/android/hardware/Camera.java
.. .. @@ -321,6 +321,7 @@ 321 321 */ 322 322 public static final int CAMERA_FACING_FRONT = 1; 323 323 324 + public static final int CAMERA_FACING_EXTERNAL = 2;324 325 /** 325 326 * The direction that the camera faces. It should be 326 327 * CAMERA_FACING_BACK or CAMERA_FACING_FRONT. android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/AndroidCamera2AgentImpl.java
.. .. @@ -1292,6 +1292,7 @@ 1292 1292 private final int mNumberOfCameras; 1293 1293 private final int mFirstBackCameraId; 1294 1294 private final int mFirstFrontCameraId; 1295 + private final int mFirstExternalCameraId;1295 1296 1296 1297 public AndroidCamera2DeviceInfo(CameraManager cameraManager, 1297 1298 String[] cameraIds, int numberOfCameras) { .. .. @@ -1301,6 +1302,7 @@ 1301 1302 1302 1303 int firstBackId = NO_DEVICE; 1303 1304 int firstFrontId = NO_DEVICE; 1305 + int firstExternalId = NO_DEVICE;1304 1306 for (int id = 0; id < cameraIds.length; ++id) { 1305 1307 try { 1306 1308 int lensDirection = cameraManager.getCameraCharacteristics(cameraIds[id]) .. .. @@ -1313,12 +1315,17 @@ 1313 1315 lensDirection == CameraCharacteristics.LENS_FACING_FRONT) { 1314 1316 firstFrontId = id; 1315 1317 } 1318 + if (firstFrontId == NO_DEVICE &&1319 + lensDirection == CameraCharacteristics.LENS_FACING_EXTERNAL) {1320 + firstExternalId = id;1321 + }1316 1322 } catch (CameraAccessException ex) { 1317 1323 Log.w(TAG, "Couldn't get characteristics of camera '" + id + "'", ex); 1318 1324 } 1319 1325 } 1320 1326 mFirstBackCameraId = firstBackId; 1321 1327 mFirstFrontCameraId = firstFrontId; 1328 + mFirstExternalCameraId = firstExternalId;1322 1329 } 1323 1330 1324 1331 @Override .. .. @@ -1347,6 +1354,11 @@ 1347 1354 return mFirstFrontCameraId; 1348 1355 } 1349 1356 1357 + @Override1358 + public int getFirstExternalCameraId() {1359 + return mFirstExternalCameraId;1360 + }1361 +1350 1362 private static class AndroidCharacteristics2 extends Characteristics { 1351 1363 private CameraCharacteristics mCameraInfo; 1352 1364 .. .. @@ -1367,6 +1379,12 @@ 1367 1379 } 1368 1380 1369 1381 @Override 1382 + public boolean isFacingExternal() {1383 + return mCameraInfo.get(CameraCharacteristics.LENS_FACING)1384 + .equals(CameraCharacteristics.LENS_FACING_EXTERNAL);1385 + }1386 +1387 + @Override1370 1388 public int getSensorOrientation() { 1371 1389 return mCameraInfo.get(CameraCharacteristics.SENSOR_ORIENTATION); 1372 1390 } android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/AndroidCameraAgentImpl.java
.. .. @@ -39,6 +39,7 @@ 39 39 40 40 import java.io.IOException; 41 41 import java.util.Collections; 42 +import java.util.HashMap;42 43 import java.util.List; 43 44 import java.util.StringTokenizer; 44 45 .. .. @@ -126,29 +127,31 @@ 126 127 } 127 128 128 129 private static class AndroidCameraDeviceInfo implements CameraDeviceInfo { 129 - private final Camera.CameraInfo[] mCameraInfos;130 + private final HashMap<Integer, Camera.CameraInfo> mCameraInfos;130 131 private final int mNumberOfCameras; 131 132 private final int mFirstBackCameraId; 132 133 private final int mFirstFrontCameraId; 134 + private final int mFirstExternalCameraId;133 135 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) {137 138 mCameraInfos = info; 138 139 mNumberOfCameras = numberOfCameras; 139 140 mFirstBackCameraId = firstBackCameraId; 140 141 mFirstFrontCameraId = firstFrontCameraId; 142 + mFirstExternalCameraId = firstExternalCameraId;141 143 } 142 144 143 145 public static AndroidCameraDeviceInfo create() { 144 146 int numberOfCameras; 145 - Camera.CameraInfo[] cameraInfos;147 + HashMap<Integer, Camera.CameraInfo> cameraInfos;146 148 try { 147 149 numberOfCameras = Camera.getNumberOfCameras(); 148 - cameraInfos = new Camera.CameraInfo[numberOfCameras];150 + Log.d(TAG, "create with number " + numberOfCameras);151 + cameraInfos = new HashMap<Integer, Camera.CameraInfo>();149 152 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));152 155 } 153 156 } catch (RuntimeException ex) { 154 157 Log.e(TAG, "Exception while creating CameraDeviceInfo", ex); .. .. @@ -157,28 +160,29 @@ 157 160 158 161 int firstFront = NO_DEVICE; 159 162 int firstBack = NO_DEVICE; 163 + int firstExternal = NO_DEVICE;160 164 // Get the first (smallest) back and first front camera id. 161 165 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) {163 167 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;168 173 } 169 174 } 170 175 171 - return new AndroidCameraDeviceInfo(cameraInfos, numberOfCameras, firstBack, firstFront);176 + return new AndroidCameraDeviceInfo(cameraInfos, numberOfCameras, firstBack, firstFront, firstExternal);172 177 } 173 178 174 179 @Override 175 180 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);180 182 if (info != null) { 181 183 return new AndroidCharacteristics(info); 184 + } else if (!mCameraInfos.isEmpty()){185 + return new AndroidCharacteristics(mCameraInfos.get(0));182 186 } else { 183 187 return null; 184 188 } .. .. @@ -199,6 +203,11 @@ 199 203 return mFirstFrontCameraId; 200 204 } 201 205 206 + @Override207 + public int getFirstExternalCameraId() {208 + return mFirstExternalCameraId;209 + }210 +202 211 private static class AndroidCharacteristics extends Characteristics { 203 212 private Camera.CameraInfo mCameraInfo; 204 213 .. .. @@ -217,6 +226,11 @@ 217 226 } 218 227 219 228 @Override 229 + public boolean isFacingExternal() {230 + return mCameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_EXTERNAL;231 + }232 +233 + @Override220 234 public int getSensorOrientation() { 221 235 return mCameraInfo.orientation; 222 236 } android/frameworks/ex/camera2/portability/src/com/android/ex/camera2/portability/CameraDeviceInfo.java
.. .. @@ -52,6 +52,12 @@ 52 52 int getFirstFrontCameraId(); 53 53 54 54 /** 55 + * @return The first (lowest) ID of the external cameras or {@code NO_DEVICE}56 + * if not available.57 + */58 + int getFirstExternalCameraId();59 +60 + /**55 61 * Device characteristics for a single camera. 56 62 */ 57 63 public abstract class Characteristics { .. .. @@ -68,6 +74,11 @@ 68 74 public abstract boolean isFacingFront(); 69 75 70 76 /** 77 + * @return Whether the camera faces the device's screen.78 + * */79 + public abstract boolean isFacingExternal();80 +81 + /**71 82 * @return The camera sensor orientation, or the counterclockwise angle 72 83 * from its natural position that the device must be held at 73 84 * for the sensor to be right side up (in degrees, always a