app - camera android
¿Cuál es el equivalente de la API de Camera2 de setDisplayOrientation()? (4)
Como se habrá dado cuenta, se supone que esto "simplemente funciona" para SurfaceView
en la API de camera2.
Como tal, no hay equivalente de setDisplayOrientation()
.
No hemos escuchado de este problema antes, así que algunas preguntas:
- ¿Tiene su aplicación bloqueada en el paisaje o está permitiendo cambios de orientación?
- ¿Maneja sus propios cambios de orientación o está haciendo que el marco se desmonte y reinicie su aplicación cuando cambie la orientación?
- ¿Dispara algún tipo de rediseño cuando ocurre la rotación de 180 grados, por ejemplo para ajustar dónde está el botón del obturador?
Con android.hardware.Camera
, para que la salida de la cámara siga adecuadamente el movimiento del dispositivo, necesitamos conectar un OrientationEventListener
al método setDisplayOrientation()
en la Camera
. De esa manera, a medida que el usuario gira el dispositivo, podemos mantener sincronizado lo que está "arriba" en la vista previa de la cámara con lo que está "arriba" en el mundo real. Esto es particularmente cierto para rotar el dispositivo alrededor del eje Y (es decir, cambiar de paisaje a paisaje inverso o atrás).
Para la mayoría de los cambios de orientación, la API android.hardware.camera2
parece "simplemente funcionar". Sin embargo, para esa rotación del eje Y (paisaje -> paisaje inverso o viceversa), la vista previa de la cámara termina siendo invertida.
¿Cuál es el equivalente a llamar a setDisplayOrientation()
en Camera
para la API de Camera2, para que podamos manejar este escenario?
No hay ninguno.
No "solo funciona" si la orientación de la pantalla se intercambia en comparación con la orientación del sensor (en la mayoría de los dispositivos, este es el caso en modo retrato) porque tiene que configurar una relación de aspecto <1 para la superficie de vista previa que la cámara 2 no puede asignar a una salida de ajuste tamaño. Solución:
- En la primera API, usas camera.setDisplayOrientation()
- En camera2, no pude encontrar una manera de usar un SurfaceHolder, sino solo una SurfaceTexture con surfaceTexture.setTransform surfaceTexture.setTransform(android.graphics.Matrix) en modo retrato.
Usa la siguiente fórmula para obtener la rotación del dispositivo.
private int getOrientation(int rotation) {
return (ORIENTATIONS.get(rotation) + mSensorOrientation + 270) % 360;
}
SensorOrientation es un campo asignado desde
characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION)
Solución sugerida por el ingeniero de google: yaraki
https://github.com/googlesamples/android-Camera2Basic/issues/24
use este CaptureRequest JPEG_ORIENTATION para configurar la orientación de su pantalla
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, 90)