onPreviewFrame没有在Nexus 4手机上调用...但是在模拟器上

时间:2013-11-09 03:23:45

标签: android opencv android-camera opticalflow nexus-4

 public boolean openCamera() {
    Log.i(TAG, "openCamera");
    releaseCamera();
    mCamera = Camera.open();
    if (mCamera == null) {
        Log.e(TAG, "Can't open camera!");
        return false;
    }

    mCamera.setPreviewCallbackWithBuffer(new PreviewCallback() {

        public void onPreviewFrame(byte[] data, Camera camera) {
            synchronized (View.this) {
                System.arraycopy(data, 0, mFrame[frameIndex], 0,
                        data.length);
                View.this.notify();
            }
            camera.addCallbackBuffer(mBuffer);
            if (frameIndex == 1) {
                bufferIsSet = true;
            }
            frameIndex ^= 1;

        }
    });
    return true;
}

以上是打开相机的方法。 (更多代码可在以下网址找到:https://github.com/sungjkang/OpticalFlow/blob/master/src/com/wais/opticalflow/View.java

使用模拟器在我的笔记本电脑上运行正常,但它在我的Nexus 4上根本不起作用。 经过一番挖掘后,我注意到在使用手机时我从未进入onPreviewFrame,但是我的模拟器正在调用该方法。

有谁知道这里发生了什么?

2 个答案:

答案 0 :(得分:1)

我有同样的问题。主要是大小问题,添加下面的代码,它适合我。

Camera.Parameters parameters = camera.getParameters();
    List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
    Camera.Size cs = sizes.get(0);
    parameters.setPreviewSize(cs.width, cs.height);
    // parameters.setPreviewSize(w, h);
    camera.setParameters(parameters);
    camera.startPreview();

答案 1 :(得分:1)

Important:将完全初始化的SurfaceHolder传递给setPreviewDisplay(SurfaceHolder)。没有表面,相机将无法开始预览。