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?).
Wie unterscheidet sich von Stefan eigenen [Antwort] (https://stackoverflow.com/a/43506843/192373)? –