current stand

This commit is contained in:
Myzel394 2023-08-17 11:08:14 +02:00
parent f22f2c3802
commit 20b466872b
No known key found for this signature in database
GPG Key ID: 50098FCA22080F0F
2 changed files with 104 additions and 36 deletions

View File

@ -6,27 +6,18 @@ import android.graphics.ImageFormat
import android.hardware.camera2.CameraCaptureSession import android.hardware.camera2.CameraCaptureSession
import android.hardware.camera2.CameraCharacteristics import android.hardware.camera2.CameraCharacteristics
import android.hardware.camera2.CameraDevice import android.hardware.camera2.CameraDevice
import android.hardware.camera2.CameraDevice.StateCallback.ERROR_CAMERA_DEVICE
import android.hardware.camera2.CameraDevice.StateCallback.ERROR_CAMERA_SERVICE
import android.hardware.camera2.CameraManager import android.hardware.camera2.CameraManager
import android.hardware.camera2.params.OutputConfiguration
import android.hardware.camera2.params.SessionConfiguration
import android.media.Image
import android.media.ImageReader import android.media.ImageReader
import android.os.Build import android.os.Build
import android.os.Handler import android.os.Handler
import android.os.HandlerThread import android.os.HandlerThread
import android.util.Log import android.util.Log
import android.util.Size
import android.view.Surface import android.view.Surface
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.content.ContentProviderCompat.requireContext
import androidx.core.content.ContextCompat
import androidx.core.content.ContextCompat.getSystemService import androidx.core.content.ContextCompat.getSystemService
import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.suspendCancellableCoroutine
import java.io.File import java.io.File
import java.util.concurrent.ArrayBlockingQueue
import java.util.concurrent.Executor
import java.util.logging.Logger
import kotlin.coroutines.resume import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException import kotlin.coroutines.resumeWithException
@ -60,7 +51,25 @@ class CameraHandler(
} }
@RequiresApi(Build.VERSION_CODES.P) @RequiresApi(Build.VERSION_CODES.P)
public suspend fun takePhoto( suspend fun startPreview(
surface: Surface,
) {
val outputs = listOf(surface)
val session = createCaptureSession(outputs)
val captureRequest = device.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)
captureRequest.addTarget(surface)
session.setRepeatingRequest(captureRequest.build(), null, handler)
}
fun stopPreview() {
device.close()
thread.quitSafely()
}
@RequiresApi(Build.VERSION_CODES.P)
suspend fun takePhoto(
outputFile: File, outputFile: File,
) { ) {
Log.d("Alibi", "Taking photo") Log.d("Alibi", "Taking photo")
@ -108,6 +117,44 @@ class CameraHandler(
Log.d("Alibi", "Success!") Log.d("Alibi", "Success!")
} }
private fun getOptimalPreviewSize(sizes: List<Size>, w: Int, h: Int): Size {
val ASPECT_TOLERANCE = 0.1
val targetRatio = h.toDouble() / w
var optimalSize: Size? = null
var minDiff = Double.MAX_VALUE
for (size in sizes) {
val ratio: Double = size.width as Double / size.height
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue
if (Math.abs(size.height - h) < minDiff) {
optimalSize = size
minDiff = Math.abs(size.height - h).toDouble()
}
}
if (optimalSize == null) {
minDiff = Double.MAX_VALUE
for (size in sizes) {
if (Math.abs(size.height - h) < minDiff) {
optimalSize = size
minDiff = Math.abs(size.height - h).toDouble()
}
}
}
return optimalSize!!
}
fun getPreviewSize(): Size {
val characteristics = manager.getCameraCharacteristics(CameraCharacteristics.LENS_FACING_BACK.toString())
return characteristics
.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)!!
.getOutputSizes(ImageFormat.JPEG)
.maxByOrNull { it.height * it.width }!!
}
companion object { companion object {
const val IMAGE_BUFFER_SIZE = 3 const val IMAGE_BUFFER_SIZE = 3

View File

@ -13,6 +13,8 @@ import android.media.ImageReader
import android.os.Handler import android.os.Handler
import android.os.HandlerThread import android.os.HandlerThread
import android.util.Log import android.util.Log
import android.view.SurfaceHolder
import android.view.SurfaceView
import android.view.ViewGroup import android.view.ViewGroup
import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.MATCH_PARENT
import androidx.camera.core.ImageCapture import androidx.camera.core.ImageCapture
@ -71,41 +73,61 @@ fun RecorderScreen(
) { ) {
val context = LocalContext.current val context = LocalContext.current
val lifecycle = LocalLifecycleOwner.current val lifecycle = LocalLifecycleOwner.current
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
Scaffold(
topBar = {
TopAppBar(
title = {
Text(stringResource(R.string.app_name))
},
actions = {
IconButton(
onClick = {
navController.navigate(Screen.Settings.route)
},
) {
Icon(
Icons.Default.Settings,
contentDescription = null
)
}
}
)
},
) { padding ->
val scope = rememberCoroutineScope()
// Wait for `CameraHadler.openCamera`
var camera by remember { mutableStateOf<CameraHandler?>(null) } var camera by remember { mutableStateOf<CameraHandler?>(null) }
AndroidView(
factory = {context ->
val surfaceView = SurfaceView(context).apply {
layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT,
)
}
surfaceView.holder.addCallback(object : SurfaceHolder.Callback {
override fun surfaceCreated(holder: SurfaceHolder) {
scope.launch {
camera = CameraHandler.openCamera(context)
val previewSize = camera!!.getPreviewSize()
holder.setFixedSize(
1080,
1920,
)
camera!!.startPreview(holder.surface)
}
}
override fun surfaceChanged(
holder: SurfaceHolder,
format: Int,
width: Int,
height: Int
) {
}
override fun surfaceDestroyed(holder: SurfaceHolder) {
scope.launch {
camera!!.stopPreview()
}
}
})
surfaceView
}
)
Button( Button(
modifier = Modifier
.padding(padding),
onClick = { onClick = {
scope.launch { scope.launch {
if (camera == null) { if (camera == null) {
camera = CameraHandler.Companion.openCamera(context) camera = CameraHandler.openCamera(context)
} }
camera!!.takePhoto( camera!!.takePhoto(
@ -180,5 +202,4 @@ fun RecorderScreen(
) )
} }
*/ */
}
} }