2011-07-12 13 views
11

Korzystam z interfejsu API aparatu w Androidzie i otrzymałem mój kod do pracy na kilku platformach, w tym galaktykach Samsung i HTC Desire. Do tej pory mam tylko problem z HTC Desire Z, który jest przerywany.Nie działa wywołanie autofokusa aparatu

w moim kodu Dzwonię następujące instrukcje

camera.startPreview(); 
camera.autoFocus(autoFocusCallback); 

gdzie już utworzone klasy autoFocusCallback wymagane. Chciałbym jeszcze raz podkreślić, że ten kod działa na telefonach, w tym na tym, z czym mam problemy, więc nie analizuj kodu. :) Po wywołaniu oddzwaniania mój kod wykonuje następnie zdjęcie, ale ta część jest na razie nieistotna.

Czasowy problem polega na tym, że w przypadku pewnego losowego obrazu (dzieje się to na 20-100 razy), oddzwanianie nie występuje. Sprawdziłem z własnymi Log.i(), że jest to ostatnie polecenie wykonane (tj. Kod nie dostaje się do wywołania zwrotnego). Debugowanie pokazuje również, że nie zgłoszono żadnych błędów.

Wystarczy ustawić swój umysł na łatwość, moja zwrotna wyglądać tak

AutoFocusCallback autoFocusCallback = new AutoFocusCallback() { 
    @Override 
    public void onAutoFocus(boolean success, Camera camera) { 
    Log.i("tag","this ran"); 
    ... 
    ... 
    } 
}; 

Wyniki logcat dla pomyślnego przebiegu wyglądać tak

07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): startPreview X 
07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): autoFocus E 
07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): autoFocus X 
07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): runAutoFocus E 
07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): af start (fd 49) 
07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): native_set_afmode: ctrlCmd.status == 0 
07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): af done: 1 
07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): runAutoFocus X 
07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): takePicture(479) 

ale problematyczne prowadzony jest tak

07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): startPreview X 
07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): autoFocus E 
07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): autoFocus X 
07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): runAutoFocus E 
07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): af start (fd 49) 

, a następnie wisi.

Chciałbym wiedzieć, czy ktoś ma jakieś pomysły na temat tego problemu, czy też doświadczyłeś czegoś podobnego? Udało mi się znaleźć tylko jeden wątek w sieci z podobnymi problemami, tutaj jest http://groups.google.com/group/android-developers/browse_thread/thread/75ecb8db0ae02bdb

Odpowiedz

3

Nie jest to rozwiązanie konkretnego problemu, ale ogólnie rzecz biorąc pytanie brzmi, że możesz wywołać autofokus przed startpreview. W tym przypadku nie ma również autofokusu, gdy podgląd jest włączony.

Z documentation

„Ta metoda jest ważna tylko wtedy, gdy podgląd jest aktywny (między startPreview() i przed stopPreview()).”

+0

Doskonała odpowiedź !. Dzięki!! – superUser

4

Połączenia z autofokusem nie mają limitu czasu. Napotkałem na niektóre urządzenia, w których autofokus wywołuje sporadyczne problemy z oddzwonieniem (nawet w doskonałych warunkach). Gdzie ten sam kod działa dobrze na innych urządzeniach.

Moje rozwiązanie polegało na przetasowaniu własnego mechanizmu limitu czasu dla autofokusa. Zrobiłem to z zaplanowaną przyszłością, ale najlepsza implementacja limitu czasu może zależeć od konkretnego przypadku użycia.

final ScheduledFuture<?> focusTimeoutFuture = mScheduledExecutorService.schedule(new Runnable() { 
     @Override 
     public void run() 
     { 
      takePictureAndCancelAutoFocus(); 
     } 
    }, 3, TimeUnit.SECONDS);// add a 3 second timeout to autofocus 

mCamera.autoFocus(new Camera.AutoFocusCallback() { 
     @Override 
     public void onAutoFocus(boolean b, Camera camera) 
     {     
      // cancel the timeout future if it didn't run already 
      boolean canceledFuture = focusTimeoutFuture.cancel(false); 
      if(canceledFuture) 
      { 
       takePictureAndCancelAutoFocus(); 
      } 
     } 
} 
+0

Nie użyłem dokładnie tego rozwiązania, ale naprawdę pomogło. Na przykład. LG Spirit przestaje koncentrować się po skutecznym ustawieniu ostrości. –

Powiązane problemy