Java 安卓相机对焦后拍照失败

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

以下代码用于从照相机获取jpeg照片

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
块,只是为了不使我的应用程序崩溃,但我不能说它是正确的。auch
try catch
不是一个好的解决方案,但由于摄像头的实现来自许多不同的供应商,这些运行时异常在大多数意外情况下都会发生。例如,当您向投资者演示您的闪亮应用程序时,您只需检查当前相机焦距模式是否为固定或无限。但您可能应该将其显式设置为?另外,请阅读此处的说明,以及何时可以/应该取消自动对焦的说明。这可能是将婴儿与水一起扔掉:。这里没有明确说明,但没有合同规定相机仍将为takePicture()聚焦。我没有检查此方法背后的本机源代码,但根据我在多台设备上使用此方法的经验,调用后焦点不会改变。此方法背后的本机代码不是很相关,因为它只提供给摄像头硬件驱动程序,上帝知道每个ISP是如何实现这个操作的。