2016-08-23 5 views
0

Я написал приложение для камеры. Она имеет бесконечный цикл, созданный внутри «OnCreate», который делает снимок каждый второй:Сбой приложения для камеры Android при закрытии

Runnable mRunnable = new Runnable() { 
     @Override 
     public void run() { 
      camera.takePicture(null, null, mPicture); 
      mHandler.postDelayed(this, 1000); 
     } 
    }; 
    mHandler.postDelayed(mRunnable,1000); 

После этого он работает классификатор, основанный на CAFFE. Однако, когда я выйти из приложения в какой-то момент я всегда получаю ошибку говоря:

"App has been stopped" 

В то же время я получаю следующее сообщение об ошибке в Android Monitor:

E/AndroidRuntime: FATAL EXCEPTION: main 
      Process: com.myUsername.myAppName, PID: 25490 
      java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.Camera.takePicture(android.hardware.Camera$ShutterCallback, android.hardware.Camera$PictureCallback, android.hardware.Camera$PictureCallback)' on a null object reference 
       at com.myUsername.myAppName.MainActivity$1.run(MainActivity.java:178) 
       at android.os.Handler.handleCallback(Handler.java:746) 
       at android.os.Handler.dispatchMessage(Handler.java:95) 
       at android.os.Looper.loop(Looper.java:135) 
       at android.app.ActivityThread.main(ActivityThread.java:5343) 
       at java.lang.reflect.Method.invoke(Native Method) 
       at java.lang.reflect.Method.invoke(Method.java:372) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:702) 

Кто-нибудь есть идея, как избежать этой ошибки? Нужно ли мне вызывать некоторые специальные функции при завершении приложения, которое заканчивает бесконечный цикл или явно закрывает камеру, которая работает в режиме предварительного просмотра?

+0

вы используете пользовательские камеры? –

+1

null указатель исключение средний вы не инициализированный объект камеры. Просьба проверить – Deepak

+0

и приложение работает нормально. Поэтому я думаю, что это не проблема инициализации. Я не уверен в вопросе «пользовательской камеры». Я использую 'public static Camera Camera = null; camera.startPreview(); private Camera.PictureCallback mPicture = новая камера Camera.PictureCallback() ' – mcExchange

ответ

1

Вы должны остановить цикл после закрытия операции. Например:

public class YourActivity extends AppCompatActivity { 

    private volatile boolean isStopped = false; 

    @Override public void onStart() { 
     super.onStart(); 
     this.isStopped = false; 
    } 

    @Override public void onStop() { 
     super.onStop(); 
     this.isStopped = true; 
    } 

    @Override public void onResume() { 
     Runnable mRunnable = new Runnable() { 
      @Override 
      public void run() { 
       if(!isStopped) { 
        camera.takePicture(null, null, mPicture); 
        mHandler.postDelayed(this, 1000); 
       } 
      } 
     }; 
     mHandler.postDelayed(mRunnable,1000); 
    } 

} 
+0

, вы имеете в виду, вероятно, 'private volatile boolean isStopped ...'. Как насчет методов 'super.onStart/onStop()' мне нужно удалить их, как в вашем примере выше? К сожалению, этот метод также, похоже, не перезапускает бесконечный цикл при повторном открытии приложения. Возможно, мне нужно полностью закрыть приложение, а не нажимать его в фоновом режиме. – mcExchange

+0

Теперь он работает. По-видимому, нормально называть 'super.onStart/onStop()'. В 'protected void onStop()' я вызываю 'finish();' который полностью завершает приложение. Спасибо всем за вашу помощь. – mcExchange

+0

Да, извините, у вас пропавших без вести и логических. Я попытался написать этот код без IDE, который заставил меня забыть о некоторых вещах. – pawelo

0

Если вы используете пользовательскую камеру, вам необходимо освободить камеру перед выходом из нее. поэтому вызовите функцию camera.release() в методе onDestroy().

+0

уже выпущена. Это, похоже, не проблема. Это скорее бесконечный цикл – mcExchange

+0

удалить обратный вызов из обработчика, затем mHandler.removeCallbacks (mRunnable); –

0

вам нужно остановить runnable (возможно, в методе onBackPressed()) до закрытия приложения, так как runnable выполняет takePicture после того, как камера равна нулю.

+0

Звучит многообещающе. Могли бы вы эволюционировать? Мой 'mRunnable' создается внутри' onCreate', поэтому я думаю, что он не может быть замечен каким-либо другим методом. Я предполагаю, что 'onBackPressed' вызывается при нажатии на какую-либо домашнюю кнопку? – mcExchange

+0

@mcExchange посмотри на мой ответ. Вам не нужно отслеживать поток/runnable - он может позаботиться о себе. Вы можете использовать флаг, чтобы указать вашему циклу прекратить цикл. Кроме того, использование onBackPress не распространяется на некоторые варианты использования (домашняя кнопка, другое приложение для захвата переднего плана и т. Д.) – pawelo

+0

также в качестве общего совета, вы должны использовать asyncTask – SidZi

0

Вы можете проверить нуль-состоянии, как это:

Runnable mRunnable = new Runnable() { 
     @Override 
     public void run() { 
      if(camera!=null) 
       camera.takePicture(null, null, mPicture); 
      mHandler.postDelayed(this, 1000); 
     } 
    }; 
    mHandler.postDelayed(mRunnable,1000); 
+0

Хорошо, что помогает избежать упомянутого выше сообщения об ошибке, но когда я снова открываю приложение, цикл, к сожалению, не перезагружается ... любая идея, как его перезапустить? (Я также не хочу, чтобы приложение продолжало работать в фоновом режиме для экономии батареи, поэтому я включил 'mHandler.postDelayed' в оператор if ... – mcExchange

+0

Вы можете ссылаться на следующий сценарий [Ответ] (http: // stackoverflow.ком/вопросы/33734074/как-делать-я-делать-а-простой таймер-в-Java-с-кнопка-клику старт-стоп--таймером/33734950 # 33734950) –