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:
parent
c38bab6824
commit
2627638a76
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 ")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue