diff --git a/hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp b/hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp index a12af6ec269..80a733aec97 100755 --- a/hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp +++ b/hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include "android-base/macros.h" #include "CameraMetadata.h" #include "../../3.2/default/include/convert.h" @@ -445,7 +445,10 @@ status_t ExternalCameraDevice::initDefaultCharsKeys( UPDATE(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, &opticalStabilizationMode, 1); - const uint8_t facing = ANDROID_LENS_FACING_EXTERNAL; + int nr_back = property_get_int32("persist.vendor.camera.nr_back", 1); + const uint8_t facing = (std::stoi(mCameraId) < (mCfg.cameraIdOffset + nr_back)) ? + ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_EXTERNAL; + ALOGV("update camera %s facing to %d", mCameraId.c_str(), facing); UPDATE(ANDROID_LENS_FACING, &facing, 1); // android.noiseReduction diff --git a/packages/apps/Camera2/src/com/android/camera/CameraActivity.java b/packages/apps/Camera2/src/com/android/camera/CameraActivity.java index 6910d550de9..3a755a62e3a 100644 --- a/packages/apps/Camera2/src/com/android/camera/CameraActivity.java +++ b/packages/apps/Camera2/src/com/android/camera/CameraActivity.java @@ -1787,6 +1787,9 @@ public class CameraActivity extends QuickActivity setModuleFromModeIndex(getModeIndex()); + // Saved camera Id (of external camera) may be gone + checkCameraId(); + profile.mark(); mCameraAppUI.prepareModuleUI(); profile.mark("Init Current Module UI"); @@ -2217,6 +2220,17 @@ public class CameraActivity extends QuickActivity } } + private void checkCameraId() { + int cameraId = mSettingsManager.getInteger(SettingsManager.SCOPE_GLOBAL, + Keys.KEY_CAMERA_ID); + + if (!mOneCameraManager.hasCamera(cameraId)) { + Log.d(TAG, "reset cameraId setting " + cameraId + " to 0"); + mSettingsManager.set(SettingsManager.SCOPE_GLOBAL, + Keys.KEY_CAMERA_ID, 0); + } + } + private void preloadFilmstripItems() { if (mDataAdapter == null) { mDataAdapter = new CameraFilmstripDataAdapter(mAppContext, diff --git a/packages/apps/Camera2/src/com/android/camera/CaptureModule.java b/packages/apps/Camera2/src/com/android/camera/CaptureModule.java index 2eed66f4052..516a02ccc03 100755 --- a/packages/apps/Camera2/src/com/android/camera/CaptureModule.java +++ b/packages/apps/Camera2/src/com/android/camera/CaptureModule.java @@ -1683,10 +1683,19 @@ public class CaptureModule extends CameraModule implements private Facing getFacingFromCameraId(int cameraId) { try { CameraManager manager = (CameraManager) mCameraActivity.getSystemService(Context.CAMERA_SERVICE); - String cameraIds = manager.getCameraIdList()[cameraId]; - Log.d(TAG,"cameraIds="+cameraIds); + String[] ids = manager.getCameraIdList(); + if (cameraId >= ids.length) cameraId = 0; + + String cameraIds = ids[cameraId]; + Log.d(TAG, "cameraIds = " + cameraIds); CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraIds); int mLensFacing = characteristics.get(CameraCharacteristics.LENS_FACING); + + // map first external camera to back + if (cameraId == 0 && mLensFacing == CameraCharacteristics.LENS_FACING_EXTERNAL) { + return Facing.BACK; + } + // cameraservice map external to front for legacy API return (mLensFacing == CameraCharacteristics.LENS_FACING_BACK) ? Facing.BACK : Facing.FRONT; } catch (CameraAccessException e) { diff --git a/packages/apps/Camera2/src/com/android/camera/one/OneCameraManager.java b/packages/apps/Camera2/src/com/android/camera/one/OneCameraManager.java index d17188c2531..e363b8276dd 100644 --- a/packages/apps/Camera2/src/com/android/camera/one/OneCameraManager.java +++ b/packages/apps/Camera2/src/com/android/camera/one/OneCameraManager.java @@ -31,6 +31,11 @@ public interface OneCameraManager { */ public boolean hasCamera(); + /** + * Returns whether the device has a camera Id. + */ + public boolean hasCamera(int id); + /** * Returns whether the device has a camera facing the given direction. */ @@ -62,4 +67,4 @@ public interface OneCameraManager { public static class Factory { } -} \ No newline at end of file +} diff --git a/packages/apps/Camera2/src/com/android/camera/one/v1/LegacyOneCameraManagerImpl.java b/packages/apps/Camera2/src/com/android/camera/one/v1/LegacyOneCameraManagerImpl.java index 68f66a18dd6..a9c9cc6ccf8 100644 --- a/packages/apps/Camera2/src/com/android/camera/one/v1/LegacyOneCameraManagerImpl.java +++ b/packages/apps/Camera2/src/com/android/camera/one/v1/LegacyOneCameraManagerImpl.java @@ -103,6 +103,11 @@ public class LegacyOneCameraManagerImpl implements OneCameraManager { @Override public boolean hasCamera() { + return hasCamera(0); + } + + @Override + public boolean hasCamera(int id) { return false; } @@ -181,4 +186,4 @@ public class LegacyOneCameraManagerImpl implements OneCameraManager { return characteristics; } -} \ No newline at end of file +} diff --git a/packages/apps/Camera2/src/com/android/camera/one/v2/Camera2OneCameraManagerImpl.java b/packages/apps/Camera2/src/com/android/camera/one/v2/Camera2OneCameraManagerImpl.java index 35cc193bae9..366c01e0ffb 100644 --- a/packages/apps/Camera2/src/com/android/camera/one/v2/Camera2OneCameraManagerImpl.java +++ b/packages/apps/Camera2/src/com/android/camera/one/v2/Camera2OneCameraManagerImpl.java @@ -81,9 +81,14 @@ public class Camera2OneCameraManagerImpl implements OneCameraManager { @Override public boolean hasCamera() { + return hasCamera(0); + } + + @Override + public boolean hasCamera(int id) { try { String[] ids = mCameraManager.getCameraIdList(); - return ids != null && ids.length > 0; + return ids != null && ids.length > id; } catch (CameraAccessException ex) { Log.e(TAG, "Unable to read camera list.", ex); return false; @@ -157,9 +162,9 @@ public class Camera2OneCameraManagerImpl implements OneCameraManager { String cameraId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_BACK); if (cameraId == null) { Log.w(TAG, "No back-facing camera found."); - Log.d(TAG, "Getting First FRONT Camera"); - //xcq add - cameraId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_FRONT); + + Log.d(TAG, "Getting First EXTERNAL Camera"); + cameraId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_EXTERNAL); } return cameraId; } @@ -169,8 +174,12 @@ public class Camera2OneCameraManagerImpl implements OneCameraManager { Log.d(TAG, "Getting First FRONT Camera"); String cameraId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_FRONT); if (cameraId == null) { - Log.w(TAG, "No front-facing camera found,try to find external facing camera."); - cameraId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_EXTERNAL); + Log.w(TAG, "No front-facing camera found."); + + String backId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_BACK); + int start = (backId == null) ? 1 : 0; + Log.d(TAG, "Finding external camera " + start); + cameraId = findCameraIdFacingFrom(CameraCharacteristics.LENS_FACING_EXTERNAL, start); if (cameraId == null) { Log.w(TAG, "No external camera found."); } @@ -178,16 +187,19 @@ public class Camera2OneCameraManagerImpl implements OneCameraManager { return cameraId; } - /** Returns the ID of the first camera facing the given direction. */ private String findFirstCameraIdFacing(int facing) { + return findCameraIdFacingFrom(facing, 0); + } + + private String findCameraIdFacingFrom(int facing, int from) { try { String[] cameraIds = mCameraManager.getCameraIdList(); for (String cameraId : cameraIds) { CameraCharacteristics characteristics = mCameraManager .getCameraCharacteristics(cameraId); if (characteristics.get(CameraCharacteristics.LENS_FACING) == facing) { - return cameraId; + if (--from < 0) return cameraId; } } } catch (CameraAccessException ex) {