2015-10-30 9 views
10

Ich teste mit neuen Android camera2 API und ich möchte jedes Bild von der Kamera steuern. Was ich dafür mache, ist ein ImageReader erstellen und Auflösung und Bildformat einrichten.Android Kamera 2 api BufferQueue wurde aufgegeben

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); 

Danach habe ich schaffen neue CaptureRequest mit dem Parameter TEMPLATE_PREVIEW und fügen Ziel ihm imageReader. Für cameraCaptureSession ich neu erstellen setRepeatingRequest mit dieser Anfrage

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(); 
} 

Als ich die Kamera geöffnet und Ansicht starten, was ich mit Vorschau habe ich Exception. Aber bevor Ausnahme ich es bekam einige Bildvorschau und nach, dass ich Ausnahme

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) 

Wie kann ich dieses Problem beheben ??

Ich bin mit einem Samsung Galaxy S5 und Android API 21

Antwort

8

Vergewissern Sie sich, einen Verweis auf die Imagereader Halten Sie wahrscheinlich erstellen, wo immer Sie msession definiert haben.

Die Oberfläche, die Sie vom ImageReader erhalten, entspricht in etwa einem schwachen Zeiger - es verhindert nicht, dass der ImageReader Müll sammelt. Am wahrscheinlichsten (basierend auf Ihrer Benennung) wird der ImageReader zerstört und der Abbruch-Fehler tritt dann auf.

+0

Ich entfernte lokale Variable von Methode und Problem mit Ausnahme wurde behoben. Vielen Dank! –

+3

@ mr.leo erwägen, diese Antwort als akzeptiert zu markieren. Diese Lösung hat mir auch geholfen. Lustig ist, dass es plattformspezifisch ist - es funktionierte gut für mich auf Nexues und anderen Geräten mit Android 6, aber scheiterte mit HTC One unter Android 5. Die Schönheit der Fragmentierung von Android. – stoiczek

+0

@stoiczek Wie haben Sie konkret einen Verweis auf den ImageReader behalten? (außer: "captureRequest.addTarget (imageReader.getSurface())") – Denis

1

hatte ich das gleiche Problem, wenn zwischen den Aktivitäten in meinem app Schalten und das war nach onSurfaceTextureDestroyed() Aufruf, die nur falsch zurückkehren, aber was ich bin habe ich geändert, es zu

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

       cameraDevice = null; 
      } 
      return false; 
     } 

und dass für mich gearbeitet.

+0

Danke. Das hat für mich funktioniert. Prost .. –

+0

Im Senden zurück wahr und seine Arbeit. –

Verwandte Themen