Android CameraX: java.lang.IllegalStateException: maxImages (2) has already been acquired, call #close before acquiring more An
创始人
2024-08-13 11:00:57
0

这个错误是由于在获取更多图像之前没有关闭之前获取的图像引起的。解决这个问题的方法是在获取更多图像之前调用close()方法来关闭之前获取的图像。

以下是一个示例代码,展示了如何正确使用CameraX API来获取图像并在使用完毕后关闭它们:

class MainActivity : AppCompatActivity() {

    private var imageCapture: ImageCapture? = null

    private val imageCaptureListener = object : ImageCapture.OnImageCapturedListener() {
        override fun onCaptureSuccess(image: ImageProxy) {
            // 处理图像
            image.close() // 关闭图像
        }

        override fun onError(imageCaptureError: ImageCapture.ImageCaptureError, message: String, cause: Throwable?) {
            // 处理错误
        }
    }

    private fun startCamera() {
        val cameraProviderFuture = ProcessCameraProvider.getInstance(this)

        cameraProviderFuture.addListener(Runnable {
            // 创建相机实例
            val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
            val cameraSelector = CameraSelector.Builder()
                .requireLensFacing(CameraSelector.LENS_FACING_BACK)
                .build()

            // 设置图像捕获用例
            imageCapture = ImageCapture.Builder()
                .setTargetRotation(viewFinder.display.rotation)
                .build()

            try {
                // 解绑之前的用例
                cameraProvider.unbindAll()

                // 绑定相机和用例
                cameraProvider.bindToLifecycle(this, cameraSelector, imageCapture)
            } catch (exc: Exception) {
                // 处理绑定错误
            }
        }, ContextCompat.getMainExecutor(this))
    }

    private fun captureImage() {
        val outputFile = createOutputFile() // 创建输出文件

        val outputOptions = ImageCapture.OutputFileOptions.Builder(outputFile).build()

        imageCapture?.takePicture(
            outputOptions,
            ContextCompat.getMainExecutor(this),
            imageCaptureListener
        )
    }

    private fun createOutputFile(): File {
        // 创建一个唯一的文件名
        val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
        val storageDir: File? = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
        return File.createTempFile("IMG_${timeStamp}_", ".jpg", storageDir)
    }

    // 在合适的地方调用captureImage方法来获取图像
}

在上面的示例中,我们使用ImageCapture类来获取图像。在onCaptureSuccess()方法中,我们执行了图像处理操作,并调用了image.close()来关闭图像。这样,在获取更多图像之前就可以释放之前获取的图像。

请注意,imageCaptureListener是一个实现了ImageCapture.OnImageCapturedListener接口的匿名内部类对象。你可以根据自己的需求自定义此接口的实现。

希望这个示例代码能帮助你解决问题!

相关内容

热门资讯

安装apache-beam==... 出现此错误可能是因为用户的Python版本太低,而apache-beam==2.34.0需要更高的P...
避免在粘贴双引号时向VS 20... 在粘贴双引号时向VS 2022添加反斜杠的问题通常是由于编辑器的自动转义功能引起的。为了避免这个问题...
Android Recycle... 要在Android RecyclerView中实现滑动卡片效果,可以按照以下步骤进行操作:首先,在项...
omi系统和安卓系统哪个好,揭... OMI系统和安卓系统哪个好?这个问题就像是在问“苹果和橘子哪个更甜”,每个人都有自己的答案。今天,我...
原生ios和安卓系统,原生对比... 亲爱的读者们,你是否曾好奇过,为什么你的iPhone和安卓手机在操作体验上有着天壤之别?今天,就让我...
Android - 无法确定任... 这个错误通常发生在Android项目中,表示编译Debug版本的Java代码时出现了依赖关系问题。下...
Android - NDK 预... 在Android NDK的构建过程中,LOCAL_SRC_FILES只能包含一个项目。如果需要在ND...
Akka生成Actor问题 在Akka框架中,可以使用ActorSystem对象生成Actor。但是,当我们在Actor类中尝试...
Agora-RTC-React... 出现这个错误原因是因为在 React 组件中使用,import AgoraRTC from “ago...
安装了Anaconda之后找不... 在安装Anaconda后,如果找不到Jupyter Notebook,可以尝试以下解决方法:检查环境...