Android摄像头创建位图失败
我的编码有问题,无法捕获实时当前帧。 这是我的camera live scene类,当我调用getBitmap函数捕获预览帧场景时,我会得到如下错误:Android摄像头创建位图失败,android,bitmap,camera,Android,Bitmap,Camera,我的编码有问题,无法捕获实时当前帧。 这是我的camera live scene类,当我调用getBitmap函数捕获预览帧场景时,我会得到如下错误: java.lang.IllegalArgumentException: yuv cannot be null 任何指导都将不胜感激~ 我正在进行调试,字节有一个很大的数组值用于存储一些数字,然后我将其分配给一个全局变量byteArray,但我不知道为什么byteArray会为null 这是我的代码: public class CameraSur
java.lang.IllegalArgumentException: yuv cannot be null
任何指导都将不胜感激~
我正在进行调试,字节有一个很大的数组值用于存储一些数字,然后我将其分配给一个全局变量byteArray,但我不知道为什么byteArray会为null
这是我的代码:
public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
Camera mCamera;
boolean isPreviewRunning = false;
private byte[] byteArray;
private Bitmap mBitmap;
CameraSurfaceView(Context context) {
super(context);
SurfaceHolder mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
synchronized(this) {
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
Log.e("Camera", "mCamera.setPreviewDisplay(holder);");
}
mCamera.setDisplayOrientation(90);
mCamera.startPreview();
mCamera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] bytes, Camera camera) {
byteArray = bytes;
}
});
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
synchronized(this) {
try {
if (mCamera!=null) {
mCamera.stopPreview();
isPreviewRunning=false;
mCamera.release();
}
} catch (Exception e) {
Log.e("Camera", e.getMessage());
}
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
}
public Bitmap getBitmap() {
try {
YuvImage yuvImage = new YuvImage(byteArray, ImageFormat.NV21, 600, 1000, null);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
Rect rect = new Rect(0, 0, 600, 1000);
yuvImage.compressToJpeg(rect, 75, byteArrayOutputStream);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPurgeable = true;
options.inInputShareable = true;
mBitmap = BitmapFactory.decodeByteArray(byteArrayOutputStream.toByteArray(), 0, byteArrayOutputStream.size(), options);
byteArrayOutputStream.flush();
byteArrayOutputStream.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
return mBitmap;
}
}
堆栈跟踪
java.lang.IllegalArgumentException: yuv cannot be null
at android.graphics.YuvImage.<init>(YuvImage.java:93)
at com.etoff.appsopengl.CameraSurfaceView.getBitmap(CameraSurfaceView.java:69)
at com.etoff.appsopengl.Stage$MyRenderer.onDrawFrame(Stage.java:168)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1467)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1221)
java.lang.IllegalArgumentException:yuv不能为null
在android.graphics.YuvImage.(YuvImage.java:93)
位于com.etoff.appsopengl.CameraSurfaceView.getBitmap(CameraSurfaceView.java:69)
位于com.etoff.appsopengl.Stage$MyRenderer.onDrawFrame(Stage.java:168)
位于android.opengl.GLSurfaceView$GLThread.guarderun(GLSurfaceView.java:1467)
位于android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1221)
从onPreviewFrame()
接收的字节数组未锁定;它可能随时被相机丢弃。最简单的修复方法是复制其内容:
…
public void onPreviewFrame(byte[] bytes, Camera camera) {
byteArray = bytes.clone();
}
另外,请确保选中byteArray!=在getBitmap()
中为null
,并将此方法与onPreviewFrame()
同步
并不是说这种方法是有效的。它产生许多内存分配和拷贝。手动使用和处理相机缓冲区要好得多,但它需要更多的编程规则。请发布stacktrace…我或我在那里发布的错误我找不到任何名为Delcareed as yuv的变量或对象。我已更新了堆栈跟踪,这意味着tat my byteArray为空。您在哪里调用getBitmap()函数。在调用getBitmap()之前,请确保您的byteArray不为null。如果您需要有关其名称的帮助,请发布更新的代码,如上所述。我只是添加了。但您还需要检查
byteArray!=在getBitmap()
中为null
,并将此方法与onPreviewFrame()
同步-您错过了此部分?在其他类中,我声明如下私有CameraSurfaceView csv;csv=新的CameraSurfaceView(上下文);并像下面这样调用newBitmap=csv.getBitmap();是的,我在方法中使用了.clone(),但在get bitmap中仍然为空