2012-01-11 8 views
20

मैंने सब कुछ करने की कोशिश की है लेकिन मैं अभी भी इस समस्या को हल करने में असमर्थ हूं।ऑटोफोकस फेंकने का अपवाद

मैं एक ऐप में कैमरा सुविधा लागू कर रहा हूं और ऑटोफोकस को छोड़कर सब कुछ ठीक काम करता है। जब मैं ऑटोफोकस() को कॉल करता हूं, तो यह अपवाद फेंकता है, और मैं समझ नहीं पा रहा हूं क्यों। मैं एक इच्छा एचडी पर कोड चला रहा हूँ।

कोड:

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

स्टैक ट्रेस: ​​

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) 

उत्तर

7

तुम्हें यकीन फोन ऑटोफोकस का समर्थन करता है कि बनाने के लिए चाहते हो सकता है। यह इस जांच करने के लिए काफी आसान है:

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

धन्यवाद, मैं मैं क्या जरूरत है कि था के लिए एक 3 पार्टी खुला स्रोत पुस्तकालय का उपयोग कर समाप्त हो गया ऑटोफोकस के साथ कोई समस्या नहीं है। – MikeIsrael

+0

@ माइक इज़राइल मुझे ऑटोफोकस असफल अपवाद के लिए एक ही समस्या का सामना करना पड़ रहा है। क्या आप मुझे बता सकते हैं कि आपने किस समाधान का उपयोग किया था। मुझे यह अपवाद कभी-कभी मिलता है जब मैं अपने ऐप में कैमरा शुरू नहीं करता हूं। धन्यवाद – Vikram

+0

@ विक्रम मुझे बारकोड स्कैनिंग के लिए कुछ चाहिए था, अंततः मैंने अंततः ज़क्सिंग का उपयोग किया। मैं अपवाद को फेंकने का कोई कारण नहीं ढूंढ पाया, मुझे याद है कि अलग-अलग अनुमतियां और सबकुछ कोशिश कर रहा है। zxing opensource है ताकि आप बस अपने कुछ कोड को देखना चाहें और देखें कि यह आपकी मदद कर सकता है, फिर भी उनके लाइसेंसिंग पर ध्यान देना सुनिश्चित करें। – MikeIsrael

13

उपयोग SurfaceHolder.Callback -> surfaceCreated पता करने के लिए जब आप ऑटोफोकस शुरू कर सकते हैं। यदि सतहधारक नहीं बनाया गया है (कुछ समय तक चला) ऑटोफोकस विफल हो जाएगा।

+0

नीचे मेरा जवाब देखें, इसका कोड यह है कि यह कैसे करें। – Josh

1

सुनिश्चित करें कि आप प्रारंभ पूर्वावलोकन को कॉल करने के बाद ऑटोफोकस फ़ंक्शन को कॉल कर रहे हैं। जब पूर्वावलोकन सक्रिय है android documentation

इस विधि के अनुसार ही मान्य है ( startPreview() के बीच और stopPreview से पहले())।

आप अभी भी सामना कर रहे हैं किसी भी त्रुटि एक ही क्रम में Rasmus's और zwebie's समाधान का प्रयास करें।

3

मैं दो समाधान प्रस्तावित करता हूं जो मेरे लिए काम करते हैं। 1) कैमरे को सही ढंग से रोकें और फिर से शुरू करें। मैं onPause और onResume पर इन तरीकों को फोन करके यह करते हैं, भी कैमरे पूर्वावलोकन, जहां मैं अपने अनुप्रयोग में QR कोड स्कैन के बीच में:

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) बहुत मुश्किल है, लेकिन जादू की तरह काम किया! सुनिश्चित करें कि पूर्वावलोकन सतह के निर्माण के बाद आप ऑटोफोकस को कॉल करते हैं। सतह चलाने के लिए समय खरीदने के लिए, 200ms देरी के साथ ऑटोफोकस को चलाने के लिए। इस तरह के रूप में एक "CameraPreview" वस्तु घोषणा से अधिक ctrl + CLIC दबाने, द्वारा इस सेट करें:

के लिए
CameraPreview my_camera; 

देखो "सार्वजनिक शून्य surfaceChanged" विधि और इस परिवर्तन करें:

//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! 

वहाँ बहुत सारे अन्य कर रहे हैं फिक्स, लेकिन ये दोनों आपका दिन बचा सकते हैं।

0

कई समाधान कर रहे हैं, लेकिन यह एक आसान, मृत सस्ता विकल्प है कि मेरे लिए काम किया है:

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 
    } 

देखा! जाल निष्क्रिय

+0

यह बहुत मदद नहीं करेगा क्योंकि ऑटोफोकस विधि को भले ही इसे समर्थित किया जा सके या नहीं। डॉक्स कहते हैं: अगर कैमरा ऑटो फोकस का समर्थन नहीं करता है, तो यह एक नो-ऑप है और ऑटोफोकस (बूलियन, कैमरा) कॉलबैक तुरंत कॉल किया जाएगा। – slott

3

मैं एक अच्छा समाधान
तो यह बस पकड़ अपवाद की सुविधा देता है पाया है और कुछ उपकरण (यानी सोनी experia और कुछ अन्य)
पुनर्प्रयास के बीच देरी के बारे में समय के लिए क्या है पर ऑटोफोकस कॉल करने के लिए पुन: प्रयास करें (1 सेकंड)
मुझे कोड में किसी भी "जादू" संख्या से प्यार नहीं है, इसलिए यह कुछ मामलों में बहुत बड़ा या बहुत छोटा हो सकता है।इसका मेरे लिए काफी)

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

और यहाँ शुरू करने और रोकने के है तरीकों

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

संदर्भ: https://github.com/dm77/barcodescanner/blob/master/core/src/main/java/me/dm7/barcodescanner/core/CameraPreview.java