2 votes

La caméra Android n'a pas réussi à prendre une photo après la mise au point

Le code suivant est utilisé pour obtenir une photo jpeg de la caméra

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);
    }
}

La plupart du temps cela fonctionne bien. Il est appelé entre les appels de startPreview et stopPreview, donc je n'ai pas de problèmes à ce sujet. Mais à des moments aléatoires, il peut générer une exception.

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)

Je n'ai aucune idée de ce qui pourrait se passer que je n'ai pas pris en compte.

0voto

guillaume-tgl Points 785

J'ai eu le même problème sur un Moto E3 et sur d'autres appareils et en appelant cancelAutoFocus juste avant camera.takePicture le crash a disparu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X