minor fixes for media output and toggling resolution

- handle exception when creating media output
- if only one resolution is supported, no need to restart the camera
This commit is contained in:
darthpaul 2022-09-29 18:05:40 +01:00
parent c38bab6824
commit 2627638a76
2 changed files with 54 additions and 44 deletions

View File

@ -34,52 +34,62 @@ class MediaOutputHelper(
private val contentResolver = activity.contentResolver private val contentResolver = activity.contentResolver
fun getImageMediaOutput(): MediaOutput { fun getImageMediaOutput(): MediaOutput {
return if (is3rdPartyIntent) { return try {
if (outputUri != null) { if (is3rdPartyIntent) {
val outputStream = openOutputStream(outputUri) if (outputUri != null) {
if (outputStream != null) { val outputStream = openOutputStream(outputUri)
MediaOutput.OutputStreamMediaOutput(outputStream, outputUri) if (outputStream != null) {
MediaOutput.OutputStreamMediaOutput(outputStream, outputUri)
} else {
errorHandler.showSaveToInternalStorage()
getMediaStoreOutput(isPhoto = true)
}
} else { } else {
errorHandler.showSaveToInternalStorage() MediaOutput.BitmapOutput
getMediaStoreOutput(isPhoto = true)
} }
} else { } else {
MediaOutput.BitmapOutput getOutputStreamMediaOutput() ?: getMediaStoreOutput(isPhoto = true)
} }
} else { } catch (e: Exception) {
getOutputStreamMediaOutput() ?: getMediaStoreOutput(isPhoto = true) errorHandler.showSaveToInternalStorage()
getMediaStoreOutput(isPhoto = true)
} }
} }
fun getVideoMediaOutput(): MediaOutput { fun getVideoMediaOutput(): MediaOutput {
return if (is3rdPartyIntent) { return try {
if (outputUri != null) { if (is3rdPartyIntent) {
if (isOreoPlus()) { if (outputUri != null) {
val fileDescriptor = openFileDescriptor(outputUri) if (isOreoPlus()) {
if (fileDescriptor != null) { val fileDescriptor = openFileDescriptor(outputUri)
MediaOutput.FileDescriptorMediaOutput(fileDescriptor, outputUri) if (fileDescriptor != null) {
MediaOutput.FileDescriptorMediaOutput(fileDescriptor, outputUri)
} else {
errorHandler.showSaveToInternalStorage()
getMediaStoreOutput(isPhoto = false)
}
} else { } else {
errorHandler.showSaveToInternalStorage() val path = activity.getRealPathFromURI(outputUri)
getMediaStoreOutput(isPhoto = false) if (path != null) {
MediaOutput.FileMediaOutput(File(path), outputUri)
} else {
errorHandler.showSaveToInternalStorage()
getMediaStoreOutput(isPhoto = false)
}
} }
} else { } else {
val path = activity.getRealPathFromURI(outputUri) getMediaStoreOutput(isPhoto = false)
if (path != null) {
MediaOutput.FileMediaOutput(File(path), outputUri)
} else {
errorHandler.showSaveToInternalStorage()
getMediaStoreOutput(isPhoto = false)
}
} }
} else { } else {
getMediaStoreOutput(isPhoto = false) if (isOreoPlus()) {
} getFileDescriptorMediaOutput() ?: getMediaStoreOutput(isPhoto = false)
} else { } else {
if (isOreoPlus()) { getFileMediaOutput() ?: getMediaStoreOutput(isPhoto = false)
getFileDescriptorMediaOutput() ?: getMediaStoreOutput(isPhoto = false) }
} else {
getFileMediaOutput() ?: getMediaStoreOutput(isPhoto = false)
} }
} catch (e: Exception) {
errorHandler.showSaveToInternalStorage()
getMediaStoreOutput(isPhoto = false)
} }
} }

View File

@ -373,18 +373,19 @@ class CameraXPreview(
} }
private fun toggleResolutions(resolutions: List<ResolutionOption>) { private fun toggleResolutions(resolutions: List<ResolutionOption>) {
val currentIndex = mediaSizeStore.getCurrentSizeIndex(isPhotoCapture, isFrontCameraInUse()) if (resolutions.size >= 2) {
val currentIndex = mediaSizeStore.getCurrentSizeIndex(isPhotoCapture, isFrontCameraInUse())
val nextIndex = if (currentIndex >= resolutions.lastIndex) { val nextIndex = if (currentIndex >= resolutions.lastIndex) {
0 0
} else { } else {
currentIndex + 1 currentIndex + 1
}
mediaSizeStore.storeSize(isPhotoCapture, isFrontCameraInUse(), nextIndex)
currentRecording?.stop()
startCamera()
} }
mediaSizeStore.storeSize(isPhotoCapture, isFrontCameraInUse(), nextIndex)
currentRecording?.stop()
startCamera()
} }
override fun toggleFrontBackCamera() { override fun toggleFrontBackCamera() {
@ -438,7 +439,7 @@ class CameraXPreview(
val mediaOutput = mediaOutputHelper.getImageMediaOutput() val mediaOutput = mediaOutputHelper.getImageMediaOutput()
if (mediaOutput is MediaOutput.BitmapOutput) { if (mediaOutput is MediaOutput.BitmapOutput) {
imageCapture.takePicture(mainExecutor, object : ImageCapture.OnImageCapturedCallback() { imageCapture.takePicture(mainExecutor, object : OnImageCapturedCallback() {
override fun onCaptureSuccess(image: ImageProxy) { override fun onCaptureSuccess(image: ImageProxy) {
listener.toggleBottomButtons(false) listener.toggleBottomButtons(false)
val bitmap = BitmapUtils.makeBitmap(image.toJpegByteArray()) val bitmap = BitmapUtils.makeBitmap(image.toJpegByteArray())
@ -457,7 +458,6 @@ class CameraXPreview(
val outputOptionsBuilder = when (mediaOutput) { val outputOptionsBuilder = when (mediaOutput) {
is MediaOutput.MediaStoreOutput -> OutputFileOptions.Builder(contentResolver, mediaOutput.contentUri, mediaOutput.contentValues) is MediaOutput.MediaStoreOutput -> OutputFileOptions.Builder(contentResolver, mediaOutput.contentUri, mediaOutput.contentValues)
is MediaOutput.OutputStreamMediaOutput -> OutputFileOptions.Builder(mediaOutput.outputStream) is MediaOutput.OutputStreamMediaOutput -> OutputFileOptions.Builder(mediaOutput.outputStream)
is MediaOutput.BitmapOutput -> throw IllegalStateException("Cannot produce an OutputFileOptions for a bitmap output")
else -> throw IllegalArgumentException("Unexpected option for image ") else -> throw IllegalArgumentException("Unexpected option for image ")
} }