Antwort

6

Sie können mit dem Beispielcode Camera2Basic von Google beginnen.

Sie müssen die Oberfläche des ImageReader als Ziel auf die Vorschau-Erfassungs-Anfrage hinzuzufügen:

//set up a CaptureRequest.Builder with the output Surface 
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
mPreviewRequestBuilder.addTarget(surface); 
mPreviewRequestBuilder.addTarget(mImageReader.getSurface()); 

Danach werden Sie das Bild in der ImageReader.OnImageAvailableListener abrufen können:

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() { 
    @Override 
    public void onImageAvailable(ImageReader reader) { 
     Image image = null; 
     try { 
      image = reader.acquireLatestImage(); 
      if (image != null) { 
       ByteBuffer buffer = image.getPlanes()[0].getBuffer(); 
       Bitmap bitmap = fromByteBuffer(buffer); 
       image.close(); 
      } 
     } catch (Exception e) { 
      Log.w(LOG_TAG, e.getMessage()); 
     } 
    } 
}; 

Um a Bitmap aus dem ByteBuffer:

Bitmap fromByteBuffer(ByteBuffer buffer) { 
    byte[] bytes = new byte[buffer.capacity()]; 
    buffer.get(bytes, 0, bytes.length); 
    return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
} 
+0

friert das Textureview ein. (mPreviewRequestBuilder.addTarget (mImageReader.getSurface());) – user1154390

4

Ja, verwenden Sie die Klasse ImageReader.

Erstellen Sie einen ImageReader mit dem Format ImageFormat.YUV_420_888 und Ihrer gewünschten Größe (stellen Sie sicher, dass Sie eine Größe auswählen, die von dem verwendeten Kameragerät unterstützt wird).

Verwenden Sie ImageReader.getSurface() dann für eine Oberfläche, die zusammen mit Ihren anderen Vorschauausgaben an CameraDevice.createCaptureSession() bereitgestellt wird.

Schließlich fügen Sie in Ihrer wiederholten Erfassungsanforderung die bereitgestellte Oberfläche von ImageReader als Ziel hinzu, bevor Sie sie in Ihrer Erfassungssitzung als wiederholende Anforderung festlegen.

+0

@ Eddy Tal vala, wenn ich ein Ziel wie mPreviewRequestBuilder.addTarget (mImageReader.getSurface()); Es friert die Oberflächen ein. – user1154390

+0

Welchen Fehler bekommen Sie im Logcat? Und haben Sie die Oberfläche zu Ihrem Aufruf createCaptureSession hinzugefügt? –

+0

Ja Beide Oberflächen für die Ausgabe in createCaptureSession festlegen. Logcat zeigt keinen Fehler an. Es sperrt geradeaus, aber stecken geblieben von den letzten zwei Tagen. – user1154390