2012-01-21 16 views
8

Tengo la aplicación de Android clásica con vista previa de la cámara (implem común que se puede encontrar en muchos tutoriales [marakana etc.]) que se supone toma fotos en un intervalo de tiempo dado. Enhebrar y matar hilos está hecho, se manejan errores como "method called after release". Pero a veces se produce el conocido error 100. Acepté el hecho de que sucediera y traté de manejarlo también. Implementé ErrorCallback y su método onError donde se lanza el objeto de la cámara actual e instalé uno nuevo como está escrito en la documentación oficial.recreando el objeto de la cámara después del error 100 (el servidor de la cámara murió)

Pero (sin sorpresa) no es suficiente. Es posible que se haya asignado erróneamente una nueva cámara porque ahora aparece un mensaje "CameraDemo has been exited unexpectedly". He leído muchos documentos y ejemplos con la esperanza de que se explicará un procedimiento adecuado, pero aparentemente nadie tiene ese problema. Entonces, me gustaría preguntar qué más debería hacer además de lanzar y crear una nueva cámara. Aquí está el código:

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 - Si suelto y volver a crear la cámara en onError devolución de llamada a continuación RuntimeException Método llamado después de la liberación (takePicture) se eleva. Entonces, ¿debería asignar de alguna manera el soporte de superficie a la cámara nuevamente o volver a crear el soporte de superficie también?

Sería suficiente para dirigirme, p. a algunos foros, donde se describe o resuelve, etc. Gracias por cualquier ayuda.

+0

¿Ha encontrado una solución? Por favor, comparte – Gena

Respuesta

0

En mi aplicación para manejar la camere yo uso esto:

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; 
} 

El mCamera = null en el getCameraInstance() es sólo para asegurarse de que no hay ninguna cámara funcionando en absoluto.

creo que es necesario para recrear una cámara completa, no sólo abrirlo con el Conjunto

camera.open(); 

esto en el onResume o en la devolución de llamada de error, dependiendo de sus necesidades.

+0

¡Advertencia! Cuando se invoca 'surfaceChanged' cuando la superficie cambia (tamaño por ejemplo), si el objeto' Camera' no se rehace SI la pantalla ha cambiado de tamaño, dará como resultado el Error 100. Esto se cuelga debido a la pantalla de la cámara que se está modificando (en dispositivos más antiguos, la cámara a veces se demora y se atasca, lo que da como resultado un tamaño de pantalla de vista previa alterado). - En otras palabras, asegúrese de estar atento a 'surfaceChanged', también es propenso a crear el Error 100. –

0

Esta es la forma en que me fijo, aquí es una muestra de código, que se entiende la 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; 
} 
Cuestiones relacionadas