方法 Camera.takePicture() 在 Nexus 5 上崩溃,但 Xperia mini 正常
Method Camera.takePicture() crash on Nexus 5, but Xperia mini is OK
首先请原谅我的英语不好。
我在以编程方式拍照时遇到问题。我写了一个应用程序,它根据 countdown timer 收集照片,然后使用 C++ 代码处理照片。
我正在使用 dummy SurfaceView,因为我不需要 UI 中的预览。下面的代码适用于我的 phone Xperia mini - API 15(因此权限和代码是正确的),但我借用了学校 Nexus 5 - API 21 并且预览有问题.
takePicture: camera 0: Cannot take picture without preview enabled
我找到了一个 solution,它使用 setPreviewTexture(下面有评论)而不是 setPreviewDisplay。它适用于通常保存的第一张照片,但在第二次调用 takePicture() 后出现相同的错误。
谢谢你的每一个建议,LS
Camera camera;
@Override
protected void onResume() {
super.onResume();
// is camera on device?
if(!checkCameraHardware()) return;
releaseCamera();
try {
camera.stopPreview();
} catch (Exception e){
Log.d(TAG, "No preview before.");
}
SurfaceView dummy = new SurfaceView(this);
camera = Camera.open();
Camera.Parameters params = camera.getParameters();
params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
camera.setParameters(params);
try {
//camera.setPreviewTexture(new SurfaceTexture(10));
camera.setPreviewDisplay(dummy.getHolder());
} catch (IOException e) {
e.printStackTrace();
}
camera.startPreview();
}
解决方案:
我需要刷新预览。下面的代码也适用于 Xperie 和 Nexus。
问题仍然是为什么我必须使用 setPreviewTexture,因为 setPreviewDisplay 在 Nexus 上总是 returns 错误。
camera.takePicture(null, null, new PictureCallback() {
@Override
public void onPictureTaken(final byte[] data, Camera camera) {
// save picture
refreshPreview();
}
});
public void refreshPreview() {
try {
camera.stopPreview();
} catch (Exception e) {}
try {
camera.startPreview();
} catch (Exception e) {}
}
并在函数 onResume()
try {
camera.setPreviewTexture(new SurfaceTexture(10));
} catch (IOException e) {}
拍完照片后,刷新您的表面视图并停止预览和释放相机,然后重新启动该过程。
try {
camera.takePicture(null, null, new PictureCallback() {
public void onPictureTaken(final byte[] data, Camera camera) {
//once ur logic done
refreshCamera();
}
});
} catch (Exception e2) {
// Toast.makeText(getApplicationContext(), "Picture not taken", Toast.LENGTH_SHORT).show();
e2.printStackTrace();
}
public void refreshCamera() {
if (dummy.getHolder().getSurface() == null) {
return;
}
try {
camera.stopPreview();
} catch (Exception e) {
// ignore: tried to stop a non-existent preview
}
try {
camera.setPreviewDisplay(dummy.getHolder());
camera.startPreview();
} catch (Exception e) {
}
}
希望这个解决方案对您有所帮助。
只需添加一个用于在您的相机实例上开始预览的回调。问题是在相机实例上开始预览后,需要一些时间才能拍照。试试这个:
camera.startPreview();
camera.setOneShotPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
camera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// do something you want with your picture and stop preview
camera.stopPreview();
}
});
首先请原谅我的英语不好。 我在以编程方式拍照时遇到问题。我写了一个应用程序,它根据 countdown timer 收集照片,然后使用 C++ 代码处理照片。
我正在使用 dummy SurfaceView,因为我不需要 UI 中的预览。下面的代码适用于我的 phone Xperia mini - API 15(因此权限和代码是正确的),但我借用了学校 Nexus 5 - API 21 并且预览有问题.
takePicture: camera 0: Cannot take picture without preview enabled
我找到了一个 solution,它使用 setPreviewTexture(下面有评论)而不是 setPreviewDisplay。它适用于通常保存的第一张照片,但在第二次调用 takePicture() 后出现相同的错误。
谢谢你的每一个建议,LS
Camera camera;
@Override
protected void onResume() {
super.onResume();
// is camera on device?
if(!checkCameraHardware()) return;
releaseCamera();
try {
camera.stopPreview();
} catch (Exception e){
Log.d(TAG, "No preview before.");
}
SurfaceView dummy = new SurfaceView(this);
camera = Camera.open();
Camera.Parameters params = camera.getParameters();
params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
camera.setParameters(params);
try {
//camera.setPreviewTexture(new SurfaceTexture(10));
camera.setPreviewDisplay(dummy.getHolder());
} catch (IOException e) {
e.printStackTrace();
}
camera.startPreview();
}
解决方案:
我需要刷新预览。下面的代码也适用于 Xperie 和 Nexus。 问题仍然是为什么我必须使用 setPreviewTexture,因为 setPreviewDisplay 在 Nexus 上总是 returns 错误。
camera.takePicture(null, null, new PictureCallback() {
@Override
public void onPictureTaken(final byte[] data, Camera camera) {
// save picture
refreshPreview();
}
});
public void refreshPreview() {
try {
camera.stopPreview();
} catch (Exception e) {}
try {
camera.startPreview();
} catch (Exception e) {}
}
并在函数 onResume()
try {
camera.setPreviewTexture(new SurfaceTexture(10));
} catch (IOException e) {}
拍完照片后,刷新您的表面视图并停止预览和释放相机,然后重新启动该过程。
try {
camera.takePicture(null, null, new PictureCallback() {
public void onPictureTaken(final byte[] data, Camera camera) {
//once ur logic done
refreshCamera();
}
});
} catch (Exception e2) {
// Toast.makeText(getApplicationContext(), "Picture not taken", Toast.LENGTH_SHORT).show();
e2.printStackTrace();
}
public void refreshCamera() {
if (dummy.getHolder().getSurface() == null) {
return;
}
try {
camera.stopPreview();
} catch (Exception e) {
// ignore: tried to stop a non-existent preview
}
try {
camera.setPreviewDisplay(dummy.getHolder());
camera.startPreview();
} catch (Exception e) {
}
}
希望这个解决方案对您有所帮助。
只需添加一个用于在您的相机实例上开始预览的回调。问题是在相机实例上开始预览后,需要一些时间才能拍照。试试这个:
camera.startPreview();
camera.setOneShotPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
camera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// do something you want with your picture and stop preview
camera.stopPreview();
}
});