我有以下方法来打开面向用户的相机:
CameraOperations.java
private Parameters parameters = null;
private Camera cam = null;
private Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
private static int camNumber = Camera.getNumberOfCameras();
public Camera toggleFaceCamera(){
if(cam == null){
for(int counter = 0; counter < camNumber; counter++){
Camera.getCameraInfo(counter, cameraInfo);
if(cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){
try{
cam = Camera.open(counter);
parameters = cam.getParameters();
parameters.setPreviewFormat(16);
return cam;
}catch(RuntimeException e){return null;}
}
}
}else{cam.release();}
return null;
}
public void onPreviewFrame(byte[] data, Camera cam){
Debug.out("teste");
}
同样被称为:
MainActivity.java
surface = (SurfaceView)findViewById(R.id.cameraView);
holder = surface.getHolder();
Camera cam = CameraOperations.toggleFaceCamera();
try{
cam.setPreviewDisplay(holder);
//cam.setPreviewCallback(CameraOperations.());
}catch(IOException e){
e.printStackTrace();
}
cam.startPreview();
所有这些工作正常,相机显示正确
不幸的是 onPreviewFrame 没有被调用。我已经使用 setPreviewCallback 和 setPreviewCallbackWithBuffer 尝试了几件事,但老实说,我不明白为什么这不起作用,因为 onPreviewFrame 应该与帧的显示一起调用......我已经阅读了文档,但我觉得有点被误导了这有效,如果有人能让我清楚地理解它,我将非常感激! (我尝试过的例子)
(...)
try{
cam = Camera.open(counter);
parameters = cam.getParameters();
parameters.setPreviewFormat(16);
cam.setPreviewCallback(onPreviewFrame); <---- doens't recognize argument
return cam;
}catch(RuntimeException e){return null;}
(...)
最佳答案
要使用的调用命令的语法
cam.setPreviewCallback(this);
来自CameraOperations类内部。
要获得预览回调,您必须调用
cam.startPreview();
如果您希望使用您的参数(例如在更改预览格式后),您需要
cam.setParameters(parameters);
通常,您需要在startPreview()
之前设置参数。
关于java - onPreviewFrame 未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24558093/