diff options
author | Lingfeng Yang <lfy@google.com> | 2016-04-27 09:12:25 -0700 |
---|---|---|
committer | Lingfeng Yang <lfy@google.com> | 2016-04-27 11:09:39 -0700 |
commit | 996546fcf4058d98d9aceecb4086283e17ae6c9d (patch) | |
tree | e90afac0a3f1b2a989412bdaa656b835d0eea93e | |
parent | 8e2f0e48cb3d2209f1cf818b6cf8c4bd95645783 (diff) | |
download | LegacyCamera-996546fcf4058d98d9aceecb4086283e17ae6c9d.zip LegacyCamera-996546fcf4058d98d9aceecb4086283e17ae6c9d.tar.gz LegacyCamera-996546fcf4058d98d9aceecb4086283e17ae6c9d.tar.bz2 |
Prevent camera app crashes on changing hw.camera.* settings
If the AVD's config.ini changes hw.camera.*, this is effectively,
connecting/disconnecting camera hardware, and the current
way in which camera settings are handled assumes
that the set of cameras never changes, which can lead to
the camera app crashing if the camera app was used successfuly
with one configuration of hw.camera.* and then
the AVD was restarted with a different configuration.
In particular, the crash happens if the number of cameras
has been reduced since the last run, and the camera app
is looking up a preferred camera ID that is not supported
by the new number of cameras.
bug: 28417929
BUG: https://code.google.com/p/android/issues/detail?id=206945
Change-Id: Ib0e26ae77d376f31f3cc281e386d3c67291c1edc
(cherry picked from commit 8f339abd9245577c348f5ba22322e8801c21faf8)
-rw-r--r-- | src/com/android/camera/Camera.java | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/com/android/camera/Camera.java b/src/com/android/camera/Camera.java index 2ca7944..b50ab18 100644 --- a/src/com/android/camera/Camera.java +++ b/src/com/android/camera/Camera.java @@ -1085,7 +1085,21 @@ public class Camera extends ActivityBase implements FocusManager.Listener, private void getPreferredCameraId() { mPreferences = new ComboPreferences(this); CameraSettings.upgradeGlobalPreferences(mPreferences.getGlobal()); - mCameraId = CameraSettings.readPreferredCameraId(mPreferences); + + mNumberOfCameras = CameraHolder.instance().getNumberOfCameras(); + int attemptedCameraId = CameraSettings.readPreferredCameraId(mPreferences); + + // It is possible that the user can connect/disconnect cameras + // between device boots. + // We need to check that the preferred camera ID + // does not refer to a disconnected camera. + if (attemptedCameraId >= mNumberOfCameras) { + Log.v(TAG, "Preferred camera (id= " + attemptedCameraId + + ") missing. Defaulting to the first one"); + mCameraId = 0; + } else { + mCameraId = attemptedCameraId; + } // Testing purpose. Launch a specific camera through the intent extras. int intentCameraId = Util.getCameraFacingIntentExtras(this); @@ -1144,7 +1158,6 @@ public class Camera extends ActivityBase implements FocusManager.Listener, mPreferences.setLocalId(this, mCameraId); CameraSettings.upgradeLocalPreferences(mPreferences.getLocal()); - mNumberOfCameras = CameraHolder.instance().getNumberOfCameras(); mQuickCapture = getIntent().getBooleanExtra(EXTRA_QUICK_CAPTURE, false); // we need to reset exposure for the preview |