Android 9 (niveau d'API 28) offre aux utilisateurs et aux développeurs de nouvelles fonctionnalités et capacités de qualité. 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. Consultez également les modifications de comportement d'Android 9 pour savoir dans quels domaines les changements de plate-forme peuvent affecter vos applications.
Positionnement en intérieur avec Wi-Fi RTT

Android 9 ajoute la compatibilité de la plate-forme avec le protocole Wi-Fi IEEE 802.11-2016, également appelé Wi-Fi Round-Trip-Time (RTT), pour vous permettre de profiter du positionnement en intérieur dans vos applications.
Sur les appareils équipés d'Android 9 et compatibles avec le matériel, vos applications peuvent utiliser les API RTT pour mesurer la distance par rapport aux points d'accès (PA) Wi-Fi compatibles avec RTT à proximité. Les services de localisation et la recherche Wi-Fi doivent être activés sur l'appareil (sous Paramètres > Localisation), et 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 préserver la confidentialité, seul le téléphone est en mesure de déterminer la distance par rapport au point d'accès. Les points d'accès ne disposent pas de cette information.
Si votre appareil mesure la distance à trois points d'accès ou plus, vous pouvez utiliser un algorithme de multilateration pour estimer la position de l'appareil qui correspond le mieux à ces mesures. Le résultat est généralement précis à un ou deux mètres près.
Grâce à cette précision, vous pouvez créer de nouvelles expériences, comme la navigation dans les bâtiments et les services géolocalisés précis, tels que le contrôle vocal non ambigu (par exemple, "Allume cette lumière") et les informations basées sur la localisation (par exemple, "Y a-t-il des offres spéciales pour ce produit ?").
Consultez l'API WiFi RTT en action dans l'application de démonstration Android WifiRttScan.
Pour en savoir plus, consultez Détection de la position via le Wi-Fi : mesure de la distance avec RTT.
Compatibilité avec les encoches

Tester l'encoche à l'aide de l'émulateur
Android 9 est compatible avec les derniers écrans bord à bord qui contiennent des encoches pour les caméras et les haut-parleurs. La classe DisplayCutout
vous permet de connaître l'emplacement et la forme des zones non fonctionnelles où le contenu ne doit pas s'afficher. Pour déterminer l'existence et l'emplacement de ces zones découpées, utilisez la méthode getDisplayCutout()
.
Un nouvel attribut de mise en page de fenêtre, layoutInDisplayCutoutMode
, permet à votre application de mettre en page son contenu autour des encoches d'un appareil. Vous pouvez définir cet attribut sur l'une des valeurs suivantes :
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
Vous pouvez simuler une encoche sur n'importe quel appareil ou émulateur exécutant Android 9 comme suit :
- Activez les options pour les développeurs.
- Sur l'écran Options pour les développeurs, faites défiler l'écran jusqu'à la section Dessin, puis sélectionnez Simuler un écran avec encoche.
- Sélectionnez la taille de l'encoche.
Notifications
Android 9 apporte plusieurs améliorations aux notifications, qui sont toutes disponibles pour les développeurs ciblant le niveau d'API 28 et supérieur.

MessagingStyle avec photo jointe.

MessagingStyle avec réponses et conversation.
Pour obtenir un exemple de code utilisant les notifications, y compris les fonctionnalités d'Android 9, consultez l'exemple People.
Expérience de messagerie améliorée
Sous Android 7.0 (niveau d'API 24) et versions ultérieures, vous pouvez ajouter une action permettant de répondre aux messages ou de saisir un autre texte directement depuis une notification. Android 9 améliore cette fonctionnalité grâce aux améliorations suivantes :
Prise en charge simplifiée des participants à une conversation : la classe
Person
permet d'identifier les personnes impliquées dans une conversation, y compris leurs avatars et leurs URI. De nombreuses autres API, telles queaddMessage()
, utilisent désormais la classePerson
au lieu d'une classeCharSequence
. La classePerson
est également compatible avec le schéma 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()
dans le message pour afficher une image. L'extrait de code suivant montre comment créer unPerson
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 l'
EXTRA_REMOTE_INPUT_DRAFT
envoyé par le système lorsqu'un utilisateur ferme par inadvertance une notification de message. Vous pouvez utiliser cet extra pour préremplir les champs de texte de l'application afin que les utilisateurs puissent terminer leur réponse.Identifier si une conversation est une conversation de groupe : vous pouvez utiliser
setGroupConversation()
pour identifier délibérément une conversation comme étant de groupe ou non.Définissez l'action sémantique pour un intent : la méthode
setSemanticAction()
vous permet de donner une signification sémantique à une action, comme "marquer comme lu", "supprimer", "répondre", etc.Réponse suggérée : Android 9 est compatible avec les mêmes réponses suggérées que celles disponibles dans votre application de chat. Utilisez
RemoteInput.setChoices()
pour fournir un éventail de réponses standards à l'utilisateur.
Paramètres de la chaîne, diffusions et mode Ne pas déranger
Android 8.0 a introduit les canaux de notification, qui vous permettent de créer un canal personnalisable par l'utilisateur pour chaque type de notification que vous souhaitez afficher. Android 9 simplifie les paramètres des canaux de notification en apportant les modifications suivantes :
Blocage des groupes de chaînes : les utilisateurs peuvent désormais bloquer des groupes entiers de chaînes dans les paramètres de notification d'une application. Vous pouvez utiliser la méthode
isBlocked()
pour identifier quand un groupe est bloqué et, par conséquent, ne pas envoyer de notifications pour les chaînes de ce groupe.De plus, votre application peut interroger les paramètres actuels du groupe de chaînes à l'aide de la nouvelle méthode
getNotificationChannelGroup()
.Nouveaux types d'intent 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 de la chaîne ou du groupe bloqué peut écouter ces intents et réagir en conséquence. Pour en savoir plus sur ces actions et extras d'intent, consultez la liste des constantes mises à jour dans la référence
NotificationManager
. Pour savoir comment réagir aux intents de diffusion, consultez la section Diffusions.NotificationManager.Policy
comporte trois nouvelles catégories de priorité pour le mode Ne pas déranger :PRIORITY_CATEGORY_ALARMS
: les alarmes sont prioritaires.PRIORITY_CATEGORY_MEDIA
donne la priorité aux sons provenant de sources multimédias, comme les contenus multimédias et la navigation vocale.PRIORITY_CATEGORY_SYSTEM
donne la priorité aux sons système.
NotificationManager.Policy
dispose également de sept nouvelles constantes Ne pas déranger que vous pouvez utiliser pour supprimer les interruptions visuelles :SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
empêche la notification de lancer une activité en plein écran.SUPPRESSED_EFFECT_LIGHTS
bloque les voyants de notification.SUPPRESSED_EFFECT_PEEK
empêche les notifications de s'afficher brièvement ("aperçu").SUPPRESSED_EFFECT_STATUS_BAR
empêche les notifications de s'afficher dans la barre d'état sur les appareils compatibles.SUPPRESSED_EFFECT_BADGE
bloque les badges sur les appareils compatibles. Pour en savoir plus, consultez Modifier un badge de notification.SUPPRESSED_EFFECT_AMBIENT
bloque les notifications sur les appareils compatibles avec l'affichage ambiant.SUPPRESSED_EFFECT_NOTIFICATION_LIST
empêche les notifications de s'afficher dans la vue Liste sur les appareils compatibles avec cette vue, comme le volet de notifications ou l'écran de verrouillage.
Compatibilité multi-caméra et mises à jour de l'appareil photo
Sur les appareils équipés d'Android 9, vous pouvez accéder simultanément aux flux de deux caméras physiques ou plus. Sur les appareils équipés de deux caméras avant ou arrière, vous pouvez créer des fonctionnalités innovantes impossibles avec une seule caméra, comme le zoom fluide, l'effet bokeh et la vision stéréo. L'API vous permet également d'appeler un flux de caméras logiques ou fusionnées qui bascule automatiquement entre deux caméras ou plus.
Parmi les autres améliorations apportées à la caméra, citons des paramètres de session supplémentaires qui permettent de réduire les délais lors de la capture initiale, ainsi que le partage de surface qui permet aux clients de la caméra de gérer divers cas d'utilisation sans avoir à arrêter et à redémarrer le flux de la caméra. Nous avons également ajouté des API pour la prise en charge du flash basée sur l'écran et l'accès aux codes temporels OIS pour la stabilisation d'image au niveau de l'application et les effets spéciaux.
Dans Android 9, l'API multicaméra est compatible avec les caméras monochromes pour les appareils dotés des fonctionnalités FULL
ou LIMITED
.
La sortie monochrome est obtenue via le format YUV_420_888
avec Y comme nuance de gris, U (Cb) comme 128 et V (Cr) comme 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 au lieu 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, commencez par appeler 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 ou un WebP animé, decodeDrawable()
renvoie un Drawable
qui est une instance de la classe AnimatedImageDrawable
.
Vous pouvez définir les propriétés d'une image de différentes manières :
- Pour mettre à l'échelle l'image décodée à une taille exacte, transmettez les dimensions cibles dans
setTargetSize()
. Vous pouvez également mettre à l'échelle des images à l'aide d'une taille d'échantillon. Transmettez la taille de l'é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, comme des coins arrondis ou des masques circulaires. 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 manière similaire à AnimatedVectorDrawable
, dans la mesure où le thread de rendu pilote les animations de AnimatedImageDrawable
.
Le thread de rendu utilise également un thread de worker pour le décodage, afin que celui-ci 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 d'UI de votre application.
Une AnimatedImageDrawable
peut être décodée à 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 qui vous permettent 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'images HEIF et API Media
Android 9 offre une compatibilité intégrée avec la technologie High Dynamic Range (HDR) VP9 Profile 2. Vous pouvez ainsi proposer des films en qualité HDR à vos utilisateurs depuis YouTube, Play Films et d'autres sources sur les appareils compatibles avec la technologie HDR.
Android 9 permet également d'encoder des images au format HEIF (High Efficiency Image File ou HEIC), ce qui améliore la compression et réduit l'espace de stockage et 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é de la plate-forme avec les appareils Android 9, il est facile d'envoyer et d'utiliser des images HEIF depuis 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 de JPEG en 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 média sont également disponibles dans les 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, et pour mieux contrôler les niveaux de sécurité et les arrêts sécurisés. Pour en savoir plus, consultez le rapport sur les différences entre les API.
Dans Android 9, l'API AAudio ajoute la prise en charge de 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 adaptés aux applications de caméscope ou de VoIP. 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 de la dynamique.
Cette classe vous permet de créer des effets audio basés sur des canaux, y compris l'égalisation, la compression multibande et le limiteur, à plusieurs étapes. 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é au 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 des données, signaler la prélecture 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. Lorsqu'il est connecté à un réseau non limité, 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 le travail. Lorsque votre job 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, qui ne répondra peut-être pas à vos exigences, ce qui entraînera une utilisation involontaire 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 les appareils Android. Android 9 étend et améliore l'API en ajoutant la prise en charge de neuf nouvelles opérations :
- Opérations mathématiques au niveau des éléments :
- Opérations sur les tableaux :
Problème connu : lors de la transmission de tenseurs ANEURALNETWORKS_TENSOR_QUANT8_ASYMM
à l'opération ANEURALNETWORKS_PAD
, ce qui est possible sur Android 9 et les versions ultérieures, la sortie de NNAPI peut ne pas correspondre à celle des frameworks de machine learning de niveau supérieur, tels que TensorFlow Lite. À la place, vous devez transmettre uniquement
ANEURALNETWORKS_TENSOR_FLOAT32
jusqu'à ce que le problème soit résolu.
De plus, l'API introduit 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 aussi faibles que 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 davantage l'expérience utilisateur lors du remplissage de formulaires. Pour en savoir plus sur l'utilisation des fonctionnalités de saisie automatique dans votre application, consultez le guide Autofill Framework.
Renforcement de la sécurité
Android 9 offre de nouvelles fonctionnalités de sécurité, qui sont 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 la confirmation de protection Android. Lorsque vous utilisez ce workflow, votre application affiche une invite demandant à l'utilisateur d'approuver une courte déclaration. Cette déclaration permet à l'application de confirmer que l'utilisateur souhaite effectuer une transaction sensible, comme un paiement.
Si l'utilisateur accepte la déclaration, Android Keystore reçoit et stocke une signature cryptographique protégée par un code d'authentification de message à 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 savoir comment ajouter la prise en charge d'Android Protected Confirmation, consultez le guide Android Protected Confirmation.
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 une apparence, une convivialité et un emplacement standardisés pour la boîte de dialogue, ce qui permet aux utilisateurs d'être plus sûrs de s'authentifier auprès d'un vérificateur d'identifiants biométriques fiable.
Si votre application utilise FingerprintManager
pour afficher une boîte de dialogue d'authentification par empreinte digitale aux utilisateurs, passez à l'utilisation de 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 d'une version ultérieure peuvent disposer de StrongBox KeyMint (anciennement Keymaster), une implémentation du HAL KeyMint (anciennement Keymaster) qui se trouve dans un module matériel de sécurité. Le module contient les éléments suivants :
- Son propre processeur.
- Stockage sécurisé.
- Un véritable générateur de nombres aléatoires.
- Des 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 KeyMint, le système confirme l'intégrité d'une clé avec l'environnement d'exécution sécurisé (TEE).
Pour en savoir plus sur l'utilisation de StrongBox KeyMint, consultez Module de sécurité matérielle.
Importer des clés sécurisées dans le Keystore
Android 9 renforce la sécurité du 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é ASN.1. KeyMint 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 APK avec rotation des clés
Android 9 est compatible avec le schéma de signature des APK 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 il est désormais signé.
Découvrez comment alterner les clés à l'aide de apksigner
.
Option permettant d'autoriser le déchiffrement de la clé uniquement sur les appareils déverrouillés
Android 9 introduit l'indicateur unlockedDeviceRequired
. Cette option détermine si le Keystore exige que l'écran soit déverrouillé avant d'autoriser le déchiffrement des données en transit ou stockées à l'aide de la clé spécifiée. Ces types de clés sont bien adaptés au chiffrement de données sensibles à stocker sur le disque, telles que les données de santé ou d'entreprise. Ce signalement offre aux utilisateurs une plus grande assurance 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 protéger une clé contre le déchiffrement lorsque l'appareil est verrouillé, activez le flag 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 (Triple Data Encryption Algorithm). Si votre application interagit avec des systèmes anciens qui nécessitent Triple DES, utilisez ce type de chiffrement lorsque vous chiffrez des identifiants sensibles.
Pour en savoir plus sur la sécurisation de votre application, consultez Sécurité pour les développeurs Android.
Abandon du WPS
La configuration Wi-Fi protégée (WPS) 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 avec chiffrement côté client
Android 9 permet de chiffrer les sauvegardes Android à l'aide d'une clé secrète définie côté client. Cette compatibilité est activée automatiquement lorsque les conditions suivantes sont remplies :
- L'utilisateur a activé la sauvegarde avec Android 9 ou version ultérieure.
- L'utilisateur a défini un verrouillage de l'écran pour son appareil, qui nécessite un code, un schéma ou un mot de passe pour le déverrouiller.
Lorsque cette mesure de confidentialité est activée, le code, le schéma ou le mot de passe de l'appareil sont requis pour restaurer les données à partir des sauvegardes effectuées par l'appareil de l'utilisateur. Pour en savoir plus sur la technologie qui sous-tend cette fonctionnalité, consultez le livre blanc Service Google Cloud Key Vault.
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 des données sur les appareils Android, consultez Présentation de la sauvegarde des données.
Accessibilité
Android 9 apporte des améliorations au framework d'accessibilité, ce qui permet d'offrir une expérience encore meilleure aux utilisateurs de votre application.
Sémantique de navigation
Les attributs ajoutés dans Android 9 vous permettent de définir plus facilement la façon dont les services d'accessibilité, en particulier les lecteurs d'écran, naviguent d'une partie de l'écran à une autre. Ces attributs peuvent aider les utilisateurs malvoyants à parcourir rapidement le texte de l'UI de votre application et à faire une sélection.
Par exemple, dans une application d'achat, un lecteur d'écran peut aider les utilisateurs à passer directement d'une catégorie de promotions à la suivante, sans avoir à lire tous les éléments d'une catégorie avant de passer à la suivante.
Titres accessibles pour les volets
Dans Android 8.1 (niveau d'API 27) et les 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 se composent d'éléments d'interface utilisateur regroupés de manière logique et visuellement liés, 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 de volet 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'UI.
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 les titres
Si votre application affiche du contenu textuel qui inclut des titres logiques, définissez l'attribut android:accessibilityHeading
sur true
pour les instances de View
qui représentent ces titres. En ajoutant ces titres, vous permettez aux services d'accessibilité d'aider les utilisateurs à naviguer directement d'un titre à l'autre. Tout service d'accessibilité peut utiliser cette fonctionnalité pour améliorer l'expérience de navigation dans l'UI des utilisateurs.
Navigation et sortie de groupe
Les lecteurs d'écran ont traditionnellement utilisé l'attribut android:focusable
pour déterminer quand ils doivent lire un ViewGroup
ou une collection d'objets View
comme une seule unité. De cette façon, les utilisateurs pouvaient comprendre que les vues étaient logiquement liées les unes aux autres.
Dans Android 8.1 et versions antérieures, vous devez marquer chaque objet View
dans un ViewGroup
comme non focusable et le ViewGroup
lui-même comme focusable. Cette disposition a entraîné le marquage de certaines instances de View
comme pouvant être sélectionnées, ce qui a rendu la navigation au clavier plus difficile.
À partir d'Android 9, vous pouvez utiliser l'attribut android:screenReaderFocusable
à la place de l'attribut android:focusable
dans les situations où rendre un objet View
sélectionnable a des conséquences indésirables. Les lecteurs d'écran mettent l'accent sur tous les éléments pour lesquels android:screenReaderFocusable
ou android:focusable
sont définis sur true
.
Actions pratiques
Android 9 permet d'effectuer des actions pratiques au nom des utilisateurs :
- Interaction avec les info-bulles
- Les fonctionnalités ajoutées dans le framework d'accessibilité vous permettent d'accéder aux info-bulles dans l'UI d'une application. Utilisez
getTooltipText()
pour lire le texte d'une info-bulle, ainsi qu'ACTION_SHOW_TOOLTIP
etACTION_HIDE_TOOLTIP
pour indiquer aux instances deView
d'afficher ou de masquer leurs info-bulles. - Ajout d'actions globales
- Android 9 est compatible avec deux actions d'appareil supplémentaires dans la classe
AccessibilityService
. Votre service peut aider les utilisateurs à verrouiller leurs appareils et à prendre des captures d'écran à l'aide des actionsGLOBAL_ACTION_LOCK_SCREEN
etGLOBAL_ACTION_TAKE_SCREENSHOT
, respectivement.
Détails des modifications des fenêtres
Android 9 facilite le suivi des mises à jour des fenêtres d'une application lorsqu'elle 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 été modifiée. Par exemple, le framework peut détecter si un volet contient un nouveau titre ou s'il a disparu.
Rotation
Pour éviter les rotations involontaires, nous avons ajouté un mode qui bloque l'orientation actuelle même si la position de l'appareil change. Les utilisateurs peuvent déclencher la rotation manuellement si nécessaire en appuyant sur un bouton de la barre système.
Dans la plupart des cas, l'impact sur la compatibilité des applications est minime. Toutefois, si votre application présente un comportement de rotation personnalisé ou utilise des paramètres d'orientation d'écran inhabituels, vous risquez de rencontrer des problèmes qui seraient passés inaperçus auparavant, lorsque la préférence de rotation de l'utilisateur était toujours définie sur "Portrait". Nous vous encourageons à examiner le comportement de rotation dans toutes les activités clés de votre application et à vous assurer que tous vos paramètres d'orientation de l'écran offrent toujours une expérience optimale.
Pour en savoir plus, consultez les modifications de comportement associées.

Un nouveau mode de rotation permet aux utilisateurs de déclencher la rotation manuellement si nécessaire à l'aide d'un bouton de la barre système.
Texte
Android 9 apporte les fonctionnalités liées au texte suivantes à la plate-forme :
Texte précalculé : la classe
PrecomputedText
améliore les performances de rendu du texte en vous permettant de calculer et de mettre en cache les informations requises à l'avance. Il 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, permettant une expérience de loupe cohérente dans toutes les applications.Linkify intelligent : Android 9 améliore la classe
TextClassifier
, qui utilise 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 alors suggérer à l'utilisateur de passer un appel téléphonique à l'aide de ce numéro. Les fonctionnalités deTextClassifier
remplacent celles de la classeLinkify
.Mise en page du texte : plusieurs méthodes et attributs pratiques facilitent l'implémentation de la conception de votre UI. Pour en savoir plus, consultez la documentation de référence sur
TextView
.
Conversion AOT des fichiers DEX par ART
Sur les appareils équipés d'Android 9 ou version ultérieure, le compilateur anticipé (AOT) Android Runtime (ART) optimise davantage les fichiers DEX (Dalvik Executable) compressés en convertissant les fichiers DEX d'un package d'application en une représentation plus compacte. Ce changement permet à votre application de démarrer plus rapidement et de consommer moins d'espace disque et de RAM.
Cette amélioration profite particulièrement aux appareils d'entrée de gamme dont la vitesse d'E/S disque est plus lente.
Traçage système sur l'appareil
Android 9 vous permet d'enregistrer des traces système depuis votre appareil, puis de partager un rapport de ces enregistrements avec votre équipe de développement. Ce rapport est disponible dans plusieurs formats, y compris HTML.
En collectant ces traces, vous pouvez capturer des données de timing liées aux processus et aux threads de votre application, et afficher d'autres types d'états d'appareil importants à l'échelle mondiale.
Pour en savoir plus sur cet outil, consultez Effectuer un traçage système sur l'appareil.