本文转载至:https://blog.csdn.net/u010867436/article/details/92662362
踩过的 camera2 的坑
在使用Camera2的接口时,实现保存图片时在onImageAvailable中获取数据进行保存操作,考虑到不存图片是耗时的操作,所有开一个线程去保存图片,操作如下:
public void onImageAvailable(ImageReader reader) {
final Image image = reader.acquireNextImage();
if (isCaptureStill) {
isCaptureStill = false;
//
}
image.close();
}
private class pictureSaver extends Thread {
private Image mImage;
public pictureSaver(Image image) {
mImage = image;
}
@Override
public void run() {
//保存操作
}
}
编译运行后发现会报错:java.lang.IllegalStateException: Image is already closed
如果线程里还有对给Image类的相关操作是也会报错,如:获取image.getPlanes()的值放到线程中做保存操作时,遇到报java.lang.NullPointerException: Attempt to invoke virtual method 'int java.nio.ByteBuffer.remaining()' on a null object reference
解决:
最终的方法是先将需要的Image中的数据获取出来并处理为自己需要的数据后再传给线程保存图片,如:
private class pictureSaver extends Thread {
private byte[] mData;
public pictureSaver(byte[] bytes) {
mData = bytes;
}
@Override
public void run() {
//保存图片
}
}
不要直接传image ,把bety 数据传来再弄成图片。