From d87fe31b196cc11ba9bec68d51fd1459b27737af Mon Sep 17 00:00:00 2001 From: junjiez Date: Tue, 19 Sep 2017 11:15:01 +0800 Subject: SnapdragonCamera:support multi camera switch add a new option in dev options to swtich camera by camera Id. Change-Id: Ieeb6f462024c3b155dc5fb532fd737313b9904de --- src/com/android/camera/CaptureModule.java | 45 +++++++++++++++++++++++----- src/com/android/camera/CaptureUI.java | 1 + src/com/android/camera/SettingsActivity.java | 1 + src/com/android/camera/SettingsManager.java | 22 ++++++++++++-- 4 files changed, 60 insertions(+), 9 deletions(-) mode change 100644 => 100755 src/com/android/camera/CaptureUI.java (limited to 'src/com/android') diff --git a/src/com/android/camera/CaptureModule.java b/src/com/android/camera/CaptureModule.java index 7dd2e59ff..d43f22117 100755 --- a/src/com/android/camera/CaptureModule.java +++ b/src/com/android/camera/CaptureModule.java @@ -655,7 +655,10 @@ public class CaptureModule implements CameraModule, PhotoController, Log.e(TAG, "onError " + id + " " + error); mCameraOpenCloseLock.release(); mCamerasOpened = false; + if (null != mActivity) { + Toast.makeText(mActivity,"open camera error id =" + id, + Toast.LENGTH_LONG).show(); mActivity.finish(); } } @@ -815,6 +818,8 @@ public class CaptureModule implements CameraModule, PhotoController, } public boolean isBackCamera() { + String switchValue = mSettingsManager.getValue(SettingsManager.KEY_SWITCH_CAMERA); + if (switchValue != null && !switchValue.equals("-1") ) return false; String value = mSettingsManager.getValue(SettingsManager.KEY_CAMERA_ID); if (value == null) return true; if (Integer.parseInt(value) == BAYER_ID) return true; @@ -973,7 +978,10 @@ public class CaptureModule implements CameraModule, PhotoController, break; } } else { - createSession(FRONT_ID); + int switchId = Integer.parseInt( + mSettingsManager.getValue(SettingsManager.KEY_SWITCH_CAMERA)); + int cameraId = switchId == -1? FRONT_ID : switchId; + createSession(cameraId); } } @@ -1051,7 +1059,8 @@ public class CaptureModule implements CameraModule, PhotoController, // Finally, we start displaying the camera preview. // for cases where we are in dual mode with mono preview off, // don't set repeating request for mono - if(id == MONO_ID && !canStartMonoPreview()) { + if(id == MONO_ID && !canStartMonoPreview() + && getCameraMode() == DUAL_MODE) { mCaptureSession[id].capture(mPreviewRequestBuilder[id] .build(), mCaptureCallback, mCameraHandler); } else { @@ -1331,10 +1340,13 @@ public class CaptureModule implements CameraModule, PhotoController, break; } } else { - if (takeZSLPicture(FRONT_ID)) { + int switchId = Integer.parseInt( + mSettingsManager.getValue(SettingsManager.KEY_SWITCH_CAMERA)); + int cameraId = switchId == -1? FRONT_ID : switchId; + if(takeZSLPicture(cameraId)) { return; } - lockFocus(FRONT_ID); + lockFocus(cameraId); } } } @@ -2459,7 +2471,10 @@ public class CaptureModule implements CameraModule, PhotoController, break; } } else { - msg.arg1 = FRONT_ID; + int switchId = Integer.parseInt( + mSettingsManager.getValue(SettingsManager.KEY_SWITCH_CAMERA)); + int cameraId = switchId == -1? FRONT_ID : switchId; + msg.arg1 = cameraId; mCameraHandler.sendMessage(msg); } mUI.showSurfaceView(); @@ -2800,7 +2815,10 @@ public class CaptureModule implements CameraModule, PhotoController, } return 0; } else { - return FRONT_ID; + int switchId = Integer.parseInt( + mSettingsManager.getValue(SettingsManager.KEY_SWITCH_CAMERA)); + int cameraId = switchId == -1? FRONT_ID : switchId; + return cameraId; } } @@ -3083,6 +3101,7 @@ public class CaptureModule implements CameraModule, PhotoController, private void updateVideoSize() { String videoSize = mSettingsManager.getValue(SettingsManager.KEY_VIDEO_QUALITY); + if (videoSize == null) return; mVideoSize = parsePictureSize(videoSize); Size[] prevSizes = mSettingsManager.getSupportedOutputSize(getMainCameraId(), MediaRecorder.class); @@ -3642,7 +3661,18 @@ public class CaptureModule implements CameraModule, PhotoController, updateHFRSetting(); boolean hfr = mHighSpeedCapture && !mHighSpeedRecordingMode; - mProfile = CamcorderProfile.get(cameraId, size); + if (CamcorderProfile.hasProfile(cameraId, size)) { + mProfile = CamcorderProfile.get(cameraId, size); + } else { + if (!"-1".equals(mSettingsManager.getValue(SettingsManager.KEY_SWITCH_CAMERA))) { + mProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); + } else { + RotateTextToast.makeText(mActivity, R.string.error_app_unsupported_profile, + Toast.LENGTH_LONG).show(); + return; + } + } + int videoWidth = mProfile.videoFrameWidth; int videoHeight = mProfile.videoFrameHeight; mUnsupportedResolution = false; @@ -4587,6 +4617,7 @@ public class CaptureModule implements CameraModule, PhotoController, case SettingsManager.KEY_CAMERA_ID: case SettingsManager.KEY_MONO_ONLY: case SettingsManager.KEY_CLEARSIGHT: + case SettingsManager.KEY_SWITCH_CAMERA: case SettingsManager.KEY_MONO_PREVIEW: if (count == 0) restartAll(); return; diff --git a/src/com/android/camera/CaptureUI.java b/src/com/android/camera/CaptureUI.java old mode 100644 new mode 100755 index d0b129ad9..9a52396dd --- a/src/com/android/camera/CaptureUI.java +++ b/src/com/android/camera/CaptureUI.java @@ -663,6 +663,7 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, public void initSwitchCamera() { mFrontBackSwitcher.setVisibility(View.INVISIBLE); String value = mSettingsManager.getValue(SettingsManager.KEY_CAMERA_ID); + Log.d(TAG,"value of KEY_CAMERA_ID is null? " + (value==null)); if (value == null) return; diff --git a/src/com/android/camera/SettingsActivity.java b/src/com/android/camera/SettingsActivity.java index eece4116a..b7ef43332 100755 --- a/src/com/android/camera/SettingsActivity.java +++ b/src/com/android/camera/SettingsActivity.java @@ -380,6 +380,7 @@ public class SettingsActivity extends PreferenceActivity { updatePreference(SettingsManager.KEY_VIDEO_HIGH_FRAME_RATE); updatePreference(SettingsManager.KEY_VIDEO_ENCODER); updatePreference(SettingsManager.KEY_ZOOM); + updatePreference(SettingsManager.KEY_SWITCH_CAMERA); updatePictureSizePreferenceButton(); Map map = mSettingsManager.getValuesMap(); diff --git a/src/com/android/camera/SettingsManager.java b/src/com/android/camera/SettingsManager.java index c99702708..675970b3d 100755 --- a/src/com/android/camera/SettingsManager.java +++ b/src/com/android/camera/SettingsManager.java @@ -115,6 +115,7 @@ public class SettingsManager implements ListMenu.SettingsListener { public static final String KEY_SCEND_MODE_INSTRUCTIONAL = "pref_camera2_scenemode_instructional"; public static final String KEY_REDEYE_REDUCTION = "pref_camera2_redeyereduction_key"; public static final String KEY_CAMERA_ID = "pref_camera2_id_key"; + public static final String KEY_SWITCH_CAMERA = "pref_camera2_switch_camera_key"; public static final String KEY_PICTURE_SIZE = "pref_camera2_picturesize_key"; public static final String KEY_ISO = "pref_camera2_iso_key"; public static final String KEY_EXPOSURE = "pref_camera2_exposure_key"; @@ -218,6 +219,7 @@ public class SettingsManager implements ListMenu.SettingsListener { String cameraId = cameraIdList[i]; CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); + Log.d(TAG,"cameraIdList size ="+cameraIdList.length); byte monoOnly = 0; try { monoOnly = characteristics.get(CaptureModule.MetaDataMonoOnlyKey); @@ -886,11 +888,26 @@ public class SettingsManager implements ListMenu.SettingsListener { private void buildCameraId() { int numOfCameras = mCharacteristics.size(); + CharSequence[] fullEntryValues = new CharSequence[numOfCameras + 1]; + CharSequence[] fullEntries = new CharSequence[numOfCameras + 1]; + for(int i = 0; i < numOfCameras ; i++) { + int facing = mCharacteristics.get(i).get(CameraCharacteristics.LENS_FACING); + String facingString = + facing == CameraCharacteristics.LENS_FACING_FRONT? "front" : "back"; + fullEntries[i] = "camera " + i +" facing:"+facingString; + fullEntryValues[i] = "" + i; + Log.d(TAG,"add "+fullEntries[i]+"="+ fullEntryValues[i]); + } + fullEntries[numOfCameras] = "disable"; + fullEntryValues[numOfCameras] = "" + -1; + ListPreference switchPref = mPreferenceGroup.findPreference(KEY_SWITCH_CAMERA); + switchPref.setEntries(fullEntries); + switchPref.setEntryValues(fullEntryValues); if (!mIsFrontCameraPresent) { + Log.d(TAG,"no front camera,remove camera id pref"); removePreference(mPreferenceGroup, KEY_CAMERA_ID); return; } - CharSequence[] entryValues = new CharSequence[numOfCameras]; CharSequence[] entries = new CharSequence[numOfCameras]; //TODO: Modify this after bayer/mono/front/back determination is done @@ -997,6 +1014,7 @@ public class SettingsManager implements ListMenu.SettingsListener { supported.add("off"); ListPreference videoQuality = mPreferenceGroup.findPreference(KEY_VIDEO_QUALITY); + if (videoQuality == null) return supported; String videoSizeStr = videoQuality.getValue(); if (videoSizeStr != null) { Size videoSize = parseSize(videoSizeStr); @@ -1365,8 +1383,8 @@ public class SettingsManager implements ListMenu.SettingsListener { private boolean isCurrentVideoResolutionSupportedByEncoder(VideoEncoderCap encoderCap) { boolean supported = false; ListPreference videoQuality = mPreferenceGroup.findPreference(KEY_VIDEO_QUALITY); + if (videoQuality == null) return supported; String videoSizeStr = videoQuality.getValue(); - if (videoSizeStr != null) { Size videoSize = parseSize(videoSizeStr); -- cgit v1.2.3