2011-06-01 22 views
12

कहलाता है मैं एक ऐसा एप्लीकेशन लिख रहा हूं जिसके लिए कैमरे से ली गई तस्वीरों की आवश्यकता है। समस्या तब होती है जब मैं एक वास्तविक तस्वीर लेने की कोशिश करता हूं। यहाँ कोड है कि मुझे परेशान कर रहा है है: इस पर काम करने लगता हैपिक्चर कैलबैक.ऑनचित्रचित्र कभी भी

final ShutterCallback shutterCallback = new ShutterCallback() { 
     @Override 
     public void onShutter() { 
      Log.d(TAG, "onShutter"); 
     } 
    }; 

    final PictureCallback callback = new PictureCallback() { 

     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
      Log.d(TAG, "onPictureTaken - jpeg"); 
      try { 
       //async task for storing the photo 
       new SavePhotoTask(CameraView.this.ctx, data).execute(); 
      } catch (final SavePhotoException e) { 
       //some exceptionhandling 
      } 
     } 
    }; 
    this.camera = Camera.open(); 
    this.camera.setPreviewDisplay(surfaceHolder); 
    final Camera.Parameters parameters = findBestParameters(w, h); 
    this.camera.setParameters(parameters); 
    this.camera.startPreview(); 
    Log.d(TAG, "takePicture now!"); 
    this.camera.takePicture(shutterCallback, null, callback); 

एमुलेटर पर लेकिन मेरे फोन पर (मोटोरोला अवहेलना - एंड्रॉयड 2.1)।

वास्तविक समस्या: फोन पर पिक्चरकॉलबैक कभी नहीं हो रहा है "ऑन पिक्चरटेकन" कभी नहीं कहा जाता है। शटरकॉलबैक निष्पादित किया गया है लेकिन दूसरा नहीं है (और मैंने जेपीईजी की बजाय कच्चे के साथ कोशिश की)।

क्या कोई इस समस्या को जानता है? मैं सिर्फ यह नहीं देखता कि अंतर अभी एमुलेटर के लिए कहां है। तुम्हारी सहायता सराहनीय है।

उत्तर

15

मैं अंततः समस्या को चला गया और डीबग किया। अचानक यह काम करता था, क्योंकि डिबगिंग बहुत धीमी है: यह एक समय की समस्या है। कॉलबैक को कुछ समय कहा जाता है। फोन को डिबग करने के दौरान तस्वीर लेने के लिए पर्याप्त समय था ...

कैमरा.स्टॉपप्रवेव() और कैमरा.रेली() बहुत जल्दी कॉल करने के लिए भी मत जाओ।

+0

यीशु मैं इसे पढ़ने से पहले समस्या महसूस करने के लिए इतने घंटे खो गया है कि wtf समस्या थी। धन्यवाद! –

+0

आपने शायद मुझे डीबग प्रयास के दिन बचाए – buster

+1

मेरे लिए काम किया, stopPreview() बहुत जल्द – Sudara

10

मुझे यह सही समस्या थी। बहुत डीबगिंग के बाद मुझे अंततः एहसास हुआ कि बेवकूफ कैमरा ऑब्जेक्ट को कॉलबैक कॉल करने का मौका मिलने से पहले कचरा इकट्ठा हो रहा था!

मैंने कैमरे ऑब्जेक्ट का एक कठिन संदर्भ बनाकर इसे ठीक किया है जिसका उपयोग मैं कर रहा था। मैंने इसे अपने पिक्चरटेकर क्लास का सदस्य बना दिया है, इसे लेने से पहले इसे सेट करेंचित्र() और फिर मुझे अपना डेटा प्राप्त करने के बाद जेपीईजी कॉलबैक में इसे हटा दें। तो मुझे बस यह सुनिश्चित करना होगा कि मेरी पिक्चरटेकर ऑब्जेक्ट खुद को gc'd नहीं मिलेगा, जो मैं प्रक्रिया के जीवन के लिए अपने एप्लिकेशन उप-वर्ग में इसे रखकर करता हूं।

यह हमेशा मेरे Droid RAZR पर काम करता है:

public class PictureTaker implements Camera.PictureCallback 
{ 
    private Camera mCam; 
    private MyApp theApp; 

    public PictureTaker(MyApp app) 
    { 
    theApp = app; 
    } 

    public void takePicture() 
    { 
    try 
    { 
     mCam = Camera.open(); 
    } 
    catch (Exception e) 
    { 
     System.out.println("Problem opening camera! " + e); 
     return; 
    } 

    if (mCam == null) 
    { 
     System.out.println("Camera is null!"); 
     return; 
    } 

    try 
    { 
     SurfaceView view = MyApp.getPreviewSurface(); // my own fcn 
     mCam.setPreviewDisplay(view.getHolder()); 
     mCam.startPreview(); 
     mCam.takePicture(null, null, this); 
    } 
    catch (Exception e) 
    { 
     System.out.println("Problem taking picture: " + e); 
    } 
    } 

    public void onPictureTaken(byte[] data, Camera cam) 
    { 
    theApp.jpegPictureData(data); // also my own fcn 

    cam.stopPreview(); 
    cam.release(); 

    mCam = null; 
    } 
} 
+0

मैंने उस ऐप को लंबे समय तक नहीं देखा है, लेकिन यह हो सकता है कि यह मेरी समस्या थी। साझा करने के लिए धन्यवाद :) – Yashima

+0

तथ्य यह है कि जब आप एक तस्वीर का अनुरोध करते हैं तो जीसी कैमरे को हटा देता है यदि आप संदर्भ नहीं रखते हैं तो मुझे हंसते हैं! –

0

मेरे मामले में यह किसी विशिष्ट उपकरण पर picturetaken पर फोन नहीं किया गया था। समस्या इसलिए हुई क्योंकि कैमरे को रेज़्यूम() और ऑनक्रेट() पर दो बार खोला जा रहा था।

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