2012-01-21 5 views
8

У меня есть классическое приложение для Android с предварительным просмотром камеры (общее изображение, которое можно найти во многих учебниках [маракана и т. Д.]), Которое должно делать изображение за определенный промежуток времени. Выполняются потоки резьбы и убийства, обрабатываются ошибки, такие как "method called after release". Но иногда происходит известная ошибка 100. Я согласился с тем фактом, что это происходит и пыталось справиться с этим. Я применил ErrorCallback и его метод onError, где текущий объект камеры освобожден и создан экземпляр нового, как указано в официальной документации.Восстанавливающий объект камеры после ошибки 100 (сервер камеры скончался)

Но (без удивления) этого недостаточно. Возможно, новая камера ошибочно выделена, потому что появляется сообщение "CameraDemo has been exited unexpectedly". Я читал много документов и примеров в надежде, что надлежащее продолжение будет где-то объяснено, но никто не имеет такой проблемы, очевидно. Поэтому я хотел бы спросить, что еще я должен сделать, помимо выпуска и создания новой камеры? Вот код:

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(); 

     } 
    } 
}; 

Вскоре - если я выпускаю и воссоздать камеру в onError обратного вызова затем RuntimeException метод вызывается после освобождения (takePicture) поднимается. Так должен ли я каким-то образом снова назначить держатель поверхности фотоаппарату или снова воссоздать держатель поверхности?

Этого было бы достаточно, чтобы направить меня, например. на некоторые форумы, где это описано или решено и т. д. Спасибо за любую помощь.

+0

Вы нашли решение? Просьба поделиться – Gena

ответ

0

В моем приложении для обработки Camere я использую это:

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

mCamera = нуль в getCameraInstance() просто чтобы убедиться, что там нет камеры работает на всех.

Я думаю, что вам нужно, чтобы воссоздать полную камеру, а не просто открыть его с Комплексом

camera.open(); 

это в onResume или в функции обратного вызова ошибки, в зависимости от ваших потребностей.

+0

Внимание! Когда 'surfaceChanged' вызывается, когда поверхность изменяется (например, размер), если объект' Camera' не изменяется, если экран изменил размер, это приведет к ошибке 100. Это сбой из-за изменения экрана камеры (на старых устройствах камера иногда задерживается и застревает, что приводит к изменению размера экрана предварительного просмотра). - Другими словами, обязательно следите за 'surfaceChanged', он также подвержен созданию ошибки 100. –

0

Это, как я установил его, вот пример кода, думаю, вы получите идею:

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; 
} 
Смежные вопросы