2015-10-30 14 views
10

छोड़ दिया गया है, मैं नए एंड्रॉइड कैमरा 2 एपीआई के साथ परीक्षण कर रहा हूं और मैं कैमरे से प्रत्येक फ्रेम को नियंत्रित करना चाहता हूं। इसके लिए मैं क्या करता हूं ImageReader और संकल्प और छवि प्रारूप सेट अप करें।एंड्रॉइड कैमरा 2 एपीआई बफरक्यूयू को

ImageReader imageReader = ImageReader.newInstance(1280,720,ImageFormat.YUV_420_888,1); 
imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { 
    @Override 
    public void onImageAvailable(ImageReader reader) { 
     Image image = reader.acquireLatestImage(); 
     Log.i(MainActivity.LOG_TAG,"imageReader: "+System.currentTimeMillis()); 
     image.close(); 
    } 
},null); 

उसके बाद मैं नए पैरामीटर TEMPLATE_PREVIEW साथ CaptureRequest बना सकते हैं और उसे imageReader को लक्ष्य जोड़ें। cameraCaptureSession के लिए मैं इस अनुरोध

try { 
    final CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 

    builder.addTarget(imageReader.getSurface()); 

    mCameraDevice.createCaptureSession(
      Arrays.asList(imageReader.getSurface()), 
      new CameraCaptureSession.StateCallback() { 
       @Override 
       public void onConfigured(CameraCaptureSession session) { 
        mSession = session; 
        try { 
         mSession.setRepeatingRequest(builder.build(),null,null); 
        } catch (CameraAccessException e) { 
         e.printStackTrace(); 
        } 
       } 
       @Override 
       public void onConfigureFailed(CameraCaptureSession session) { 

       } 
      }, 
      null 
    ); 
} catch (CameraAccessException e) { 
    e.printStackTrace(); 
} 

के साथ नए setRepeatingRequest बनाने जब मैं कैमरे खोला और दृश्य क्या मैं पूर्वावलोकन के साथ है मैं अपवाद मिल शुरू करते हैं। लेकिन अपवाद से पहले मुझे कुछ पूर्वावलोकन छवि मिली और उसके बाद मुझे अपवाद

10-30 16:00:32.850 1390-1894/.camera2tutorial E/BufferQueueProducer﹕ [unnamed-1390-1] dequeueBuffer: BufferQueue has been abandoned 
10-30 16:00:32.850 1390-1894/.camera2tutorial E/Legacy-CameraDevice-JNI﹕ LegacyCameraDevice_nativeProduceFrame: Error while producing frame No such device (-19). 
10-30 16:00:32.850 1390-1894/.camera2tutorial W/SurfaceTextureRenderer﹕ Surface abandoned, dropping frame. 
    android.hardware.camera2.legacy.LegacyExceptionUtils$BufferQueueAbandonedException 
      at android.hardware.camera2.legacy.LegacyExceptionUtils.throwOnError(LegacyExceptionUtils.java:64) 
      at android.hardware.camera2.legacy.LegacyCameraDevice.produceFrame(LegacyCameraDevice.java:516) 
      at android.hardware.camera2.legacy.SurfaceTextureRenderer.drawIntoSurfaces(SurfaceTextureRenderer.java:699) 
      at android.hardware.camera2.legacy.GLThreadManager$1.handleMessage(GLThreadManager.java:103) 
      at android.os.Handler.dispatchMessage(Handler.java:98) 
      at android.os.Looper.loop(Looper.java:145) 
      at android.os.HandlerThread.run(HandlerThread.java:61) 

मैं इसे कैसे ठीक कर सकता हूं ??

मैं एक Samsung Galaxy S5 और एंड्रॉयड एपीआई 21

उत्तर

8

उपयोग कर रहा हूँ आप ImageReader आप बनाते हैं, शायद भी आप mSession परिभाषित किया है के लिए एक संदर्भ रोक रखी है सुनिश्चित करें।

इमेज रीडर से प्राप्त सतह जो लगभग कमजोर सूचक के बराबर है - यह ImageReader को कचरा इकट्ठा करने से नहीं रोकेगी। तो सबसे अधिक संभावना (आपके नामकरण के आधार पर) ImageReader नष्ट हो रहा है और त्याग त्रुटि तब होती है।

+0

मैंने विधि से स्थानीय चर को हटा दिया और अपवाद के साथ समस्या हल हो गई। धन्यवाद! –

+3

@ mr.leo इस उत्तर को स्वीकृत के रूप में चिह्नित करने पर विचार करें। इस समाधान ने मेरे मामले में भी मदद की। मजेदार बात यह है कि यह मंच विशिष्ट है - यह नेक्सस और एंड्रॉइड 6 चलाने वाले अन्य उपकरणों पर मेरे लिए ठीक काम किया, लेकिन एंड्रॉइड 5 चलाने वाले एचटीसी वन के साथ असफल रहा। एंड्रॉइड विखंडन की सुंदरता। – stoiczek

+0

@stoiczek आपने ImageReader का संदर्भ कैसे रखा? (इसके अलावा: "captureRequest.addTarget (imageReader.getSurface())") – Denis

1

मैं जब मेरे एप्लिकेशन में गतिविधियों के बीच स्विच एक ही समस्या थी और उस onSurfaceTextureDestroyed() जो केवल झूठे लौट रहा था बुला के बाद किया गया था, लेकिन मैं

public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 
      Log.e(TAG, "onSurfaceTextureDestroyed"); 
      if(cameraDevice != null){ 
       closeCamera(); 

       cameraDevice = null; 
      } 
      return false; 
     } 

में बदल क्या मैंने किया है और यह मेरे लिए काम किया।

+0

धन्यवाद। यह मेरे लिए काम किया। चीयर्स .. –

+0

मैं वापस सच और उसके काम भेज रहा हूँ। –

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