2010-01-12 12 views
26

मैंने कोड को the answer here से कॉपी किया है और मुझे अभी भी एक रनटाइम अपवाद मिल रहा है: सेट पैरामीटर मेरे नेक्सस पर त्रुटि विफल रही है। मेरी मेनिफेस्ट फ़ाइल में कैमरा और wake_lock अनुमतियां हैं। यह एमुलेटर पर काम करता है, और droid पर मुझे त्रुटि नहीं मिलती है लेकिन इसमें घूर्णन समस्या होती है।नेक्सस पर कैमरा.सेट पैरामीटर() पर रनटाइम अपवाद

उत्तर

41

आप शायद एक अवैध पूर्वावलोकन आकार की आवश्यकता है। आप adb logcat के परिणामों की जांच तो आप शायद कुछ इस तरह दिखाई देंगे:

E/QualcommCameraHardware(22732): Invalid preview size requested: 480x724 

समाधान अपनी इच्छानुसार एक के सबसे करीब उपलब्ध पूर्वावलोकन आकार अनुरोध करने के लिए है, Camera.getParameters द्वारा लौटाए गए Camera.Parameters ऑब्जेक्ट में getSupportedPreviewSizes पर कॉल करके आप उपलब्ध पूर्वावलोकन आकारों की एक सूची प्राप्त कर सकते हैं।

+0

आप ठीक कह रहे हैं, सिवाय इसके कि यह 320x480 के लिए सेट करने के लिए कोशिश कर रहा था और 480x320 काम किया है जाएगा:

यहाँ this great tutorial से getOptimalPreview आकार है। यह मुझे मेरे अगले प्रश्न पर लाता है, SurfaceHolder.Callback.surfaceChanged() विधि इतनी कम रिज़ॉल्यूशन के साथ क्यों बुलाया गया था जो डिवाइस के पहलू अनुपात से भी मेल नहीं खाता है? –

+2

@ एरिक बी - मुझे एहसास है कि इस टिप्पणी के जवाब में यह देर हो चुकी है, लेकिन इसकी संभावना है क्योंकि आपका ऐप संगतता मोड में है, और सिस्टम आपके ऐप में पिक्सेल का वास्तविक डिवाइस रिज़ॉल्यूशन 0.66x के रूप में व्यवहार कर रहा है। इसलिए 480x800 आपके ऐप को 320x533 के रूप में प्रस्तुत किया जाएगा, संभवतः स्टेटस बार के लिए क्षैतिज या लंबवत कुछ पिक्सेल शेविंग करेगा जब तक कि आपकी गतिविधि पूर्णस्क्रीन न हो। –

+0

एपीआई संस्करण 5 से पहले आप क्या करते हैं? (मान लें कि मैं एंड्रॉइड 1.5 के साथ संगत होना चाहता हूं) – uvgroovy

26

मैं कर क्या रोमन कहा द्वारा इसे सुधार, कोड के साथ:

Camera.Parameters parameters = camera.getParameters(); 
    List<Camera.Size> sizes = parameters.getSupportedPreviewSizes(); 
    Camera.Size cs = sizes.get(0); 
    parameters.setPreviewSize(cs.width, cs.height); 
    camera.setParameters(parameters); 
10

क्या इसके लायक है के लिए, मेरे मुद्दे के स्रोत जा रहा है कि मैं पहली बार है कि फ्लैश मोड सत्यापित किए बिना parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); कॉल करने के लिए कोशिश कर रहा था समाप्त हो गया parameters.getFlashMode() != null की जांच करके समर्थित थे।

इस खराब दस्तावेज अपवाद के लिए एक से अधिक कारण हैं, इसलिए अपने सभी पैरामीटर जांचें और न कि आप supportedPreviewSize का उपयोग कर रहे हैं।

+0

इससे मेरी मदद मिली। :) –

+1

साझा करने के लिए धन्यवाद अगर (! getBaseContext()। getPackageManager()। सिस्टम सिस्टम ( PackageManager.FEATURE_CAMERA_FLASH)) { // डिवाइस फ्लैश डिवाइस पर उपलब्ध नहीं है } –

2

उपरोक्त में से कोई भी मेरे लिए हल नहीं हुआ। हालांकि पैरामीटर सेट करने से पहले इस कोड को जोड़ना था।

// stop preview before making changes 
    try { 
     mCamera.stopPreview(); 
    } catch (Exception e){ 
     // ignore: tried to stop a non-existent preview 
    } 

//now set your parameters 
0

opencamera जैसे कुछ खुला स्रोत कैमरा परियोजना हमेशा try-catch का उपयोग Camera.setParameters कॉल करने के लिए:

private void setCameraParameters(Camera.Parameters parameters) { 
    if(MyDebug.LOG) 
     Log.d(TAG, "setCameraParameters"); 
    try { 
     camera.setParameters(parameters); 
     if(MyDebug.LOG) 
      Log.d(TAG, "done"); 
    } catch (RuntimeException e) { 
     // just in case something has gone wrong 
     if(MyDebug.LOG) 
      Log.d(TAG, "failed to set parameters"); 
     e.printStackTrace(); 
     count_camera_parameters_exception++; 
    } 
} 
अलावा

, हमेशा नवीनतम getParameters मिल इससे पहले कि आप इस तरह setParameters फोन:

void setRotation(int rotation) { 
    Camera.Parameters parameters = this.getParameters(); 
    parameters.setRotation(rotation); 
    setCameraParameters(parameters); 
} 
0

सैम का समाधान सही है लेकिन आउटपुट छवि अभी भी कई टैबलेट उपकरणों पर थोड़ी सी ज़ूम कर दी गई है। इंटरनेट पर मुझे मिली सर्वोत्तम प्रथाओं में से एक, हमें कैमरा होस्ट में सेट करना चाहिए ताकि कैमरे को फिर से शुरू होने पर गुणों का फिर से उपयोग किया जा सके। यहाँ CameraHost में विधि कार्यान्वित किया जाता है:

@Override 
     public Parameters adjustPreviewParameters(Parameters parameters) { 
      List<Camera.Size> sizes = parameters.getSupportedPreviewSizes(); 
      Camera.Size cs = sizes.get(0); 
      parameters.setPreviewSize(cs.width, cs.height); 
      return super.adjustPreviewParameters(parameters); 
     } 
2

मेरे लिए यह जब तक मैं अपने कॉल अपडेट किए गए पैरामीटर निम्नलिखित होने के लिए, एक तस्वीर और पूर्वावलोकन फ्रीज होगा लेने के बाद क्या होगा। इस त्रुटि के साथ यह सुनिश्चित करना हमेशा महत्वपूर्ण होता है कि आप यह सुनिश्चित करने के लिए कैमरे से पूछने के लिए सभी पैरामीटर जांचें कि कैमरे के लिए आप जिस कैमरे को कैमरे से खुद को सेट करने के लिए कह रहे हैं, वह हर पैरामीटर है।

if (myCamera.getParameters().getSupportedPreviewSizes() != null){ 
    Camera.Size previewSize = getOptimalPreviewSize(myCamera.getParameters().getSupportedPreviewSizes(), width, height);; 
    parameters.setPreviewSize(previewSize.width, previewSize.height); 
} 
फ़्लैश/फोकस भी तरीके में

:

if(parameters.getSupportedFocusModes() != null && parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)){ 
    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); 
} 

if (parameters.getSupportedFlashModes() != null && parameters.getSupportedFlashModes().contains(Camera.Parameters.FLASH_MODE_AUTO)){ 
    parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO); 

} 

myCamera.setParameters(parameters); 

आदि यह एक अच्छा प्रयास {} पकड़() {} में लिपटे के सभी

Camera.Parameters parameters = myCamera.getParameters(); 
पूर्वावलोकन आकार के साथ

बहुत अच्छा काम करता है। सौभाग्य।

private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int width, int height) 
    { 
     // Source: http://stackoverflow.com/questions/7942378/android-camera-will-not-work-startpreview-fails 
     Camera.Size optimalSize = null; 

     final double ASPECT_TOLERANCE = 0.1; 
     double targetRatio = (double) height/width; 

     // Try to find a size match which suits the whole screen minus the menu on the left. 
     for (Camera.Size size : sizes){ 

      if (size.height != width) continue; 
      double ratio = (double) size.width/size.height; 
      if (ratio <= targetRatio + ASPECT_TOLERANCE && ratio >= targetRatio - ASPECT_TOLERANCE){ 
       optimalSize = size; 
      } 
     } 

     // If we cannot find the one that matches the aspect ratio, ignore the requirement. 
     if (optimalSize == null) { 
      // TODO : Backup in case we don't get a size. 
     } 

     return optimalSize; 
    } 
संबंधित मुद्दे