Код, связанный с CameraX ImageProcessingUtil, выдает ошибку fdsanAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Код, связанный с CameraX ImageProcessingUtil, выдает ошибку fdsan

Сообщение Anonymous »

В моей консоли Google Play есть сообщения об очень загадочной ошибке в моем приложении, использующем CameraX. Это ошибка fdsan низкого уровня, которую я не могу исправить с помощью, казалось бы, очень безопасно написанного кода. Вот (на мой взгляд, наиболее актуальное) использование CameraX в моем коде:

Код: Выделить всё

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)
}
}
Кажется, это самый общий вариант использования CameraX, в котором нет ничего особенного. Он следует официальным рекомендациям, но сообщается об этой ошибке:
Тема: 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»