2013-05-06 13 views
20

Die benutzerdefinierte Kamera-App, die ich geschrieben habe, hört auf, die Vorschau zu geben, nachdem der Bildschirm gesperrt wurde (durch Drücken von Schloss Butten oder Warten auf ein paar Minuten). Ich bekomme keine Ausnahme, was es ziemlich schwierig macht, das Problem zu finden.Kameravorschau friert nach Bildschirmsperre ein

Wird der Android-Bildschirm gesperrt (wenn das der richtige Begriff ist) pausiert/hält/... meine App (Aktivität)?

Wenn dies der Fall wäre, könnte die Ursache meine onPause/onResume Methoden sein? Oder ist eine andere Ursache wahrscheinlicher?

Vielen Dank im Voraus

+2

Ja, Sie müssen die Camere-Vorschau in 'onPause' stoppen und in' onResume' fortsetzen. – asloob

Antwort

29

ich gleiches Problem konfrontiert und reparierte es folgende Schritte:

  1. ich meine Kamera Vorschau erstellt und an dem Behälter FrameLayout in onResume() der Mutter Aktivität hinzugefügt. Etwas wie:

    public void onResume{ 
        super.onResume(); 
        mCamera = Camera.open(); 
        if(null != mCamera){ 
         mCamera.setDisplayOrientation(90); 
         mPreview = new CameraOverlay(getActivity(), mCamera); 
         frLyParent.addView(mPreview); 
        } 
    } 
    
  2. Ich entfernte die Ansicht in onPause(). Dies behebt das Einfrieren.

    public void onPause(){ 
        super.onPause(); 
        if(null != mCamera){ 
         mCamera.release(); 
         mCamera = null; 
        } 
        frLyParent.removeView(mPreview); 
        mPreview = null; 
    } 
    

wo CameraOverlay() ist die Klasse, die Surface und implementiert SurfaceHolder.Callback erstreckt. Lassen Sie mich wissen, wenn Sie diese Implementierung benötigen.

+0

Dies hat den Trick gemacht , Vielen Dank! –

+0

Hi itsviks. Könnten Sie bitte das, was Sie in Schritt 2 geschrieben haben, aktualisieren? Danke. – Paul

+3

Sie sind ein genialer Mann! Danke! Ich habe das frLyParen.removeView (mPreview) nicht verwendet, das ist grundlegend! –

4

Danke, habe ich eine Änderung dieses und es funktioniert auch für mich

I mPreview.removeView(mPreview.mSurfaceView); in onpause() hinzugefügt und mPreview.addView(mPreview.mSurfaceView); in onResume() vor der Kamera zu öffnen.

Ich löschte auch addView(mSurfaceView); in der Vorschau-Klasse.

4

hier ist mein, es funktioniert :-)

@Override 
    public void onResume() { 
     super.onResume(); 
     try { 
      camera = Camera.open(); 
      holder.addCallback(this); 
      surface.setVisibility(View.VISIBLE); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    public void onPause() { 
     try { 
      surface.setVisibility(View.GONE); 
      holder.removeCallback(this); 
      camera.release(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     super.onPause(); 
    } 
1

In onResume() Methode, um diese Zeile hinzu:

surfaceView.setVisibility(View.VISIBLE); 

In onPaused() Methode, um diese Zeile hinzu:

surfaceView.setVisibility(View.GONE); 
+0

Dies sollte die richtige Antwort sein, weil es das Problem nagt. – epx