调用系统相机拍照Crash,忘记image.close()

240 阅读1分钟

按照正常流程,创建ImageReader,用来获取照片的数据流,通过监听实现图片保存。

mImageReader = ImageReader.newInstance(mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.JPEG, 1);
//监听ImageReader的事件,当有图像流数据可用时会回调onImageAvailable方法,它的参数就是预览帧数据,可以对这帧数据进行处理
mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
    @Override
    public void onImageAvailable(ImageReader reader) {
        Log.i(TAG, "Image Available!");
        Image image = reader.acquireNextImage();
        // 开启线程异步保存图片
        new Thread(new ImageSaver(image)).start();

    }
}, null);

第一次点击拍照OK, 点击第二次就会出现Crash,log如下: java.lang.IllegalStateException: maxImages (1) has already been acquired, call #close before acquiring more

ImageSaver代码如下:

public static class ImageSaver implements Runnable {
    private Image mImage;

    public ImageSaver(Image image) {
        mImage = image;
    }

    @Override
    public void run() {
        ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
        byte[] data = new byte[buffer.remaining()];
        buffer.get(data);
        File imageFile = new File(Environment.getExternalStorageDirectory() + "/DCIM/"+System.currentTimeMillis()+".jpg");
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(imageFile);
            fos.write(data, 0, data.length);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                   * mImage.close();*
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

以上斜体部分就是关键啦,记得保存完图片后调用 image.close()