Appareil photo sur Surface Duo

Appareil photo avant et arrière

Surface Duo utilise le même matériel d’appareil photo pour l’appareil photo avant et pour l’appareil photo arrière, en fonction de la position de l’appareil. Le basculement entre les appareils photo retourne l’image afin que les selfies s’affichent correctement.

Verrouillage de l’orientation

Demander le verrouillage de l’orientation en portrait ou en paysage entraîne l’affichage d’un cadre quand l’application est sur un seul écran et que l’autre écran affiche une autre application (ou le lanceur). Quand une vue d’appareil photo a l’orientation verrouillée et ou qu’elle s’affiche dans un cadre, elle est à un niveau de rotation différent de celui de l’application. Votre application peut :

  • Afficher un message
  • Faire pivoter le flux de l’appareil photo

Définir le verrou d’orientation

android:screenOrientation="portrait"

ou dans le code :

requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

Afficher un message

Pour afficher un message sur l’appareil photo quand le mode portrait est verrouillé, utilisez cette classe PortraitLockHelper. La classe d’assistance peut être rattachée dans onCreate à l’aide d’un écouteur pour détecter les états quand le message doit s’afficher :

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);
        }
//...
    }
}

Pour obtenir une implémentation complète, consultez l’exemple de code d’appareil photo sur GitHub.

Faire pivoter le flux de l’appareil photo

La classe PortraitLockHelper peut également être utilisée pour détecter la rotation de l’appareil et faire pivoter le flux de données de l’appareil photo en conséquence. Pour que cela fonctionne, vous devez vérifier que vous utilisez un TextureView et non un SurfaceView comme zone d’aperçu. TextureView peut être transformé, par exemple textureView.setRotation(90) fait pivoter le flux de 90 degrés. setScaleX et setScaleY doivent alors être utilisés pour mettre à jour les proportions afin de compenser les dimensions de l’écran pivoté.

Dans l’exemple de code d’appareil photo, les valeurs de transformation suivantes sont utilisées pour chaque état de l’appareil :

État Rotation du flux de l’appareil photo Échelle des X Échelle des Y
default 0 1 1
Retourné 0 1 1
Réparti 90 4/3 4/3
Encadré 90 90 4/3 4/3
Encadré 270 270 4/3 4/3

L’exemple de code inclut des boutons permettant d’activer ou de désactiver la rotation. Consultez l’implémentation de PortraitStateListener afin d’obtenir le code nécessaire pour s’adapter à chaque état de l’appareil.

Appareil photo redimensionnable sans verrou d’orientation

Si votre application n’a pas besoin de verrouiller l’orientation, il est possible d’utiliser le même code que celui permettant de faire pivoter le flux de l’appareil photo. Reportez-vous à la section Faire pivoter le flux de l’appareil photo ci-dessus.

Pour garantir qu’il n’existe aucun verrou d’orientation, utilisez le code suivant :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

CameraX

Si vous générez une nouvelle application ou que vous planifiez la mise à niveau de votre code d’appareil photo, l’adoption de l’API CameraX vous donne une base moderne avec laquelle commencer. L’exemple CameraXBasic de Google sur GitHub s’exécute parfaitement sur Surface Duo, mais il existe deux petits ajustements de code qui peuvent améliorer l’expérience utilisateur :

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)
    }
}

Ces mises à jour mineures offrent une expérience plus fluide lors de la répartition de l’application sur deux écrans et le retour à un seul écran, et quand le focus passe de l’application d’appareil photo à tout ce qui se trouve sur l’autre écran.

Exemples