Fonctionnalités et API d'Android 8.0

Android 8.0 (niveau d'API 26) introduit de nombreuses nouvelles fonctionnalités pour les utilisateurs et les développeurs. Ce document présente les nouveautés pour les développeurs.

Veillez également à consulter Changements de comportement dans Android 8.0 pour en savoir plus sur les domaines dans lesquels les modifications de la plate-forme peuvent affecter vos applications.

Expérience utilisateur

Mode Picture-in-picture

Picture-in-picture sur Android 8.0

Android 8.0 (niveau d'API 26) permet de lancer des activités en mode Picture-in-picture (PIP). PIP est un type particulier de mode multifenêtre principalement utilisé pour la lecture de vidéos. À l'origine, le mode PIP n'était disponible que pour Android TV. Avec Android 8.0, la fonctionnalité est disponible sur d'autres appareils Android.

Lorsqu'une activité est en mode PIP, elle est suspendue, mais elle doit continuer à afficher du contenu. C'est pourquoi vous devez vous assurer que votre application ne suspend pas la lecture dans son gestionnaire onPause(). Mettez la vidéo en pause dans onStop() et reprenez la lecture dans onStart(). Pour en savoir plus, consultez la section Cycle de vie du mode multifenêtre.

Pour spécifier que votre activité peut utiliser le mode PIP, définissez android:supportsPictureInPicture sur "true" dans le fichier manifeste. (À partir d'Android 8.0, PIP ne nécessite pas l'attribut de fichier manifeste android:resizeableActivity. Toutefois, vous devez définir android:resizeableActivity sur "true" si votre activité est compatible avec d'autres modes multifenêtres.

Android 8.0 (niveau d'API 26) introduit un nouvel objet, PictureInPictureParams, que vous transmettez aux méthodes PIP pour spécifier le comportement d'une activité en mode PIP. Cet objet spécifie des propriétés telles que le format préféré de l'activité.

Les méthodes PIP existantes décrites dans la section Ajouter Picture-in-picture peuvent désormais être utilisées sur tous les appareils Android, et pas seulement sur Android TV. De plus, Android 8.0 fournit les méthodes suivantes pour assurer la compatibilité avec le mode PIP:

  • Activity.enterPictureInPictureMode(PictureInPictureParams args) : place l'activité en mode Picture-in-picture. Le format de l'activité et les autres paramètres de configuration sont spécifiés par args. Si des champs dans args sont vides, le système utilise les valeurs définies la dernière fois que vous avez appelé Activity.setPictureInPictureParams().

    L'activité spécifiée est placée dans un coin de l'écran. Le reste de l'écran est rempli avec l'activité précédente qui était affichée à l'écran. L'activité qui passe en mode PIP passe à l'état "Mis en pause", mais reste lancée. Si l'utilisateur appuie sur l'activité PIP, le système affiche un menu avec lequel il peut interagir. Aucun événement tactile n'atteint l'activité tant qu'elle est à l'état PIP.

  • Activity.setPictureInPictureParams() : met à jour les paramètres de configuration PIP d'une activité. Si l'activité est actuellement en mode PIP, les paramètres sont mis à jour. Cela est utile si le format de l'activité change. Si l'activité n'est pas en mode PIP, ces paramètres de configuration sont utilisés quelle que soit la méthode enterPictureInPictureMode() que vous appelez.

Notifications

Dans Android 8.0 (niveau d'API 26), nous avons repensé les notifications pour permettre de gérer le comportement et les paramètres des notifications plus facilement et de manière plus cohérente. Ces modifications comprennent les opérations suivantes :

    Un menu de notification par appui prolongé sur Android 8.0 (niveau d'API 26).

    Les utilisateurs peuvent appuyer de manière prolongée sur les icônes du lanceur d'applications pour afficher les notifications dans Android 8.0.

  • Canaux de notification: Android 8.0 introduit des canaux de notification qui vous permettent de créer un canal personnalisable pour chaque type de notification que vous souhaitez afficher. Dans l'interface utilisateur, les canaux de notification sont appelés catégories de notification. Pour savoir comment mettre en œuvre des canaux de notification, consultez la section Gérer les canaux de notification.
  • Points de notification: Android 8.0 permet d'afficher des points, ou badges, sur les icônes de lanceur d'applications. Les pastilles de notification indiquent la présence de notifications que l'utilisateur n'a pas encore ignorées ni traitées. Pour savoir comment utiliser les pastilles de notification, consultez Badges de notification.
  • Répétition: les utilisateurs peuvent mettre en attente les notifications. Elles disparaissent alors pendant un certain temps avant de réapparaître. Les notifications réapparaissent avec le même niveau d'importance. Les applications peuvent supprimer ou modifier une notification en attente, mais la modification d'une notification mise en attente n'entraîne pas sa réapparition.
  • Délais d'expiration des notifications: vous pouvez définir un délai avant expiration lorsque vous créez une notification à l'aide de setTimeoutAfter(). Vous pouvez utiliser cette méthode pour spécifier le délai au terme duquel une notification doit être annulée. Si nécessaire, vous pouvez annuler une notification avant l'expiration du délai spécifié.
  • Paramètres de notification: vous pouvez appeler setSettingsText() pour définir le texte qui s'affiche lorsque vous créez un lien vers les paramètres de notification de votre application à partir d'une notification à l'aide de l'intent Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES. Le système peut fournir les extras suivants afin de filtrer les paramètres que votre application doit présenter aux utilisateurs: EXTRA_CHANNEL_ID, NOTIFICATION_TAG et NOTIFICATION_ID.
  • Fermeture des notifications: les utilisateurs peuvent ignorer les notifications eux-mêmes. Les applications peuvent les supprimer par programmation. Vous pouvez déterminer quand une notification est ignorée et pourquoi en implémentant la méthode onNotificationRemoved() à partir de la classe NotificationListenerService.
  • Couleurs d'arrière-plan: vous pouvez définir et activer une couleur d'arrière-plan pour une notification. N'utilisez cette fonctionnalité dans les notifications que pour les tâches en cours qui sont essentielles pour un utilisateur. Par exemple, vous pouvez définir une couleur d'arrière-plan pour les notifications concernant un itinéraire ou un appel téléphonique en cours. Vous pouvez également définir la couleur d'arrière-plan souhaitée à l'aide de setColor(). Cela vous permet d'utiliser setColorized() afin d'activer l'utilisation d'une couleur d'arrière-plan pour une notification.
  • Style de message: sous Android 8.0, les notifications qui utilisent la classe MessagingStyle affichent davantage de contenu dans leur forme réduite. Vous devez utiliser la classe MessagingStyle pour les notifications liées à la messagerie. Vous pouvez également utiliser la méthode addHistoricMessage() pour fournir du contexte à une conversation en ajoutant l'historique des messages aux notifications liées à la messagerie.

Autofill Framework

La création d'un compte, la connexion et les transactions par carte de crédit prennent du temps et sont sources d'erreurs. Les utilisateurs peuvent facilement être frustrés par les applications qui nécessitent ce type de tâches répétitives.

Android 8.0 (niveau d'API 26) facilite le remplissage de formulaires, tels que les formulaires de connexion et de carte de crédit, grâce à l'introduction du framework de saisie automatique. Les applications existantes et nouvelles fonctionnent avec Autofill Framework une fois que l'utilisateur a activé la saisie automatique.

Vous pouvez prendre certaines mesures pour optimiser le fonctionnement de votre application avec le framework. Pour en savoir plus, consultez la présentation de Autofill Framework.

Polices téléchargeables

Android 8.0 (niveau d'API 26) et Android Support Library 26 vous permettent de demander des polices à une application de fournisseur au lieu de regrouper les polices dans l'APK ou d'autoriser celui-ci à télécharger des polices. Cette fonctionnalité réduit la taille de votre APK, augmente le taux de réussite d'installation de l'application et permet à plusieurs applications de partager la même police.

Pour en savoir plus sur le téléchargement de polices, consultez Polices téléchargeables.

Polices XML

Android 8.0 (niveau d'API 26) introduit une nouvelle fonctionnalité, Fonts in XML, qui vous permet d'utiliser des polices en tant que ressources. Il n'est donc pas nécessaire de regrouper les polices en tant qu'éléments. Les polices sont compilées dans le fichier R et sont automatiquement disponibles en tant que ressource dans le système. Vous pouvez ensuite accéder à ces polices à l'aide d'un nouveau type de ressource, font.

La bibliothèque Support 26 est entièrement compatible avec cette fonctionnalité sur les appareils exécutant les versions d'API 14 et ultérieures.

Pour en savoir plus sur l'utilisation des polices en tant que ressources et la récupération des polices système, consultez la section Polices XML.

Redimensionner automatiquement TextView

Android 8.0 (niveau d'API 26) vous permet de définir automatiquement la taille de votre texte développé ou réduit en fonction de celle de TextView. Cela signifie qu'il est beaucoup plus facile d'optimiser la taille du texte sur différents écrans ou avec du contenu dynamique. Pour en savoir plus sur le dimensionnement automatique de TextView dans Android 8.0, consultez la section Ajuster automatiquement TextView.

Icônes adaptatives

Android 8.0 (niveau d'API 26) introduit des icônes de lanceur adaptatives. Les icônes adaptatives sont compatibles avec les effets visuels et peuvent afficher différentes formes sur différents modèles d'appareils. Pour savoir comment créer des icônes adaptatives, consultez le guide sur les icônes adaptatives.

Gestion des couleurs

Les développeurs Android d'applications d'imagerie peuvent désormais tirer parti des nouveaux appareils dotés d'un écran à large gamme de couleurs. Pour afficher des images à large gamme de couleurs, les applications doivent activer un indicateur dans leur fichier manifeste (par activité) et charger des bitmaps avec un profil de couleur large intégré (AdobeRGB, Pro Photo RVB, DCI-P3, etc.).

API WebView

Android 8.0 fournit plusieurs API pour vous aider à gérer les objets WebView qui affichent du contenu Web dans votre application. Ces API, qui améliorent la stabilité et la sécurité de votre application, incluent les suivantes:

  • Version de l'API
  • API Google SafeBrowsing
  • API Completed Handle
  • API Renderer Importance

Pour en savoir plus sur l'utilisation de ces API, consultez Gérer les classes WebView.

La classe WebView inclut désormais une API Safe Browsing pour améliorer la sécurité de la navigation Web. Pour en savoir plus, consultez la page API Google Safe Browsing.

Épingler des raccourcis et des widgets

Android 8.0 (niveau d'API 26) permet d'épingler des raccourcis et des widgets dans l'application. Dans votre application, vous pouvez créer des raccourcis et des widgets épinglés pour les lanceurs d'applications compatibles, sous réserve de l'autorisation de l'utilisateur.

Pour en savoir plus, consultez le guide de la fonctionnalité Épingler des raccourcis et des widgets.

Format d'écran maximal

Android 8.0 (niveau d'API 26) apporte des modifications à la configuration du format maximal d'une application.

Tout d'abord, Android 8.0 introduit l'attribut maxAspectRatio, que vous pouvez utiliser pour définir le format maximal de votre application. De plus, sous Android 8.0 et versions ultérieures, le format maximal par défaut d'une application correspond au format natif de l'appareil sur lequel l'application est exécutée.

Pour en savoir plus sur la déclaration du format maximal, consultez la page Compatibilité avec plusieurs écrans.

Compatibilité multi-écran

À partir d'Android 8.0 (niveau d'API 26), la plate-forme offre une compatibilité améliorée pour plusieurs écrans. Si une activité est compatible avec le mode multifenêtre et s'exécute sur un appareil doté de plusieurs écrans, les utilisateurs peuvent la déplacer d'un écran à un autre. Lorsqu'une application lance une activité, elle peut spécifier l'affichage sur lequel elle doit s'exécuter.

Remarque : Si une activité est compatible avec le mode multifenêtre, Android 8.0 active automatiquement la compatibilité multi-écran pour cette activité. Nous vous recommandons de tester votre application pour vous assurer qu'elle fonctionne correctement dans un environnement multi-écran.

Une seule activité à la fois peut être réactivée, même si l'application dispose de plusieurs écrans. L'activité ciblée est réactivée. Toutes les autres activités visibles sont mises en pause, mais ne sont pas arrêtées. Pour en savoir plus sur le cycle de vie d'une activité lorsque plusieurs activités sont visibles, consultez la section Cycle de vie multifenêtre.

Lorsqu'un utilisateur déplace une activité d'un écran à un autre, le système la redimensionne et modifie l'environnement d'exécution si nécessaire. Votre activité peut gérer elle-même la modification de configuration, ou permettre au système de détruire le processus contenant votre activité et de la recréer avec les nouvelles dimensions. Pour en savoir plus, consultez Gérer les modifications de configuration.

ActivityOptions fournit deux nouvelles méthodes pour accepter plusieurs écrans:

setLaunchDisplayId()
Spécifie l'affichage sur lequel l'activité doit s'afficher lorsqu'elle est lancée.
getLaunchDisplayId()
Renvoie l'écran de lancement actuel de l'activité.

L'interface système adb est étendue pour prendre en charge plusieurs écrans. La commande shell start peut maintenant être utilisée pour lancer une activité et spécifier l'affichage cible de l'activité:

adb shell start <activity_name> --display <display_id>

Marges et marge intérieure de mise en page unifiées

Android 8.0 (niveau d'API 26) vous permet de spécifier plus facilement les cas où les côtés opposés d'un élément View utilisent la même marge ou la même marge intérieure. Plus précisément, vous pouvez désormais utiliser les attributs suivants dans vos fichiers XML de mise en page:

Remarque:Si vous personnalisez la logique de votre application pour l'adapter à différentes langues et cultures, y compris l'orientation du texte, n'oubliez pas que ces attributs n'affectent pas les valeurs de layout_marginStart, layout_marginEnd, paddingStart ou paddingEnd. Vous pouvez définir ces valeurs vous-même, en plus des nouveaux attributs de mise en page verticale et horizontale, pour créer un comportement de mise en page qui dépend de l'orientation du texte.

Capture du pointeur

Certaines applications, telles que les jeux, le bureau à distance et les clients de virtualisation, profitent considérablement du contrôle du pointeur de la souris. La capture du pointeur est une nouvelle fonctionnalité d'Android 8.0 (niveau d'API 26) qui offre un tel contrôle en diffusant tous les événements de souris dans une vue sélectionnée de votre application.

À partir d'Android 8.0, un View de votre application peut demander la capture de pointeur et définir un écouteur pour traiter les événements de pointeur capturés. Le pointeur de la souris est masqué dans ce mode. La vue peut libérer la capture du pointeur lorsqu'elle n'a plus besoin des informations de la souris. Le système peut également libérer la capture du pointeur lorsque la vue perd son focus, par exemple lorsque l'utilisateur ouvre une autre application.

Pour en savoir plus sur l'utilisation de cette fonctionnalité dans votre application, consultez Capture de pointeur.

Catégories d'applis

Android 8.0 (niveau d'API 26) permet à chaque application de déclarer une catégorie à laquelle elle appartient, le cas échéant. Ces catégories permettent de regrouper des applications ayant un objectif ou une fonction similaires lors de leur présentation aux utilisateurs, par exemple pour la consommation des données, l'utilisation de la batterie ou l'utilisation du stockage. Vous pouvez définir une catégorie pour votre application en définissant l'attribut android:appCategory dans la balise <application> de votre fichier manifeste.

Lanceur d'applications Android TV

Android 8.0 (niveau d'API 26) inclut une nouvelle expérience d'écran d'accueil Android TV axée sur le contenu, disponible avec l'émulateur Android TV et l'image de l'appareil du Nexus Player pour Android 8.0. Le nouvel écran d'accueil organise le contenu vidéo en lignes correspondant aux chaînes, chacune contenant des programmes par une application du système. Les applications peuvent publier plusieurs chaînes, et les utilisateurs peuvent configurer celles qu'ils souhaitent voir sur l'écran d'accueil. L'écran d'accueil d'Android TV comprend également une ligne "Ma sélection", qui contient les programmes des applications en fonction des habitudes de visionnage de l'utilisateur. Les applications peuvent également fournir des aperçus vidéo, qui sont lus automatiquement lorsqu'un utilisateur sélectionne un programme. Les API permettant de remplir les canaux et les programmes font partie des API TvProvider, distribuées en tant que module de bibliothèque Android Support avec Android 8.0.

Animateur

À partir d'Android 8.0 (niveau d'API 26), l'API AnimatorSet prend désormais en charge la recherche et la lecture en sens inverse. La recherche vous permet de définir la position de l'animation définie à un moment précis. La lecture en sens inverse est utile si votre application inclut des animations pour des actions qui peuvent être annulées. Au lieu de définir deux ensembles d'animation distincts, vous pouvez lire le même en sens inverse.

Saisie et navigation

Groupes de navigation au clavier

Si une activité de votre application utilise une hiérarchie des vues complexe, comme celle de la figure 2, envisagez d'organiser des groupes d'éléments d'interface utilisateur en clusters pour faciliter la navigation entre eux au clavier. Sur les appareils Chromebook, les utilisateurs peuvent appuyer sur Méta+Tabulation ou Rechercher+Tabulation pour passer d'un cluster à un autre. Voici de bons exemples de clusters: les panneaux latéraux, les barres de navigation, les zones de contenu principales et les éléments pouvant contenir de nombreux éléments enfants.

Exemple d&#39;activité comprenant cinq clusters de navigation que l&#39;utilisateur peut parcourir à l&#39;aide du raccourci clavier du cluster de navigation. Les clusters apparaissent dans la disposition suivante: panneau supérieur, panneau latéral gauche, zone de contenu principal, panneau inférieur et bouton d&#39;action flottant.
Figure 2 : Activité contenant cinq clusters de navigation

Pour transformer un élément View ou ViewGroup en cluster, définissez l'attribut android:keyboardNavigationCluster sur true dans le fichier XML de mise en page de l'élément, ou transmettez true à setKeyboardNavigationCluster() dans la logique d'UI de votre application.

Remarque:Les clusters ne peuvent pas être imbriqués, bien que les clusters non imbriqués puissent apparaître à différents niveaux de la hiérarchie. Si vous essayez d'imbriquer des clusters, le framework ne traite que l'élément ViewGroup de niveau supérieur comme un cluster.

Sur les appareils dotés d'écrans tactiles, vous pouvez définir l'élément android:touchscreenBlocksFocus d'un objet ViewGroup désigné par un cluster sur true pour autoriser uniquement la navigation dans ce cluster et en dehors. Si vous appliquez cette configuration à un cluster, les utilisateurs ne peuvent pas utiliser la touche Tabulation ni les touches fléchées pour accéder au cluster ou en sortir. Ils doivent utiliser le clavier de navigation du cluster à la place.

Afficher le focus par défaut

Dans Android 8.0 (niveau d'API 26), vous pouvez attribuer le View qui doit être sélectionné après la reprise d'une activité (re)créée et après que l'utilisateur appuie sur une touche de navigation du clavier, comme la touche de tabulation. Pour appliquer ce paramètre "sélectionné par défaut", définissez l'attribut android:focusedByDefault d'un élément View sur true dans le fichier XML de mise en page contenant l'élément d'interface utilisateur, ou transmettez true à setFocusedByDefault() dans la logique d'UI de votre application.

Sortie vocale

Les activités et les services peuvent utiliser des instances de TextToSpeech pour dicter et prononcer du contenu. À partir d'Android 8.0 (niveau d'API 26), votre application peut obtenir des informations temporelles plus précises sur le moment où un moteur de synthèse vocale commence à énoncer des mots synthétisés individuels, à condition qu'il fournisse ces informations. Vous pouvez utiliser cette fonctionnalité pour attirer l'attention sur des mots spécifiques au fur et à mesure que le moteur de synthèse vocale les prononce.

Pour utiliser ces améliorations du moteur de synthèse vocale dans votre application, enregistrez une instance de UtteranceProgressListener. Dans le processus d'enregistrement, incluez un gestionnaire pour la méthode onRangeStart().

Le moteur de synthèse vocale appelle rangeStart() pour enregistrer le moment auquel il prévoit le début de la lecture audio d'une plage de texte spécifique. Lorsque le contenu audio de cette plage de texte commence à être lu, la méthode onRangeStart() de votre application s'exécute. Votre application peut ensuite répondre à ce rappel, par exemple en mettant en surbrillance la plage de texte associée à l'énoncé.

Pour en savoir plus sur le suivi de la progression de la lecture d'un moteur de synthèse vocale, consultez la documentation de référence sur la classe UtteranceProgressListener.

Système

Nouveaux détecteurs StrictMode

Android 8.0 (niveau d'API 26) ajoute trois nouveaux détecteurs StrictMode pour vous aider à identifier les bugs potentiels dans votre application:

  • detectUnbufferedIo() détecte quand votre application lit ou écrit des données sans mise en mémoire tampon, ce qui peut avoir un impact important sur les performances.
  • detectContentUriWithoutPermission() détecte lorsque votre application oublie accidentellement d'accorder des autorisations à une autre application lorsqu'elle démarre une activité en dehors de votre application.
  • detectUntaggedSockets() détecte quand votre application effectue du trafic réseau sans utiliser setThreadStatsTag(int) pour ajouter des tags à votre trafic à des fins de débogage.

Données en cache

Android 8.0 (niveau d'API 26) offre de meilleurs conseils et de meilleurs comportements concernant les données mises en cache. Chaque application se voit désormais attribuer un quota d'espace disque pour les données mises en cache, comme renvoyé par getCacheQuotaBytes(UUID).

Lorsque le système doit libérer de l'espace disque, il commence par supprimer les fichiers mis en cache des applications qui dépassent le quota alloué. Ainsi, si vous ne dépassez pas le quota alloué pour vos données mises en cache, vos fichiers mis en cache seront parmi les derniers à effacer du système, si nécessaire. Lorsque le système décide des fichiers mis en cache à supprimer dans votre application, il prend d'abord en compte les fichiers les plus anciens (comme déterminé par l'heure de modification).

Il existe également deux nouveaux comportements que vous pouvez activer pour chaque répertoire afin de contrôler la manière dont le système libère vos données mises en cache:

  • StorageManager.setCacheBehaviorAtomic() permet d'indiquer qu'un répertoire et tout son contenu doivent être supprimés en tant qu'unité atomique unique.
  • setCacheBehaviorTombstone(File, boolean) peut être utilisé pour indiquer qu'au lieu de supprimer des fichiers dans un répertoire, ils doivent être tronqués à 0 octet, laissant le fichier vide intact.

Enfin, lorsque vous devez allouer de l'espace disque pour des fichiers volumineux, envisagez d'utiliser la nouvelle API allocateBytes(FileDescriptor, long), qui vide automatiquement les fichiers mis en cache appartenant à d'autres applications (si nécessaire) pour répondre à votre demande. Pour déterminer si l'appareil dispose d'un espace disque suffisant pour stocker vos nouvelles données, appelez getAllocatableBytes(UUID) au lieu d'utiliser getUsableSpace(), car le premier tiendra compte de toutes les données mises en cache que le système est prêt à effacer en votre nom.

Pagination du fournisseur de contenu

Nous avons mis à jour les fournisseurs de contenu afin qu'ils prennent en charge le chargement d'un ensemble de données volumineux, page par page. Par exemple, une application photo avec plusieurs milliers d'images peut interroger un sous-ensemble de données à afficher sur une page. Chaque page de résultats renvoyée par un fournisseur de contenu est représentée par un seul objet "Curseur". Pour utiliser cette fonctionnalité, un client et un fournisseur doivent implémenter la pagination.

Pour en savoir plus sur les modifications apportées aux fournisseurs de contenu, consultez ContentProvider et ContentProviderClient.

Demandes d'actualisation de contenu

Les classes ContentProvider et ContentResolver incluent désormais chacune une méthode refresh(), ce qui permet aux clients de savoir plus facilement si les informations qu'ils demandent sont à jour.

Vous pouvez ajouter une logique d'actualisation de contenu personnalisée en étendant ContentProvider. Veillez à ignorer la méthode refresh() pour renvoyer true, indiquant aux clients de votre fournisseur que vous avez essayé d'actualiser vous-même les données.

Votre application cliente peut explicitement demander du contenu actualisé en appelant une autre méthode, également appelée refresh(). Lorsque vous appelez cette méthode, transmettez l'URI des données à actualiser.

Remarque:Étant donné que vous pouvez demander des données sur un réseau, vous ne devez appeler refresh() côté client que lorsqu'il est fort probable que le contenu soit obsolète. Le plus souvent, ce type d'actualisation du contenu est effectué en réponse à un geste de balayage pour actualiser, demandant explicitement à l'interface utilisateur actuelle d'afficher un contenu à jour.

Améliorations apportées à JobScheduler

Android 8.0 (niveau d'API 26) introduit un certain nombre d'améliorations dans JobScheduler. Ces améliorations permettent à votre application de respecter plus facilement les nouvelles limites d'exécution en arrière-plan, car vous pouvez généralement utiliser des tâches planifiées pour remplacer les services d'arrière-plan désormais restreints ou les broadcast receivers implicites.

Modifications apportées à JobScheduler:

  • Vous pouvez désormais associer une file d'attente de travail à un job planifié. Pour ajouter un élément de travail à la file d'attente d'une tâche, appelez JobScheduler.enqueue(). Lorsque le job est en cours d'exécution, il peut retirer de la file d'attente le travail en attente et le traiter. Cette fonctionnalité gère de nombreux cas d'utilisation qui auraient auparavant demandé le démarrage d'un service d'arrière-plan, en particulier les services qui implémentent IntentService.
  • La bibliothèque Android Support 26.0.0 introduit une nouvelle classe JobIntentService, qui fournit les mêmes fonctionnalités que IntentService, mais utilise des tâches au lieu de services sur Android 8.0 (niveau d'API 26) ou version ultérieure.
  • Vous pouvez maintenant appeler JobInfo.Builder.setClipData() pour associer un ClipData à une tâche. Cette option vous permet d'associer les autorisations d'URI accordées à une tâche, de la même manière que ces autorisations peuvent être propagées vers Context.startService(). Vous pouvez également accorder des autorisations d'URI avec des intents dans les files d'attente de travail.
  • Les jobs planifiés prennent désormais en charge plusieurs nouvelles contraintes :
    JobInfo.isRequireStorageNotLow()
    La tâche ne s'exécute pas si l'espace de stockage disponible sur l'appareil est insuffisant.
    JobInfo.isRequireBatteryNotLow()
    La tâche ne s'exécute pas si le niveau de la batterie est inférieur ou égal au seuil critique. Il s'agit du niveau auquel l'appareil affiche la boîte de dialogue système Avertissement de batterie faible.
    NETWORK_TYPE_METERED
    La tâche nécessite une connexion réseau facturée à l'usage, comme la plupart des forfaits de données mobiles.

Data store personnalisé

Android 8.0 (niveau d'API 26) vous permet de fournir un data store personnalisé en fonction de vos préférences, ce qui peut être utile si votre application les stocke dans une base de données cloud ou locale, ou si elles sont spécifiques à un appareil. Pour en savoir plus sur la mise en œuvre du data store, consultez le data store personnalisé.

Améliorations multimédias

VolumeShaper

Il existe une nouvelle classe VolumeShaper. Utilisez-le pour effectuer de courtes transitions de volume automatisées telles que des fondus, des fondus et des fondus enchaînés. Pour en savoir plus, consultez la page Contrôler l'amplitude avec VolumeShaper.

Améliorations apportées à la mise au point audio

Les applications audio partagent la sortie audio d'un appareil en demandant et en abandonnant la priorité audio. Une application gère les changements de mise au point en démarrant ou en arrêtant la lecture, ou en diminuant le volume. Il existe une nouvelle classe AudioFocusRequest. En utilisant cette classe comme paramètre de requestAudioFocus(), les applications disposent de nouvelles fonctionnalités lors de la gestion des changements de ciblage audio : diminution automatique et gain de mise au point différée.

Métriques multimédias

Une nouvelle méthode getMetrics() renvoie un objet PersistableBundle contenant des informations de configuration et de performances, exprimées sous la forme d'une carte d'attributs et de valeurs. La méthode getMetrics() est définie pour ces classes de contenus multimédias:

Les métriques sont collectées séparément pour chaque instance et sont conservées pendant toute la durée de vie de l'instance. Si aucune métrique n'est disponible, la méthode renvoie la valeur "null". Les métriques renvoyées dépendent de la classe.

MediaPlayer

À partir d'Android 8.0 (niveau d'API 26), MediaPlayer peut lire du contenu protégé par DRM et des contenus multimédias chiffrés au niveau de l'échantillon HLS.

Android 8.0 introduit une nouvelle commande seekTo() surchargée qui offre un contrôle ultraprécis lors de la recherche d'un frame. Elle inclut un deuxième paramètre qui spécifie un mode de recherche:

  • SEEK_PREVIOUS_SYNC déplace la position du contenu multimédia sur une image de synchronisation (ou clé) associée à une source de données située juste avant ou à l'heure donnée.
  • SEEK_NEXT_SYNC déplace la position du contenu multimédia sur une image de synchronisation (ou clé) associée à une source de données située juste après ou à l'heure donnée.
  • SEEK_CLOSEST_SYNC déplace la position du contenu multimédia sur une image de synchronisation (ou clé) associée à une source de données située la plus proche de l'heure donnée ou à un moment donné.
  • SEEK_CLOSEST déplace la position du contenu multimédia sur un frame (pas nécessairement une image clé ou synchronisée) associée à une source de données située la plus proche ou à l'heure indiquée.

Lorsque vous effectuez une recherche continue, les applications doivent utiliser n'importe quel mode SEEK_ plutôt que SEEK_CLOSEST, qui s'exécute relativement plus lentement, mais peut être plus précis.

MediaRecorder

  • MediaRecorder prend désormais en charge le format MPEG2_TS, utile pour le streaming:

    Kotlin

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)
    

    Java

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
    

    voir MediaRecorder.OutputFormat

  • Le MediaMuxer peut désormais gérer autant de flux audio et vidéo que vous le souhaitez. Vous n'êtes plus limité à une piste audio et/ou une piste vidéo. Utilisez addTrack() pour mixer autant de titres que vous le souhaitez.
  • MediaMuxer peut également ajouter une ou plusieurs pistes de métadonnées contenant des informations par image définies par l'utilisateur. Le format des métadonnées est défini par votre application. La piste de métadonnées n'est compatible qu'avec les conteneurs MP4.

Les métadonnées peuvent être utiles pour le traitement hors connexion. Par exemple, les signaux du capteur Gyroscope peuvent être utilisés pour effectuer la stabilisation de la vidéo.

Lorsque vous ajoutez une piste de métadonnées, son format MIME doit commencer par le préfixe "application/". L'écriture de métadonnées revient à écrire des données vidéo/audio, sauf que les données ne proviennent pas d'un MediaCodec. À la place, l'application transmet un ByteBuffer avec un horodatage associé à la méthode writeSampleData(). Le code temporel doit correspondre à la même base de temps que les pistes vidéo et audio.

Le fichier MP4 généré utilise le TextMetaDataSampleEntry défini à la section 12.3.3.2 du fichier ISOBMFF pour signaler le format MIME des métadonnées. Lorsque vous utilisez MediaExtractor pour extraire le fichier avec une piste de métadonnées, le format MIME des métadonnées est extrait dans MediaFormat.

Amélioration de l'accès aux fichiers multimédias

Le framework d'accès au stockage (SAF, Storage Access Framework) permet aux applications d'exposer un DocumentsProvider personnalisé, qui peut fournir à d'autres applications l'accès aux fichiers d'une source de données. En fait, un fournisseur de documents peut même fournir l'accès à des fichiers résidant sur un stockage réseau ou qui utilisent un protocole tel que le protocole de transfert multimédia (MTP).

Toutefois, l'accès à des fichiers multimédias volumineux à partir d'une source de données distante pose certains défis:

  • Les lecteurs multimédias nécessitent un accès aux fichiers auprès d'un fournisseur de documents. Si un fichier multimédia volumineux réside sur une source de données distante, le fournisseur de documents doit extraire toutes les données à l'avance et créer un descripteur de fichier d'instantané. Le lecteur multimédia ne peut pas lire le fichier sans le descripteur de fichier. La lecture ne peut donc pas commencer tant que le fournisseur de documents n'a pas fini de télécharger le fichier.
  • Les responsables de collections multimédias, comme les applications photo, doivent parcourir une série d'URI d'accès pour accéder aux contenus multimédias stockés sur une carte SD externe à l'aide de dossiers cloisonnés. Ce modèle d'accès ralentit les opérations de masse sur des contenus multimédias, telles que le déplacement, la copie et la suppression.
  • Les gestionnaires de collections multimédias ne peuvent pas déterminer l'emplacement d'un document en fonction de son URI. Il est donc difficile pour ces types d'applications de permettre aux utilisateurs de choisir où enregistrer un fichier multimédia.

Android 8.0 résout chacun de ces problèmes en améliorant le framework d'accès au stockage.

Fournisseurs de documents personnalisés

À partir d'Android 8.0, Storage Access Framework permet aux fournisseurs de documents personnalisés de créer des descripteurs de fichier accessibles pour les fichiers résidant dans une source de données distante. La SAF peut ouvrir un fichier pour obtenir un descripteur de fichier natif pouvant être recherché. La SAF envoie ensuite des requêtes d'octets discrètes au fournisseur de documents. Cette fonctionnalité permet à un fournisseur de documents de renvoyer la plage exacte d'octets demandée par une application de lecteur multimédia au lieu de mettre en cache l'intégralité du fichier à l'avance.

Pour utiliser cette fonctionnalité, vous devez appeler la nouvelle méthode StorageManager.openProxyFileDescriptor(). La méthode openProxyFileDescriptor() accepte un objet ProxyFileDescriptorCallback en tant que rappel. La SAF appelle le rappel chaque fois qu'une application cliente effectue des opérations de fichier sur le descripteur de fichier renvoyé par le fournisseur de documents.

Accès direct aux documents

À partir d'Android 8.0 (niveau d'API 26), vous pouvez utiliser la méthode getDocumentUri() pour obtenir un URI qui fait référence au même document que le mediaUri donné. Toutefois, comme l'URI renvoyé repose sur un élément DocumentsProvider, les responsables de la collecte de médias peuvent accéder directement au document, sans avoir à traverser l'arborescence de répertoires cloisonnés. De ce fait, les responsables multimédias peuvent effectuer des opérations sur les fichiers du document beaucoup plus rapidement.

Attention:La méthode getDocumentUri() ne localise que les fichiers multimédias. Elle n'autorise pas les applications à accéder à ces fichiers. Pour savoir comment obtenir une autorisation d'accès aux fichiers multimédias, consultez la documentation de référence.

Chemins d'accès aux documents

Lorsque vous utilisez Storage Access Framework sous Android 8.0 (niveau d'API 26), vous pouvez utiliser la méthode findDocumentPath(), disponible dans les classes DocumentsContract et DocumentsProvider, pour déterminer le chemin d'accès à partir de la racine d'un système de fichiers en fonction de l'ID d'un document. La méthode renvoie ce chemin dans un objet DocumentsContract.Path. Si un système de fichiers comporte plusieurs chemins d'accès définis vers le même document, la méthode renvoie le chemin le plus souvent utilisé pour atteindre le document avec l'ID donné.

Cette fonctionnalité est particulièrement utile dans les cas suivants:

  • Votre application utilise une boîte de dialogue "Enregistrer sous" qui affiche l'emplacement d'un document particulier.
  • Votre application affiche les dossiers dans la vue des résultats de recherche et doit charger les documents enfants qui se trouvent dans un dossier particulier si l'utilisateur sélectionne ce dossier.

Remarque:Si votre application n'est autorisée à accéder qu'à certains des documents du chemin d'accès, la valeur renvoyée par findDocumentPath() n'inclut que les dossiers et les documents auxquels votre application peut accéder.

Contrôler la lecture audio

Le service système AudioManager gère une liste d'objets AudioPlaybackConfiguration actifs, chacun contenant des informations sur une session de lecture audio particulière. Votre application peut récupérer l'ensemble des configurations actuellement actives en appelant getActivePlaybackConfigurations().

À partir d'Android 8.0 (niveau d'API 26), vous pouvez enregistrer un rappel qui avertit votre application lorsqu'un ou plusieurs objets AudioPlaybackConfiguration sont modifiés. Pour ce faire, appelez registerAudioPlaybackCallback() en transmettant une instance de AudioManager.AudioPlaybackCallback. La classe AudioManager.AudioPlaybackCallback contient la méthode onPlaybackConfigChanged(), que le système appelle lorsque la configuration de la lecture audio change.

Connectivité

Wi-Fi Aware

Android 8.0 (niveau d'API 26) est compatible avec Wi-Fi Aware, qui est basé sur la spécification NAN (Neighbor Awareness Networking). Sur les appareils équipés du matériel Wi-Fi Aware approprié, les applications et les appareils à proximité peuvent détecter et communiquer via le Wi-Fi sans point d'accès Internet. Nous collaborons avec nos partenaires fournisseurs de matériel pour intégrer la technologie Wi-Fi Aware aux appareils dès que possible. Pour savoir comment intégrer Wi-Fi Aware à votre application, consultez Wi-Fi Aware.

Bluetooth

Android 8.0 (niveau d'API 26) enrichit la compatibilité Bluetooth de la plate-forme en ajoutant les fonctionnalités suivantes:

  • Compatibilité avec la norme AVRCP 1.4, qui permet de parcourir la bibliothèque de chansons.
  • Prise en charge de la norme Bluetooth Low-Energy (BLE) 5.0.
  • Intégration du codec LDAC de Sony à la pile Bluetooth

Association d'un appareil associé

Android 8.0 (niveau d'API 26) fournit des API qui vous permettent de personnaliser la boîte de dialogue de demande d'association lorsque vous essayez d'associer des appareils associés via Bluetooth, BLE et Wi-Fi. Pour en savoir plus, consultez Associer un appareil associé.

Pour en savoir plus sur l'utilisation du Bluetooth sur Android, consultez le guide du Bluetooth. Pour connaître les modifications apportées au Bluetooth spécifiques à Android 8.0 (niveau d'API 26), consultez la section Bluetooth de la page Changements de comportement d'Android 8.0.

Partage

Partage intelligent

Android 8.0 (niveau d'API 26) apprend les préférences de partage personnalisées des utilisateurs et comprend mieux chaque type de contenu avec lequel partager des applications. Par exemple, si un utilisateur prend une photo d'un reçu, Android 8.0 peut suggérer une application de suivi des dépenses. Si l'utilisateur prend un selfie, une application de réseaux sociaux peut mieux gérer l'image. Android 8.0 apprend automatiquement tous ces modèles en fonction des préférences personnalisées des utilisateurs.

Le partage intelligent fonctionne pour les types de contenus autres que image, tels que audio, video, text, URL, etc.

Pour activer le partage intelligent, ajoutez un ArrayList contenant au maximum trois annotations de chaîne à l'intent qui partage le contenu. Les annotations doivent décrire les principaux composants ou sujets du contenu. L'exemple de code suivant montre comment ajouter des annotations à l'intent:

Kotlin

val annotations: ArrayList<String> = arrayListOf(
        "topic1",
        "topic2",
        "topic3"
)

intent.putStringArrayListExtra(
        Intent.EXTRA_CONTENT_ANNOTATIONS,
        annotations
)

Java

ArrayList<String> annotations = new ArrayList<>();

annotations.add("topic1");
annotations.add("topic2");
annotations.add("topic3");

intent.putStringArrayListExtra(
    Intent.EXTRA_CONTENT_ANNOTATIONS,
    annotations
);

Pour en savoir plus sur les annotations de partage intelligentes, consultez EXTRA_CONTENT_ANNOTATIONS.

Classificateur de texte

Sur les appareils compatibles, les applications peuvent utiliser un nouveau classificateur de texte pour vérifier si une chaîne correspond à un type d'entité de classificateur connu et obtenir des suggestions de sélection. Les entités reconnues par le système incluent les adresses, les URL, les numéros de téléphone et les adresses e-mail. Pour en savoir plus, consultez TextClassifier.

Accessibilité

Android 8.0 (niveau d'API 26) est compatible avec plusieurs nouvelles fonctionnalités d'accessibilité pour les développeurs qui créent leurs propres services d'accessibilité:

Pour savoir comment rendre votre application plus accessible, consultez Accessibilité.

Sécurité et confidentialité

Autorisations

Android 8.0 (niveau d'API 26) introduit plusieurs nouvelles autorisations liées à la téléphonie:

  • L'autorisation ANSWER_PHONE_CALLS permet à votre application de répondre aux appels téléphoniques entrants de manière programmatique. Pour gérer un appel téléphonique entrant dans votre application, vous pouvez utiliser la méthode acceptRingingCall().
  • L'autorisation READ_PHONE_NUMBERS accorde à votre application un accès en lecture aux numéros de téléphone stockés dans un appareil.

Ces autorisations sont classées comme dangereuses et font toutes deux partie du groupe d'autorisations PHONE.

Nouvelles API d'accès au compte et de découverte

Android 8.0 (niveau d'API 26) introduit plusieurs améliorations concernant l'accès des applications aux comptes utilisateur. Pour les comptes qu'ils gèrent, les authentificateurs peuvent utiliser leur propre règle pour décider s'ils doivent masquer des comptes dans une application ou en révéler des comptes. Le système Android suit les applications qui peuvent accéder à un compte particulier.

Dans les versions précédentes d'Android, les applications qui souhaitaient suivre la liste des comptes utilisateur devaient recevoir des informations sur tous les comptes, y compris ceux sans rapport. Android 8.0 ajoute la méthode addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[]), qui permet aux applications de spécifier une liste de types de comptes pour lesquels des modifications de compte doivent être reçues.

Modifications apportées à l'API

AccountManager propose six nouvelles méthodes pour aider les authentificateurs à gérer les applications qui peuvent voir un compte:

Android 8.0 (niveau d'API 26) introduit deux valeurs spéciales de nom de package pour spécifier les niveaux de visibilité pour les applications qui n'ont pas été définies à l'aide de la méthode setAccountVisibility(android.accounts.Account, java.lang.String, int). La valeur de visibilité PACKAGE_NAME_KEY_LEGACY_VISIBLE est appliquée aux applications disposant de l'autorisation GET_ACCOUNTS et ciblant les versions d'Android antérieures à Android 8.0 ou dont les signatures correspondent à l'authentificateur ciblant n'importe quelle version d'Android. PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE fournit une valeur de visibilité par défaut pour les applications qui n'ont pas été définies précédemment et pour lesquelles PACKAGE_NAME_KEY_LEGACY_VISIBLE n'est pas applicable.

Pour en savoir plus sur les nouvelles API d'accès au compte et de découverte, consultez la documentation de référence sur AccountManager et OnAccountsUpdateListener.

Test

Tests d'instrumentation

Android 8.0 (niveau d'API 26) fournit une assistance supplémentaire pour les tests d'instrumentation de votre application.

Exécuter l'application sur des processus d'application autres que ceux par défaut

Vous pouvez maintenant spécifier qu'un test d'instrumentation particulier doit s'exécuter sur un processus en dehors du processus par défaut de votre application. Cette configuration est utile si votre application contient plusieurs activités qui s'exécutent dans différents processus.

Pour définir une instrumentation de processus autre que celle par défaut, accédez à votre fichier manifeste, puis à l'élément <instrumentation> souhaité. Ajoutez l'attribut android:targetProcess et définissez sa valeur sur l'une des valeurs suivantes:

  • Nom d'un processus particulier.
  • Liste de noms de processus séparés par une virgule.
  • Un caractère générique ("*"), qui permet à l'instrumentation de s'exécuter sur tout processus lancé qui exécute du code dans le package spécifié dans l'attribut android:targetPackage.

Pendant l'exécution de votre test d'instrumentation, vous pouvez vérifier quel processus est testé en appelant getProcessName().

Rapporter les résultats pendant un test

Vous pouvez désormais générer des rapports sur les résultats pendant l'exécution de votre test d'instrumentation plutôt que par la suite en appelant addResults().

Intents fictifs pour les tests

Pour faciliter la création de tests d'interface utilisateur indépendants et isolés pour les activités de votre application, Android 8.0 (niveau d'API 26) introduit la méthode onStartActivity(). Vous remplacez cette méthode dans une sous-classe personnalisée de la classe Instrumentation.ActivityMonitor pour gérer un intent particulier appelé par votre classe de test.

Lorsque votre classe de test appelle l'intent, la méthode renvoie un objet bouchon Instrumentation.ActivityResult au lieu d'exécuter l'intent lui-même. En utilisant cette logique d'intent fictive dans vos tests, vous pouvez vous concentrer sur la façon dont votre activité prépare et gère l'intent que vous transmettez à une autre activité ou à une application entièrement différente.

Environnement d'exécution et outils

Optimisations de la plate-forme

Android 8.0 (niveau d'API 26) apporte à la plate-forme des optimisations d'exécution et d'autres optimisations qui entraînent un certain nombre d'améliorations des performances. Ces optimisations incluent la récupération de mémoire par compactage simultané, une utilisation plus efficace de la mémoire et la localité du code.

Ces optimisations permettent de réduire le temps de démarrage et d'améliorer les performances du système d'exploitation et des applications.

Mise à jour de la compatibilité avec le langage Java

Android 8.0 (niveau d'API 26) est compatible avec plusieurs API OpenJDK Java supplémentaires:

Pour en savoir plus sur les classes et les méthodes de ces packages nouvellement ajoutés, consultez la documentation de référence de l'API.

Si vous souhaitez utiliser les fonctionnalités du langage Java 8 dans Android Studio, vous devez télécharger la dernière version preview.

Mise à jour des API ICU4J Android Framework

Android 8.0 (niveau d'API 26) étend les API ICU4J Android Framework, qui est un sous-ensemble des API ICU4J, que les développeurs d'applications peuvent utiliser sous le package android.icu. Ces API utilisent les données de localisation présentes sur l'appareil. Vous pouvez donc réduire l'empreinte de votre APK en ne compilant pas les bibliothèques ICU4J dans votre APK.

Tableau 1. Versions ICU, CLDR et Unicode utilisées sous Android.

Niveau d'API Android Version de la bibliothèque ICU Version CLDR Version Unicode
Android 7.0 (niveau d'API 24), Android 7.1 (niveau d'API 25) 56 28 8.0
Android 8.0 (niveau d'API 26) 58.2 30.0.3 9.0

Pour en savoir plus sur l'internationalisation sur Android, y compris sur la prise en charge d'ICU4J, consultez Internationalisation sur Android.

Android Enterprise

De nouvelles fonctionnalités et API d'entreprise ont été introduites pour les appareils équipés d'Android 8.0 (niveau d'API 26). Les principales nouveautés sont les suivantes:

  • Les profils professionnels sur les appareils entièrement gérés permettent aux entreprises de séparer les données professionnelles des données personnelles, tout en gérant les deux.
  • La délégation d'API permet aux propriétaires d'appareils et de profils d'attribuer la gestion des applications à d'autres applications.
  • Les améliorations apportées à l'expérience utilisateur dans le flux de provisionnement (y compris les nouvelles options de personnalisation) réduisent le temps de configuration.
  • De nouvelles commandes relatives au Bluetooth, au Wi-Fi, à la sauvegarde et à la sécurité permettent aux entreprises de gérer une plus grande partie des appareils. La journalisation de l'activité réseau aide les entreprises à détecter les problèmes.

Pour en savoir plus à ce sujet et sur d'autres nouvelles API et fonctionnalités Android pour les entreprises, consultez Android in the Enterprise.