按照正常流程,创建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()