ошибка выпуска камеры Android из PreviewCallback - PullRequest
19 голосов
/ 22 марта 2012

Итак, я перечитал API-интерфейс камеры и не смог ничего найти по этому поводу.Я использую камеру для захвата кадров, и она отлично работает, пока я не попытаюсь освободить камеру.Я повторил ошибку в одной последовательности вызовов:

camera = Camera.open();
camera.setPreviewDisplay(getHolder());
Parameters params = camera.getParameters();
List<Size> ls = params.getSupportedPreviewSizes();
Size size = ls.get(1);
this.width = size.width;
this.height = size.height;
params.setPreviewSize(size.width, size.height);
camera.setParameters(params);
camera.setDisplayOrientation(90);
camera.setPreviewCallback(this);
camera.startPreview();
camera.stopPreview();
camera.release();

Я получаю ошибку

03-22 13:31:42.592: E/AndroidRuntime(14152): java.lang.RuntimeException: Method called after release()
03-22 13:31:42.592: E/AndroidRuntime(14152):    at android.hardware.Camera.setHasPreviewCallback(Native Method)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at android.hardware.Camera.access$600(Camera.java:114)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at android.hardware.Camera$EventHandler.handleMessage(Camera.java:545)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at android.os.Looper.loop(Looper.java:130)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at android.app.ActivityThread.main(ActivityThread.java:3684)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at java.lang.reflect.Method.invokeNative(Native Method)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at java.lang.reflect.Method.invoke(Method.java:507)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:845)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:603)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at dalvik.system.NativeStart.main(Native Method)

Так что все, что происходит, не входит ни в одну из моих функций.Если я закомментирую camera.setPreviewCallback (this);тогда эта ошибка не появляется, но я, очевидно, теряю свой обратный вызов, что является смыслом включения камеры в мое приложение.

Ответы [ 2 ]

64 голосов
/ 23 марта 2012

Вы должны сбросить обратный вызов предварительного просмотра до camera.release(), после camera.stopPreview():

camera.setPreviewCallback(null);

В противном случае он может быть вызван после выпуска камеры.

15 голосов
/ 07 мая 2015

Как примечание, полный метод releaseCamera выглядит следующим образом:

// release Camera for other applications
private void releaseCamera() {
    // check if Camera instance exists
    if (mCamera != null) {
        sPreviewing = false;
        // first stop preview
        mCamera.stopPreview();
        // then cancel its preview callback
        mCamera.setPreviewCallback(null);
        // and finally release it
        mCamera.release();
        // sanitize you Camera object holder
        mCamera = null;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...