2017-04-17 6 views
1

Ich arbeite an einer App mit Android Camera2 API. Bisher konnte ich eine Vorschau innerhalb einer TextureView anzeigen lassen. Die App ist standardmäßig im Querformatmodus. Wenn Sie den Emulator verwenden, erscheint die Vorschau auf dem Kopf. Auf meinem physischen Nexus 5 ist die Vorschau normalerweise korrekt angezeigt (Landschaft, nicht auf dem Kopf), aber gelegentlich ist es um 90 Grad gedreht, aber auf die Abmessungen des Bildschirms gestreckt. dachte ich, dass einfach sein sollte und dachte, der folgende Code die notwendigen Informationen über die aktuelle Ausrichtung zurück:Android Camera2 Vorschau gelegentlich um 90 Grad gedreht

// display rotation 
getActivity().getWindowManager().getDefaultDisplay().getRotation(); 
// sensor orientation 
mManager.getCameraCharacteristics(mCameraId).get(CameraCharacteristics.SENSOR_ORIENTATION); 

... ich ziemlich überrascht war, als ich oben Code sah, dass immer1 für die Anzeige zurück Rotation und 90 für die Sensorausrichtung, unabhängig der Vorschau wird um 90 Grad gedreht oder nicht. (Innerhalb des Emulator-Sensors ist die Orientierung immer 270, was irgendwie Sinn macht, wenn ich anlege, dass 90 die richtige Orientierung ist). Ich überprüft auch die Breite und Höhe innerhalb onMeasure innerhalb AutoMeasureTextureView (übernommen von Android's Camera2 example), die ich verwende, um meine TextureView zu erstellen. Aber auch kein Glück - Breite und Höhe, die innerhalb von onMeasure gemeldet werden, sind unabhängig von der Vorschaurotation immer gleich. Ich bin also ratlos, wie ich dieses Problem angehen kann. Hat jemand eine Idee was könnte der Grund für die gelegentlichen Probleme in meiner Vorschau sein?

[Bearbeiten] Ein Detail, das ich gerade herausgefunden habe: Immer wenn die Vorschau gedreht onSurfaceTextureSizeChanged in der TextureView.SurfaceTextureListener scheint nicht aufgerufen werden. In der Dokumentation für onSurfaceTextureSizeChanged heißt es, dass diese Methode aufgerufen wird, wenn die Puffergröße SurfaceTexture geändert wird. Ich habe eine Methode createCameraPreviewSession (kopiert von Androids Camera2 Beispiel), in dem ich die Standardpuffergröße meiner Textur gesetzt wie

texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); 

Aus meiner Log-Ausgabe kann ich sagen, dass onSurfaceTextureSizeChanged genau danach genannt wird - jedoch nicht immer ... (oder die Einstellung der Standardpuffergröße schlägt manchmal automatisch fehl?).

Antwort

2

Ich denke ich kann meine eigene Frage beantworten: Ich habe mein Camera2 Fragment nach der Android's Camera2 example erstellt. Allerdings habe ich die Methode configureTransform nicht wirklich für wichtig gehalten, da meine Anwendung im Gegensatz zum Beispielcode ohnehin in den Landscape-Modus gezwungen wird. Es stellte sich heraus, dass diese Annahme falsch war. Seit ich configureTransform in meinen Code reintegriert habe, habe ich keinen Schluckauf mehr erlebt.

0

Ich hatte auch das gleiche Problem auf Nexus-Gerät konfrontiert. Der Code funktioniert für mich. Rufen Sie diese Funktion vor dem Öffnen der Kamera auf.And auch auf Resume().

private void transformImage (int width, int height) {

if (textureView == null) { 

     return; 
    } else try { 
     { 
      Matrix matrix = new Matrix(); 
      int rotation = getWindowManager().getDefaultDisplay().getRotation(); 
      RectF textureRectF = new RectF(0, 0, width, height); 
      RectF previewRectF = new RectF(0, 0, textureView.getHeight(), textureView.getWidth()); 
      float centerX = textureRectF.centerX(); 
      float centerY = textureRectF.centerY(); 
      if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) { 
       previewRectF.offset(centerX - previewRectF.centerX(), centerY - previewRectF.centerY()); 
       matrix.setRectToRect(textureRectF, previewRectF, Matrix.ScaleToFit.FILL); 
       float scale = Math.max((float) width/width, (float) height/width); 
       matrix.postScale(scale, scale, centerX, centerY); 
       matrix.postRotate(90 * (rotation - 2), centerX, centerY); 
      } 
      textureView.setTransform(matrix); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 
+0

Wie unterscheidet sich von Stefan eigenen [Antwort] (https://stackoverflow.com/a/43506843/192373)? –

Verwandte Themen