Gérer le matériel TV

Le matériel TV est très différent des autres appareils Android. Les téléviseurs n'incluent pas certaines des fonctionnalités matérielles disponibles sur d'autres appareils Android, comme les écrans tactiles, les appareils photo et les récepteurs GPS. De plus, les téléviseurs dépendent entièrement d'appareils secondaires : pour que les utilisateurs puissent interagir avec les applications TV, ils doivent utiliser une télécommande ou une manette de jeu. (Pour en savoir plus sur les différentes méthodes de saisie, consultez Gérer les manettes de téléviseur.)

Lorsque vous créez une application pour TV, tenez bien compte des limites et des exigences matérielles liées à son utilisation sur du matériel TV. Vérifiez si votre application s'exécute sur un téléviseur et gère les fonctionnalités matérielles non compatibles.

Rechercher un téléviseur

Si vous créez une application qui fonctionne à la fois sur des téléviseurs et sur d'autres appareils, vous devrez peut-être vérifier le type d'appareil sur lequel votre application s'exécute et en ajuster le fonctionnement. Par exemple, si votre application peut être lancée via un Intent, vérifiez les propriétés de l'appareil pour déterminer s'il faut lancer une activité sur téléviseur ou téléphone.

La méthode recommandée pour déterminer si votre application s'exécute sur un téléviseur consiste à utiliser la méthode PackageManager.hasSystemFeature() pour vérifier si l'appareil s'exécute en mode télévision. L'exemple de code suivant vous montre comment vérifier si votre application s'exécute sur un téléviseur:

Kotlin

const val TAG = "DeviceTypeRuntimeCheck"

val isTelevision = packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)
if (isTelevision) {
    Log.d(TAG, "Running on a TV Device")
} else {
    Log.d(TAG, "Running on a non-TV Device")
}

Java

public static final String TAG = "DeviceTypeRuntimeCheck";

boolean isTelevision = getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK);
if (isTelevision) {
    Log.d(TAG, "Running on a TV Device");
} else {
    Log.d(TAG, "Running on a non-TV Device");
}

Gérer les fonctionnalités matérielles non compatibles

Selon la conception et les fonctionnalités de votre application, vous pourrez peut-être contourner l'indisponibilité de certaines fonctionnalités matérielles. Cette section décrit les fonctionnalités matérielles qui ne sont généralement pas disponibles pour les téléviseurs, comment détecter les fonctionnalités matérielles manquantes et les alternatives à ces fonctionnalités suggérées.

Fonctionnalités matérielles non compatibles avec le téléviseur

Les téléviseurs n'ont pas la même fonction que les autres appareils. Ils ne possèdent donc pas les fonctionnalités matérielles les plus courantes. Pour cette raison, le système Android ne prend pas en charge les fonctionnalités suivantes pour un téléviseur:

Matériel Descripteur de fonctionnalité Android
Écran tactile android.hardware.touchscreen
Émulateur d'écran tactile android.hardware.faketouch
Téléphonie android.hardware.telephony
Appareil photo android.hardware.camera
Technologie NFC (communication en champ proche) android.hardware.nfc
GPS android.hardware.location.gps
Micro android.hardware.microphone
Capteurs android.hardware.sensor
Écran en mode portrait android.hardware.screen.portrait

Remarque:Certaines manettes de téléviseur sont équipées d'un micro, ce qui n'est pas la même fonctionnalité matérielle de micro décrite ici. Le micro de la manette est entièrement compatible.

Consultez la documentation de référence sur les fonctionnalités pour obtenir la liste complète des fonctionnalités, des sous-éléments géographiques et de leurs descripteurs.

Déclarer la configuration matérielle requise pour le téléviseur

Les applications Android peuvent déclarer des fonctionnalités matérielles requises dans leur fichier manifeste pour s'assurer qu'elles ne sont pas installées sur des appareils qui ne proposent pas ces fonctionnalités. Si vous étendez une application existante pour une utilisation sur un téléviseur, examinez attentivement le fichier manifeste de votre application afin de vérifier toute déclaration relative à la configuration matérielle requise qui pourrait empêcher son installation sur un téléviseur.

Si votre application utilise des fonctionnalités matérielles, telles qu'un écran tactile ou une caméra qui ne sont pas disponibles sur un téléviseur, mais qu'elle peut fonctionner sans ces fonctionnalités, modifiez le fichier manifeste de votre application pour indiquer qu'elles ne sont pas requises. L'extrait de code suivant du fichier manifeste montre comment déclarer que votre application ne nécessite pas de fonctionnalités matérielles indisponibles sur les téléviseurs, mais les utilise sur des appareils autres que les téléviseurs:

<uses-feature android:name="android.hardware.touchscreen"
        android:required="false"/>
<uses-feature android:name="android.hardware.faketouch"
        android:required="false"/>
<uses-feature android:name="android.hardware.telephony"
        android:required="false"/>
<uses-feature android:name="android.hardware.camera"
        android:required="false"/>
<uses-feature android:name="android.hardware.nfc"
        android:required="false"/>
<uses-feature android:name="android.hardware.location.gps"
        android:required="false"/>
<uses-feature android:name="android.hardware.microphone"
        android:required="false"/>
<uses-feature android:name="android.hardware.sensor"
        android:required="false"/>
<!-- Some TV devices have an ethernet connection only -->
<uses-feature android:name="android.hardware.wifi"
        android:required="false"/>

Remarque:Certaines fonctionnalités possèdent des sous-fonctionnalités, comme android.hardware.camera.front, comme décrit dans la documentation de référence sur les fonctionnalités. Veillez à marquer toutes les sous-fonctionnalités également utilisées dans votre application comme required="false".

Toutes les applications destinées à être utilisées sur des téléviseurs doivent déclarer que la fonctionnalité d'écran tactile n'est pas requise, comme décrit dans la section Premiers pas avec les applications TV. Si votre application utilise normalement une ou plusieurs des fonctionnalités non compatibles avec les téléviseurs, définissez le paramètre de l'attribut android:required sur false pour ces fonctionnalités dans votre fichier manifeste.

Attention:Déclarer une fonctionnalité matérielle comme requise en définissant sa valeur sur true empêche votre application d'être installée sur des téléviseurs ou d'apparaître dans le lanceur de l'écran d'accueil d'Android TV.

Tenir compte des autorisations qui impliquent des fonctionnalités matérielles

Certaines déclarations du fichier manifeste uses-permission concernent simplement des fonctionnalités matérielles. Ce comportement signifie que demander certaines autorisations dans le fichier manifeste de votre application peut l'empêcher d'être installée et utilisée sur des téléviseurs. Les autorisations suivantes, fréquemment demandées, créent une exigence de fonctionnalité matérielle implicite:

Autorisation Fonctionnalité matérielle implicite
RECORD_AUDIO android.hardware.microphone
CAMERA android.hardware.camera et
android.hardware.camera.autofocus
ACCESS_COARSE_LOCATION

android.hardware.location

android.hardware.location.network (niveau d'API cible 20 ou inférieur uniquement)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (niveau d'API cible 20 ou inférieur uniquement)

ACCESS_WIFI_STATE
CHANGE_WIFI_STATE

android.hardware.wifi

Certains téléviseurs ne disposent que d'une connexion Ethernet.

Pour obtenir la liste complète des demandes d'autorisation qui impliquent une exigence de fonctionnalité matérielle, consultez le guide uses-feature. Si votre application demande l'une des fonctionnalités listées précédemment, incluez une déclaration uses-feature dans votre fichier manifeste pour la fonctionnalité matérielle implicite, qui indique qu'elle n'est pas requise. android:required="false"

Remarque:Si votre application cible Android 5.0 (niveau d'API 21) ou une version ultérieure et utilise l'autorisation ACCESS_COARSE_LOCATION ou ACCESS_FINE_LOCATION, les utilisateurs peuvent toujours installer votre application sur un téléviseur, même s'il ne dispose pas d'une carte réseau ni d'un récepteur GPS.

Une fois que vous avez rendu les fonctionnalités matérielles facultatives pour votre application, vous devez vérifier leur disponibilité au moment de l'exécution, puis ajuster le comportement de votre application. La section suivante explique comment vérifier les fonctionnalités matérielles et suggère des approches pour modifier le comportement de votre application.

Pour en savoir plus sur le filtrage et la déclaration de fonctionnalités dans le fichier manifeste, consultez le guide uses-feature.

Rechercher les fonctionnalités matérielles

Le framework Android peut vous indiquer si des fonctionnalités matérielles ne sont pas disponibles sur l'appareil sur lequel votre application est exécutée. Utilisez la méthode hasSystemFeature(String) pour rechercher des fonctionnalités spécifiques au moment de l'exécution. Cette méthode utilise un seul argument de chaîne qui spécifie la caractéristique à vérifier.

L'exemple de code suivant montre comment détecter la disponibilité des fonctionnalités matérielles au moment de l'exécution:

Kotlin

// Check whether the telephony hardware feature is available.
if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
    Log.d("HardwareFeatureTest", "Device can make phone calls")
}

// Check whether android.hardware.touchscreen feature is available.
if (packageManager.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) {
    Log.d("HardwareFeatureTest", "Device has a touchscreen.")
}

Java

// Check whether the telephony hardware feature is available.
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
    Log.d("HardwareFeatureTest", "Device can make phone calls");
}

// Check whether android.hardware.touchscreen feature is available.
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) {
    Log.d("HardwareFeatureTest", "Device has a touchscreen.");
}

Écran tactile

Comme la plupart des téléviseurs ne sont pas équipés d'un écran tactile, Android ne permet pas d'interagir avec ce type d'écran. De plus, l'utilisation d'un écran tactile n'est pas cohérente avec un environnement de visionnage dans lequel l'utilisateur est assis à trois mètres de l'écran. Assurez-vous que vos éléments d'interface utilisateur et votre texte n'exigent ni n'impliquent l'utilisation d'un écran tactile.

Pour les téléviseurs, concevez votre application de sorte qu'elle prenne en charge la navigation à l'aide d'un pavé directionnel (ou pavé directionnel) sur la télécommande du téléviseur. Pour savoir comment gérer correctement la navigation à l'aide de commandes adaptées aux téléviseurs, consultez Navigation TV.

Appareil photo

Bien qu'un téléviseur ne soit généralement pas équipé d'un appareil photo, vous pouvez tout de même fournir une application de photographie sur un téléviseur. Par exemple, si votre application permet de prendre des photos, de les consulter et de les retoucher, vous pouvez désactiver leur fonctionnalité de prise de vue sur les téléviseurs tout en permettant aux utilisateurs de consulter et même de modifier des photos. Si vous décidez d'activer votre application liée aux caméras pour qu'elle fonctionne sur un téléviseur, ajoutez la déclaration de fonctionnalité suivante dans le fichier manifeste de votre application:

<uses-feature android:name="android.hardware.camera" android:required="false" />

Si vous permettez à votre application de s'exécuter sans caméra, ajoutez-y du code qui détecte si la fonctionnalité Appareil photo est disponible et adapte le fonctionnement de votre application. L'exemple de code suivant montre comment détecter la présence d'une caméra:

Kotlin

// Check whether the camera hardware feature is available.
if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
    Log.d("Camera test", "Camera available!")
} else {
    Log.d("Camera test", "No camera available. View and edit features only.")
}

Java

// Check whether the camera hardware feature is available.
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
    Log.d("Camera test", "Camera available!");
} else {
    Log.d("Camera test", "No camera available. View and edit features only.");
}

GPS

Les téléviseurs sont des appareils fixes intérieurs et ne sont pas équipés de récepteurs GPS (Global Positioning System) intégrés. Si votre application utilise des informations de localisation, vous pouvez toujours autoriser les utilisateurs à rechercher un lieu ou utiliser un fournisseur de localisation statique tel qu'un code postal configuré lors de la configuration du téléviseur.

Kotlin

// Request a static location from the location manager.
val locationManager = this.getSystemService(Context.LOCATION_SERVICE) as LocationManager
val location: Location = locationManager.getLastKnownLocation("static")

// Attempt to get postal code from the static location object.
val geocoder = Geocoder(this)
val address: Address? =
        try {
            geocoder.getFromLocation(location.latitude, location.longitude, 1)[0]
                    .apply {
                        Log.d(TAG, postalCode)
                    }
        } catch (e: IOException) {
            Log.e(TAG, "Geocoder error", e)
            null
        }

Java

// Request a static location from the location manager.
LocationManager locationManager = (LocationManager) this.getSystemService(
        Context.LOCATION_SERVICE);
Location location = locationManager.getLastKnownLocation("static");

// Attempt to get postal code from the static location object.
Geocoder geocoder = new Geocoder(this);
Address address = null;
try {
  address = geocoder.getFromLocation(location.getLatitude(),
          location.getLongitude(), 1).get(0);
  Log.d("Postal code", address.getPostalCode());

} catch (IOException e) {
  Log.e(TAG, "Geocoder error", e);
}

Mettre la lecture en pause en mode Économie d'énergie

Certains téléviseurs acceptent un mode d'économie d'énergie lorsque l'utilisateur éteint l'appareil. Au lieu de s'éteindre, l'écran est désactivé et Android TV continue de s'exécuter en arrière-plan. La sortie audio est toujours activée dans ce mode. Par conséquent, arrêtez tout contenu en cours de lecture lorsque l'appareil est en mode économie d'énergie.

Pour éviter la lecture en mode Économie d'énergie, ignorez onStop() et arrêtez le contenu en cours de lecture:

Kotlin

override fun onStop() {
    // App-specific method to stop playback.
    stopPlayback()
    super.onStop()
}

Java

@Override
public void onStop() {
  // App-specific method to stop playback.
  stopPlayback();
  super.onStop();
}

Lorsque l'utilisateur rétablit le courant, onStart() est appelé si votre application est l'application active au premier plan. Pour en savoir plus sur le démarrage et l'arrêt d'une activité, consultez Cycle de vie d'une activité.