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,但是我的模拟器正在调用该方法。
有谁知道这里发生了什么?
答案 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)。没有表面,相机将无法开始预览。