mirror of
https://github.com/SimpleMobileTools/Simple-Camera.git
synced 2025-04-07 12:11:07 +02:00
adding some crashfixes
This commit is contained in:
parent
dee6247321
commit
c1c9c49f04
@ -895,9 +895,10 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
|
|
||||||
private fun resetViewsOnTimerFinish() {
|
private fun resetViewsOnTimerFinish() {
|
||||||
arrayOf(top_options, toggle_camera, last_photo_video_preview, camera_mode_holder).forEach {
|
arrayOf(top_options, toggle_camera, last_photo_video_preview, camera_mode_holder).forEach {
|
||||||
it.fadeIn()
|
it?.fadeIn()
|
||||||
it.beVisible()
|
it?.beVisible()
|
||||||
}
|
}
|
||||||
|
|
||||||
timer_text.beGone()
|
timer_text.beGone()
|
||||||
shutter.setImageState(intArrayOf(-R.attr.state_timer_cancel), true)
|
shutter.setImageState(intArrayOf(-R.attr.state_timer_cancel), true)
|
||||||
}
|
}
|
||||||
|
@ -11,10 +11,7 @@ import com.simplemobiletools.camera.models.CameraSelectorImageQualities
|
|||||||
import com.simplemobiletools.camera.models.MySize
|
import com.simplemobiletools.camera.models.MySize
|
||||||
import com.simplemobiletools.commons.extensions.showErrorToast
|
import com.simplemobiletools.commons.extensions.showErrorToast
|
||||||
|
|
||||||
class ImageQualityManager(
|
class ImageQualityManager(private val activity: AppCompatActivity) {
|
||||||
private val activity: AppCompatActivity,
|
|
||||||
) {
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val CAMERA_LENS = arrayOf(CameraCharacteristics.LENS_FACING_FRONT, CameraCharacteristics.LENS_FACING_BACK)
|
private val CAMERA_LENS = arrayOf(CameraCharacteristics.LENS_FACING_FRONT, CameraCharacteristics.LENS_FACING_BACK)
|
||||||
}
|
}
|
||||||
@ -59,7 +56,7 @@ class ImageQualityManager(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun getSupportedResolutions(cameraSelector: CameraSelector): List<MySize> {
|
fun getSupportedResolutions(cameraSelector: CameraSelector): List<MySize> {
|
||||||
val fullScreenSize = getFullScreenResolution(cameraSelector)
|
val fullScreenSize = getFullScreenResolution(cameraSelector) ?: return ArrayList()
|
||||||
return listOf(fullScreenSize) + imageQualities.filter { it.camSelector == cameraSelector }
|
return listOf(fullScreenSize) + imageQualities.filter { it.camSelector == cameraSelector }
|
||||||
.flatMap { it.qualities }
|
.flatMap { it.qualities }
|
||||||
.sortedByDescending { it.pixels }
|
.sortedByDescending { it.pixels }
|
||||||
@ -68,11 +65,11 @@ class ImageQualityManager(
|
|||||||
.filter { it.isSupported(fullScreenSize.isSixteenToNine()) }
|
.filter { it.isSupported(fullScreenSize.isSixteenToNine()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getFullScreenResolution(cameraSelector: CameraSelector): MySize {
|
private fun getFullScreenResolution(cameraSelector: CameraSelector): MySize? {
|
||||||
return imageQualities.filter { it.camSelector == cameraSelector }
|
return imageQualities.filter { it.camSelector == cameraSelector }
|
||||||
.flatMap { it.qualities }
|
.flatMap { it.qualities }
|
||||||
.sortedByDescending { it.width }
|
.sortedByDescending { it.width }
|
||||||
.first { it.isSupported(false) }
|
.firstOrNull { it.isSupported(false) }
|
||||||
.copy(isFullScreen = true)
|
?.copy(isFullScreen = true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ class MediaActionSound(private val context: Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class SoundState(
|
private class SoundState(
|
||||||
val mediaSound: MediaSound,
|
val mediaSound: MediaSound?,
|
||||||
// 0 is an invalid sample ID.
|
// 0 is an invalid sample ID.
|
||||||
var loadId: Int = 0,
|
var loadId: Int = 0,
|
||||||
var streamId: Int = 0,
|
var streamId: Int = 0,
|
||||||
@ -99,7 +99,11 @@ class MediaActionSound(private val context: Context) {
|
|||||||
|
|
||||||
private fun loadSound(sound: SoundState): Int {
|
private fun loadSound(sound: SoundState): Int {
|
||||||
var id = 0
|
var id = 0
|
||||||
when (val mediaSound = sound.mediaSound) {
|
if (sound.mediaSound == null) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
when (val mediaSound = sound.mediaSound!!) {
|
||||||
is MediaSound.ManufacturerSound -> {
|
is MediaSound.ManufacturerSound -> {
|
||||||
for (soundDir in SOUND_DIRS) {
|
for (soundDir in SOUND_DIRS) {
|
||||||
val soundPath = soundDir + mediaSound.fileName
|
val soundPath = soundDir + mediaSound.fileName
|
||||||
@ -167,7 +171,7 @@ class MediaActionSound(private val context: Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun playWithSoundPool(sound: SoundState) {
|
private fun playWithSoundPool(sound: SoundState) {
|
||||||
if (playCompletionRunnable != null) {
|
if (playCompletionRunnable != null && sound.mediaSound != null) {
|
||||||
val duration = getSoundDuration(sound.mediaSound)
|
val duration = getSoundDuration(sound.mediaSound)
|
||||||
playTimeHandler.postDelayed(playCompletionRunnable!!, duration)
|
playTimeHandler.postDelayed(playCompletionRunnable!!, duration)
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ import android.util.Rational
|
|||||||
import android.util.Size
|
import android.util.Size
|
||||||
import android.view.*
|
import android.view.*
|
||||||
import android.view.GestureDetector.SimpleOnGestureListener
|
import android.view.GestureDetector.SimpleOnGestureListener
|
||||||
|
import android.widget.Toast
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.camera.core.*
|
import androidx.camera.core.*
|
||||||
import androidx.camera.core.ImageCapture.*
|
import androidx.camera.core.ImageCapture.*
|
||||||
@ -29,8 +30,10 @@ import com.simplemobiletools.camera.R
|
|||||||
import com.simplemobiletools.camera.extensions.*
|
import com.simplemobiletools.camera.extensions.*
|
||||||
import com.simplemobiletools.camera.helpers.*
|
import com.simplemobiletools.camera.helpers.*
|
||||||
import com.simplemobiletools.camera.interfaces.MyPreview
|
import com.simplemobiletools.camera.interfaces.MyPreview
|
||||||
import com.simplemobiletools.camera.models.*
|
|
||||||
import com.simplemobiletools.camera.models.CaptureMode
|
import com.simplemobiletools.camera.models.CaptureMode
|
||||||
|
import com.simplemobiletools.camera.models.MediaOutput
|
||||||
|
import com.simplemobiletools.camera.models.MySize
|
||||||
|
import com.simplemobiletools.camera.models.ResolutionOption
|
||||||
import com.simplemobiletools.commons.extensions.toast
|
import com.simplemobiletools.commons.extensions.toast
|
||||||
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
||||||
|
|
||||||
@ -461,14 +464,19 @@ class CameraXPreview(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun tryTakePicture() {
|
override fun tryTakePicture() {
|
||||||
val imageCapture = imageCapture ?: throw IllegalStateException("Camera initialization failed.")
|
if (imageCapture == null) {
|
||||||
|
activity.toast(R.string.camera_open_error)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val imageCapture = imageCapture
|
||||||
|
|
||||||
val metadata = Metadata().apply {
|
val metadata = Metadata().apply {
|
||||||
isReversedHorizontal = isFrontCameraInUse() && config.flipPhotos
|
isReversedHorizontal = isFrontCameraInUse() && config.flipPhotos
|
||||||
}
|
}
|
||||||
|
|
||||||
val mediaOutput = mediaOutputHelper.getImageMediaOutput()
|
val mediaOutput = mediaOutputHelper.getImageMediaOutput()
|
||||||
imageCapture.takePicture(mainExecutor, object : OnImageCapturedCallback() {
|
imageCapture!!.takePicture(mainExecutor, object : OnImageCapturedCallback() {
|
||||||
override fun onCaptureSuccess(image: ImageProxy) {
|
override fun onCaptureSuccess(image: ImageProxy) {
|
||||||
listener.shutterAnimation()
|
listener.shutterAnimation()
|
||||||
playShutterSoundIfEnabled()
|
playShutterSoundIfEnabled()
|
||||||
@ -555,20 +563,25 @@ class CameraXPreview(
|
|||||||
|
|
||||||
@SuppressLint("MissingPermission", "NewApi")
|
@SuppressLint("MissingPermission", "NewApi")
|
||||||
private fun startRecording() {
|
private fun startRecording() {
|
||||||
val videoCapture = videoCapture ?: throw IllegalStateException("Camera initialization failed.")
|
if (videoCapture == null) {
|
||||||
|
activity.toast(R.string.camera_open_error)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val videoCapture = videoCapture
|
||||||
|
|
||||||
val recording = when (val mediaOutput = mediaOutputHelper.getVideoMediaOutput()) {
|
val recording = when (val mediaOutput = mediaOutputHelper.getVideoMediaOutput()) {
|
||||||
is MediaOutput.FileDescriptorMediaOutput -> {
|
is MediaOutput.FileDescriptorMediaOutput -> {
|
||||||
FileDescriptorOutputOptions.Builder(mediaOutput.fileDescriptor).build()
|
FileDescriptorOutputOptions.Builder(mediaOutput.fileDescriptor).build()
|
||||||
.let { videoCapture.output.prepareRecording(activity, it) }
|
.let { videoCapture!!.output.prepareRecording(activity, it) }
|
||||||
}
|
}
|
||||||
is MediaOutput.FileMediaOutput -> {
|
is MediaOutput.FileMediaOutput -> {
|
||||||
FileOutputOptions.Builder(mediaOutput.file).build()
|
FileOutputOptions.Builder(mediaOutput.file).build()
|
||||||
.let { videoCapture.output.prepareRecording(activity, it) }
|
.let { videoCapture!!.output.prepareRecording(activity, it) }
|
||||||
}
|
}
|
||||||
is MediaOutput.MediaStoreOutput -> {
|
is MediaOutput.MediaStoreOutput -> {
|
||||||
MediaStoreOutputOptions.Builder(contentResolver, mediaOutput.contentUri).setContentValues(mediaOutput.contentValues).build()
|
MediaStoreOutputOptions.Builder(contentResolver, mediaOutput.contentUri).setContentValues(mediaOutput.contentValues).build()
|
||||||
.let { videoCapture.output.prepareRecording(activity, it) }
|
.let { videoCapture!!.output.prepareRecording(activity, it) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,14 +3,14 @@
|
|||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
tools:ignore="AppCompatResource">
|
tools:ignore="AppCompatResource">
|
||||||
<item
|
|
||||||
android:id="@+id/more_apps_from_us"
|
|
||||||
android:icon="@drawable/ic_google_play_vector"
|
|
||||||
android:title="@string/more_apps_from_us"
|
|
||||||
app:showAsAction="ifRoom" />
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/about"
|
android:id="@+id/about"
|
||||||
android:icon="@drawable/ic_info_vector"
|
android:icon="@drawable/ic_info_vector"
|
||||||
android:title="@string/about"
|
android:title="@string/about"
|
||||||
app:showAsAction="ifRoom" />
|
app:showAsAction="ifRoom" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/more_apps_from_us"
|
||||||
|
android:icon="@drawable/ic_google_play_vector"
|
||||||
|
android:title="@string/more_apps_from_us"
|
||||||
|
app:showAsAction="ifRoom" />
|
||||||
</menu>
|
</menu>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user