Gérer les télécommandes de téléviseur

Les téléviseurs nécessitent un appareil secondaire pour interagir avec les applications : une télécommande de base, une télécommande avec pointeur ou une manette de jeu. Pour offrir une expérience utilisateur cohérente, votre application doit prendre en charge les entrées du pavé directionnel, gérer les manettes qui se déconnectent et accepter les entrées de plusieurs types de manettes, y compris les télécommandes à pointeur.

Commandes minimales du pavé directionnel

Le contrôleur par défaut d'un téléviseur est un pavé directionnel. En général, votre application doit pouvoir être utilisée à partir d'une télécommande qui ne comporte que les boutons Haut, Bas, Gauche, Droite, Sélectionner, Retour et Accueil. Si votre application est un jeu qui nécessite généralement une manette de jeu avec des commandes supplémentaires, essayez de prendre en charge le gameplay uniquement avec ces commandes du pavé directionnel. Sinon, avertissez l'utilisateur qu'une manette est requise et permettez-lui de quitter votre jeu de manière appropriée à l'aide du pavé directionnel.

Pour en savoir plus sur la navigation avec les pavés directionnels pour les téléviseurs, consultez Navigation sur les téléviseurs.

Gérer les déconnexions de contrôleurs

Les manettes pour téléviseur sont souvent des appareils Bluetooth, qui peuvent tenter d'économiser de l'énergie en passant régulièrement en mode veille et en se déconnectant du téléviseur. Cela signifie qu'une application peut être interrompue ou redémarrée si elle n'est pas configurée pour gérer ces événements de reconnexion. Ces événements peuvent se produire dans l'un des cas suivants :

  • Pendant la lecture d'une vidéo de plusieurs minutes, un pavé directionnel ou une manette de jeu peut passer en mode veille, se déconnecter du téléviseur et se reconnecter plus tard.
  • Pendant le jeu, un nouveau joueur peut rejoindre la partie à l'aide d'une manette de jeu qui n'est pas encore connectée.
  • Pendant une partie, un joueur peut quitter le jeu et déconnecter une manette de jeu.

Toute activité d'application TV soumise à des événements de déconnexion et de reconnexion doit être configurée pour gérer les événements de reconnexion dans le fichier manifeste de l'application. L'exemple de code suivant montre comment permettre à une activité de gérer les modifications de configuration, y compris la connexion, la déconnexion ou la reconnexion d'un clavier ou d'un appareil de navigation :

<activity
  android:name="com.example.android.TvActivity"
  android:label="@string/app_name"
  android:configChanges="keyboard|keyboardHidden|navigation"
  android:theme="@style/Theme.Leanback">

  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
  </intent-filter>
  ...
</activity>

Cette modification de configuration permet à l'application de continuer à s'exécuter lors d'un événement de reconnexion, plutôt que d'être redémarrée par le framework Android, ce qui n'est pas une bonne expérience utilisateur.

Gérer les variations de saisie du pavé directionnel

Les utilisateurs de téléviseurs peuvent utiliser plusieurs types de manettes avec leur téléviseur. Par exemple, un utilisateur peut disposer d'une manette de base avec pavé directionnel, d'une télécommande avec pointeur ou d'une manette de jeu. Les codes de touche fournis par une manette de jeu lorsqu'elle est utilisée pour les fonctions du pavé directionnel peuvent différer des codes de touche envoyés par un pavé directionnel de base.

Gérez les variations de saisie du pavé directionnel pour que l'utilisateur n'ait pas à changer de manette pour utiliser votre application. Pour en savoir plus sur la gestion des variations de saisie, consultez Traiter les entrées du pavé directionnel.

Prendre en charge les télécommandes à pointeur

Certains téléviseurs sont compatibles avec les télécommandes à pointeur, comme les souris gyroscopiques ou les télécommandes dotées de pavés directionnels tactiles (trackpads). La prise en charge des télécommandes à pointeur permet aux utilisateurs d'interagir avec votre application à l'aide de gestes de pointer-cliquer, de pointage, de balayage et de déplacement, ce qui offre une expérience plus fluide sur le matériel compatible tout en conservant une compatibilité totale avec le pavé directionnel.

Déclarer la compatibilité avec les télécommandes à pointeur dans le fichier manifeste

Pour indiquer que votre application est navigable avec un pointeur et une saisie tactile, configurez le fichier manifeste de votre application avec l'attribut android.software.leanback.supports_touch <property> défini sur true dans l'élément <application> (ou dans des éléments <activity> individuels pour configurer la compatibilité par activité) :

<manifest ...>
    <!-- Signal whether the app is adaptive or built just for TV -->
    <uses-feature
        android:name="android.software.leanback"
        android:required="true|false" />
    <!-- Ensure the app can be installed on conventional TVs -->
    <uses-feature
        android:name="android.hardware.touchscreen"
        android:required="false" />
    <application ...>
        <!-- Signal whether the app supports pointer remotes -->
        <property
            android:name="android.software.leanback.supports_touch"
            android:value="true" />
        ...
    </application>
</manifest>

sont compatibles avec les interactions de clic, de pointage et de défilement.

Lorsque vous prenez en charge les télécommandes à pointeur, assurez-vous que les composants de votre UI répondent de manière appropriée aux entrées du curseur et aux saisies tactiles pour les interactions suivantes :

  • Clic et sélection : tous les éléments d'interface utilisateur sélectionnables et pouvant être mis en évidence doivent être cliquables avec la télécommande pointeur, conformément au comportement de la sélection par pavé directionnel (KEYCODE_DPAD_CENTER).
  • États de survol visuels : fournissez un effet de survol visuel clair pour indiquer quand le curseur est positionné sur un élément sélectionnable.
  • Défilement par balayage et défilement rapide : le défilement horizontal et vertical déclenché par un balayage ou un défilement rapide sur un bouton central tactile du pavé directionnel doit fonctionner de manière fluide sur l'ensemble du contenu défilant.
  • Défilement par glissement : les utilisateurs doivent pouvoir faire glisser leur doigt pour faire défiler l'écran verticalement (vers le haut et vers le bas) ou horizontalement (vers la gauche et vers la droite) dans les conteneurs à défilement.
    • Jetpack Compose : les conteneurs à défilement standards sont compatibles par défaut avec le défilement tactile et au pointeur. Pour les implémentations personnalisées, consultez Saisie avec un dispositif de pointage dans Compose.
    • Vues : les vues déroulantes standards sont compatibles avec le défilement tactile par défaut. Pour en savoir plus sur la gestion des entrées personnalisées, consultez Saisie tactile et entrées.
  • Défilement de la lecture multimédia : pendant la lecture d'un contenu multimédia (comme des séries TV et des films), les utilisateurs doivent pouvoir interagir avec la barre de progression de la lecture (barre de recherche) en pointant et en cliquant pour accéder à un code temporel passé ou futur, ainsi qu'en faisant glisser (défilement) la barre de progression pour accéder à un moment précis.

Gérer les événements de bouton

Lorsqu'un utilisateur clique sur un bouton d'une manette, votre application reçoit un événement avec un KeyEvent. Le comportement prévu pour le bouton peut être un événement multimédia, comme la lecture, la mise en pause ou l'arrêt, ou un événement de type TV, comme la sélection ou la navigation. Pour offrir une expérience utilisateur de qualité, attribuez un comportement cohérent aux boutons de la manette.

Événements d'interface utilisateur pour téléviseur

Attribuez un comportement d'interface utilisateur TV aux boutons qui génèrent des types KeyEvent, comme indiqué dans le tableau suivant :

KeyEvent Comportement
KEYCODE_BUTTON_B, KEYCODE_BACK Retour
KEYCODE_BUTTON_SELECT, KEYCODE_BUTTON_A, KEYCODE_ENTER, KEYCODE_DPAD_CENTER et KEYCODE_NUMPAD_ENTER Sélection
KEYCODE_DPAD_UP, KEYCODE_DPAD_DOWN, KEYCODE_DPAD_LEFT, KEYCODE_DPAD_RIGHT Navigation

Événements multimédias

Lorsque l'utilisateur regarde un contenu multimédia, attribuez un comportement aux boutons qui génèrent des types KeyEvent, comme indiqué dans le tableau suivant. Si votre application contrôle un MediaSession, utilisez un MediaControllerAdapter pour appeler l'une des méthodes MediaControllerCompat.TransportControls indiquées dans le tableau. Notez que les boutons de sélection agissent comme des boutons de lecture ou de pause dans ce contexte.

KeyEvent Appel TransportControls Comportement
BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER et KEYCODE_NUMPAD_ENTER play() Lire
BUTTON_START, BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER pause() Pause
BUTTON_R1 skipToNext() Passer au suivant
BUTTON_L1 skipToPrevious() Passer au contenu précédent
DPAD_RIGHT, BUTTON_R2, AXIS_RTRIGGER, AXIS_THROTTLE fastForward() Avance rapide
DPAD_LEFT, BUTTON_L2, AXIS_LTRIGGER, AXIS_BRAKE rewind() Retour arrière
N/A stop() Arrêter

Faire en sorte que le bouton "Retour" adopte un comportement approprié

Le bouton "Retour" ne doit jamais servir de bouton d'activation/désactivation. Par exemple, ne l'utilisez pas pour ouvrir et fermer un menu. Utilisez-le uniquement pour revenir en arrière, comme un fil d'Ariane, dans les écrans précédents que le joueur a consultés.

Étant donné que le bouton Retour ne permet que de revenir en arrière de manière linéaire, vous pouvez l'utiliser pour quitter un menu intégré à l'application ouvert par un autre bouton et revenir à l'application. Appuyer plusieurs fois sur le bouton Retour doit toujours permettre de revenir à l'écran d'accueil d'Android TV. Par exemple : gameplay > écran de pause du jeu > écran principal du jeu > écran d'accueil d'Android TV ou lecture d'un programme TV > écran principal de l'application TV.

Écran d'accueil d'Android TV.

Pour en savoir plus sur la conception de la navigation, consultez Concevoir la navigation Retour et Haut. Pour en savoir plus sur l'implémentation, consultez Fournir un retour en arrière approprié.

Prise en main des manettes de jeu

Lorsque vous créez des jeux pour Android TV, concevez votre système de commandes de manière à ce qu'il fonctionne à la fois avec les télécommandes TV standards et les manettes de jeu dédiées.

Prendre en charge les commandes par pavé directionnel

Planifiez votre schéma de contrôle autour d'un pavé directionnel, car cet ensemble de commandes est celui par défaut pour les appareils Android TV. Le joueur doit pouvoir utiliser un pavé directionnel pour tous les aspects du jeu, non seulement pour contrôler le gameplay de base, mais aussi pour naviguer dans les menus et les annonces. Pour cette raison, assurez-vous que votre jeu Android TV ne fait pas référence à une interface tactile avec des expressions telles que "Appuyez ici pour continuer".

La façon dont vous concevez l'interaction du joueur avec la manette peut être essentielle pour offrir une expérience utilisateur optimale. Voici quelques bonnes pratiques :

  • Indiquez clairement les exigences concernant les manettes : utilisez la description Google Play pour indiquer au joueur les exigences concernant les manettes. Si un jeu est plus adapté à une manette de jeu avec un joystick qu'à une manette avec un pavé directionnel, indiquez-le clairement. Un joueur qui utilise une manette mal adaptée à un jeu peut avoir une mauvaise expérience et donner une mauvaise note à votre jeu.
  • Utilisez un mappage de boutons cohérent : un mappage de boutons intuitif est essentiel pour une bonne expérience utilisateur. Par exemple, respectez les conventions en utilisant le bouton A pour accepter et le bouton B pour annuler. Vous pouvez également offrir de la flexibilité en permettant à l'utilisateur de remapper les boutons. Pour en savoir plus sur le mappage des boutons, consultez Gérer les actions de la manette.
  • Détecter les fonctionnalités de la manette et les ajuster en conséquence : interrogez la manette sur ses fonctionnalités pour optimiser la correspondance entre la manette et le jeu. Par exemple, vous pouvez souhaiter qu'un joueur dirige un objet en agitant la manette dans les airs, mais si la manette d'un joueur ne dispose pas d'un accéléromètre et d'un gyroscope, cela ne fonctionnera pas. Interrogez la manette et, si la détection de mouvement n'est pas prise en charge, passez à un autre schéma de contrôle disponible. Pour en savoir plus sur l'interrogation des fonctionnalités des manettes, consultez Prendre en charge les manettes sur différentes versions d'Android.

Utiliser les boutons appropriés

Toutes les manettes de jeu ne sont pas dotées des boutons "Démarrer", "Rechercher" ou "Menu". Assurez-vous que votre UI ne dépend pas de l'utilisation de ces boutons.

Gérer plusieurs manettes

Lorsque plusieurs joueurs jouent à un jeu, chacun avec sa propre manette, il est important de mapper chaque paire joueur-manette. Pour en savoir plus sur l'implémentation de l'identification par numéro de contrôleur, consultez getControllerNumber().

Gérer les déconnexions de manette

Lorsqu'une manette est déconnectée en cours de jeu, mettez le jeu en pause et affichez une boîte de dialogue invitant le joueur déconnecté à reconnecter sa manette.

Proposez également des conseils de dépannage dans la boîte de dialogue. Par exemple, dites au joueur de "vérifier sa connexion Bluetooth". Pour en savoir plus sur l'implémentation de la compatibilité avec les périphériques d'entrée, consultez Gérer les actions de la manette et Présentation du Bluetooth.

Afficher les instructions de la manette

Si votre jeu fournit des instructions visuelles concernant les commandes, utilisez une image de manette sans branding et n'incluez que des boutons compatibles avec Android.

Pour obtenir des exemples d'images d'une manette compatible avec Android, téléchargez le modèle de manette de jeu Android TV (ZIP). Il comprend une manette blanche sur fond noir et une manette noire sur fond blanc (voir la figure 1) sous forme de fichier PNG et de fichier Adobe® Illustrator®.

**Figure 1.** Exemple d'instructions de manette à l'aide du modèle de manette Android TV.