Fonctionnalités et API d'Android 9

Android 9 (niveau d'API 28) introduit de nouvelles fonctionnalités très pratiques pour les utilisateurs et les développeurs. Ce document présente les nouveautés pour les développeurs.

Pour en savoir plus sur les nouvelles API, consultez le rapport de différences des API ou la documentation de référence de l'API Android. Veillez également à consulter Changements de comportement dans Android 9 pour en savoir plus sur les domaines dans lesquels les modifications de la plate-forme peuvent affecter vos applications.

Positionnement en intérieur avec le texte en temps réel Wi-Fi

Les nouvelles API de texte en temps réel prennent en charge le positionnement en intérieur dans vos applications.

Android 9 est compatible avec le protocole Wi-Fi IEEE 802.11-2016, également appelé délai aller-retour Wi-Fi (DAR, Wi-Fi Round-Trip-Time), ce qui vous permet de bénéficier d'un positionnement en intérieur dans vos applications.

Sur les appareils équipés d'Android 9 avec compatibilité matérielle, vos applications peuvent utiliser les API RTT pour mesurer la distance aux points d'accès Wi-Fi compatibles RTT à proximité. Les services de localisation et la recherche Wi-Fi doivent être activés sur l'appareil (sous Settings > Location (Paramètres > Localisation). Votre application doit disposer de l'autorisation ACCESS_FINE_LOCATION. L'appareil n'a pas besoin de se connecter aux points d'accès pour utiliser le texte en temps réel. Pour des raisons de confidentialité, seul le téléphone peut déterminer la distance jusqu'au point d'accès. Les points d'accès ne disposent pas de cette information.

Si votre appareil mesure la distance entre trois points d'accès ou plus, vous pouvez utiliser un algorithme de multilatération pour estimer la position de l'appareil qui correspond le mieux à ces mesures. Le résultat est généralement proche de 1 à 2 mètres.

Cette précision vous permet de créer de nouvelles expériences, comme la navigation intégrée et des services précis basés sur la localisation, comme la commande vocale clarifiée (par exemple, Allume ce voyant) et les informations basées sur la localisation (telles que Existe-t-il des offres spéciales pour ce produit ?).

Découvrez l'API Wi-Fi DAR en cours d'utilisation dans l'application de démonstration Android WifiRttScan.

Pour en savoir plus, consultez Localisation via le Wi-Fi: portée avec DAR.

Compatible avec l'encoche

Écran Options pour les développeurs montrant différentes tailles d'encoche

Tester l'encoche à l'aide de l'émulateur

Android 9 est compatible avec les derniers écrans bord à bord qui contiennent des encoches pour les appareils photo et les haut-parleurs. La classe DisplayCutout vous permet de déterminer l'emplacement et la forme des zones non fonctionnelles dans lesquelles le contenu ne doit pas être affiché. Pour déterminer l'existence et l'emplacement de ces zones d'encoche, utilisez la méthode getDisplayCutout().

Un nouvel attribut de mise en page de fenêtre, layoutInDisplayCutoutMode, permet à votre application d'organiser son contenu autour des encoches d'un appareil. Vous pouvez définir cet attribut sur l'une des valeurs suivantes:

Vous pouvez simuler une découpe d'écran sur n'importe quel appareil ou émulateur exécutant Android 9 comme suit:

  1. Activez les options pour les développeurs.
  2. Sur l'écran Options pour les développeurs, faites défiler la page jusqu'à la section Dessin et sélectionnez Simuler un écran avec une encoche.
  3. Sélectionnez la taille de l'encoche.

Notifications

Android 9 introduit plusieurs améliorations aux notifications, qui sont toutes disponibles pour les développeurs ciblant le niveau d'API 28 ou supérieur.

Notifications de messagerie

MessagingStyle avec photo en pièce jointe.

Notification de messagerie

MessagingStyle avec réponses et conversations.

Pour obtenir un exemple de code utilisant des notifications, y compris les fonctionnalités d'Android 9, consultez l'exemple de contact.

Expérience de messagerie améliorée

À partir d'Android 7.0 (niveau d'API 24), vous pouvez ajouter une action pour répondre aux messages ou saisir un autre texte directement à partir d'une notification. Android 9 améliore cette fonctionnalité avec les améliorations suivantes:

  • Prise en charge simplifiée pour les participants à la conversation: la classe Person permet d'identifier les personnes impliquées dans une conversation, y compris leurs avatars et URI. De nombreuses autres API, telles que addMessage(), exploitent désormais la classe Person au lieu d'un CharSequence. La classe Person est également compatible avec le modèle de conception "Builder".

  • Prise en charge des images: Android 9 affiche désormais les images dans les notifications de messagerie sur les téléphones. Vous pouvez utiliser setData() sur le message pour afficher une image. L'extrait de code suivant montre comment créer un Person et un message contenant une image.

Kotlin

// Create new Person.
val sender = Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build()
// Create image message.
val message = Message("Picture", time, sender)
        .setData("image/", imageUri)
val style = Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message)

Java

// Create new Person.
Person sender = new Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build();
// Create image message.
Message message = new Message("Picture", time, sender)
        .setData("image/", imageUri);
Notification.MessagingStyle style = new Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message);
  • Enregistrer les réponses en tant que brouillons: votre application peut récupérer le EXTRA_REMOTE_INPUT_DRAFT envoyé par le système lorsqu'un utilisateur ferme par inadvertance une notification de messagerie. Vous pouvez utiliser cet extra pour préremplir les champs de texte dans l'application afin que les utilisateurs puissent terminer leur réponse.

  • Déterminez si une conversation est une conversation de groupe: vous pouvez utiliser setGroupConversation() pour identifier volontairement une conversation en tant que conversation de groupe ou non-groupe.

  • Définissez l'action sémantique d'un intent: la méthode setSemanticAction() vous permet de donner une signification sémantique à une action, telle que "marquer comme lu", "supprimer", "répondre", etc.

  • SmartReply: Android 9 accepte les mêmes suggestions de réponses que celles disponibles dans votre application de chat. Utilisez RemoteInput.setChoices() pour fournir un tableau de réponses standards à l'utilisateur.

Paramètres de la chaîne, diffusions et Ne pas déranger

Android 8.0 a introduit des canaux de notification, qui vous permettent de créer un canal personnalisable pour chaque type de notification que vous souhaitez afficher. Android 9 simplifie les paramètres du canal de notification avec les modifications suivantes:

  • Blocage de groupes de canaux: les utilisateurs peuvent désormais bloquer des groupes entiers de canaux dans les paramètres de notification d'une application. Vous pouvez utiliser la méthode isBlocked() pour déterminer quand un groupe est bloqué et, par conséquent, ne pas envoyer de notification pour les canaux de ce groupe.

    De plus, votre application peut interroger les paramètres actuels du groupe de canaux à l'aide de la nouvelle méthode getNotificationChannelGroup().

  • Nouveaux types d'intents de diffusion: le système Android envoie désormais des intents de diffusion lorsque l'état de blocage des canaux de notification et des groupes de canaux change. L'application propriétaire du canal ou du groupe bloqué peut écouter ces intents et réagir en conséquence. Pour en savoir plus sur ces actions et ces extras d'intent, consultez la liste des constantes mise à jour dans la documentation de référence sur NotificationManager. Pour en savoir plus sur la réaction aux intents de diffusion, consultez la section Diffusions.

  • NotificationManager.Policy dispose de trois nouvelles catégories de priorité "Ne pas déranger" :

  • NotificationManager.Policy comporte également sept nouvelles constantes Do-Not-Disturb que vous pouvez utiliser pour supprimer les interruptions visuelles:

Compatibilité avec les caméras multiples et mises à jour des caméras

Sur les appareils équipés d'Android 9, vous pouvez accéder aux flux simultanément à partir de deux caméras physiques ou plus. Sur les appareils équipés d'une double caméra avant ou double dos, vous pouvez créer des fonctionnalités innovantes impossibles à réaliser avec un seul appareil photo, comme un zoom fluide, un effet bokeh et une vision stéréo. L'API vous permet également d'appeler un flux de caméra logique ou fusionné, qui bascule automatiquement entre plusieurs caméras.

Parmi les autres améliorations de la caméra figurent des paramètres de session supplémentaires qui aident à réduire les retards lors de la capture initiale, ainsi qu'un partage de surface qui permet aux clients de la caméra de gérer divers cas d'utilisation sans avoir à arrêter et démarrer la diffusion du flux de la caméra. Nous avons également ajouté des API pour la prise en charge de Flash et l'accès aux horodatages OIS pour la stabilisation d'image et les effets spéciaux au niveau de l'application.

Dans Android 9, l'API multi-caméra prend en charge les caméras monochromes pour les appareils dotés de la capacité FULL ou LIMITED. La sortie monochrome est obtenue au moyen du format YUV_420_888 avec Y en nuances de gris, U (Cb) à 128 et V (Cr) à 128.

Android 9 est également compatible avec les caméras USB/UVC externes sur les appareils compatibles.

ImageDecoder pour les drawables et les bitmaps

Android 9 introduit la classe ImageDecoder, qui fournit une approche modernisée pour le décodage des images. Utilisez cette classe à la place des API BitmapFactory et BitmapFactory.Options.

ImageDecoder vous permet de créer un Drawable ou un Bitmap à partir d'un tampon d'octets, d'un fichier ou d'un URI. Pour décoder une image, appelez d'abord createSource() avec la source de l'image encodée. Appelez ensuite decodeDrawable() ou decodeBitmap() en transmettant l'objet ImageDecoder.Source pour créer un Drawable ou un Bitmap. Pour modifier les paramètres par défaut, transmettez OnHeaderDecodedListener à decodeDrawable() ou decodeBitmap(). ImageDecoder appelle onHeaderDecoded() avec la largeur et la hauteur par défaut de l'image, une fois qu'elles sont connues. Si l'image encodée est un GIF animé ou un WebP, decodeDrawable() renvoie un Drawable qui est une instance de la classe AnimatedImageDrawable.

Il existe différentes méthodes pour définir les propriétés d'une image:

  • Pour redimensionner l'image décodée à une taille exacte, transmettez les dimensions cibles à setTargetSize(). Vous pouvez également mettre à l'échelle des images en utilisant une taille d'échantillon. Transmettez la taille d'échantillon directement à setTargetSampleSize().
  • Pour recadrer une image dans la plage de l'image mise à l'échelle, appelez setCrop().
  • Pour créer un bitmap modifiable, transmettez true à setMutableRequired().

ImageDecoder vous permet également d'ajouter des effets personnalisés et complexes à une image, tels que des angles arrondis ou des masques de cercle. Utilisez setPostProcessor() avec une instance de la classe PostProcessor pour exécuter les commandes de dessin de votre choix.

Animation

Android 9 introduit la classe AnimatedImageDrawable pour dessiner et afficher des images animées GIF et WebP. AnimatedImageDrawable fonctionne de la même manière que AnimatedVectorDrawable, dans la mesure où le thread de rendu pilote les animations de AnimatedImageDrawable. Le thread de rendu utilise également un thread de calcul pour décoder, de sorte que le décodage n'interfère pas avec d'autres opérations sur le thread de rendu. Cette implémentation permet à votre application d'afficher une image animée sans gérer ses mises à jour ni interférer avec d'autres événements sur le thread UI de votre application.

Un AnimatedImageDrawable peut être décodé à l'aide d'une instance de ImageDecoder. L'extrait de code suivant montre comment utiliser ImageDecoder pour décoder votre AnimatedImageDrawable:

Kotlin

@Throws(IOException::class)
private fun decodeImage() {
    val decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(resources, R.drawable.my_drawable))

    // Prior to start(), the first frame is displayed.
    (decodedAnimation as? AnimatedImageDrawable)?.start()
}

Java

private void decodeImage() throws IOException {
    Drawable decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(getResources(), R.drawable.my_drawable));

    if (decodedAnimation instanceof AnimatedImageDrawable) {
        // Prior to start(), the first frame is displayed.
        ((AnimatedImageDrawable) decodedAnimation).start();
    }
}

ImageDecoder propose plusieurs méthodes vous permettant de modifier davantage l'image. Par exemple, vous pouvez utiliser la méthode setPostProcessor() pour modifier l'apparence de l'image, par exemple en appliquant un masque circulaire ou des angles arrondis.

Vidéo HDR VP9, compression d'image HEIF et API multimédias

Android 9 est compatible avec le VP9 Profile 2 HDR (High Dynamic Range). Vous pouvez ainsi diffuser des films compatibles HDR sur les appareils compatibles HDR depuis YouTube, Play Films et d'autres sources.

Android 9 prend également en charge l'encodage des images à l'aide du format de fichier image à haute efficacité (HEIF ou HEIC), ce qui améliore la compression et réduit l'espace de stockage ainsi que l'utilisation des données réseau. Les exemples d'images fixes HEIF sont acceptés dans les classes MediaMuxer et MediaExtractor. Grâce à la compatibilité avec les plates-formes des appareils Android 9, il est facile d'envoyer et d'utiliser des images HEIF à partir de votre serveur backend. Après vous être assuré que votre application est compatible avec ce format de données pour le partage et l'affichage, essayez HEIF comme format de stockage d'images dans votre application. Vous pouvez effectuer une conversion jpeg-to-heic à l'aide de ImageDecoder ou BitmapFactory (qui obtient un bitmap à partir d'un fichier JPEG). Vous pouvez ensuite utiliser HeifWriter pour écrire des images fixes HEIF à partir de tampons d'octets YUV ou d'instances de Surface ou Bitmap.

Les métriques multimédias sont également disponibles à partir des classes AudioTrack, AudioRecord et MediaDrm.

Android 9 introduit des méthodes dans la classe MediaDRM pour obtenir des métriques, des niveaux HDCP, des niveaux de sécurité et le nombre de sessions, ainsi que pour renforcer le contrôle des niveaux de sécurité et des arrêts sécurisés. Pour en savoir plus, consultez le rapport sur les différences d'API.

Dans Android 9, l'API AAudio est compatible avec plusieurs attributs AAudioStream supplémentaires, y compris l'utilisation, le type de contenu et le préréglage d'entrée. À l'aide de ces attributs, vous pouvez créer des flux réglés pour les applications VoIP ou caméscope. Vous pouvez également définir l'ID de session pour associer un flux AAudio à un sous-mix pouvant inclure des effets. Utilisez l'API AudioEffect pour contrôler les effets.

Android 9 introduit l'API AudioEffect pour le traitement dynamique. Elle vous permet de créer des effets audio basés sur les canaux, y compris l'égalisation, la compression multibande et le limiteur, sur plusieurs niveaux. Le nombre de bandes et d'étapes actives est configurable, et la plupart des paramètres peuvent être contrôlés en temps réel.

Sensibilité du coût des données dans JobScheduler

À partir d'Android 9, JobScheduler peut utiliser les signaux d'état du réseau fournis par les opérateurs pour améliorer la gestion des tâches liées au réseau.

Les tâches peuvent déclarer la taille estimée de leurs données, précharger les signaux et spécifier des exigences réseau détaillées. JobScheduler gère ensuite le travail en fonction de l'état du réseau. Par exemple, lorsque le réseau signale qu'il est encombré, JobScheduler peut différer les requêtes réseau volumineuses. Sur un réseau sans compteur, JobScheduler peut exécuter des tâches de préchargement pour améliorer l'expérience utilisateur, par exemple en préchargeant les titres.

Lorsque vous ajoutez des tâches, veillez à utiliser setEstimatedNetworkBytes(), setPrefetch() et setRequiredNetwork(), le cas échéant, pour aider JobScheduler à gérer correctement la tâche. Lorsque votre tâche s'exécute, veillez à utiliser l'objet Network renvoyé par JobParameters.getNetwork(). Sinon, vous utiliserez implicitement le réseau par défaut de l'appareil, ce qui risque de ne pas répondre à vos exigences, ce qui entraînera une utilisation non conforme des données.

API Neural Networks 1.1

L'API Neural Networks a été introduite dans Android 8.1 (niveau d'API 27) pour accélérer le machine learning sur l'appareil sous Android. Android 9 développe et améliore l'API, en assurant la compatibilité avec neuf nouvelles opérations:

Problème connu:Lors de la transmission de Tensors ANEURALNETWORKS_TENSOR_QUANT8_ASYMM à l'opération ANEURALNETWORKS_PAD, disponible sur Android 9 ou version ultérieure, le résultat de NNAPI peut ne pas correspondre à celui des frameworks de machine learning de niveau supérieur, tels que TensorFlow Lite. À la place, vous ne devez transmettre que ANEURALNETWORKS_TENSOR_FLOAT32 jusqu'à ce que le problème soit résolu.

L'API introduit également une nouvelle fonction, ANeuralNetworksModel_relaxComputationFloat32toFloat16(), qui vous permet de spécifier si vous souhaitez calculer ANEURALNETWORKS_TENSOR_FLOAT32 avec une plage et une précision inférieures à celles du format à virgule flottante 16 bits IEEE 754.

Autofill Framework

Android 9 introduit plusieurs améliorations que les services de saisie automatique peuvent implémenter pour améliorer l'expérience utilisateur lorsqu'il remplit des formulaires. Pour en savoir plus sur l'utilisation des fonctionnalités de saisie automatique dans votre application, consultez le guide du framework de saisie automatique.

Renforcement de la sécurité

Android 9 introduit un certain nombre de fonctionnalités de sécurité, résumées dans les sections suivantes:

Confirmation de protection Android

Les appareils compatibles équipés d'Android 9 ou version ultérieure vous permettent d'utiliser Confirmation de protection Android. Lorsque vous utilisez ce workflow, votre application affiche une invite demandant à l'utilisateur d'approuver un bref énoncé. Cette déclaration permet à l'application de réaffirmer que l'utilisateur souhaite effectuer une transaction sensible, comme effectuer un paiement.

Si l'utilisateur accepte l'instruction, Android Keystore reçoit et stocke une signature cryptographique protégée par un code d'authentification de message par hachage à clé (HMAC). Une fois qu'Android Keystore a confirmé la validité du message, votre application peut utiliser la clé générée à partir de trustedConfirmationRequired dans l'environnement d'exécution sécurisé (TEE) pour signer le message que l'utilisateur a accepté. La signature indique, avec un degré de confiance très élevé, que l'utilisateur a vu la déclaration et l'a acceptée.

Attention : Confirmation de protection Android ne fournit pas de canal d'informations sécurisé à l'utilisateur. Votre application ne peut pas apporter d'autres garanties de confidentialité que celles offertes par la plate-forme Android. En particulier, n'utilisez pas ce workflow pour afficher des informations sensibles que vous n'afficheriez habituellement pas sur l'appareil de l'utilisateur.

Pour obtenir des conseils sur la prise en charge de Confirmation de protection Android, consultez le guide Confirmation de protection Android.

Boîte de dialogue d'authentification biométrique unifiée

Dans Android 9, le système fournit des boîtes de dialogue d'authentification biométrique au nom de votre application. Cette fonctionnalité crée un aspect, un aspect et un emplacement standardisés pour la boîte de dialogue. Les utilisateurs sont ainsi plus sûrs qu'ils s'authentifient auprès d'un vérificateur d'identifiants biométriques de confiance.

Si votre application utilise FingerprintManager pour afficher une boîte de dialogue d'authentification par empreinte digitale aux utilisateurs, passez plutôt à BiometricPrompt. BiometricPrompt s'appuie sur le système pour afficher la boîte de dialogue d'authentification. Il modifie également son comportement pour s'adapter au type d'authentification biométrique choisi par l'utilisateur.

Module matériel de sécurité

Les appareils compatibles équipés d'Android 9 ou version ultérieure peuvent disposer de StrongBox Keymaster, une implémentation du HAL Keymaster qui se trouve dans un module de sécurité matériel. Le module contient les éléments suivants :

  • Son propre processeur.
  • Stockage sécurisé
  • Véritable générateur de nombres aléatoires.
  • Mécanismes supplémentaires pour empêcher la falsification des packages et le téléchargement indépendant non autorisé d'applications.

Lors de la vérification des clés stockées dans StrongBox Keymaster, le système corrobore l'intégrité d'une clé avec l'environnement d'exécution sécurisé (TEE).

Pour en savoir plus sur l'utilisation de Strongbox Keymaster, consultez le module de sécurité matérielle.

Importation sécurisée de clés dans le keystore

Android 9 offre une sécurité supplémentaire pour le déchiffrement des clés en ajoutant la possibilité d'importer des clés chiffrées de manière sécurisée dans le keystore à l'aide d'un format de clé encodée ASN.1. Le Keymaster déchiffre ensuite les clés dans le keystore, de sorte que leur contenu n'apparaisse jamais en texte brut dans la mémoire hôte de l'appareil.

Découvrez comment importer des clés chiffrées de manière plus sécurisée.

Schéma de signature de l'APK avec rotation des clés

Android 9 est compatible avec APK Signature Scheme v3. Ce schéma permet d'inclure un enregistrement de preuve de rotation dans son bloc de signature pour chaque certificat de signature. Cette fonctionnalité permet de signer votre application avec un nouveau certificat de signature en associant les anciens certificats de signature du fichier APK à celui avec lequel elle est maintenant signée.

Découvrez comment alterner des clés à l'aide de apksigner.

Option permettant d'autoriser le déchiffrement des clés uniquement sur les appareils déverrouillés

Android 9 introduit l'indicateur unlockedDeviceRequired. Cette option détermine si le keystore nécessite le déverrouillage de l'écran avant de permettre le déchiffrement des données en cours de transfert ou stockées à l'aide de la clé spécifiée. Ces types de clés sont adaptés au chiffrement des données sensibles à stocker sur disque, telles que les données de santé ou les données d'entreprise. Cet indicateur garantit aux utilisateurs que les données ne peuvent pas être déchiffrées lorsque l'appareil est verrouillé en cas de perte ou de vol de leur téléphone.

Pour empêcher le déchiffrement de la clé lorsque l'appareil est verrouillé, activez l'indicateur en transmettant true à la méthode setUnlockedDeviceRequired(). Une fois cette étape terminée, lorsque l'écran de l'utilisateur est verrouillé, toute tentative de déchiffrement ou de signature de données à l'aide de cette clé échoue. Un appareil verrouillé nécessite un code, un mot de passe, une empreinte digitale ou un autre facteur de confiance avant de pouvoir y accéder.

Compatibilité avec l'ancien chiffrement

Les appareils Android 9 équipés de Keymaster 4 sont compatibles avec l'algorithme de chiffrement triple des données (Triple Data Encryption Algorithm) Si votre application interagit avec d'anciens systèmes nécessitant le triple DES, utilisez ce type d'algorithme de chiffrement lors du chiffrement d'identifiants sensibles.

Pour en savoir plus sur la manière de sécuriser votre application, consultez Sécurité pour les développeurs Android.

Abandon de WPS

WPS (Wi-Fi Protected Setup) est obsolète pour des raisons de sécurité.

Sauvegardes Android

Android 9 ajoute de nouvelles fonctionnalités et options pour les développeurs liées à la sauvegarde et à la restauration. Vous trouverez plus d'informations sur ces modifications dans les sections suivantes.

Sauvegardes de chiffrement côté client

Android 9 est compatible avec le chiffrement des sauvegardes Android avec un secret côté client. Cette compatibilité est activée automatiquement lorsque les conditions suivantes sont remplies:

Lorsque cette mesure de confidentialité est activée, le code, le schéma ou le mot de passe de l'appareil est requis pour restaurer les données à partir des sauvegardes effectuées par l'appareil de l'utilisateur. Pour en savoir plus sur la technologie derrière cette fonctionnalité, consultez le livre blanc Google Cloud Key Vault Service.

Définir les conditions de l'appareil requises pour la sauvegarde

Si les données de votre application incluent des informations ou des préférences sensibles, Android 9 vous permet de définir les conditions de l'appareil selon lesquelles les données de votre application sont incluses dans la sauvegarde de l'utilisateur, par exemple lorsque le chiffrement côté client est activé ou qu'un transfert local d'appareil à appareil est en cours.

Pour en savoir plus sur la sauvegarde de données sur des appareils Android, consultez la page Présentation de la sauvegarde de données.

Accessibilité

Android 9 apporte des améliorations au framework d'accessibilité, qui permettent d'offrir plus facilement une meilleure expérience aux utilisateurs de votre application.

Sémantique de navigation

Les attributs ajoutés dans Android 9 vous permettent de définir plus facilement la manière dont les services d'accessibilité, en particulier les lecteurs d'écran, passent d'une partie de l'écran à l'autre. Ces attributs peuvent aider les utilisateurs déficients visuels à parcourir rapidement du texte dans l'interface utilisateur de votre application et leur permettre d'effectuer une sélection.

Par exemple, dans une application d'achat, un lecteur d'écran peut aider les utilisateurs à passer directement d'une catégorie d'offres à la suivante, sans avoir à lire tous les articles d'une catégorie avant de passer à la suivante.

Titres accessibles pour les volets

Sous Android 8.1 (niveau d'API 27) et versions antérieures, les services d'accessibilité ne peuvent pas toujours déterminer quand un volet spécifique de l'écran a été mis à jour, par exemple lorsqu'une activité remplace un fragment par un autre. Les volets sont constitués d'éléments d'interface utilisateur liés visuellement et regroupés de manière logique, qui constituent généralement un fragment.

Dans Android 9, vous pouvez fournir des titres de volet d'accessibilité, ou des titres identifiables individuellement, pour ces volets. Si un volet possède un titre d'accessibilité, les services d'accessibilité reçoivent des informations plus détaillées lorsque le volet change. Cette fonctionnalité permet aux services de fournir à l'utilisateur des informations plus précises sur les modifications apportées à l'interface utilisateur.

Pour spécifier le titre d'un volet, utilisez l'attribut android:accessibilityPaneTitle. Vous pouvez également mettre à jour le titre d'un volet d'interface utilisateur remplacé au moment de l'exécution à l'aide de setAccessibilityPaneTitle(). Par exemple, vous pouvez fournir un titre pour la zone de contenu d'un objet Fragment.

Navigation basée sur l'en-tête

Si votre application affiche du contenu textuel incluant des en-têtes logiques, définissez l'attribut android:accessibilityHeading sur true pour les instances de View qui représentent ces en-têtes. En ajoutant ces titres, vous permettez aux services d'accessibilité d'aider les utilisateurs à passer directement d'un titre à l'autre. Tout service d'accessibilité peut utiliser cette fonctionnalité pour améliorer l'expérience de navigation des utilisateurs dans l'interface utilisateur.

Navigation et sortie du groupe

Les lecteurs d'écran utilisaient traditionnellement l'attribut android:focusable pour déterminer quand ils devaient lire un ViewGroup, ou une collection d'objets View, comme une seule unité. De cette façon, les utilisateurs pourraient comprendre que les vues étaient logiquement liées entre elles.

Sous Android 8.1 et versions antérieures, vous devez marquer chaque objet View d'un ViewGroup comme étant non sélectionnable, et le ViewGroup lui-même comme sélectionnable. Avec cette disposition, certaines instances de View étaient marquées comme sélectionnables, ce qui rendait la navigation au clavier plus fastidieuse.

À partir d'Android 9, vous pouvez utiliser l'attribut android:screenReaderFocusable à la place de l'attribut android:focusable dans les cas où le fait de rendre un objet View sélectionnable peut avoir des conséquences indésirables. Les lecteurs d'écran placent le curseur sur tous les éléments qui ont défini android:screenReaderFocusable ou android:focusable sur true.

Actions pratiques

Android 9 prend désormais en charge l'exécution d'actions pratiques pour le compte des utilisateurs:

Interaction avec les info-bulles
Les fonctionnalités ajoutées au framework d'accessibilité vous permettent d'accéder aux info-bulles dans l'interface utilisateur d'une application. Utilisez getTooltipText() pour lire le texte d'une info-bulle, et utilisez ACTION_SHOW_TOOLTIP et ACTION_HIDE_TOOLTIP pour indiquer aux instances de View d'afficher ou de masquer leurs info-bulles.
Actions générales ajoutées
Android 9 permet d'effectuer deux actions supplémentaires sur l'appareil dans la classe AccessibilityService. Votre service peut aider les utilisateurs à verrouiller leur appareil et à effectuer des captures d'écran à l'aide des actions GLOBAL_ACTION_LOCK_SCREEN et GLOBAL_ACTION_TAKE_SCREENSHOT, respectivement.

Détails sur les modifications des fenêtres

Android 9 facilite le suivi des mises à jour des fenêtres d'une application lorsqu'une application redessine plusieurs fenêtres simultanément. Lorsqu'un événement TYPE_WINDOWS_CHANGED se produit, utilisez l'API getWindowChanges() pour déterminer dans quelle mesure les fenêtres ont changé. Lors d'une mise à jour multifenêtre, chaque fenêtre génère son propre ensemble d'événements. La méthode getSource() renvoie la vue racine de la fenêtre associée à chaque événement.

Si une application a défini des titres de volet d'accessibilité pour ses objets View, votre service peut reconnaître quand l'UI de l'application est mise à jour. Lorsqu'un événement TYPE_WINDOW_STATE_CHANGED se produit, utilisez les types renvoyés par getContentChangeTypes() pour déterminer dans quelle mesure la fenêtre a changé. Par exemple, le framework peut détecter si un volet change de titre ou disparaît.

Rotation

Pour éliminer les rotations involontaires, nous avons ajouté un mode qui épingle l'orientation actuelle même si la position de l'appareil change. Les utilisateurs peuvent déclencher la rotation manuellement en cas de besoin en appuyant sur un bouton dans la barre système.

L'impact sur la compatibilité des applications est minime dans la plupart des cas. Toutefois, si votre application utilise un comportement de rotation personnalisé ou utilise des paramètres d'orientation d'écran inhabituels, vous pouvez rencontrer des problèmes qui n'auraient pas été remarqués auparavant, lorsque la préférence de rotation des utilisateurs était toujours définie sur Portrait. Nous vous recommandons d'examiner le comportement de rotation dans toutes les activités clés de votre application et de vous assurer que tous les paramètres d'orientation de l'écran offrent toujours une expérience optimale.

Pour en savoir plus, consultez les modifications de comportement associées.

Mobile en rotation montrant un nouveau mode de rotation permettant aux utilisateurs de déclencher la rotation manuellement

Un nouveau mode de rotation permet aux utilisateurs de déclencher une rotation manuellement en cas de besoin à l'aide d'un bouton dans la barre système.

Texte

Android 9 intègre les fonctionnalités textuelles suivantes à la plate-forme:

  • Texte précalculé: la classe PrecomputedText améliore les performances de rendu de texte en vous permettant de calculer et de mettre en cache les informations requises à l'avance. Elle permet également à votre application d'effectuer la mise en page du texte en dehors du thread principal.

  • Loupe: la classe Magnifier est un widget de plate-forme qui fournit une API de loupe, ce qui permet une expérience cohérente avec la fonctionnalité de loupe dans toutes les applications.

  • Smart Linkify: Android 9 améliore la classe TextClassifier, qui exploite le machine learning pour identifier certaines entités dans le texte sélectionné et suggérer des actions. Par exemple, TextClassifier peut permettre à votre application de détecter que l'utilisateur a sélectionné un numéro de téléphone. Votre application peut ensuite suggérer à l'utilisateur de passer un appel téléphonique à l'aide de ce numéro. Les fonctionnalités de TextClassifier remplacent celles de la classe Linkify.

  • Mise en page du texte: plusieurs méthodes et attributs pratiques facilitent l'implémentation de votre interface utilisateur. Pour en savoir plus, consultez la documentation de référence sur TextView.

Conversion anticipée des fichiers DEX via ART

Sur les appareils équipés d'Android 9 ou version ultérieure, le compilateur en avance (ART) Android Runtime optimise en outre les fichiers au format Dalvik Executable (DEX) compressés en convertissant les fichiers DEX d'un package d'application en une représentation plus compacte. Cette modification permet à votre application de démarrer plus rapidement et d'utiliser moins d'espace disque et de RAM.

Cette amélioration profite particulièrement aux appareils d'entrée de gamme présentant des vitesses d'E/S de disque plus lentes.

Traçage système sur l'appareil

Android 9 vous permet d'enregistrer les traces système de votre appareil, puis de partager un rapport de ces enregistrements avec votre équipe de développement. Ce rapport accepte plusieurs formats, y compris HTML.

En collectant ces traces, vous pouvez capturer les données temporelles liées aux processus et aux threads de votre application, et afficher d'autres types d'états d'appareil significatifs à l'échelle mondiale.

Pour en savoir plus sur cet outil, consultez Effectuer un traçage système sur l'appareil.