Fonctionnalités et API d'Android 8.0

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

Pensez également à consulter <ph type="x-smartling-placeholder"></ph> Changements de comportement d'Android 8.0 pour en savoir plus sur les changements de plate-forme peut 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 outil type spécial de mode multifenêtre principalement utilisé pour la lecture vidéo. Le mode PIP était à l'origine disponible uniquement pour Android TV. Android 8.0 le rend disponible sur d'autres appareils Android.

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

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 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 le mode 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 prendre en charge Mode PIP:

  • Activity.enterPictureInPictureMode(PictureInPictureParams args) : met l'activité en mode Picture-in-picture. 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 lors de la dernière fois appelé Activity.setPictureInPictureParams().

    L'activité spécifiée est placée dans un coin de l'écran. Le reste de l'écran est rempli par l'activité précédente qui était à l'écran. L'activité qui passe en mode PIP passe à l'état "En pause", mais reste démarrée. Si l'utilisateur appuie sur l'activité PIP, le système affiche un menu avec lequel l'utilisateur peut interagir. Aucun événement tactile n'atteint l'activité lorsqu'elle est en mode 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, ceci 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 enterPictureInPictureMode() que vous appelez.

Notifications

Dans Android 8.0 (niveau d'API 26), nous avons repensé les notifications pour faciliter et harmoniser la gestion du comportement et des paramètres des notifications. Ces modifications comprennent les opérations suivantes :

    Menu de pression prolongée sur une notification sous Android 8.0 (niveau d&#39;API 26).

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

  • Canaux de notification: lancement d'Android 8.0 les canaux de notification qui vous permettent de créer un canal personnalisable pour chaque type de notification à afficher. Dans l'interface utilisateur, les canaux de notification sont appelés catégories de notifications. Pour savoir comment pour implémenter des canaux de notification, consultez Gestion canaux de notification.
  • Points de notification: Android 8.0 permet d'afficher points ou badges, sur les icônes de lanceur d'applications. Les points de notification reflètent la présence de notifications que l'utilisateur n'a pas encore ignorées ni traitées. Pour découvrir comment utiliser les points de notification, consultez la section Badges de notification.
  • Mise en veille : les utilisateurs peuvent mettre en veille les notifications, ce qui les fait disparaître pendant un certain temps avant qu'elles ne réapparaissent. Les notifications réapparaissent avec le même niveau d'importance qu'au premier affichage. Les applis peuvent être supprimées ou mises à jour notification mise en attente, mais sa mise à jour n'entraîne pour qu'elle réapparaisse.
  • Délais d'expiration des notifications : vous pouvez définir un délai d'expiration lorsque vous créez une notification à l'aide de setTimeoutAfter(). Vous pouvez utiliser cette méthode pour spécifier une durée au bout de laquelle une notification doit être annulée. Si nécessaire, vous pouvez annuler une notification avant que le le délai avant expiration spécifié est écoulé.
  • 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 avec l'intent de filtrage les paramètres que votre appli doit présenter aux utilisateurs: EXTRA_CHANNEL_ID, NOTIFICATION_TAG et NOTIFICATION_ID.
  • Fermeture des notifications: les utilisateurs peuvent ignorer eux-mêmes les notifications. applications peuvent les supprimer par programmation. Vous pouvez déterminer quand une notification et pourquoi en appliquant la fonction onNotificationRemoved() à partir de NotificationListenerService.
  • Couleurs d'arrière-plan : vous pouvez définir et activer une couleur d'arrière-plan pour une notification. Vous ne devez utiliser cette fonctionnalité que dans les notifications pour les tâches en cours qui sont essentielles pour un utilisateur à voir d'un coup d'œil. Par exemple, vous pouvez définir une couleur d'arrière-plan pour les notifications liées aux itinéraires ou à un appel téléphonique en cours. Vous pouvez également définir la couleur d'arrière-plan souhaitée en utilisant setColor() Procéder à cette opération vous permet d'utiliser setColorized() pour activer l'utilisation d'une couleur d'arrière-plan pour une notification.
  • Style de messagerie: sous Android 8.0, les notifications qui utilisent le paramètre Affichage de la classe MessagingStyle plus de contenu dans leur forme réduite. Vous devez utiliser la Classe MessagingStyle pour des notifications liées aux messages. Vous pouvez également utiliser addHistoricMessage() pour fournir du contexte à une conversation en ajoutant l'historique des messages aux notifications de messagerie.

Autofill Framework

La création d'un compte, la connexion et les transactions par carte de crédit prennent du temps et sont sujettes les erreurs. Les utilisateurs peuvent facilement perdre patience avec les applications qui impliquent ce type de tâches répétitives.

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

Vous pouvez prendre certaines mesures pour optimiser le fonctionnement de votre application avec le framework. Pour plus d'informations, consultez la page 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 du fournisseur au lieu de les regrouper dans l'APK ou de laisser l'APK télécharger des polices. Cette fonctionnalité réduit la taille de votre APK, augmente le taux de réussite de l'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 la section Polices téléchargeables.

Polices XML

Android 8.0 (niveau d'API 26) introduit une nouvelle fonctionnalité, les polices en XML, qui vous permet d'utiliser des polices comme 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 dans le système en tant que ressource. 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 14 et ultérieures de l'API.

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

TextView à redimensionnement automatique

Android 8.0 (niveau d'API 26) vous permet de définir la taille de la zone de texte automatiquement en fonction de la taille de TextView. Cela signifie qu’il est beaucoup il est 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 Dimensionnement automatique de TextView.

Icônes adaptatives

Android 8.0 (niveau d'API 26) introduit les 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 Icônes adaptatives.

Gestion des couleurs

Les développeurs Android d'applications d'imagerie peuvent désormais exploiter les nouveaux appareils qui disposent d'un écran à large gamme de couleurs. Pour afficher une large gamme images, les applications devront activer un indicateur dans leur fichier manifeste (par activité) et charger des bitmaps avec un profil de couleur large intégré (AdobeRVB, 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 suivantes:

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

Pour en savoir plus sur l'utilisation de ces API, consultez la section Gérer les WebViews.

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

Épingler des raccourcis et des widgets

Android 8.0 (niveau d'API 26) permet d'épingler des raccourcis dans l'application widgets. Dans votre application, vous pouvez créer des raccourcis et des widgets épinglés pour les lanceurs 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 maximal de l'écran

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 le 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 elle s'exécute.

Pour savoir comment déclarer un format maximal, consultez la section Compatibilité avec plusieurs écrans.

Compatibilité multi-écran

À partir d'Android 8.0 (niveau d'API 26), la plate-forme offre une meilleure prise en charge des écrans multiples. Si une activité est compatible avec le mode multifenêtre et qu'elle s'exécute sur un appareil avec plusieurs écrans, les utilisateurs peuvent la déplacer d'un écran à un autre. Lorsqu'une application lance une activité, elle peut spécifier l'écran sur lequel l'activité doit s'exécuter.

Remarque : Si une activité est compatible avec mode multifenêtre, Android 8.0 active automatiquement la compatibilité multi-écran pour cette activité. Vous devez 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 la l'application comporte plusieurs écrans. L'activité sélectionnée est à l'état "reprise". Toutes les autres activités visibles sont en pause, mais pas arrêtées. Pour plus d'informations sur le cycle de vie d'une activité lorsque plusieurs activités sont visibles, Voir la section Mode multifenêtre Lifecycle

Lorsqu'un utilisateur déplace une activité d'un écran à un autre, le système redimensionne l'activité et modifie l'environnement d'exécution si nécessaire. Votre activité peut gérer elle-même le changement 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 Gestion de la configuration Modifications.

ActivityOptions fournit deux nouvelles méthodes pour prendre en charge plusieurs écrans :

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

Le shell adb est étendu pour prendre en charge plusieurs écrans. La commande shell start peut désormais être utilisée pour lancer une activité et spécifier l'écran cible de l'activité :

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

Marges et marges intérieures de mise en page unifiées

Android 8.0 (niveau d'API 26) vous permet de spécifier plus facilement les situations 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 prendre en charge différentes langues et cultures, y compris l'orientation du texte, gardez à l'esprit 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 de 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, les clients de bureau à distance et les clients de virtualisation, bénéficient grandement 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 ce contrôle en transmettant tous les événements de la souris à une vue ciblée dans votre application.

À partir d'Android 8.0, un View dans votre application peut demander la capture du 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 capture du pointeur lorsque la vue perd son focus, par exemple lorsque l'utilisateur ouvre une autre application.

Pour savoir comment utiliser cette fonctionnalité dans votre application, consultez Capture du 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 les applications ayant un objectif ou une fonction similaires lorsque vous les présentez aux utilisateurs, par exemple dans "Utilisation des données", "Utilisation de la batterie" ou "Utilisation de l'espace de stockage". Vous pouvez définir une catégorie pour votre application en définissant l'attribut android:appCategory dans la balise de fichier manifeste <application>.

Lanceur d'applications Android TV

Android 8.0 (niveau d'API 26) inclut une nouvelle version axée sur le contenu, L'écran d'accueil Android TV, disponible avec les Image de l'émulateur Android TV et du Nexus Player pour Android 8.0. Le nouvel écran d'accueil organise les contenus vidéo en lignes correspondant aux chaînes, qui sont chacune remplies de programmes par une application du système. Les applications peuvent publier plusieurs chaînes, et les utilisateurs peuvent configurer les chaînes qu'ils souhaitent voir sur l'écran d'accueil. L'écran d'accueil d'Android TV comprend également une ligne "Ma sélection", qui est contenant des programmes issus d'applications, basés sur les 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 pour l'ajout de canaux et de programmes fait partie des API TvProvider, qui sont distribuées sous forme de Module de bibliothèque Support avec Android 8.0.

AnimatorSet

À partir d'Android 8.0 (niveau d'API 26), l'API AnimatorSet prend désormais en charge la recherche et la lecture en arrière. La recherche vous permet de définir la position de l'ensemble d'animation à un moment précis. La lecture en sens inverse est utile si votre application inclut des animations pour des actions pouvant être annulées. Au lieu de définir deux animations distinctes, vous pouvez jouer le même jeu à l'envers.

Saisie et navigation

Groupes de navigation au clavier

Si une activité de votre application utilise une hiérarchie de 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 à l'aide du clavier. Les utilisateurs peuvent appuyer sur Maj+Tabulation ou sur Recherche+Tabulation sur les appareils Chromebook pour passer d'un cluster à un autre. Bons exemples de les groupes incluent: les panneaux latéraux, les barres de navigation, les zones de contenu principale et les éléments. pouvant contenir de nombreux éléments enfants.

Un exemple d&#39;activité qui inclut cinq clusters de navigation que l&#39;utilisateur
  peuvent naviguer à l&#39;aide du raccourci
du cluster de navigation clavier. Les clusters apparaissent dans l&#39;ordre suivant : panneau supérieur, panneau latéral gauche, zone de contenu principale, panneau inférieur et bouton d&#39;action flottant.
Figure 2. Activité contenant 5 navigations clusters

Pour faire d'un élément View ou ViewGroup un 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 des clusters non imbriqués puissent apparaître à différents niveaux de la hiérarchie. Si vous essayez de d'autres clusters, le framework ne traite que les ViewGroup en tant que 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 la navigation dans et hors de ce cluster uniquement. Si vous appliquez ce configuration sur un cluster, les utilisateurs ne peuvent pas utiliser la touche de tabulation ou les touches fléchées pour accéder au cluster ou en sortir ; il doit appuyer sur la barre de navigation du cluster une combinaison de touches.

Afficher le focus par défaut

Dans Android 8.0 (niveau d'API 26), vous pouvez attribuer le View qui doit recevoir le focus après la reprise d'une activité (re)créée et après que l'utilisateur appuie sur un touche de navigation du clavier, telle que la touche de tabulation. Pour appliquer ce paramètre "en focus 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'interface utilisateur de votre application.

Sortie vocale

Les activités et les services peuvent utiliser des instances de TextToSpeech pour dicter et prononcer du contenu. Depuis 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 à prononcer des mots synthétisés individuels, à condition que le moteur fournisse ces informations. Vous pouvez utiliser cette fonctionnalité pour attirer l'attention sur des mots spécifiques lorsque 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 cadre du processus d'enregistrement, incluez un gestionnaire pour la méthode onRangeStart().

Le moteur de synthèse vocale appelle rangeStart() pour enregistrer le moment où il s'attend à ce que la lecture audio d'une plage de texte spécifique commence. Lorsque le contenu audio de cette plage de texte commence à être lu, onRangeStart() s'exécute. Votre application peut ensuite répondre à ce rappel, par exemple en en mettant en évidence 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 de 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étectera quand votre application lit ou écrit des données sans mise en mémoire tampon, ce qui peut avoir un impact considérable sur les performances.
  • detectContentUriWithoutPermission() va détecter les cas où votre application oublie accidentellement d'accorder des autorisations à une autre application lorsque démarrer une activité en dehors de votre application.
  • detectUntaggedSockets() détectera quand votre application génère du trafic réseau sans utiliser setThreadStatsTag(int) pour taguer votre trafic à des fins de débogage.

Données en cache

Android 8.0 (niveau d'API 26) fournit de meilleurs conseils et comportements concernant les données mises en cache. Chaque application reçoit désormais un quota d'espace disque pour les données mises en cache, comme indiqué 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 plus leur quota alloué. Ainsi, si vous conservez les données mises en cache dans votre quota alloué, vos fichiers mis en cache seront parmi les derniers du système à être effacés lorsque nécessaires. Lorsque le système décide des fichiers mis en cache à supprimer dans votre application, il considère d'abord les fichiers les plus anciens (déterminés par l'heure de modification).

Vous pouvez également activer deux nouveaux comportements par répertoire pour contrôler comment 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) permet d'indiquer qu'au lieu de supprimer des fichiers à l'intérieur d'un répertoire, ils devraient être tronqués à 0 octet dans la longueur du fichier vide, laissant intact le fichier vide.

Enfin, lorsque vous devez allouer de l'espace disque pour des fichiers volumineux, envisagez d'utiliser le nouveau L'API allocateBytes(FileDescriptor, long), qui sera automatiquement effacée mis en cache les fichiers d'autres applications (si nécessaire) pour répondre à votre demande. Pour déterminer si l'appareil dispose d'assez d'espace disque pour contenir vos nouvelles données, appelez getAllocatableBytes(UUID) au lieu d'utiliser getUsableSpace(), car le premier tient 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 pour qu'ils prennent en charge le chargement d'un grand ensemble de données une page à la fois. Par exemple, une application photo avec des milliers de les images peuvent interroger un sous-ensemble de données pour les présenter sur une page. Chaque page des résultats renvoyés par un fournisseur de contenu sont représentés par un seul curseur . Pour pouvoir utiliser cette fonctionnalité, un client et un fournisseur doivent tous deux implémenter la pagination.

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

Demandes d'actualisation du 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 de rafraîchissement de contenu personnalisée en étendant ContentProvider. Assurez-vous de remplacer la méthode refresh() pour renvoyer true, ce qui indique aux clients de votre fournisseur que vous avez essayé d'actualiser les données vous-même.

Votre application cliente peut demander explicitement un 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 y a une forte indication que le contenu est obsolète. Le plus souvent, ce type d'actualisation du contenu s'explique un balayer pour actualiser qui demande explicitement à l'interface utilisateur actuelle d'afficher du 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 en arrière-plan ou les broadcast receivers implicites désormais limités.

Voici les modifications apportées à JobScheduler:

  • Vous pouvez désormais associer une file d'attente de tâches à 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, auparavant, appelé à démarrer un service d'arrière-plan, notamment des services qui mettent en œuvre IntentService
  • Sur Android La bibliothèque Support 26.0.0 introduit une nouvelle classe JobIntentService, qui fournit le même en tant que IntentService, mais utilise des jobs au lieu de services lorsqu'ils sont exécutés sur Android 8.0 (niveau d'API 26) ou version ultérieure.
  • Vous pouvez désormais appeler JobInfo.Builder.setClipData() pour associer un ClipData à une tâche. Cette option permet d'activer d'associer les autorisations d'URI accordées à une tâche, de la même manière que les autorisations peuvent être propagées à Context.startService(). Vous pouvez également utiliser des autorisations d'URI avec les intents dans les files d'attente de tâches.
  • Les jobs planifiés sont désormais compatibles avec plusieurs nouvelles contraintes :
    JobInfo.isRequireStorageNotLow()
    La tâche ne s'exécute pas si l'espace de stockage disponible sur l'appareil est faible.
    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
    Le job nécessite une connexion réseau limitée, comme la plupart des données mobiles de votre application.

Data store personnalisé

Android 8.0 (niveau d'API 26) vous permet de fournir un datastore personnalisé à vos préférences, ce qui peut être utile si votre application stocke les préférences dans une base de données cloud ou locale, ou si les préférences sont spécifiques à l'appareil. Pour en savoir plus sur l'implémentation du datastore, consultez la section Datastore personnalisé.

Améliorations multimédias

VolumeShaper

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

Améliorations de la priorité audio

Les applications audio partagent la sortie audio d'un appareil en demandant la priorité audio et en l'abandonnant. Une application gère les changements de focus en démarrant ou en arrêtant la lecture, ou en baissant le volume. Il existe une nouvelle classe AudioFocusRequest. L'utilisation de cette classe comme paramètre requestAudioFocus(), Les applications présentent de nouvelles fonctionnalités pour la gestion des changements de priorité audio: diminution automatique et degré de concentration différé.

Métriques sur les médias

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

Les métriques sont collectées séparément pour chaque instance et persistent pendant toute la durée de vie de l'instance. Si aucune métrique n'est disponible, la méthode renvoie "null". Les métriques réelles 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 des échantillons HLS.

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

  • SEEK_PREVIOUS_SYNC déplace la position du contenu multimédia vers un frame de synchronisation (ou clé) associé à 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 vers un frame de synchronisation (ou clé) associé à 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 vers un frame de synchronisation (ou clé) associé à une source de données située le plus près de l'heure donnée ou à cette heure.
  • SEEK_CLOSEST déplace la position du contenu multimédia dans une image (ne correspondant pas nécessairement à une synchronisation) ou une trame clé) associée à une source de données située la plus proche de à un moment donné.

Pour une recherche en continu, les applications doivent utiliser l'un des modes SEEK_ plutôt que SEEK_CLOSEST, qui fonctionne relativement plus lentement, mais qui peut être plus précis.

MediaRecorder

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

    Kotlin

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)

    Java

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);

    voir MediaRecorder.OutputFormat

  • MediaMuxer peut désormais gérer un nombre illimité de flux audio et vidéo. 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 une image définie par l'utilisateur. des informations. Le format des métadonnées est défini par votre application. La 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 gyroscope du capteur peuvent être utilisés pour stabiliser la vidéo.

Lorsque vous ajoutez une piste de métadonnées, le format MIME de la piste doit commencer par le préfixe "application/". L'écriture de métadonnées est identique à l'écriture de données vidéo/audio, sauf que les données ne proviennent pas d'un MediaCodec. Au lieu de cela, l'application transmet un ByteBuffer avec un code temporel associé à la méthode writeSampleData(). Le code temporel doit être dans la même base temporelle que les pistes vidéo et audio.

Le fichier MP4 généré utilise le TextMetaDataSampleEntry défini dans la section 12.3.3.2 de l'ISOBMFF pour signaler le format mime des métadonnées. Lorsque vous utilisez MediaExtractor pour extraire le fichier avec la piste de métadonnées, la méthode MIME format des métadonnées sera extraite dans MediaFormat.

Accès amélioré aux fichiers multimédias

Le Storage Access Framework (SAF) 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, le fournisseur de documents peut même donner accès à des fichiers qui résident sur le stockage réseau ou qui utilisent un protocole tel que Protocole MTP (Media Transfer Protocol).

Toutefois, l'accès à de grands fichiers multimédias à partir d'une source de données distante présente certains défis :

  • Les lecteurs multimédias nécessitent un accès accessible à un fichier à partir d'un fournisseur de documents. Lorsqu'un fichier multimédia volumineux se trouve sur une source de données distante, le fournisseur de documents doit récupérer toutes les données à l'avance et créer un instantané descripteur de fichier. 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 terminé de télécharger le fichier.
  • Les gestionnaires de collections multimédias, tels que les applications photo, doivent parcourir une série accéder aux URI pour accéder aux contenus stockés sur une carte SD externe via des dossiers. Ce modèle d'accès permet d'effectuer des opérations de masse sur des médias le déplacement, la copie et la suppression, ce qui est plutôt lent.
  • Les gestionnaires de collections multimédias ne peuvent pas déterminer l'emplacement d'un document à partir de son URI. Il est donc difficile pour ces types d'applications de permettre aux utilisateurs de choisir l'emplacement où enregistrer un fichier multimédia.

Android 8.0 résout chacun de ces défis en améliorant l'accès au stockage Framework.

Fournisseurs de documents personnalisés

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

Pour utiliser cette fonctionnalité, vous devez appeler la nouvelle méthode StorageManager.openProxyFileDescriptor(). La méthode openProxyFileDescriptor() accepte un objet ProxyFileDescriptorCallback comme 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 getDocumentUri() pour Récupère un URI qui fait référence au même document que le mediaUri donné. Toutefois, comme l'URI renvoyé est basé sur un DocumentsProvider, les gestionnaires de collections multimédias peuvent accéder directement au document, sans avoir à parcourir les arborescences de répertoires à portée. Par conséquent, les gestionnaires multimédias peuvent effectuer des opérations de fichiers sur le document beaucoup plus rapidement.

Attention:La méthode getDocumentUri() ne localise que les fichiers multimédias. il n'autorise pas les applications l'autorisation d'accéder à ces fichiers. Pour savoir comment obtenir l’accès pour les 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 findDocumentPath(), disponible dans les deux les DocumentsContract et DocumentsProvider pour déterminer le chemin à partir de la racine d'un système de fichiers en fonction de l'état ID. La méthode renvoie ce chemin d'accès dans une DocumentsContract.Path. Si un système de fichiers comporte plusieurs chemins définis vers le même document, la méthode renvoie le chemin le plus souvent utilisé pour accéder au document avec l'ID donné.

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

  • Votre application utilise la fonctionnalité "Enregistrer sous" qui affiche l'emplacement un document en particulier.
  • Votre application affiche des dossiers dans une vue de résultats de recherche et doit charger les documents enfants situés dans un dossier particulier si l'utilisateur le sélectionne.

Remarque:Si votre application n'est autorisée à accéder qu'à certains documents dans le chemin, la valeur renvoyée pour findDocumentPath() n'inclut les dossiers et documents auxquels votre application peut accéder.

Surveiller la lecture audio

Le service système AudioManager gère une liste des objets AudioPlaybackConfiguration actifs, chacun d'entre eux contient des informations sur une session de lecture audio spécifique. 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 AudioPlaybackConfiguration objets ont été 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 disposant de la Le matériel Wi-Fi Aware, les applis et les appareils à proximité peuvent détecter le Wi-Fi et communiquer via le Wi-Fi sans point d'accès à Internet. Nous collaborons avec nos partenaires matériels pour proposer la technologie Wi-Fi Aware sur les appareils dès que possible. Pour pour savoir comment intégrer Wi-Fi Aware dans 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 les bibliothèques de titres
  • Compatibilité avec la norme Bluetooth à basse consommation (BLE) 5.0.
  • Intégration du codec Sony LDAC dans 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 la section Association d'un appareil compagnon.

Pour en savoir plus sur l'utilisation du Bluetooth sur Android, consultez les Guide sur le 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 à connaître les partage personnalisé en fonction de vos préférences et comprend mieux pour chaque type de contenu avec lesquelles partager. 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, peut mieux gérer l'image. Android 8.0 apprend automatiquement des modèles en fonction des des préférences personnalisées.

Le partage intelligent fonctionne pour d'autres types de contenus que image, comme audio, video, text, URL, etc.

Pour activer le partage intelligent, ajoutez un ArrayList de trois annotations de chaîne maximum à 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 intelligent, consultez EXTRA_CONTENT_ANNOTATIONS.

Classificateur de texte

Sur les appareils compatibles, les applications peuvent utiliser un nouvel outil de classification de texte pour vérifier la chaîne correspond à un type d'entité de classificateur connu et d'obtenir une suggestion de sélection alternatives. Les entités reconnues par le système incluent les adresses, les URL, numéros de téléphone et 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 qui créent leurs propres services d'accessibilité:

Pour en savoir plus sur la façon de rendre votre application plus accessible, consultez la section 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 acceptRingingCall() .
  • L'autorisation READ_PHONE_NUMBERS accorde à votre application un accès en lecture aux numéros de téléphone stockés sur un appareil.

Ces autorisations sont toutes deux 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 applications ont accès aux comptes utilisateur. Pour les comptes qu'ils gèrent, les authentificateurs peuvent utiliser leur propre stratégie pour décider de masquer des comptes ou de les révéler à une application. Le système Android suit les applications pouvant accéder à un compte particulier.

Dans les versions précédentes d'Android, les applications qui souhaitaient suivre la liste des comptes utilisateur devaient obtenir des informations sur tous les comptes, y compris ceux de types différents. Android 8.0 ajoute la 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 les modifications du compte doivent être reçues.

Modifications apportées à l'API

AccountManager propose six nouvelles méthodes pour aider les authentificateurs à gérer applications peuvent accéder à 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é des applications qui n'ont pas été définis à l'aide de la méthode setAccountVisibility(android.accounts.Account, java.lang.String, int). La PACKAGE_NAME_KEY_LEGACY_VISIBLE visibilité est appliquée aux applications GET_ACCOUNTS l'autorisation et les versions cibles Android version antérieure à 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 et de découverte de comptes, consultez la documentation sur AccountManager et OnAccountsUpdateListener.

Tests

Tests d'instrumentation

Android 8.0 (niveau d'API 26) fournit les fonctionnalités supplémentaires suivantes pour les fonctionnalités des tests d'instrumentation.

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

Vous pouvez maintenant spécifier qu'un test d'instrumentation spécifique doit s'exécuter sur 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 des processus différents.

Pour définir une instrumentation de processus autre que celle par défaut, accédez à votre fichier manifeste puis à l'emplacement souhaité <ph type="x-smartling-placeholder"></ph> <instrumentation>. Ajoutez le android:targetProcess et définissez sa valeur sur l'une des les éléments suivants:

  • Nom d'un processus spécifique.
  • 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 pour 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 les tests sont effectués en appelant getProcessName().

Signaler les résultats lors d'un test

Vous pouvez maintenant générer des rapports sur les résultats pendant l'exécution de votre test d'instrumentation. plutôt qu'après, en appelant addResults().

Intents fictifs pour les tests

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

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

Environnement d'exécution et outils

Optimisations de la plate-forme

Android 8.0 (niveau d'API 26) permet d'optimiser l'environnement d'exécution et d'autres optimisations sur la plate-forme permet d'améliorer les performances. Ces optimisations incluent la récupération de mémoire de compactage simultané, une utilisation plus efficace de la mémoire et de la localité du code.

Ces optimisations permettent de réduire les temps de démarrage et d'améliorer les performances de l'OS et des applications.

Mise à jour de la compatibilité avec le langage Java

Android 8.0 (niveau d'API 26) prend en charge plusieurs API Java OpenJDK supplémentaires :

Pour en savoir plus sur les classes et les méthodes de ces nouvelles consultez la documentation de référence de l'API.

Si vous souhaitez <ph type="x-smartling-placeholder"></ph> utiliser les fonctionnalités du langage Java 8 dans Android Studio, télécharger la dernière version preview.

Mise à jour des API du framework Android ICU4J

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

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

Niveau d'API Android Version 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 la prise en charge d'ICU4J, consultez la section 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). Voici quelques points clés :

  • Sur les appareils entièrement gérés, les profils professionnels permettent aux entreprises de séparer le travail des données à caractère personnel, tout en gérant les deux.
  • La délégation d'API permet aux propriétaires d'appareils et aux propriétaires de profils d'attribuer une application à d'autres applications.
  • Amélioration de l'expérience utilisateur dans le flux de provisionnement (nouvelles de personnalisation) réduisent le temps de configuration.
  • De nouvelles commandes sur le Bluetooth, le Wi-Fi, la sauvegarde et la sécurité permettent aux entreprises gérer une plus grande partie de l'appareil. La journalisation de l'activité réseau aide les entreprises à suivre les problèmes.

Pour en savoir plus sur ces API et sur d'autres nouvelles API et fonctionnalités Android Enterprise, consultez la page Android en entreprise.