2010-10-08 10 views
51

में विफल रहा है मैंने अपने एप्लिकेशन में कैमरा कार्यक्षमता शामिल की है। मैंने बाजार में ऐप भी लॉन्च किया है। मुझे उपयोगकर्ताओं में से एक से एक त्रुटि संदेश मिला है कि कैमरे को खोलते समय उसे एक त्रुटि मिल रही है।camera.set पैरामीटर एंड्रॉइड

मैंने 2.1 पर डिवाइस पर ऐप का परीक्षण किया है। त्रुटि मुझे प्रयोक्ता की ओर मिला गठजोड़ एक है जो ज्यादातर 2.2 चलेंगे उपयोग कर रहा है ... यहाँ logcat त्रुटि है कि मैं प्राप्त हो गया है है ...

java.lang.RuntimeException: setParameters failed 
at android.hardware.Camera.native_setParameters(Native Method) 
at android.hardware.Camera.setParameters(Camera.java:647) 
at com.CameraApp.Preview.surfaceChanged(Preview.java:67) 
at android.view.SurfaceView.updateWindow(SurfaceView.java:538) 
at android.view.SurfaceView.dispatchDraw(SurfaceView.java:339) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
at android.view.View.draw(View.java:6743) 
at android.widget.FrameLayout.draw(FrameLayout.java:352) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1640) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
at android.view.View.draw(View.java:6743) 
at android.widget.FrameLayout.draw(FrameLayout.java:352) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1842) 
at android.view.ViewRoot.draw(ViewRoot.java:1407) 
at android.view.ViewRoot.performTraversals(ViewRoot.java:1163) 
at android.view.ViewRoot.handleMessage(ViewRoot.java:1727) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:4627) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
at dalvik.system.NativeStart.main(Native Method) 

मैं 2.2 एम्युलेटर पर ऐप्लिकेशन दौड़ा भी यह जांच करने के लिए। लेकिन यह ठीक काम किया। क्या कोई मुझे बता सकता है कि त्रुटि क्यों हो रही है?

class Preview extends SurfaceView implements SurfaceHolder.Callback 
{ 
    private static final String TAG = "Preview"; 

    SurfaceHolder mHolder; 
    public Camera camera; 

    Preview(Context context) 
    { 
     super(context); 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    public void surfaceCreated(SurfaceHolder holder) 
    { 
     // The Surface has been created, acquire the camera and tell it where 
     // to draw. 
     camera = Camera.open(); 
     try { 
     camera.setPreviewDisplay(holder); 
     } catch (IOException exception) { 
     camera.release(); 
     camera = null; 
      // TODO: add more exception handling logic here 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) 
    { 
     // Surface will be destroyed when we return, so stop the preview. 
     // Because the CameraDevice object is not a shared resource, it's very 
     // important to release it when the activity is paused. 
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) 
    { 
     // Now that the size is known, set up the camera parameters and begin 
     // the preview. 

     Camera.Parameters parameters = camera.getParameters(); 
     parameters.setPreviewSize(w, h); 
     camera.setParameters(parameters); 
     camera.startPreview(); 
    } 

    @Override 
    public void draw(Canvas canvas) 
    { 
     super.draw(canvas); 
     Paint p= new Paint(Color.RED); 
     Log.d(TAG,"draw"); 
     canvas.drawText("PREVIEW", canvas.getWidth()/2, canvas.getHeight()/2, p); 
    } 
} 
+0

जब तक आप कोड पोस्ट नहीं करते हैं जहां आप कैमरा पैरामीटर को संशोधित कर रहे हैं, तो आपकी मदद करना बहुत मुश्किल होगा। – CommonsWare

+0

आपकी प्रतिक्रिया के लिए धन्यवाद, मेरे पास एक अलग वर्ग है जिसे उस वर्ग में "पूर्वावलोकन" के रूप में नामित किया गया है, मैं कुछ विधियों को ओवरराइड कर रहा हूं, उनमें से एक "सतह परिवर्तन()" है जो "सेट पैरामीटर()" का उपयोग करता है, मैं उस वर्ग का कोड जोड़ रहा हूं प्रश्न निकाय कृपया इसे देखें ... और इस मुद्दे को हल करने में मेरी सहायता करें। धन्यवाद –

उत्तर

109

यह क्योंकि सभी उपकरणों मनमाना पूर्वावलोकन आकारों का समर्थन विफल हो रहा है:

यहाँ वर्ग जो मैं टिप्पणी में उल्लेख किया है। जाहिर है कुछ लोग करते हैं लेकिन आप इस पर भरोसा नहीं कर सकते हैं। अपने surfaceChanged विधि में आप कुछ इस तरह करने की जरूरत है:

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    Camera.Parameters parameters = camera.getParameters(); 
    List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes(); 

    // You need to choose the most appropriate previewSize for your app 
    Camera.Size previewSize = // .... select one of previewSizes here 

    parameters.setPreviewSize(previewSize.width, previewSize.height); 
    camera.setParameters(parameters); 
    camera.startPreview(); 
} 

आप इस पैमाने पर करने के लिए एक तरह से यह पता लगाने की है, ताकि आप यहां संदर्भ के लिए पहलू अनुपात आदि

खोना नहीं है होगा Android SDK doc है।

+0

धन्यवाद, मैंने उपर्युक्त कोड की कोशिश की, लेकिन यह 2.1 से आगे है। यह कुछ त्रुटियां भी दे रहा है। समस्या यह है कि जब मैं पोर्ट्रेट से लैंडस्केप तक मोबाइल का अभिविन्यास बदल रहा हूं, तो वास्तविक डिवाइस छवि में पूर्वावलोकन के लिए शून्य मान दे रहा है, यह 0kb के साथ संग्रहीत है, यह पोर्ट्रेट में ठीक काम कर रहा है और यह पोर्ट्रेट और लैंडस्केप मोड दोनों में एमुलेटर में अच्छी तरह से काम कर रहा है , –

+0

ठीक है मुझे नहीं पता कि 2.1 से पहले इसे कैसे किया जाए। मुझे एचटीसी एवो पर भी एक ही समस्या थी और इस तरह मैं इसे चारों ओर मिला। समस्या यह है कि आप पूर्वावलोकन आकार को जो कुछ भी चाहते हैं उसे सेट नहीं कर सकते हैं (सभी फोन इसका समर्थन नहीं करेंगे)। पूर्वावलोकन आकार को उस सतह का आकार होने की आवश्यकता नहीं है जिसे आप चित्रित कर रहे हैं यदि यह बिल्कुल मदद करता है। – macbutch

+0

इस के लिए धन्यवाद, 2.2 पर मुझे 'getPupviewSreviewSizes' को 'getPreviewSize' के साथ बदलना था, लेकिन शेष बस काम करता है। – kolenda

संबंधित मुद्दे