【问题标题】:Android camera2: java.lang.IllegalStateException: maxImages (1) has already been acquired, call #close before acquiring moreAndroid camera2: java.lang.IllegalStateException: maxImages(1) 已经获取,获取更多之前调用#close
【发布时间】:2015-12-08 17:44:37
【问题描述】:

您好,无法解决此问题。

我已经在 ImageAvailable 回调中调用了一个 imageReader.close,但仍然出现错误:

java.lang.IllegalStateException: maxImages (1) 已经获取,获取更多之前调用#close。

我的代码在这里:

private ImageReader.OnImageAvailableListener imageAvailableListener = new ImageReader.OnImageAvailableListener()
{
    @Override
    public void onImageAvailable(ImageReader reader) {
        Image img = mReader.acquireLatestImage();

        mReader.close();
    }

};

ps。我也使用参数阅读器,但似乎没有解决问题

【问题讨论】:

  • 我想我解决了。必须关闭 img 而不是 ImageReader。

标签: android image reader camera2


【解决方案1】:

好的,我已经解决了我的问题。我需要关闭 img 对象而不是 ImageReader。

【讨论】:

  • 请接受您自己的答案
  • 你能显示你在哪里访问图像我只有一个阅读器和一个文件没有图像
  • 你在哪里关闭了img 对象。答案不清楚
  • 如果没有更多细节,这将无济于事
  • 你在哪里关闭了 img 对象
【解决方案2】:
    private ImageReader.OnImageAvailableListener imageAvailableListener = new ImageReader.OnImageAvailableListener() {
    @Override
    public void onImageAvailable(ImageReader reader) {
        String status = Environment.getExternalStorageState();
        if (!status.equals(Environment.MEDIA_MOUNTED)) {
            Toast.makeText(getApplicationContext(), "your SD card is not available", Toast.LENGTH_SHORT).show();
            return;
        }
        Image image = reader.acquireNextImage();
        ByteBuffer buffer = image.getPlanes()[0].getBuffer();
        byte[] data = new byte[buffer.remaining()];
        buffer.get(data);
        image.close();//after you use the image's content ,you can close it
        String filePath = Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/";
        String picturePath = System.currentTimeMillis() + ".jpg";
        imgFile = new File(filePath, picturePath);
        Uri uri = Uri.fromFile(imgFile);
        try {//Store to folder
            FileOutputStream fileOutputStream = new FileOutputStream(imgFile);
            fileOutputStream.write(data);
            fileOutputStream.close();


        } catch (IOException e) {
            e.printStackTrace();
        }
        startEditPictureActivity(uri, imgFile);


    }
};

【讨论】:

  • 请连同答案一起添加解释。
【解决方案3】:

close() 需要在acquireLatestImage() 返回的Image 对象上调用。

因此,从 OP 在他的示例中实现 onImageAvailable() 开始,只需在 acquireLatestImage() 之后添加 .close() 就可以了。
像这样:

public void onImageAvailable(ImageReader reader) {
    Image image = reader.acquireLatestImage().close(); // Note the added `close()` call.
}

我还应该补充一点,image 在您调用close() 后将不再可用(请参阅docs)。
所以我上面提到的解决方案会让你摆脱提到的异常 OP,但你也无法对image 做任何事情。这显然很容易解决,方法是先用image 做任何你想做的事情,然后再调用close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多