mirror of
https://github.com/SimpleMobileTools/Simple-Camera.git
synced 2025-06-27 09:02:59 +02:00
handle toggling between photo and video modes
This commit is contained in:
@ -110,7 +110,7 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun initVariables() {
|
private fun initVariables() {
|
||||||
mIsInPhotoMode = false
|
mIsInPhotoMode = config.initPhotoMode
|
||||||
mIsCameraAvailable = false
|
mIsCameraAvailable = false
|
||||||
mIsVideoCaptureIntent = false
|
mIsVideoCaptureIntent = false
|
||||||
mIsHardwareShutterHandled = false
|
mIsHardwareShutterHandled = false
|
||||||
@ -202,7 +202,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener {
|
|||||||
mFocusCircleView = FocusCircleView(applicationContext)
|
mFocusCircleView = FocusCircleView(applicationContext)
|
||||||
view_holder.addView(mFocusCircleView)
|
view_holder.addView(mFocusCircleView)
|
||||||
|
|
||||||
mIsInPhotoMode = true
|
|
||||||
mTimerHandler = Handler()
|
mTimerHandler = Handler()
|
||||||
mFadeHandler = Handler()
|
mFadeHandler = Handler()
|
||||||
setupPreviewImage(true)
|
setupPreviewImage(true)
|
||||||
@ -325,6 +324,7 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener {
|
|||||||
mPreview?.setFlashlightState(FLASH_OFF)
|
mPreview?.setFlashlightState(FLASH_OFF)
|
||||||
hideTimer()
|
hideTimer()
|
||||||
mIsInPhotoMode = !mIsInPhotoMode
|
mIsInPhotoMode = !mIsInPhotoMode
|
||||||
|
config.initPhotoMode = mIsInPhotoMode
|
||||||
showToggleCameraIfNeeded()
|
showToggleCameraIfNeeded()
|
||||||
checkButtons()
|
checkButtons()
|
||||||
toggleBottomButtons(false)
|
toggleBottomButtons(false)
|
||||||
|
@ -50,6 +50,10 @@ class Config(context: Context) : BaseConfig(context) {
|
|||||||
get() = prefs.getString(LAST_USED_CAMERA, context.getMyCamera().getBackCameraId().toString())
|
get() = prefs.getString(LAST_USED_CAMERA, context.getMyCamera().getBackCameraId().toString())
|
||||||
set(cameraId) = prefs.edit().putString(LAST_USED_CAMERA, cameraId).apply()
|
set(cameraId) = prefs.edit().putString(LAST_USED_CAMERA, cameraId).apply()
|
||||||
|
|
||||||
|
var initPhotoMode: Boolean
|
||||||
|
get() = prefs.getBoolean(INIT_PHOTO_MODE, false)
|
||||||
|
set(initPhotoMode) = prefs.edit().putBoolean(INIT_PHOTO_MODE, initPhotoMode).apply()
|
||||||
|
|
||||||
var flashlightState: Int
|
var flashlightState: Int
|
||||||
get() = prefs.getInt(FLASHLIGHT_STATE, FLASH_OFF)
|
get() = prefs.getInt(FLASHLIGHT_STATE, FLASH_OFF)
|
||||||
set(state) = prefs.edit().putInt(FLASHLIGHT_STATE, state).apply()
|
set(state) = prefs.edit().putInt(FLASHLIGHT_STATE, state).apply()
|
||||||
|
@ -15,6 +15,7 @@ const val TURN_FLASH_OFF_AT_STARTUP = "turn_flash_off_at_startup"
|
|||||||
const val FLIP_PHOTOS = "flip_photos"
|
const val FLIP_PHOTOS = "flip_photos"
|
||||||
const val LAST_USED_CAMERA = "last_used_camera_2"
|
const val LAST_USED_CAMERA = "last_used_camera_2"
|
||||||
const val FLASHLIGHT_STATE = "flashlight_state"
|
const val FLASHLIGHT_STATE = "flashlight_state"
|
||||||
|
const val INIT_PHOTO_MODE = "init_photo_mode"
|
||||||
const val BACK_PHOTO_RESOLUTION_INDEX = "back_photo_resolution_index_2"
|
const val BACK_PHOTO_RESOLUTION_INDEX = "back_photo_resolution_index_2"
|
||||||
const val BACK_VIDEO_RESOLUTION_INDEX = "back_video_resolution_index_2"
|
const val BACK_VIDEO_RESOLUTION_INDEX = "back_video_resolution_index_2"
|
||||||
const val FRONT_PHOTO_RESOLUTION_INDEX = "front_photo_resolution_index_2"
|
const val FRONT_PHOTO_RESOLUTION_INDEX = "front_photo_resolution_index_2"
|
||||||
|
@ -84,6 +84,7 @@ class PreviewCameraTwo : ViewGroup, TextureView.SurfaceTextureListener, MyPrevie
|
|||||||
mActivity = activity
|
mActivity = activity
|
||||||
mTextureView = textureView
|
mTextureView = textureView
|
||||||
mUseFrontCamera = activity.config.lastUsedCamera == activity.getMyCamera().getBackCameraId().toString()
|
mUseFrontCamera = activity.config.lastUsedCamera == activity.getMyCamera().getBackCameraId().toString()
|
||||||
|
mIsInVideoMode = !activity.config.initPhotoMode
|
||||||
|
|
||||||
mTextureView.setOnTouchListener { view, event ->
|
mTextureView.setOnTouchListener { view, event ->
|
||||||
if (event.action == MotionEvent.ACTION_DOWN) {
|
if (event.action == MotionEvent.ACTION_DOWN) {
|
||||||
@ -227,8 +228,27 @@ class PreviewCameraTwo : ViewGroup, TextureView.SurfaceTextureListener, MyPrevie
|
|||||||
|
|
||||||
private fun getCurrentResolution(): MySize {
|
private fun getCurrentResolution(): MySize {
|
||||||
val configMap = getCameraCharacteristics().get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
|
val configMap = getCameraCharacteristics().get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
|
||||||
val resIndex = if (mUseFrontCamera) mActivity.config.frontPhotoResIndex else mActivity.config.backPhotoResIndex
|
val resIndex = if (mUseFrontCamera) {
|
||||||
val size = configMap.getOutputSizes(ImageFormat.JPEG).sortedByDescending { it.width * it.height }[resIndex]
|
if (mIsInVideoMode) {
|
||||||
|
mActivity.config.frontVideoResIndex
|
||||||
|
} else {
|
||||||
|
mActivity.config.frontPhotoResIndex
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (mIsInVideoMode) {
|
||||||
|
mActivity.config.backVideoResIndex
|
||||||
|
} else {
|
||||||
|
mActivity.config.backPhotoResIndex
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val outputSizes = if (mIsInVideoMode) {
|
||||||
|
configMap.getOutputSizes(MediaRecorder::class.java)
|
||||||
|
} else {
|
||||||
|
configMap.getOutputSizes(ImageFormat.JPEG)
|
||||||
|
}
|
||||||
|
|
||||||
|
val size = outputSizes.sortedByDescending { it.width * it.height }[resIndex]
|
||||||
return MySize(size.width, size.height)
|
return MySize(size.width, size.height)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -248,8 +268,12 @@ class PreviewCameraTwo : ViewGroup, TextureView.SurfaceTextureListener, MyPrevie
|
|||||||
val configMap = getCameraCharacteristics().get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
|
val configMap = getCameraCharacteristics().get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
|
||||||
val currentResolution = getCurrentResolution()
|
val currentResolution = getCurrentResolution()
|
||||||
|
|
||||||
mImageReader = ImageReader.newInstance(currentResolution.width, currentResolution.height, ImageFormat.JPEG, 2)
|
if (mIsInVideoMode) {
|
||||||
mImageReader!!.setOnImageAvailableListener(imageAvailableListener, mBackgroundHandler)
|
mImageReader = null
|
||||||
|
} else {
|
||||||
|
mImageReader = ImageReader.newInstance(currentResolution.width, currentResolution.height, ImageFormat.JPEG, 2)
|
||||||
|
mImageReader!!.setOnImageAvailableListener(imageAvailableListener, mBackgroundHandler)
|
||||||
|
}
|
||||||
|
|
||||||
val displaySize = getRealDisplaySize()
|
val displaySize = getRealDisplaySize()
|
||||||
var maxPreviewWidth = displaySize.width
|
var maxPreviewWidth = displaySize.width
|
||||||
@ -275,7 +299,7 @@ class PreviewCameraTwo : ViewGroup, TextureView.SurfaceTextureListener, MyPrevie
|
|||||||
maxPreviewHeight = MAX_PREVIEW_HEIGHT
|
maxPreviewHeight = MAX_PREVIEW_HEIGHT
|
||||||
}
|
}
|
||||||
|
|
||||||
val outputSizes = configMap.getOutputSizes(SurfaceTexture::class.java)
|
val outputSizes = if (mIsInVideoMode) configMap.getOutputSizes(MediaRecorder::class.java) else configMap.getOutputSizes(SurfaceTexture::class.java)
|
||||||
mPreviewSize = chooseOptimalSize(outputSizes, rotatedPreviewWidth, rotatedPreviewHeight, maxPreviewWidth, maxPreviewHeight, currentResolution)
|
mPreviewSize = chooseOptimalSize(outputSizes, rotatedPreviewWidth, rotatedPreviewHeight, maxPreviewWidth, maxPreviewHeight, currentResolution)
|
||||||
|
|
||||||
mTextureView.setAspectRatio(mPreviewSize!!.height, mPreviewSize!!.width)
|
mTextureView.setAspectRatio(mPreviewSize!!.height, mPreviewSize!!.width)
|
||||||
@ -354,15 +378,20 @@ class PreviewCameraTwo : ViewGroup, TextureView.SurfaceTextureListener, MyPrevie
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mCaptureSession = cameraCaptureSession
|
||||||
try {
|
try {
|
||||||
mCaptureSession = cameraCaptureSession
|
if (mIsInVideoMode) {
|
||||||
mPreviewRequestBuilder!!.apply {
|
mPreviewRequestBuilder!!.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO)
|
||||||
set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)
|
mCaptureSession!!.setRepeatingRequest(mPreviewRequestBuilder!!.build(), null, mBackgroundHandler)
|
||||||
setFlashAndExposure(this)
|
} else {
|
||||||
mPreviewRequest = build()
|
mPreviewRequestBuilder!!.apply {
|
||||||
|
set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)
|
||||||
|
setFlashAndExposure(this)
|
||||||
|
mPreviewRequest = build()
|
||||||
|
}
|
||||||
|
mCaptureSession!!.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mBackgroundHandler)
|
||||||
|
mCameraState = STATE_PREVIEW
|
||||||
}
|
}
|
||||||
mCaptureSession!!.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mBackgroundHandler)
|
|
||||||
mCameraState = STATE_PREVIEW
|
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -378,7 +407,11 @@ class PreviewCameraTwo : ViewGroup, TextureView.SurfaceTextureListener, MyPrevie
|
|||||||
mPreviewRequestBuilder = mCameraDevice!!.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)
|
mPreviewRequestBuilder = mCameraDevice!!.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)
|
||||||
mPreviewRequestBuilder!!.addTarget(surface)
|
mPreviewRequestBuilder!!.addTarget(surface)
|
||||||
|
|
||||||
mCameraDevice?.createCaptureSession(Arrays.asList(surface, mImageReader!!.surface), stateCallback, null)
|
if (mIsInVideoMode) {
|
||||||
|
mCameraDevice!!.createCaptureSession(Arrays.asList(surface), stateCallback, mBackgroundHandler)
|
||||||
|
} else {
|
||||||
|
mCameraDevice!!.createCaptureSession(Arrays.asList(surface, mImageReader!!.surface), stateCallback, null)
|
||||||
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -669,22 +702,27 @@ class PreviewCameraTwo : ViewGroup, TextureView.SurfaceTextureListener, MyPrevie
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun tryInitVideoMode() {
|
override fun tryInitVideoMode() {
|
||||||
|
initVideoMode()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun initPhotoMode() {
|
override fun initPhotoMode() {
|
||||||
mIsInVideoMode = false
|
mIsInVideoMode = false
|
||||||
|
closeCamera()
|
||||||
|
openCamera(mTextureView.width, mTextureView.height)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun initVideoMode(): Boolean {
|
override fun initVideoMode(): Boolean {
|
||||||
mIsInVideoMode = true
|
mIsInVideoMode = true
|
||||||
return false
|
closeCamera()
|
||||||
|
openCamera(mTextureView.width, mTextureView.height)
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun checkFlashlight() {
|
override fun checkFlashlight() {
|
||||||
if (mCameraState == STATE_PREVIEW && mIsFlashSupported) {
|
if (mCameraState == STATE_PREVIEW && mIsFlashSupported) {
|
||||||
setFlashAndExposure(mPreviewRequestBuilder!!)
|
setFlashAndExposure(mPreviewRequestBuilder!!)
|
||||||
mPreviewRequest = mPreviewRequestBuilder!!.build()
|
mPreviewRequest = mPreviewRequestBuilder!!.build()
|
||||||
mCaptureSession!!.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mBackgroundHandler)
|
mCaptureSession?.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mBackgroundHandler)
|
||||||
mActivity.updateFlashlightState(mFlashlightState)
|
mActivity.updateFlashlightState(mFlashlightState)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user