2016-05-02 11 views
0

Android App stürzt nach backpress mit Handler und KameraAndroid App stürzt nach backpress mit Handler und Kamera

I Kamera für einen SOS-App zu nutzen versuchen, der Code ausgeführt wird, wenn wir die sos Start Flash mit der Schaltfläche klicken in um das Blitzlicht am Laufen zu halten, ich bin mit Handler mit Deutsche Post verzögern

die App stürzt ab, wenn wir backpress verwenden, um zur vorherigen Aktivität zurück zu gehen

ich versucht habe handler.removeCallbacks(r); verwenden, onbackpress aber immer noch die App stürzt

dies ist der Code, den ich

public class sos extends Activity { 
    String myMorseString = "111000111"; 
    int sleepTime; 
    Camera cam; 
    Handler handler; 
    Runnable r; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.sos); 
     ImageButton button = (ImageButton) findViewById(R.id.Start); 
     button.setOnClickListener(new View.OnClickListener() { 


      public void onClick(View v) { 
       startsos(); 
      } 
     }); 
    } 

    public void startsos() { 
     // new Thread() { 
     handler = new Handler(); 
      r = new Runnable() { 
      public void run() { 
       if (myMorseString != null) { 
        for (int x = 0; x < myMorseString.length(); x++) { 

         if (myMorseString.charAt(x) == '2') { 
          cam = Camera.open(); 
          sleepTime = 500; 
          Parameters p = cam.getParameters(); 
          p.setFlashMode(Parameters.FLASH_MODE_TORCH); 
          cam.setParameters(p); 
          cam.startPreview(); 
          try { 
           Thread.sleep(sleepTime); 
          } catch (InterruptedException e) { 

          } 
          // power off after signal 
          cam.stopPreview(); 
          cam.release(); 
          cam = null; 
          try { 
           Thread.sleep(100); 
          } catch (InterruptedException e) { 

          } 
         } 

         if (myMorseString.charAt(x) == '1') { 
          cam = Camera.open(); 
          sleepTime = 250; 
          Parameters p = cam.getParameters(); 
          p.setFlashMode(Parameters.FLASH_MODE_TORCH); 
          cam.setParameters(p); 
          cam.startPreview(); 
          try { 
           Thread.sleep(sleepTime); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 

          // power off after signal 
          cam.stopPreview(); 
          cam.release(); 
          cam = null; 
          try { 
           Thread.sleep(100); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 
         } 

         if (myMorseString.charAt(x) == '0') { 
          cam = Camera.open(); 
          sleepTime = 250; 
          Parameters p = cam.getParameters(); 
          cam.setParameters(p); 
          //cam.startPreview(); 
          cam.stopPreview(); 
          cam.release(); 
          cam = null; 

          try { 
           Thread.sleep(sleepTime); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 
         } 
        } 
       } 
       handler.postDelayed(this, 10000); 
      } 
      // }.start(); 


     }; 

     handler.postDelayed(r, 10000); 
    } 

    @Override 
    protected void onDestroy() { 

     super.onDestroy(); 
    } 

    @Override 
    protected void onPause() { 

     super.onPause(); 
    } 

    @Override 
    public void onBackPressed() { 
     handler.removeCallbacks(r); 
     finish(); 
     super.onBackPressed(); 
    } 
} 
+0

können Sie den Stacktrace buchen? – John

+1

Ich denke, Aufruf von 'finish()' in 'onBackPressed' ist das Problem. Wenn Sie 'super.onBackPressed()' aufrufen, ist Ihre Aktivität beendet. Wenn Sie 'finish()' explizit aufrufen, denke ich, dass Sie den Fehler einführen. Sie können 'finish()' als 'super.onBackPressed()' auch zerstören Ihre Aktivität – 0xDEADC0DE

+0

ohne zu beenden auch die App stürzt – 1234567

Antwort

0

Es ist sehr wahrscheinlich Absturz versuchen, weil die Kamera Vorschau nicht gestoppt wird, wenn wieder gedrückt wird. Die Runnable wird gerade von der Handler entfernt.

Das wird gesagt, Sie werden auch ein anderes Problem sehen: Erstellen eines Handler aus einem onClick() Handler erstellt keinen neuen Thread. Es erstellt immer noch eine Handler, die an Ihren Haupt-Thread gebunden ist. Die onClick() (und jede Ansicht im Zusammenhang mit Callback) wird auf dem Haupt (UI) -Thread aufgerufen. Also die sleep() Anrufe, die Sie machen in der Runnable sind passiert auf Ihrem Haupt-Thread, die sehr schlecht ist.

+0

können Sie im Code mit dem obigen Code zu erklären Ich habe versucht, die folgende @Override öffentliche void onBackPressed () { // cam = Camera.open(); Parameter p = cam.getParameters(); p.setFlashMode (Parameter.FLASH_MODE_OFF); cam.setParameters (p); cam.stopPreview(); cam.release(); cam = null; Thread.interrupted(); super.onBackPressed(); }, jetzt wird der Flash nicht stoppen – 1234567

+0

Leider können einige Geräte sehr wählerisch sein, wie das funktioniert. Bei einigen Geräten müssen Sie die Vorschau beispielsweise nicht starten, bei anderen hingegen nicht. Vielleicht möchten Sie die API "Camera2" verwenden, da die ursprüngliche API "Camera" veraltet ist. –