Câmera no Surface Duo

Câmera frontal e traseira

O Surface Duo usa o mesmo hardware de câmera para a câmera frontal e a traseira, dependendo da postura do dispositivo. A alternância de câmeras inverte a imagem para que as selfies sejam renderizadas corretamente.

Bloqueio de orientação

Solicitar que a orientação seja bloqueada como retrato ou paisagem resultará em um formato letterbox quando o aplicativo estiver em uma tela e a outra tela estiver mostrando um aplicativo diferente (ou o Inicializador). Quando uma exibição de câmera tem a orientação bloqueada e formato letterbox, a exibição de câmera está em uma rotação diferente do aplicativo. Seu aplicativo pode:

  • Mostrar uma mensagem
  • Girar o feed da câmera

Definir o bloqueio da orientação

android:screenOrientation="portrait"

ou no código:

requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

Mostrar uma mensagem

Para mostrar uma mensagem sobre a câmera quando ela estiver bloqueada em retrato, use esta classe . A classe auxiliar pode ser conectada em onCreate usando um ouvinte para detectar estados quando a mensagem deve ser exibida:

portraitHelper = new PortraitLockHelper(this);
portraitHelper.StateListener = new PortraitLockHelper.PortraitStateListener() {
    @Override
    public void PortraitStateChanged(int state) {
//...
    if((state & PortraitLockHelper.PORTRAIT_STATE_LETTERBOXED_90) > 0 ){
        if(showRotationMessage){
            rotationMessageView.setVisibility(View.VISIBLE);
        }
//...
    }
}

Confira o código de exemplo da câmera no GitHub para obter uma implementação completa.

Girar o feed da câmera

A classe também pode ser usada para detectar a rotação do dispositivo e fazer a rotação do fluxo de dados da câmera para corresponder. Para que isso funcione, você precisa usar um TextureView e não um SurfaceView como sua área de visualização. TextureView pode ser transformado; por exemplo, textureView.setRotation(90) vai girar o feed 90 graus – setScaleX e setScaleY precisam ser usados para atualizar a taxa de proporção para compensar as dimensões da tela girada.

No código de exemplo da câmera, os seguintes valores de transformação são usados para cada estado do dispositivo:

Estado Rotação do feed da câmera Escala X Escala Y
padrão 0 1 1
Invertido 0 1 1
Estendido 90 4/3 4/3
Em formato letterbox 90 90 4/3 4/3
Em formato letterbox 270 270 4/3 4/3

O código de exemplo inclui botões para habilitar ou desabilitar a rotação. Confira a implementação para obter o código necessário para se adaptar a cada estado do dispositivo.

Câmera redimensionável sem bloqueio de orientação

Se seu aplicativo não precisar bloquear a orientação, o mesmo código para girar o feed da câmera poderá ser usado. Veja a seção girar o feed da câmera acima.

Para que não haja nenhum bloqueio de orientação, use o seguinte código:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

CameraX

Se você estiver criando um aplicativo ou planejando atualizar o código da câmera, a adoção da API CameraX fornecerá uma base moderna para a criação. O exemplo de CameraXBasic no GitHub do Google tem um bom desempenho no Surface Duo, mas há dois pequenos ajustes de código que podem aprimorar a experiência do usuário:

AndroidManifest.xml

android:configChanges="orientation|screenLayout|screenSize|smallestScreenSize"

MainActivity.kt

override fun onWindowFocusChanged(hasFocus: Boolean) {
    super.onWindowFocusChanged(hasFocus)
    if(hasFocus){
        container.postDelayed({
            container.systemUiVisibility = FLAGS_FULLSCREEN
        }, IMMERSIVE_FLAG_TIMEOUT)
    }
}

Essas atualizações secundárias fornecem uma experiência mais suave ao estender e reduzir o aplicativo e quando o foco muda entre o aplicativo de câmera e o que está na outra tela.

Exemplos