2013-01-07 18 views
5

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

public class CameraDemo extends Activity 

मैं भी एक सदस्य सेट: वर्ग पूर्वावलोकन में SurfaceView SurfaceHolder.Callback

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); 
     camera.startPreview(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    hasSurface = true; 
} 


public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    // It will be called immediately after surfaceCreated 
    // I move it to Resume. 
    setCameraPreviewParameters(); 

    camera.startPreview(); 

} 

लागू करता है मुख्य गतिविधि में फैली हुई है CameraUnit ui; यह है:

public class CameraUnit extends LinearLayout 

onCreate में,

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ui = new CameraUnit(this); 
    setContentView((View) ui); 

    Log.d(TAG, "onCreate'd"); 
} 

यह एक LinearLayout वस्तु है, जो SurfaceView शामिल है, और एक कैमरा बटन बनाएं।

onResume है:

@Override 
protected void onResume() { 
    super.onResume(); 
} 

हालांकि यह काम करता है, मुझे लगता है कि onResume रिक्त नहीं होना चाहिए। मैं सतह को भी देखता हूं और सतह बदलती है famous Android app example OCRTest में खाली हैं इसलिए मुझे विश्वास है कि यह बेहतर है और सतहों में सतहों को स्थानांतरित करने के लिए भी संभव है। सतह और सतह को चालू किया गया है।

मुझे लगता है कि मेरे ऐप के 1 संस्करण के लिए प्रवाह चैट होना चाहिए: मुख्य गतिविधि OnCreate (LinearLayout और उसके SurfaceView, कैमरा बटन बनाई गई हैं जहां), surfaceCreated और surfaceChanged कहा जाता है, onResume।

तो मैं बस सतहों में सतहों को स्थानांतरित कर सकता हूं क्रिएटिव और सतह पर चालू किया गया। लेकिन यह काम नहीं करता है! मैंने डीबग का उपयोग सतह को खोजने के लिए किया है। मुझे लगता है कि सतह क्रिएट नहीं कहा जाता है। मेरा ऐप अलग ओसीआरटेस्ट है, जो मुख्य गतिविधि में SurfaceHolder.Callback लागू करता है। मैं SurfaceView में SurfaceHolder.Callback लागू:

class Preview extends SurfaceView implements SurfaceHolder.Callback 

तो मैं onResume

 ui.preview.surfaceCreated(ui.preview.mHolder); 
    ui.preview.surfaceChanged(ui.preview.mHolder, 0, 800, 400); 

मैं बेतरतीब ढंग से पिछले तीन पूर्णांक तर्क सेट में दो अन्य पंक्तियाँ जोड़ें। जब मैं गतिविधि शुरू करता हूं, तो एंड्रॉइड फोन में त्रुटि विंडो पॉप आउट हो जाती है। यह कहता है "इसके कारण: java.lang.RuntimeException: कैमरा सेवा से कनेक्ट करने में विफल"। लेकिन इसे कैसे ठीक करें ???? बहुत बहुत धन्यवाद!

त्रुटियाँ हैं:

01-07 00:27:57.173: W/dalvikvm(11625): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0) 
01-07 00:27:57.173: E/AndroidRuntime(11625): FATAL EXCEPTION: main 
01-07 00:27:57.173: E/AndroidRuntime(11625): java.lang.RuntimeException: Unable to resume activity {com.example/com.example.CameraDemo}: java.lang.RuntimeException: Fail to connect to camera service 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2460) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2481) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1847) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.access$1500(ActivityThread.java:132) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1038) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.os.Looper.loop(Looper.java:150) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.main(ActivityThread.java:4263) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at java.lang.reflect.Method.invokeNative(Native Method) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at java.lang.reflect.Method.invoke(Method.java:507) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at dalvik.system.NativeStart.main(Native Method) 
01-07 00:27:57.173: E/AndroidRuntime(11625): Caused by: java.lang.RuntimeException: Fail to connect to camera service 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.hardware.Camera.native_setup(Native Method) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.hardware.Camera.<init>(Camera.java:265) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.hardware.Camera.open(Camera.java:241) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at com.example.Preview.surfaceCreated(Preview.java:60) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at com.example.CameraDemo.onResume(CameraDemo.java:64) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1242) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.Activity.performResume(Activity.java:3904) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2450) 
01-07 00:27:57.173: E/AndroidRuntime(11625): ... 12 more 
01-07 00:27:59.455: I/Process(11625): Sending signal. PID: 11625 SIG: 9 
+0

मुझे लगता है कि यह एसिटिविटी के ऑनक्रेट, ऑनस्यूम और सतह के निर्माण आदि के कार्यान्वयन अनुक्रम से संबंधित हो सकता है। ऐसा लगता है कि सतही दृश्य वर्ग SurfaceHolder लागू करता है। कॉलबैक, जब भी हम बिंदु पर होते हैं तब भी सतह तैयार नहीं होती है गतिविधि के ऑन्यूसम का। तो हम कब तैयार हैं? यदि गतिविधि SurfaceHolder लागू करती है। कॉलबैक, अंतर्निहित अनुक्रम क्या हैं? मदद!!!! – user1914692

उत्तर

5

आप जब कैमरा अन्य एप्लिकेशन द्वारा उपयोग किया जा रहा है इस

java.lang.RuntimeException: Fail to connect to camera service 

अपवाद मिलता है। लेकिन मुझे विश्वास है कि अन्य आवेदन आपका आवेदन ही है। आपको कैमरा जारी करना होगा।

पूर्वावलोकन वर्ग में:

public void surfaceDestroyed(SurfaceHolder holder) { 

    // empty. Take care of releasing the Camera preview in your activity. 
    if (mCamera != null) { 
     mCamera.release(); 
    } 
} 

गतिविधि में:

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    if (myCamera != null) { 
     myCamera.release(); 
    } 
    finish(); 
} 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    if (myCamera != null) { 
     myCamera.release(); 
    } 
} 

इसके अलावा रद्द करें पर

इन मामलों जहां कैमरा जारी करना चाहिए पर क्लिक किया गया, और जब भी आप हैं कैमरा i.e .. का उपयोग करके समाप्त हो गया, जब छवि कैप्चर की जाती है और आप गतिविधि पर वापस आते हैं।

इसके अलावा इस प्रयास करें:

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 

    if (mHolder.getSurface() == null) { 
     return; 
    } 

    try { 
     mCamera.stopPreview(); 
    } catch (Exception e) { 
     //You can ignore this, because this means the Preview doesn't Exist 
     //So, no need to try stopping 
    } 

    try { 
     mCamera.setPreviewDisplay(mHolder); 
     mCamera.startPreview(); 
    } catch (Exception e) { 
     //Catch this 
    } 
} 
+0

बहुत बहुत धन्यवाद। मैंने उन स्थानों पर इन कैमरा रिलीज कार्यों को शामिल किया है। और मेरे ऐप का पहला संस्करण बहुत अच्छी तरह से काम करता है। जैसा कि मैंने कहा, मैं सतहों में सतहों को स्थानांतरित करना चाहता हूं, और सतह पर बदल दिया गया है। समस्या यह है कि रेज़्यूम का पहला कॉल काम नहीं करता है। तो मुझे लगता है कि यह रेस्यूम और सतह पर कॉल के बीच संबंधों से संबंधित हो सकता है। आपकी राय के बारे में क्या? – user1914692

+0

मेरे लिए काम किया !! – GAMA

0

मैं कुछ उदाहरण में मिल जाए, कैमरा खुला कोड शामिल किया गया है दोनों surfaceChanged में, और onResume में, एक अगर वाक्य का उपयोग कर पुनरावृत्ति से बचने की। शायद यह समस्या को हल करने का एक तरीका है।

1

इसलिए मैंने एक ऐप बनाया जो कैमरा का उपयोग करता था लेकिन सेटिंग्स पृष्ठ पर जाने के लिए एक अलग लॉन्च आइकन। इसलिए हर बार जब मैंने सेटिंग्स को बदलने के लिए ऐप को रोक दिया और कम किया और वापस चला गया तो यह भी इस त्रुटि से दुर्घटनाग्रस्त हो गया। तो बहुत सारे शोध के बाद मुझे अभी भी कोई जवाब नहीं मिला। तब मुझे एहसास हुआ कि इसे कैमरे के जीवन चक्र के प्रबंधन के साथ करना था। तो चला गया और लाइफ साइकिल पर विशेष रूप से Pausing पर देखा। तो मुझे पता चला, हम सब गलत तरीके से ऐसा कर रहे हैं। जहां हम इसे ऑनस्यूम पर कर रहे हैं, हमें इसे स्टार्ट पर करना चाहिए। और बाम! इसने काम कर दिया।

यहां मेरे ऐप के लिए मेरा कोड है।

@Override 
    protected void onPause() { 
     super.onPause(); 
     if (mCamera != null) { 
      mCamera.stopPreview(); 
      mCamera.release();  // release the camera for other applications 
      mCamera = null; 
     } 
     if (mPreview != null) { 
      FrameLayout preview = (FrameLayout) findViewById(R.id.camera_viewer); 
      preview.removeView(mPreview); 
      mPreview = null; 
     } 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     if (mCamera != null) { 
      mCamera.stopPreview(); 
      mCamera.release();  // release the camera for other applications 
      mCamera = null; 
     } 
     if (mPreview != null) { 
      FrameLayout preview = (FrameLayout) findViewById(R.id.camera_viewer); 
      preview.removeView(mPreview); 
      mPreview = null; 
     } 
    } 
    @Override 
    protected void onResume() { 
     super.onResume(); 

    } 

    @Override 
    protected void onStart(){ 
     super.onStart(); 
//Check if the camera exists or not so it does not clash with the onCreate 
     if(mCamera == null){ 
      dir_string = new File("/storage/sdcard1/app"); 
      Log.d("TAG",dir_string.toString()); 
      mCamera = getCameraInstance(); 
      mPreview = new CameraPreview(this, mCamera); 
      FrameLayout preview = (FrameLayout) findViewById(R.id.camera_viewer); 
      preview.addView(mPreview); 
     } 
    } 

आशा है कि इससे कम से कम किसी की मदद करें।

+0

यह काम नहीं कर रहा है। – exshinigami

+0

आपकी त्रुटि क्या है जो आप प्राप्त कर रहे हैं? – user2365554