2012-01-21 11 views
8

Ho un'app per Android classica con anteprima della fotocamera (un'implementazione comune che può essere trovata in molti tutorial [marakana ecc.] Che dovrebbe scattare foto in un dato intervallo di tempo. Thread di thread e uccisione è fatto, errori come "method called after release" vengono gestiti. Ma a volte si verifica l'errore noto 100. Ho accettato il fatto che ciò accada e ho cercato di gestirlo anche io. Ho implementato ErrorCallback e il suo metodo onError in cui l'attuale oggetto della fotocamera è stato rilasciato e istanziato uno nuovo come scritto nella documentazione ufficiale.ricreare l'oggetto della fotocamera dopo l'errore 100 (il server della videocamera è morto)

Ma (senza sorpresa) non è abbastanza. La nuova fotocamera è forse assegnata in modo errato perché ora viene visualizzato un messaggio "CameraDemo has been exited unexpectedly". Ho letto molti documenti ed esempi nella speranza, che un procedimento appropriato sarà spiegato da qualche parte ma nessuno ha questo problema apparentemente. Quindi vorrei chiedere che altro dovrei fare oltre al rilascio e alla creazione di una nuova fotocamera? Ecco il codice:

ErrorCallback CEC = new ErrorCallback() 
{ 
    public void onError(int error, Camera camera) 
    { 
     Log.d("CameraDemo", "camera error detected"); 
     if(error == Camera.CAMERA_ERROR_SERVER_DIED) 
     { 
      Log.d("CameraDemo", "attempting to reinstantiate new camera"); 
      camera.stopPreview(); 
      camera.setPreviewCallback(null); 
      camera.release(); //written in documentation... 
      camera = null;    
      camera = Camera.open(); 

     } 
    } 
}; 

Poco - se rilasciare e ricreare fotocamera in onError richiamata poi RuntimeException Metodo chiamato dopo il rilascio (takePicture) è sollevata. Quindi dovrei in qualche modo assegnare nuovamente il supporto per la superficie alla fotocamera o ricreare anche il supporto per la superficie?

Sarebbe sufficiente indirizzarmi ad es. ad alcuni forum, dove è descritto o risolto, ecc. Grazie per qualsiasi aiuto.

+0

Avete trovato una soluzione? Si prega di condividere – Gena

risposta

0

Nella mia app per gestire il camere io uso questo:

public void onResume() { 
    super.onResume(); 
if(mCamera == null) 
    mCamera = getCameraInstance(): 
} 


public static Camera getCameraInstance() { 
mCamera = null; 
    try { 
     mCamera = Camera.open(); 
Parameters parameters = mCamera.getParameters(); 
    mCamera.cancelAutoFocus(); 
    mCamera.setPreviewCallback(yourPreviewCb); 
    mCamera.startPreview(); 
    mCamera.setParameters(parameters); 

    mCamera.autoFocus(yourAutoFocusCB); 
    } catch (Exception e) { 
     //TODO 
    } 
    return mCamera; 
} 

Il mCamera = null nel getCameraInstance() è solo per essere sicuro che non ci sia nessuna telecamera in esecuzione a tutti.

Penso che avete bisogno di ricreare una macchina fotografica completa, non solo aprirlo con il

camera.open(); 

Impostare questo nel onResume o nella richiamata errore, a seconda delle esigenze.

+0

Attenzione! Quando 'surfaceChanged' viene richiamato quando la superficie cambia (dimensione ad esempio), se l'oggetto' Camera' non viene rifatto SE lo schermo ha cambiato dimensione, si verificherà l'errore 100. Questo si blocca a causa della modifica dello schermo della fotocamera (su dispositivi meno recenti la fotocamera a volte si ritarda e si blocca con conseguente alterazione delle dimensioni dello schermo di anteprima). - In altre parole, assicurati di tenere d'occhio 'surfaceChanged', è anche incline a creare l'errore 100. –

0

Ecco come ho riparato, ecco un esempio di codice, che si ottiene l'idea:

private Camera camera; 

// code... 

public Camera getCameraInstance() { 
    Camera camera = Camera.open(); 
    // code... 
    camera.setErrorCallback(new ErrorCallback() { 
     @Override 
     public void onError(int error, Camera camera) { 
      if(error == Camera.CAMERA_ERROR_SERVER_DIED) { 
       releaseCamera(); 
       startCamera(); 
      } 
     } 
    }); 
    return camera; 
} 

protected void startCamera() { 
    if(getCamera() == null) 
     setCamera(getCameraInstance()); 
    refreshCamera(); 
} 

protected void releaseCamera() { 
    if (getCamera() != null) { 
     getCamera().release(); 
     setCamera(null); 
    } 
} 

public Camera getCamera() { 
    return camera; 
} 

public void setCamera(Camera camera) { 
    this.camera = camera; 
} 
Problemi correlati