Как обрабатывать предварительный просмотр камеры из другого действия в методе onPause ()?

#android #android-layout #android-emulator #android-widget #android-camera

#Android #android-макет #android-эмулятор #android-виджет #android-камера

Вопрос:

mPreview является объектом CameraActivity . и я запускаю просмотр камеры из своего основного действия. Теперь в MainActivity есть метод onPause () .

Прямо сейчас это выглядит так:

 protected void onPause() {
   super.onPause();
   if (counter>=2) {
        System.exit(0);
   }
}
  

Но с этим кодом. Мое приложение завершит работу, если перейдет в состояние паузы.
Я хочу, чтобы мое приложение снова запускалось, если пользователь возвращается с паузы устройства.

Итак, для этого я реализовал этот код:

     protected void onPause() {
        super.onPause();
        if (counter>=2) {
            //System.exit(0);
            try {
                if (mPreview.mCamera!=null) {
                    mPreview.mCamera.stopPreview();  
                    mPreview.isPreviewRunning=false;
                    mPreview.mCamera.release();
                }
            } catch (Exception e) {
                Log.e("Camera", e.getMessage());
            }
            //mPreview.mCamera.stopPreview();
        }
        else{
//          mPreview.mCamera.startPreview();
            mPreview.isPreviewRunning=false;
        }
    }
}
  

Но из-за этого кода иногда мое приложение зависало. Итак, где я ошибаюсь в его реализации??

Трассировка стека:

 11-03 12:26:21.748: ERROR/AndroidRuntime(4295): FATAL EXCEPTION: main
11-03 12:26:21.748: ERROR/AndroidRuntime(4295): java.lang.RuntimeException: Method called after release()
11-03 12:26:21.748: ERROR/AndroidRuntime(4295):     at android.hardware.Camera.setHasPreviewCallback(Native Method)
11-03 12:26:21.748: ERROR/AndroidRuntime(4295):     at android.hardware.Camera.access$600(Camera.java:114)
11-03 12:26:21.748: ERROR/AndroidRuntime(4295):     at android.hardware.Camera$EventHandler.handleMessage(Camera.java:472)
11-03 12:26:21.748: ERROR/AndroidRuntime(4295):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-03 12:26:21.748: ERROR/AndroidRuntime(4295):     at android.os.Looper.loop(Looper.java:123)
11-03 12:26:21.748: ERROR/AndroidRuntime(4295):     at android.app.ActivityThread.main(ActivityThread.java:4633)
11-03 12:26:21.748: ERROR/AndroidRuntime(4295):     at java.lang.reflect.Method.invokeNative(Native Method)
11-03 12:26:21.748: ERROR/AndroidRuntime(4295):     at java.lang.reflect.Method.invoke(Method.java:521)
11-03 12:26:21.748: ERROR/AndroidRuntime(4295):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
11-03 12:26:21.748: ERROR/AndroidRuntime(4295):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
11-03 12:26:21.748: ERROR/AndroidRuntime(4295):     at dalvik.system.NativeStart.main(Native Method)
11-03 12:26:21.758: WARN/ActivityManager(171):   Force finishing activity de.offis.magic.core/.GLCamTest
  

Спасибо.

Ответ №1:

@Override public void surfaceDestroyed(SurfaceHolder SurfaceHolder) {

     this.getHolder().removeCallback(this);
    mCamera.stopPreview();
    mCamera.release();
    mCamera = null;
  Log.e("surfaceDestroyed", "surfaceDestroyed");
}
  

И повторно инициализируйте камеру в функции возобновления.

Ответ №2:

Попробуйте вызвать super.onPause(); после остановки предварительного просмотра и отпускания дескриптора. Это работает для меня.