2011-11-24 5 views
5

Ho un'attività di tabulazione con 2 schede (attività). Ogni scheda ha una scena 3D Open GL disegnata sopra un SurfaceView con l'anteprima della fotocamera.SurfaceView con l'anteprima della telecamera non viene distrutto

Tuttavia, a seconda dell'orientamento del dispositivo, le schede vengono scambiate.

Il problema è che quando si avvia l'altra attività, chiama camera.open(), che genera un'eccezione, dicendo che il servizio fotocamera non è disponibile.

In realtà, il problema è che la telecamera non viene arrestata quando l'attività è in pausa, in altre parole su SurfaceDestroyed() non viene chiamato per SurfaceView. Ho provato a fermare la telecamera quando onPause() per le attività viene chiamato, ma ottiene ancora lo stesso errore.

Qualcuno ha avuto gli stessi problemi con le attività a schede? Qualche idea su come far distruggere la vista della superfice?

+0

hai chiamato sia .Rilasciare '.stopPreview()' e '()' sul vostro oggetto fotocamera? –

+0

Sì, vedere il codice qui sotto. –

risposta

5

Sembra che questa domanda sia molto popolare, quindi aggiungo la soluzione qui ancora una volta.

La causa principale era che SurfaceDestroyed non veniva mai chiamato per SurfaceView quando l'app era in pausa.

Quindi ho creato un framelayout che contiene tutte le viste secondarie. Impostalo come visualizzazione del contenuto. Eppure ferma la telecamera semplicemente chiamando setVisibility (View.GONE) in onPause() e View.Visible in onResume(). Ciò porterà alla distruzione di SurfaceView.

3
private SurfaceHolder.Callback mSurfaceHolderListener = new SurfaceHolder.Callback() { 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     Log.e("TABACT", "surfaceDestroyed()"); 
     camera.stopPreview(); 
     camera.setPreviewCallback(null); 
     camera.release(); 
     camera = null; 
    } 
+1

Trovato la soluzione. Prima di tutto per ogni attività a schede, crea un framelayout che contiene tutte le viste secondarie. Impostalo come visualizzazione del contenuto. Eppure ferma la telecamera semplicemente chiamando onPause() setVisibility a View.GONE e View.Visible in onResume(). –

+0

Grazie mille per questo. Ho avuto il problema che sul Sony Ericsson Xperia mini il menu di abilitazione/disabilitazione USB dalla barra di notifica a discesa ha messo in pausa la mia app fotocamera ma non ho distrutto la superficie. Sorprendentemente solo il menu di abilitazione/disabilitazione ha avuto questo problema, il menu delle impostazioni di debug USB si è comportato correttamente. L'utilizzo di setVisibility() come descritto direttamente per SurfaceView per l'anteprima della fotocamera ha risolto completamente il problema. – Nantoka

0

questo è bene per me:

public void surfaceDestroyed(SurfaceHolder holder) { 
     Log.e("TABACT", "surfaceDestroyed()"); 
     camera.stopPreview(); 
     camera.setPreviewCallback(null); 
     camera.release(); 
     camera = null; 
    } 
Problemi correlati