android: 相机没有拍照
android: camera is not taking a picture
想法很简单:我的应用程序应该创建一个相机对象,显示预览并拍照(不按任何按钮),然后关闭相机。不幸的是,它甚至没有拍任何照片。 (意思是:我的应该在拍照后执行的回调代码一直没有到。)
我正在为 android 相机 api 使用一个小包装 class。我的 activity 代码如下所示:
camera = new SurveillanceCamera(this, layoutForPreview);
camera.start();
camera.takePicture();
包装器class:
public SurveillanceCamera(Context context, LinearLayout previewLayout) {
cameraInstance = Camera.open(findBackFacingCamera());
pictureCallback = getPictureCallback();
cameraPreview = new CameraPreview(context, cameraInstance);
this.previewLayout = previewLayout;
this.previewLayout.addView(cameraPreview);
cameraInstance.startPreview();
}
public void takePicture() {
//this code is reached
cameraInstance.takePicture(null, null, pictureCallback);
}
public void start() {
if (cameraInstance == null) {
cameraInstance = Camera.open(findBackFacingCamera());
pictureCallback = getPictureCallback();
cameraPreview.setCamera(cameraInstance);
cameraInstance.startPreview();
}
}
private PictureCallback getPictureCallback() {
PictureCallback picture = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.e(TAG, "Jey picture was taken...");
// refresh camera to continue preview
cameraPreview.refreshCamera(cameraInstance);
}
};
return picture;
}
private int findBackFacingCamera() {
int cameraId = -1;
// Search for the back facing camera
// get the number of cameras
int numberOfCameras = Camera.getNumberOfCameras();
// for every camera check
for (int i = 0; i < numberOfCameras; i++) {
CameraInfo info = new CameraInfo();
Camera.getCameraInfo(i, info);
if (info.facing == CameraInfo.CAMERA_FACING_BACK) {
cameraId = i;
break;
}
}
return cameraId;
}
代码中没有抛出异常,但是onPictureTaken中的Log.e()没有显示。似乎显示了相机预览但没有任何反应。是否有可能在执行 camera.takePicture() 时预览未完全加载?有什么建议吗?
您的怀疑很可能是有道理的。我没有看到 setPreviewDisplay()
何时被调用。但是这个调用应该完成 takePicture()
才能成功。
简单调用是不可能的
camera = new SurveillanceCamera(this, layoutForPreview);
camera.start();
camera.takePicture();
因为要完成一个setPreviewDisplay()
调用,你需要一个完全初始化的Holder实例,但是你只在构造函数中添加表面视图。
最好注册一个SurfaceHolder.Callback
and call takePicture()
from the surfaceChanged()
回调。
想法很简单:我的应用程序应该创建一个相机对象,显示预览并拍照(不按任何按钮),然后关闭相机。不幸的是,它甚至没有拍任何照片。 (意思是:我的应该在拍照后执行的回调代码一直没有到。)
我正在为 android 相机 api 使用一个小包装 class。我的 activity 代码如下所示:
camera = new SurveillanceCamera(this, layoutForPreview);
camera.start();
camera.takePicture();
包装器class:
public SurveillanceCamera(Context context, LinearLayout previewLayout) {
cameraInstance = Camera.open(findBackFacingCamera());
pictureCallback = getPictureCallback();
cameraPreview = new CameraPreview(context, cameraInstance);
this.previewLayout = previewLayout;
this.previewLayout.addView(cameraPreview);
cameraInstance.startPreview();
}
public void takePicture() {
//this code is reached
cameraInstance.takePicture(null, null, pictureCallback);
}
public void start() {
if (cameraInstance == null) {
cameraInstance = Camera.open(findBackFacingCamera());
pictureCallback = getPictureCallback();
cameraPreview.setCamera(cameraInstance);
cameraInstance.startPreview();
}
}
private PictureCallback getPictureCallback() {
PictureCallback picture = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.e(TAG, "Jey picture was taken...");
// refresh camera to continue preview
cameraPreview.refreshCamera(cameraInstance);
}
};
return picture;
}
private int findBackFacingCamera() {
int cameraId = -1;
// Search for the back facing camera
// get the number of cameras
int numberOfCameras = Camera.getNumberOfCameras();
// for every camera check
for (int i = 0; i < numberOfCameras; i++) {
CameraInfo info = new CameraInfo();
Camera.getCameraInfo(i, info);
if (info.facing == CameraInfo.CAMERA_FACING_BACK) {
cameraId = i;
break;
}
}
return cameraId;
}
代码中没有抛出异常,但是onPictureTaken中的Log.e()没有显示。似乎显示了相机预览但没有任何反应。是否有可能在执行 camera.takePicture() 时预览未完全加载?有什么建议吗?
您的怀疑很可能是有道理的。我没有看到 setPreviewDisplay()
何时被调用。但是这个调用应该完成 takePicture()
才能成功。
简单调用是不可能的
camera = new SurveillanceCamera(this, layoutForPreview);
camera.start();
camera.takePicture();
因为要完成一个setPreviewDisplay()
调用,你需要一个完全初始化的Holder实例,但是你只在构造函数中添加表面视图。
最好注册一个SurfaceHolder.Callback
and call takePicture()
from the surfaceChanged()
回调。