Android摄像头创建位图失败

Android摄像头创建位图失败,android,bitmap,camera,Android,Bitmap,Camera,我的编码有问题,无法捕获实时当前帧。 这是我的camera live scene类,当我调用getBitmap函数捕获预览帧场景时,我会得到如下错误: java.lang.IllegalArgumentException: yuv cannot be null 任何指导都将不胜感激~ 我正在进行调试,字节有一个很大的数组值用于存储一些数字,然后我将其分配给一个全局变量byteArray,但我不知道为什么byteArray会为null 这是我的代码: public class CameraSur

我的编码有问题,无法捕获实时当前帧。 这是我的camera live scene类,当我调用getBitmap函数捕获预览帧场景时,我会得到如下错误:

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中仍然为空