2011-12-14 12 views
7

मुझे अभी एहसास हुआ कि सतहीधारक में मेरी कैमरा गतिविधि कुछ उपकरणों पर काम नहीं करती है। कुछ ड्रॉइड ब्रांडेड और चमड़े वाले फोन। यह अब तक मानक एंड्रॉइड कार्यान्वयन के साथ सभी Google फोन पर काम करता है।एंड्रॉइड कैमरा फ़ंक्शंस कुछ फोन पर काम नहीं करते

मैं 2.2 पर डिवाइस को डिबग करने के लिए एक संक्षिप्त पल मिल गया (पता नहीं है इस वास्तव में क्या मॉडल फोन था, लेकिन यह चमड़ी था) और मैंने देखा डिबगर कहा (ICamera विफल) (कैमरा त्रुटि 100)

लेकिन मुझे यह पता लगाने का मौका नहीं मिला कि यह कहां गलत है, लेकिन मुझे लगता है कि दूसरों को इस समस्या का सामना करना पड़ा है (पूर्वावलोकन शुरू करने से पहले पूर्वावलोकन आकार प्राप्त करने के बारे में कुछ ??), लेकिन कोई स्पष्ट प्रतिक्रिया या कुछ भी सहज नहीं है मेरे पास है, लेकिन यह मेरा कैमरा कोड है, यह काम अधिक सार्वभौमिक रूप से क्या करेगा?

//this is in OnCreate 
    preview = (SurfaceView) findViewById(R.id.cameraplacer); 
    previewHolder = preview.getHolder(); 

    previewHolder.addCallback(surfaceCallback); 
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

// इस जीवन चक्र के तरीकों के बाहर है

SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() { 
    public void surfaceCreated(SurfaceHolder holder) { 
     if (camera == null) { 
      camera = Camera.open(); 
      try { 
       Camera.Parameters camParams = camera.getParameters(); 
       camParams.setFlashMode(Parameters.FLASH_MODE_AUTO); 

       setDisplayOrientation(camera, 90); 
       camera.setPreviewDisplay(previewHolder); 
       camera.setParameters(camParams); 

      } catch (IOException e) { 
       camera.release(); 
       camera = null; 
      } 
     } 


    }//end surfaceCreated 

    public void surfaceChanged(SurfaceHolder holder, 
      int format, int width, 
      int height) { 
     Camera.Parameters parameters=camera.getParameters(); 
     Camera.Size size=getBestPreviewSize(width, height, 
       parameters); 

     if (size!=null) { 
      parameters.setPreviewSize(size.width, size.height); 
      camera.setParameters(parameters); 
      camera.startPreview(); 
      inPreview=true; 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     if (camera != null) { 
      camera.stopPreview(); 
      camera.setPreviewCallback(null); 
      camera.release(); 
      camera = null; 
     } 
    } 
};//end CallBack 

private Camera.Size getBestPreviewSize(int width, int height, 
     Camera.Parameters parameters) { 
    Camera.Size result=null; 

    for (Camera.Size size : parameters.getSupportedPreviewSizes()) { 
     if (size.width<=width && size.height<=height) { 
      if (result==null) { 
       result=size; 
      } 
      else { 
       int resultArea=result.width*result.height; 
       int newArea=size.width*size.height; 

       if (newArea>resultArea) { 
        result=size; 
       } 
      } 
     } 
    } 

    return(result); 
}//end getBestPreviewSize 

// इस OnResume पर है

 try { 
     //Method rotateMethod = android.hardware.Camera.class.getMethod("setDisplayOrientation", int.class); 
     //rotateMethod.invoke(camera, 90); 
     //Camera.Parameters camParams = camera.getParameters(); 
     //camParams.setPreviewSize(480, 320);// here w h are reversed 
     //camera.setParameters(camParams);*/ 
     //setCameraDisplayOrientation(MainPhoto.this, 0, camera); 
     if(camera!=null) 
     { 
      Camera.Parameters camParams = camera.getParameters(); 
      camParams.setFlashMode(Parameters.FLASH_MODE_AUTO); 
      camera.setParameters(camParams); 
      setDisplayOrientation(camera, 90); 
      camera.setPreviewDisplay(previewHolder); 
      camera.startPreview(); 
     } 


    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }/* catch (NoSuchMethodException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }*/ catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }/* catch (IllegalAccessException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }*/ 
+0

आपके द्वारा प्राप्त किए जा रहे लॉग और कंसोल संदेशों के बिना, मुझे नहीं लगता कि बहुत से लोग इस पर आपकी सहायता कर सकते हैं। –

उत्तर

4

के रूप में यह डुप्लिकेट क्या आप में है मैं, onResume() तर्क को हटा देंगे surfaceChanged(), और onResume() द्वारा उस कार्य को करने के लिए सुरक्षित नहीं हो सकता है, क्योंकि सतह अभी तक तैयार नहीं हो सकती है।

इसके अलावा, आप आँख बंद करके कि यदि उपकरण के द्वारा समर्थित है देखे बिना FLASH_MODE_AUTO के लिए पूछ रहे हैं।

वे शुरू होने के लिए दो स्थान होंगे।

+0

मैं फ्लैश मोड ऑटो की जांच कैसे करूं? मैंने सोचा कि कॉल ने स्वयं को चेक किया है क्योंकि यह एक हार्डकोडेड वेरिएबल है – CQM

+0

@CQM: कॉल 'getSupportedFlashModes()' पर कॉल करें और देखें कि यह सूची में है या नहीं। मुझे पता नहीं है कि अगर आप असमर्थित मोड का अनुरोध करते हैं तो क्या होता है। – CommonsWare

+0

धन्यवाद! मुझे उस से एक सशर्त बयान मिला। 'onResume' चला गया है और फ़्लैश मोड संवेदनापूर्वक चेक किया गया है। यह अभी भी 2.2 उपकरणों पर कैमरे से कुछ भी नहीं दिखा रहा है।मैं अभी न्यूनतम एसडीके को 10 तक टक्कर मारने जा रहा हूं, इसलिए कम से कम सभी उपयोगकर्ता जो इसे इंस्टॉल कर सकते हैं, उन्हें सही अनुभव मिलेगा – CQM

4

पहले एक सवाल है, जहां आपके onPause विधि है, मैं आप सभी कैमरा से संबंधित संसाधनों जारी कर रहे हैं संभालने हूँ, जैसा कि आप जब तक अपने अनुप्रयोग रोक दिया गया है उस पर वापस नहीं कर सकते पकड़ो।

दूसरी बात, चाहे इसके नष्ट कर दिया या कि तुम क्या onResume में करने का फैसला किया है पर आधारित नहीं सतह स्थिति का ट्रैक रखने के चर है। इस

if (hasSurface) { 
      // The activity was paused but not stopped, so the surface still 
      // exists. Therefore 
      // surfaceCreated() won't be called, so init the camera here. 
      initCamera(surfaceHolder); 
     } else { 
      surfaceHolder.addCallback(this); 
      surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     } 

एक और बात त्रुटि 100 आप हो रही है जैसे कुछ बात वास्तव में कैमरे देशी कैमरा एप्लिकेशन का संकेत किसी भी तरह दुर्घटनाग्रस्त हो गया है, अगर आप कैमरा उदाहरण तुम वापस के बारे में सूचित कर दिया जाएगा करने के लिए निर्धारित किया है errorCallback है यह घटना और त्रुटि दस्तावेज के अनुसार आप क्या कर सकते हैं ताज़ा शुरू होता है यानी कैमरे के उदाहरण को फिर से शुरू करना।

उम्मीद है कि यह किसी भी तरह से मदद करता है!

2

एंड्रॉयड उदाहरण here

पर एक नजर डालें या अपने आईडीई में एंड्रॉयड उदाहरण आयात करते हैं।

आशा है कि यह

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