2012-01-11 20 views
20

Her şeyi denedim ama yine de bu sorunu çözemiyorum.autoFocus atanması istisnası

Bir uygulamada kamera özelliği uyguluyorum ve her şey otomatik netleme dışında çalışıyor. AutoFocus() öğesini çağırdığımda, bir istisna atar ve nedenini anlayamıyorum. Desire HD'de kodu çalıştırıyorum.

Kodu:

@Override 
protected void onStart() { 
    super.onStart(); 

    //grab seurface view and callback 
    cameraView = (CameraSurfaceView) findViewById(R.id.cameraView); 
    try{ 
     camera = Camera.open(); 
     cameraView.setCamera(camera); 
     //release previous autofocus and assign new one 
     camera.cancelAutoFocus(); 
     camera.autoFocus(new Camera.AutoFocusCallback() { 

       public void onAutoFocus(boolean success, Camera camera) { 
       // TODO Auto-generated method stub 

       }}); 
    } 
    catch (Exception e) { 
     //had an issue accessing the camera prompt user 
     //TODO create user prompt 
     e.printStackTrace(); 
    } 
} 

Yığın izleme: Telefon otofokus desteklediğinden emin olmak isteyebilirsiniz

01-11 16:09:38.456: W/System.err(26546): java.lang.RuntimeException: autoFocus failed 
01-11 16:09:38.456: W/System.err(26546): at android.hardware.Camera.native_autoFocus(Native Method) 
01-11 16:09:38.456: W/System.err(26546): at android.hardware.Camera.autoFocus(Camera.java:680) 
01-11 16:09:38.456: W/System.err(26546): at com.myapp.MyActivity.onStart(BarcodeScannerActivity.java:57) 
01-11 16:09:38.466: W/System.err(26546): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1201) 
01-11 16:09:38.466: W/System.err(26546): at android.app.Activity.performStart(Activity.java:3955) 
01-11 16:09:38.466: W/System.err(26546): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1845) 
01-11 16:09:38.466: W/System.err(26546): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1893) 
01-11 16:09:38.466: W/System.err(26546): at android.app.ActivityThread.access$1500(ActivityThread.java:135) 
01-11 16:09:38.466: W/System.err(26546): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1054) 
01-11 16:09:38.466: W/System.err(26546): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-11 16:09:38.466: W/System.err(26546): at android.os.Looper.loop(Looper.java:150) 
01-11 16:09:38.476: W/System.err(26546): at android.app.ActivityThread.main(ActivityThread.java:4385) 
01-11 16:09:38.476: W/System.err(26546): at java.lang.reflect.Method.invokeNative(Native Method) 
01-11 16:09:38.476: W/System.err(26546): at java.lang.reflect.Method.invoke(Method.java:507) 
01-11 16:09:38.476: W/System.err(26546): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849) 
01-11 16:09:38.476: W/System.err(26546): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607) 
01-11 16:09:38.476: W/System.err(26546): at dalvik.system.NativeStart.main(Native Method) 

cevap

7

. Kontrol etmek oldukça kolaydır:

Camera.Parameters p = mCamera.getParameters(); 
List<String> focusModes = p.getSupportedFocusModes(); 

if(focusModes != null && focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) { 
    //Phone supports autofocus! 
} 
else { 
    //Phone does not support autofocus! 
} 
+0

sayesinde ben vardı gerekli için 3. parti açık kaynak kitaplığı kullanarak sona erdi otomatik netleme ile ilgili sorun yok. – MikeIsrael

+0

@MikeIsrael AutoFocus Başarısız istisna için aynı sorunla karşılaşıyorum. Bana hangi çözümü kullandığını söyler misin? Uygulamamdaki her zaman kamera açmaya başladığımda bu istisnai durumdayım. Teşekkürler – Vikram

+0

@Vikram Barkod taraması için bir şeye ihtiyacım vardı, sonunda sonunda sadece zxing kullanmıştım. Hiçbir zaman istisna için bir neden bulamadım, farklı izinleri ve her şeyi denediğimi hatırlıyorum. zxing açık kaynak kodudur, bu yüzden onların kodlarından bazılarını kontrol etmek ve size yardımcı olup olmayacağını görmek isteyebilirsiniz, ancak lisanslarına dikkat etmeyi unutmayın. – MikeIsrael

13

Kullanım SurfaceHolder.Callback - Eğer Otomatik Netleme başlayabilirsiniz zaman> surfaceCreated bilmek. Yüzey tutucu oluşturulmazsa (biraz zaman sürdü) otomatik netleme başarısız olur.

+0

Aşağıdaki cevabımı görün, bunun nasıl yapılacağına dair kodu var. – Josh

1

Başlangıç ​​önizlemesini çektikten sonra autoFocus işlevini çağırdığınızdan emin olun. Önizleme aktifken android documentation

Bu metoda göre geçerlidir ( startPreview (arasında) ve stopPreview önce()).

yine herhangi bir hata aynı sırada Rasmus's ve zwebie's çözümü deneyin yaşıyorsanız.

3

Benim için çalışan iki çözüm öneririm. 1) Kamerayı doğru şekilde durdurun ve devam ettirin. Ben de Uygulamamda QR kodları taramak kamera Önizleme ortasında, OnPause ve onResume Bu yöntemlerin arayarak bunu: Çok zor

public void stopCamera(){ 
    mCamera.cancelAutoFocus(); 
    mCamera.setPreviewCallback(null); 
    mCamera.stopPreview(); 
    mPreviewing = false; 
    } 

public void rethrottleCamera(){ 
     updateViews(); //Updates my Layouts 
     mPreviewing = true; 
     mCamera.startPreview(); 
     mCamera.setPreviewCallback(previewCb); 
     mCamera.autoFocus(autoFocusCB); 
     } 

2) ama büyü gibi çalıştı! Önizleme yüzeyi oluşturulduktan sonra otomatik netlemeyi aradığınızdan emin olun. Bunu yapmak için, Autofocus'u 200ms'lik bir gecikmeyle çalıştırmak için, yüzeyin oluşturulmasına zaman ayırın. gibi bir "CameraPreview" nesne ilanı konusunda ctrl + clic basarak bu ayarlayın:

için
CameraPreview my_camera; 

Bak "kamu boşlukta surfaceChanged" yöntemi ve bu değişiklikleri yapmak:

//Add a delay to AUTOFOCUS after mCamera.startpreview();!!: 
    mCamera.startPreview();     
    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() {      
      mCamera.autoFocus(autoFocusCallback); 
      } 
    }, 200); //<-200 millisecond delay 

    //If you call autofocus right after startPreview, chances are, 
    //that the previewSurface will have not been created yet, 
    //and autofocus will fail: 
    mCamera.startPreview();    //Bad idea! 
    mCamera.autoFocus(autoFocusCallback); //Bad idea! 

diğer bolluk vardır düzeltmeler, ancak bu ikisi gününüzünüzü kurtarabilir.

0

birçok çözüm vardır, ancak bu benim için çalıştı kolay, ölü ucuz seçenektir:

try{ 
    mCamera.autoFocus(autoFocusCB); //Or whatever part of code that crashes 
    } 
catch(Exception e){ 
    Log.v("joshtag","THIS PHONE DOES NOT SUPPORT AUTOFOCUS!!"); //a warning, popup, whatever 
    } 

Voilà! Tuzak devre dışı bırakıldı.

+0

Bu, desteklenip desteklenmediğine bakılmaksızın autoFocus yönteminin çağrılabileceği kadar yardımcı olmaz. Dokümanlar: Kamera otomatik odaklamayı desteklemiyorsa, bu bir op-op değildir ve onOutoFocus (boolean, Kamera) geri çağırma hemen çağrılır. – slott

3

i
Yani bu sadece yakalamak istisna sağlar güzel bir çözüm bulundu ve (bazı cihazlarda (yani Xperia ve bazı diğerleri)
deneme arasındaki gecikme hakkında süredir nedir üzerine otofokus aramaya tekrar 1 saniye deneyin var
Kodda "sihirli" sayıları sevmiyorum, bu yüzden bazı durumlarda çok büyük veya çok küçük olabilir.Onun burada

public void requestAutoFocus(Handler handler, int message) { 
    if(camera != null && previewing) { 
     autoFocusCallback.setHandler(handler, message); 
     scheduleAutoFocus(); 
    } 
} 

public void safeAutoFocus() { 
    try { 
     camera.autoFocus(autoFocusCallback); 
    } catch (RuntimeException e) { 
     // Horrible hack to deal with autofocus errors on Sony devices 
     // See https://github.com/dm77/barcodescanner/issues/7 for example 
     scheduleAutoFocus(); // wait 1 sec and then do check again 
    } 
} 

private void scheduleAutoFocus() { 
    mAutoFocusHandler.postDelayed(doAutoFocus, 1000); 
} 

private Runnable doAutoFocus = new Runnable() { 
    public void run() { 
     if(camera != null && previewing) { 
      safeAutoFocus(); 
     } 
    } 
}; 

ve başlangıç ​​ve bitiş edilir) benim için yeterli yöntemler

public void startPreview() { 
    if (camera != null && !previewing) { 
     camera.startPreview(); 
     camera.autoFocus(autoFocusCallback); 
     previewing = true; 
    } 
} 

public void stopPreview() { 
    if(camera != null && previewing) { 
     try { 
      camera.cancelAutoFocus(); 
      if(!useOneShotPreviewCallback) { 
       camera.setPreviewCallback(null); 
      } 
      camera.stopPreview(); 
      previewCallback.setHandler(null, 0); 
      autoFocusCallback.setHandler(null, 0); 
      previewing = false; 
     } catch(Exception e) { 
      Log.e(TAG, e.toString(), e); 
     } 
    } 
} 

referans: https://github.com/dm77/barcodescanner/blob/master/core/src/main/java/me/dm7/barcodescanner/core/CameraPreview.java