2016-08-16 2 views
1

У меня есть активность, где я инициализирую обнаружение штрих-кода. Тогда я иду к другой деятельности, и когда я нажимаю кнопку назад он запускает цикл этого исключения:После возврата к активности CameraSource отключает исключение null

com.example.myapp E/CameraSource: Exception thrown from receiver. 
            java.lang.NullPointerException 
         at com.google.android.gms.vision.CameraSource$zzb.run(Unknown Source) 
         at java.lang.Thread.run(Thread.java:841) 

Если я настаиваю и возвратятся к другой деятельности, это пожары еще одно исключение:

com.example.myapp E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: com.example.myapp, PID: 22942 
                     java.lang.NullPointerException 
                      at com.google.android.gms.vision.CameraSource$zzb.release(Unknown Source) 
                      at com.google.android.gms.vision.CameraSource.release(Unknown Source) 
                      at com.example.myapp.CameraActivity$3.surfaceDestroyed(CameraActivity.java:184) 
                      at android.view.SurfaceView.updateWindow(SurfaceView.java:586) 
                      at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:240) 
                      at android.view.View.dispatchWindowVisibilityChanged(View.java:8495) 
                      at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1087) 
                      at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1087) 
                      at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1087) 
                      at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1087) 
                      at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1087) 
                      at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1087) 
                      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1537) 
                      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254) 
                      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6602) 
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:805) 
                      at android.view.Choreographer.doCallbacks(Choreographer.java:605) 
                      at android.view.Choreographer.doFrame(Choreographer.java:575) 
                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:791) 
                      at android.os.Handler.handleCallback(Handler.java:733) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:136) 
                      at android.app.ActivityThread.main(ActivityThread.java:5476) 
                      at java.lang.reflect.Method.invokeNative(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:515) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
                      at dalvik.system.NativeStart.main(Native Method) 

CameraSource инициализируется как это в OnCreate:

final CameraSource cameraSource = new CameraSource.Builder(this, barcodeDetector) 
      .setRequestedFps(15f) 
      .setAutoFocusEnabled(true) 
      .build(); 
    mCameraView.getHolder().addCallback(new SurfaceHolder.Callback() { 
     @Override 
     public void surfaceCreated(SurfaceHolder holder) { 
      try { 
       if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) 
        return; 
       cameraSource.start(holder); 
      } catch (IOException e) { 
       Log.e(getClass().getName(), e.getMessage()); 
      } 
     } 

     @Override 
     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
     } 

     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) { 
      cameraSource.release(); 
     } 
    }); 
+0

Действия Пауза и возобновление, если вы переходите к другому действию, а затем возвращаетесь к ним. Посмотрите здесь, как выпустить камеру на Pause и снова инициализировать ее в разделе «Возобновить». Это может сделать трюк, но не 100% в вашем случае это может быть другая проблема. Https://developer.android.com/training/basics/activity-lifecycle/pausing.html – Tasos

+1

Я переместил код инициализации с 'onCreate 'to' onResume' и защитил отключение камеры, когда ваша ссылка была указана, и теперь все в порядке. Спасибо. – Fabricio

+1

хотел сказать (не на 100% уверен, что если это поможет), но я думаю, что это было :) – Tasos

ответ

1

Я переместил код инициализации камеры от onCreate к onResume и защищал выпуск Лик камеры e это:

mCameraView.getHolder().addCallback(new SurfaceHolder.Callback() { 
     ... 
     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) { 
      if (mCameraSource != null) { 
       mCameraSource.release(); 
       mCameraSource = null; 
      } 
     } 
    }); 

Теперь это работает.

Смежные вопросы