2012-01-21 11 views
8

Mam klasyczną aplikację na Androida z podglądem kamery (wspólne wdrożenie, które można znaleźć w wielu samouczkach [marakana itp.]), Która ma zrobić zdjęcie w danym przedziale czasu. Gwintowanie i zabijanie wątków jest wykonywane, obsługiwane są błędy takie jak "method called after release". Ale czasami pojawia się znany błąd: 100. Zgadzam się z faktem, że to się dzieje i starałem się też z tym poradzić. Wdrożyłem metodę ErrorCallback i jej metodę onError, w której obecny obiekt kamery został zwolniony i utworzono nowy, zgodnie z oficjalną dokumentacją.odtworzenie obiektu kamery po błędzie 100 (serwer kamery zginął)

Ale (bez zaskoczenia) to nie wystarczy. Prawdopodobnie nowa kamera jest niepoprawnie przydzielona, ​​ponieważ pojawia się teraz komunikat "CameraDemo has been exited unexpectedly". Czytałem wiele dokumentów i przykładów w nadziei, że odpowiednie postępowanie będzie gdzieś wyjaśnione, ale nikt nie ma takiego problemu. Więc chciałbym zapytać, co jeszcze powinienem zrobić, puszczając i tworząc nowy aparat? Oto kod:

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

     } 
    } 
}; 

Krótko - gdybym zwolnić i ponownie aparat w onError zwrotnego następnie RuntimeException Metoda nazywa się po zwolnieniu (takePicture) jest podniesiona. Czy powinienem w jakiś sposób ponownie przypisać uchwyt do kamery lub odtworzyć również uchwyt powierzchniowy?

Wystarczy skierować do mnie np. na niektóre fora, gdzie jest opisane lub rozwiązane itp. Dzięki za pomoc.

+0

znalazłeś rozwiązania? Proszę udostępnić – Gena

Odpowiedz

0

W mojej aplikacji do obsługi camere używam to:

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 = null w getCameraInstance() jest po prostu mieć pewność, że ma aparat działa w ogóle.

myślę, że trzeba odtworzyć pełny aparat, nie wystarczy otworzyć go z

camera.open(); 

Zestaw ten w onResume lub w zwrotnego o błędzie, w zależności od potrzeb.

+0

Ostrzeżenie! Kiedy 'surfaceChanged' jest wywoływany, gdy powierzchnia zmienia się (na przykład rozmiar), jeśli obiekt' Camera' nie zostanie przetworzony, JEŻELI ekran zmieni rozmiar, spowoduje to błąd 100. Dzieje się to z powodu modyfikacji ekranu kamery (na starszych urządzeniach aparat czasami pozostaje w tyle i blokuje się, powodując zmianę rozmiaru ekranu podglądu). - Innymi słowy, należy uważać na "surfaceChanged", jest również podatny na tworzenie błędu 100. –

0

ten sposób Naprawiłem go, oto próbka kodu, pomyśl masz pomysł:

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