Код: Выделить всё
class CameraConfig(private val context: Context) {
private val cameraExecutor = Executors.newSingleThreadExecutor()
private var cameraProvider: ProcessCameraProvider? = null
private var camera: Camera? = null
private val cameraSelector: CameraSelector by lazy {
CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build()
}
private val preview: Preview by lazy {
Preview.Builder().build()
}
private val resolutionSelector: ResolutionSelector by lazy {
ResolutionSelector.Builder().build()
}
private val imageAnalysis: ImageAnalysis by lazy {
ImageAnalysis.Builder().apply {
setResolutionSelector(resolutionSelector)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
setOutputImageRotationEnabled(true)
}
}.build()
}
fun startCamera(lifecycleOwner: LifecycleOwner, previewView: PreviewView) {
try {
ProcessCameraProvider.configureInstance(Camera2Config.defaultConfig())
} catch (illegalStateException: IllegalStateException) { /* no-op */ }
val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
cameraProviderFuture.addListener({
cameraProvider = cameraProviderFuture.get().apply {
try {
unbindAll()
preview.surfaceProvider = previewView.surfaceProvider
camera = bindToLifecycle(
lifecycleOwner,
cameraSelector,
preview,
imageAnalysis
).apply {
configureAutoFocus(previewView, this)
}
} catch (exception: Exception) {
Log.e("CameraConfig", "Error when starting camera", exception)
}
}
}, ContextCompat.getMainExecutor(context))
}
fun stopCamera() {
cameraProvider?.let {
it.unbindAll()
camera = null
}
if (!cameraExecutor.isShutdown) {
cameraExecutor.shutdownNow()
}
}
private fun configureAutoFocus(previewView: PreviewView, camera: Camera) {
previewView.afterMeasured {
val previewViewWidth = previewView.width.toFloat()
val previewViewHeight = previewView.height.toFloat()
val autoFocusPoint = SurfaceOrientedMeteringPointFactory(
previewViewWidth, previewViewHeight
).createPoint(previewViewWidth / 2.0f, previewViewHeight / 2.0f)
try {
camera.cameraControl.startFocusAndMetering(
FocusMeteringAction
.Builder(autoFocusPoint, FocusMeteringAction.FLAG_AF)
.setAutoCancelDuration(2, TimeUnit.SECONDS)
.build()
)
} catch (exception: CameraInfoUnavailableException) {
Log.d("CameraConfig", "Cannot access camera", exception)
}
}
}
private inline fun View.afterMeasured(crossinline block: () -> Unit) {
if (measuredWidth > 0 && measuredHeight > 0) {
block()
} else {
viewTreeObserver.addOnGlobalLayoutListener(
object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
if (measuredWidth > 0 && measuredHeight > 0) {
viewTreeObserver.removeOnGlobalLayoutListener(this)
block()
}
}
}
)
}
}
fun setAnalyzer(analyzer: ImageAnalysis.Analyzer) {
imageAnalysis.setAnalyzer(cameraExecutor, analyzer)
}
}
Тема: fdsan: попытка закрыть файловый дескриптор 214, который, как ожидается, не принадлежит пользователю, но на самом деле принадлежит unique_fd 0xe5d47e98
Код: Выделить всё
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
pid: 0, tid: 3190 >>> my.package.name
Подробнее здесь: [url]https://stackoverflow.com/questions/79303951/camerax-imageprocessingutil-related-code-throws-an-fdsan-error[/url]
Мобильная версия