Java 安卓相机对焦后拍照失败
以下代码用于从照相机获取jpeg照片Java 安卓相机对焦后拍照失败,java,android,camera,android-camera,autofocus,Java,Android,Camera,Android Camera,Autofocus,以下代码用于从照相机获取jpeg照片 public void getPhoto(final PictureCallback callback, final Runnable focusFailCallback) { if(!Camera.Parameters.FOCUS_MODE_FIXED.equals(mCamera.getParameters().getFocusMode()) && !Camera.Parameters.FOCUS_MODE
public void getPhoto(final PictureCallback callback, final Runnable focusFailCallback) {
if(!Camera.Parameters.FOCUS_MODE_FIXED.equals(mCamera.getParameters().getFocusMode()) &&
!Camera.Parameters.FOCUS_MODE_INFINITY.equals(mCamera.getParameters().getFocusMode())) {
mCamera.autoFocus(new AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if(success) {
camera.takePicture(null, null, null, callback);
} else {
camera.cancelAutoFocus();
focusFailCallback.run();
}
}
});
} else {
mCamera.takePicture(null, null, null, callback);
}
}
一般来说,它工作得很好。它在startPreview
和stopPreview
调用之间调用,因此我对此没有问题。但在随机时刻,它可以抛出异常
java.lang.RuntimeException: takePicture failed
android.hardware.Camera.native_takePicture(Native Method)
android.hardware.Camera.takePicture(Camera.java:1828)
org.opencv.android.JavaCameraView$2.onAutoFocus(JavaCameraView.java:463)
android.hardware.Camera$EventHandler.handleMessage(Camera.java:1273)
android.os.Handler.dispatchMessage(Handler.java:111)
android.os.Looper.loop(Looper.java:194)
android.app.ActivityThread.main(ActivityThread.java:5534)
java.lang.reflect.Method.invoke(Native Method)
java.lang.reflect.Method.invoke(Method.java:372)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:750)
我不知道会发生什么我没有准备好的情况。我在Moto E3和其他一些设备上也遇到了同样的问题,并在
摄像头前呼叫取消自动对焦
。拍照使撞车消失。这个问题以前有人问过:但我没有将其标记为重复,因为a)不清楚是否这个问题只发生在第二次尝试拍照时,b)不清楚哪一个建议答案(如果有的话)在这里会有帮助。@AlexCohn从这个问题中我得到了cancelAutoFocus
method调用。主要是它有帮助。代码可以正常工作2次、3次、5次甚至更多。它也可能在第一时间崩溃。我不知道它为什么这样做或为什么不这样做。现在我只是将自动聚焦
方法主体放入try catch
块,只是为了不使我的应用程序崩溃,但我不能说它是正确的。auchtry catch
不是一个好的解决方案,但由于摄像头的实现来自许多不同的供应商,这些运行时异常在大多数意外情况下都会发生。例如,当您向投资者演示您的闪亮应用程序时,您只需检查当前相机焦距模式是否为固定或无限。但您可能应该将其显式设置为?另外,请阅读此处的说明,以及何时可以/应该取消自动对焦的说明。这可能是将婴儿与水一起扔掉:。这里没有明确说明,但没有合同规定相机仍将为takePicture()聚焦。我没有检查此方法背后的本机源代码,但根据我在多台设备上使用此方法的经验,调用后焦点不会改变。此方法背后的本机代码不是很相关,因为它只提供给摄像头硬件驱动程序,上帝知道每个ISP是如何实现这个操作的。