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 le lancement des activités dans 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 pour Android TV uniquement Android 8.0 rend cette fonctionnalité disponible sur les autres appareils Android.

Lorsqu'une activité est en mode PIP, elle est mise en pause, mais continuer à afficher le contenu. C'est pourquoi vous devez vous assurer que votre application ne met pas en pause la lecture dans son 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. Cependant, vous devez définir android:resizeableActivity sur "true" si votre activité prend en charge 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 Ajout Picture-in-picture peut désormais être sur tous les appareils Android, 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): Place 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ée 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 à l’écran. L'activité qui passe en mode PIP est mise en pause, mais reste pour commencer. Si l'utilisateur appuie sur l'activité PIP, le système affiche un menu pour avec lequel l’utilisateur interagit ; aucun événement tactile n'atteint l'activité tant qu'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 permettent de gérer le comportement des notifications de façon plus simple et plus cohérente. et paramètres. Ces modifications comprennent les opérations suivantes :

    Notification avec appui prolongé sur le menu sous Android 8.0 (niveau d&#39;API 26).

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

  • 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. L'interface utilisateur fait référence aux canaux de notification en tant que catégories de notification. 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 savoir comment utiliser les pastilles de notification, consultez Notification et des badges.
  • Répétition: les utilisateurs peuvent mettre en attente les notifications afin de les faire disparaître. pendant un certain temps avant de réapparaître. Les notifications réapparaissent avec le le même niveau d'importance avec lequel ils sont apparus pour la première fois. 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élai d'expiration des notifications: vous pouvez définir un délai d'expiration lors de la création d'un notification avec setTimeoutAfter() Vous pouvez utiliser cette méthode pour spécifier le délai après lequel 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 le compte les paramètres de notification à partir d'une notification à l'aide de la 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 . 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. Pour Par exemple, vous pouvez définir une couleur d'arrière-plan pour les notifications relatives à un itinéraire 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 être frustrés par les applications qui nécessitent ces types 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 la bibliothèque Android Support 26 vous permettent de demander des polices à partir d'un au lieu de regrouper des polices dans l'APK ou de laisser Polices de téléchargement de l'APK Cette fonctionnalité réduit la taille de votre APK et augmente l'application taux de réussite de l'installation et permet à plusieurs applications de partager la même police.

Pour en savoir plus sur le téléchargement des polices, consultez 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 disponible dans le système en tant que ressource. Vous pouvez ensuite accéder à ces polices à l'aide de la commande 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.

Redimensionnement automatique de TextView

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 des icônes de lanceur adaptatives. Les icônes adaptatives prennent en charge les éléments visuels et peut afficher une variété de formes sur différents modèles d'appareils. Pour savoir comment créer des icônes adaptatives, consultez la page 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:

  • API de la version
  • API Google Safe Browsing
  • API termination 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 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 lanceurs compatibles, sous réserve de l'autorisation de l'utilisateur.

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

Format maximal de l'écran

Android 8.0 (niveau d'API 26) modifie la façon de configurer le 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, l'application le format maximal par défaut correspond au format natif de l'appareil sur lequel l'application est exécutée.

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 propose des fonctionnalités compatible avec plusieurs écrans. Si une activité est compatible avec le mode multifenêtre et s'exécute sur un appareil doté de plusieurs écrans, l'utilisateur peut 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 s'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é ciblée est à l'état de reprise ; toutes les autres activités visibles sont mises en pause, mais pas interrompues. Pour en savoir plus, 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 lui-même le changement de configuration, ou il peut permettre au système de le processus contenant votre activité et le recréer avec le nouveau . 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é.

L'interface système adb est étendue pour prendre en charge plusieurs écrans. Vous pouvez maintenant utiliser la commande shell start pour lancer une activité. et pour spécifier l'affichage 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 dans lesquelles 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 votre fichier XML de mise en page :

Remarque:Si vous personnalisez la logique de votre application pour différentes langues et cultures, y compris l'orientation du texte, gardez à l'esprit que n'ont aucune incidence sur les valeurs <ph type="x-smartling-placeholder"></ph> 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, le bureau à distance et les clients de virtualisation, de contrôler le pointeur de la souris. La capture par pointeur est une nouvelle fonctionnalité fonctionnalité d'Android 8.0 (niveau d'API 26) qui fournit ce contrôle en diffusant tous les événements de souris à une vue sélectionnée de votre application.

À partir d'Android 8.0, un View de votre application peut demander la capture du pointeur et de définir un écouteur pour traiter les événements de pointeur capturés. La le pointeur de la souris est masqué dans ce mode. La vue peut libérer la capture du pointeur lorsqu'il 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 qui lui correspond le cas échéant. Ces catégories permettent de regrouper les applications de leur but ou leur fonction lorsque vous les présentez aux utilisateurs, par exemple dans les sections "Consommation des données", Utilisation de l'espace de stockage. Vous pouvez définir une catégorie pour votre application en définissant Attribut android:appCategory dans votre <application> balise du fichier manifeste.

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 contenu vidéo dans des lignes correspondant aux chaînes, chacune contenant les programmes d'une application sur le système. Les applications peuvent publier plusieurs chaînes, et les utilisateurs peuvent configurer les chaînes sur lesquelles que vous souhaitez afficher 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'insertion 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 dans inverse. 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 les actions qui peuvent ê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é dans votre application utilise une hiérarchie de vues complexe, telle que celle de Figure 2 : Organisez des groupes d'éléments d'interface utilisateur en clusters pour faciliter la navigation au clavier entre eux. Les utilisateurs peuvent appuyer sur Méta+Tabulation ou Recherche+Tabulation les Chromebooks, 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
  s&#39;affichent dans l&#39;ordre suivant: panneau supérieur, panneau latéral gauche, contenu principal
  zone, panneau inférieur et bouton d&#39;action flottant.
Figure 2. Activité contenant 5 navigations clusters

Pour créer un élément View ou ViewGroup un cluster, définissez le <ph type="x-smartling-placeholder"></ph> android:keyboardNavigationCluster à true dans le fichier XML de mise en page de l'élément, ou transmettre true en setKeyboardNavigationCluster() dans la logique d'UI de votre application.

Remarque:Les clusters ne peuvent pas être imbriqués, bien qu'ils ne soient pas imbriqués. les clusters peuvent 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'un écran tactile, vous pouvez définir un cluster Objets ViewGroup android:touchscreenBlocksFocus sur true pour autoriser la navigation uniquement pour les clusters vers et depuis ce cluster. Si vous appliquez ce configuration sur un cluster, les utilisateurs ne peuvent pas utiliser la touche Tab 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 l'option "sélectionné par défaut" , définissez l'attribut d'un élément View <ph type="x-smartling-placeholder"></ph> android:focusedByDefault à true dans fichier XML de mise en page contenant l'élément d'interface utilisateur, ou transmettez true à setFocusedByDefault() dans votre la logique d'UI de l'application.

Sortie vocale

Les activités et services peuvent utiliser des instances de TextToSpeech pour dicter et prononcer le contenu. À compter du Android 8.0 (niveau d'API 26), votre application peut obtenir des informations temporelles plus précises le moment où un moteur de synthèse vocale commence à prononcer des mots synthétisés individuels, tant que le moteur fournit ces informations. Vous pouvez utiliser cette fonctionnalité pour attirer l'attention sur des mots spécifiques pendant que le moteur de synthèse vocale parle de l'IA générative.

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

Le moteur de synthèse vocale appelle rangeStart() pour enregistrer Le moment où la lecture audio d'une plage de texte spécifique est attendue pour commencer. 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'une synthèse vocale consultez la classe UtteranceProgressListener référence.

Système

Nouveaux détecteurs StrictMode

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

  • detectUnbufferedIo() détectera quand L'application lit ou écrit des données sans mise en mémoire tampon, ce qui peut avoir un impact important des 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 effectue du trafic réseau sans utiliser setThreadStatsTag(int) pour ajouter des balises à votre trafic en vue du débogage objectifs.

Données en cache

Android 8.0 (niveau d'API 26) offre de meilleurs conseils et comportements concernant les données mises en cache. Chaque l'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 dans les applications. qui dépassent le 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 à être effacés du système lorsque nécessaires. Lorsque le système décide des fichiers mis en cache à supprimer dans votre application, il de prendre en compte les fichiers les plus anciens en premier (selon la date 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écider dispose de suffisamment d'espace disque pour stocker vos nouvelles données, appelez getAllocatableBytes(UUID) au lieu d'utiliser getUsableSpace(), car le premier prendra en compte toutes les mises en cache des données que le système est disposé à effacer en votre nom.

Pagination du fournisseur de contenu

Nous avons mis à jour les fournisseurs de contenu afin d'inclure la prise en charge du 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 . Un client et un fournisseur doivent tous deux implémenter la pagination pour utiliser cette fonctionnalité.

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

Demandes d'actualisation du contenu

Les ContentProvider et Les classes ContentResolver incluent désormais chacune un refresh(), ce qui permet aux clients de savoir plus facilement si les informations demandées sont à jour.

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

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

Remarque:Étant donné que vous pouvez demander des données via un réseau, vous devez appeler refresh() depuis côté client uniquement lorsqu'il y a de fortes 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 facilitent la conception pour respecter le nouveau contexte limites d'exécution, car vous pouvez généralement utiliser des jobs planifiés pour remplacer les services d'arrière-plan désormais restreints ou les broadcast receivers implicites.

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'un job, 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 implémentent 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 maintenant appeler JobInfo.Builder.setClipData() pour associer un ClipData à une offre d'emploi. 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 prennent désormais en charge plusieurs nouvelles contraintes: <ph type="x-smartling-placeholder">
    </ph>
    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 batterie est inférieur ou égal au seuil critique seuil niveau auquel l'appareil affiche le niveau de batterie faible d'avertissement du système.
    NETWORK_TYPE_METERED
    Le job nécessite une connexion réseau limitée, comme la plupart des données mobiles de votre application.

Datastore personnalisé

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

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 mise au point audio

Les applications audio partagent la sortie audio sur un appareil en demandant et en abandonnant la priorité audio. Pour gérer les changements de mise au point, une application peut lancer ou arrêter la lecture, ou baisser 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 de gain 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 ces classes de médias:

Les métriques sont collectées séparément pour chaque instance et sont conservées 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 des contenus Protection par DRM et les contenus multimédias chiffrés au niveau de l'échantillon HLS.

Android 8.0 introduit un nouveau modèle seekTo() qui fournit un contrôle détaillé lorsque vous recherchez une image. 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 une image de synchronisation (ou clé) associée à une source de données située juste avant ou à un moment donné.
  • SEEK_NEXT_SYNC déplace la position du contenu multimédia vers une image de synchronisation (ou clé) associée avec une source de données située juste après ou à un moment donné.
  • SEEK_CLOSEST_SYNC déplace la position du contenu multimédia vers une image de synchronisation (ou clé) associée à une source de données la plus proche ou à l'heure donnée.
  • 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. Utiliser addTrack() de mixer autant de pistes que vous voulez.
  • 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 un traitement hors connexion. Par exemple, les signaux gyroscopiques le capteur peut être utilisé pour la stabilisation 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 ByteBuffer par un horodatage associé à writeSampleData(). Le code temporel doit être identique à celui des pistes vidéo et audio.

Le fichier MP4 généré utilise l'élément TextMetaDataSampleEntry défini dans 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 la piste de métadonnées, la méthode MIME format des métadonnées sera extraite dans MediaFormat.

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

La <ph type="x-smartling-placeholder"></ph> Storage Access Framework (SAF) permet aux applications d'exposer un objet DocumentsProvider, qui peut fournir l'accès aux fichiers d'une source de données à d'autres applications. 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).

Cependant, l'accès à des fichiers multimédias volumineux depuis une source de données distante introduit une défis:

  • Les lecteurs multimédias nécessitent un accès au fichier via la recherche auprès 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 celui-ci et la lecture ne peut donc pas commencer tant que le fournisseur de documents n'a pas terminé télécharger le fichier.
  • Les gestionnaires de collections multimédias, tels que les applications photo, doivent parcourir une série de 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 responsables de la collection multimédia ne peuvent pas déterminer l'emplacement d'un document en raison des 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 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 fichier natif pouvant être recherché du descripteur. La SAF envoie ensuite des requêtes d'octets discrets aux documents un fournisseur de services agréé. 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 StorageManager.openProxyFileDescriptor(). La 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é repose sur un DocumentsProvider, les gestionnaires de collections multimédias peuvent accéder directement le document, sans avoir à parcourir les arborescences de répertoires limités. Par conséquent, les gestionnaires de mé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 dans 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. Lorsqu'un fichier dispose de plusieurs chemins d'accès définis vers le même document, la méthode renvoie qui est le plus souvent utilisé pour accéder au document avec l'ID donné.

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

  • Votre application utilise la fonctionnalité "Enregistrer sous" qui affiche l'emplacement un document en particulier.
  • Votre application affiche les dossiers dans une vue de résultats de recherche et doit charger l'enfant les documents figurant dans un dossier donné 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 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 La classe AudioManager.AudioPlaybackCallback contient La méthode onPlaybackConfigChanged(), que le système appelle lorsque l'audio la configuration de lecture change.

Connectivité

Wi-Fi Aware

Android 8.0 (niveau d'API 26) est compatible avec le Wi-Fi Aware, basé sur le voisinage la spécification NAN (Awareness Networking). Sur les appareils disposant 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 travaillons avec notre matériel partenaires d'intégrer la technologie Wi-Fi Aware aux 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) améliore la compatibilité Bluetooth de la plate-forme en ajoutant les éléments suivants : fonctionnalités:

  • Compatibilité avec la norme AVRCP 1.4, qui permet de parcourir les bibliothèques de titres
  • Compatibilité avec la norme Bluetooth Low-Energy (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 le boîte de dialogue de demande d'association lors d'une tentative d'association à des appareils associés via Bluetooth, BLE et Wi-Fi. Pour en savoir plus, consultez Appareil associé Association

Pour en savoir plus sur l'utilisation du Bluetooth sur Android, consultez les Guide sur le Bluetooth. Pour modifications Bluetooth spécifiques à Android 8.0 (niveau d'API 26), consultez la 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, par exemple audio, video, text, URL etc.

Pour activer le partage intelligent, ajoutez jusqu'à trois ArrayList des 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 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 obtenir une suggestion de sélection alternatives. 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 qui créent leurs propres services d'accessibilité:

Pour savoir comment 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:

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

Nouvelles API d'accès aux comptes 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'il gère, les authentificateurs peuvent utiliser leurs propres règles pour décider de masquer les comptes ou révéler les comptes à une application. Le système Android suit les applications qui peuvent à un compte particulier.

Dans les versions précédentes d'Android, les applications qui voulaient suivre la liste des les comptes d'utilisateurs devaient obtenir des mises à jour sur tous les comptes, y compris ceux avec qui ne sont pas liés. 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 la visibilité pour les applications qui n'ont pas été définies à l'aide 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 applicables.

Pour en savoir plus sur les nouvelles API d'accès aux comptes et de découverte, consultez les référence pour 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 l'application 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 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 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 du Instrumentation.ActivityMonitor pour gérer une classe 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 manière dont votre activité prépare et gère l'intent que vous transmettez à un une autre activité ou à une application complètement différente.

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 OS et applications.

Mise à jour de la compatibilité avec le langage Java

Android 8.0 (niveau d'API 26) est compatible avec 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 Compatibilité avec ICU4J, voir Internationalisation sur Android

Android Enterprise

De nouvelles API et fonctionnalités d'entreprise ont été introduites pour les appareils Android 8.0 (niveau d'API 26). Voici les principales améliorations apportées:

  • 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.