From 996546fcf4058d98d9aceecb4086283e17ae6c9d Mon Sep 17 00:00:00 2001 From: Lingfeng Yang Date: Wed, 27 Apr 2016 09:12:25 -0700 Subject: 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) --- src/com/android/camera/Camera.java | 17 +++++++++++++++-- 1 file 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 -- cgit v1.1