Présentation des fonctionnalités et des API

Android 11 offre aux développeurs de nouvelles fonctionnalités et API de qualité. Les sections ci-dessous vous présentent les nouvelles fonctionnalités disponibles pour vos application et leurs nouvelles API.

Pour obtenir une liste détaillée des nouvelles API, des API modifiées et supprimées, consultez le rapport de différences des API. Pour en savoir plus sur les nouvelles API, consultez la documentation de référence des API Android. Les nouvelles API sont mises en évidence. Pour savoir dans quels domaines les changements de plate-forme peuvent affecter vos applications, consultez les modifications de comportement d'Android 11 pour les applications ciblant Android R et pour toutes les applications, ainsi que les modifications de confidentialité.

Nouvelles expériences

Commandes de contrôle des appareils

Android 11 inclut une nouvelle API ControlsProviderService que vous pouvez utiliser pour exposer les commandes des appareils externes connectés. Ces commandes s'affichent sous Commandes de l'appareil dans le menu d'alimentation d'Android. Pour en savoir plus, consultez Contrôler les appareils externes.

Commandes multimédias

Android 11 modifie l'affichage des commandes multimédias. Les commandes multimédias s'affichent à côté des réglages rapides. Les sessions de plusieurs applications sont organisées dans un carrousel balayable qui inclut les flux lus localement sur le téléphone, les flux distants, tels que ceux détectés sur des appareils externes ou des sessions de diffusion, et les sessions précédentes pouvant être reprises, dans l'ordre de leur dernière lecture.

Les utilisateurs peuvent redémarrer des sessions précédentes à partir du carrousel sans avoir à lancer l'application. Lorsque la lecture commence, l'utilisateur interagit avec les commandes multimédias de la manière habituelle.

Pour en savoir plus, consultez Commandes multimédias.

Écrans

Amélioration de la prise en charge des écrans en cascade

Android 11 fournit plusieurs API pour prendre en charge les écrans en cascade, qui s'enroulent autour du bord de l'appareil. Ces écrans sont traités comme une variante des écrans avec encoche. Les méthodes DisplayCutout.getSafeInset…() existantes renvoient désormais l'encart sécurisé pour éviter les zones en cascade ainsi que les découpes. Pour afficher le contenu de votre application dans la zone de l'encoche, procédez comme suit :

  • Appelez DisplayCutout.getWaterfallInsets() pour obtenir les dimensions exactes de l'encart en cascade.

  • Définissez l'attribut de mise en page de la fenêtre layoutInDisplayCutoutMode sur LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS pour permettre à la fenêtre de s'étendre dans les zones d'encoche et d'écran incurvé sur tous les bords de l'écran. Vous devez vous assurer qu'aucun contenu essentiel ne se trouve dans les zones de découpe ou d'affichage en cascade.

Capteur d'angle de charnière et appareils pliables

Android 11 permet aux applications exécutées sur des appareils dotés d'une configuration d'écran à charnière de déterminer l'angle de la charnière en fournissant un nouveau capteur avec TYPE_HINGE_ANGLE et un nouveau SensorEvent qui peut surveiller l'angle de la charnière et fournit une mesure en degrés entre deux parties intégrantes de l'appareil. Vous pouvez utiliser ces mesures brutes pour effectuer des animations précises lorsque l'utilisateur manipule l'appareil.

Consultez Appareils pliables.

Conversations

Améliorations de la conversation

Android 11 apporte un certain nombre d'améliorations à la gestion des conversations. Les conversations sont des communications bidirectionnelles en temps réel entre deux personnes ou plus. Ces conversations sont mises en avant, et les utilisateurs disposent de plusieurs nouvelles options pour interagir avec elles.

Pour en savoir plus sur les conversations et sur la façon dont votre application peut les prendre en charge, consultez Personnes et conversations.

Bulles de chat

Les bulles sont désormais disponibles pour les développeurs afin de faciliter l'affichage des conversations dans le système. Les bulles étaient une fonctionnalité expérimentale d'Android 10 qui était activée via une option pour les développeurs. Dans Android 11, cela n'est plus nécessaire.

Si une application cible Android 11 (niveau d'API 30) ou une version ultérieure, ses notifications ne sont pas présentées sous forme de bulles, sauf si elles répondent aux nouvelles exigences concernant les conversations. Plus précisément, la notification doit être associée à un raccourci.

Avant Android 11, si vous souhaitiez qu'une notification s'affiche sous forme de bulle, vous deviez spécifier explicitement qu'elle était configurée pour toujours se lancer en mode UI de document. À partir d'Android 11, vous n'avez plus besoin de définir explicitement ce paramètre. Si la notification est une bulle, la plate-forme la configure automatiquement pour qu'elle se lance toujours en mode UI de document.

Les performances des bulles ont été améliorées, et les utilisateurs peuvent activer et désactiver les bulles de chaque application de manière plus flexible. Pour les développeurs qui ont implémenté la compatibilité expérimentale, quelques modifications ont été apportées aux API dans Android 11 :

Indicateurs visuels 5G

Pour en savoir plus sur l'affichage des indicateurs 5G sur les appareils des utilisateurs, consultez Informer vos utilisateurs lorsqu'ils sont sur la 5G.

Confidentialité

Android 11 introduit un grand nombre de modifications et de restrictions visant à améliorer la confidentialité des utilisateurs. Pour en savoir plus, consultez la page Confidentialité.

Sécurité

Mises à jour de l'authentification biométrique

Pour vous aider à contrôler le niveau de sécurité des données de votre application, Android 11 apporte plusieurs améliorations à l'authentification biométrique. Ces modifications apparaissent également dans la bibliothèque Jetpack Biometric.

Types d'authentification

Android 11 introduit l'interface BiometricManager.Authenticators, que vous pouvez utiliser pour déclarer les types d'authentification compatibles avec votre application.

Déterminer le type d'authentification utilisé

Une fois l'utilisateur authentifié, vous pouvez vérifier s'il a utilisé des identifiants d'appareil ou des identifiants biométriques en appelant getAuthenticationType().

Prise en charge supplémentaire des clés auth-per-use (authentification à l'utilisation)

Android 11 offre une meilleure compatibilité avec l'authentification à l'aide de clés d'authentification par utilisation.

Méthodes obsolètes

Android 11 abandonne les méthodes suivantes :

  • La méthode setDeviceCredentialAllowed().
  • La méthode setUserAuthenticationValidityDurationSeconds().
  • La version surchargée de canAuthenticate() qui n'accepte aucun argument.

Partage sécurisé de grands ensembles de données

Dans certains cas, par exemple pour le machine learning ou la lecture de contenus multimédias, votre application peut avoir besoin d'utiliser le même grand ensemble de données qu'une autre application. Dans les versions précédentes d'Android, votre application et l'autre application devaient chacune télécharger une copie distincte du même ensemble de données.

Pour réduire la redondance des données sur le réseau et sur le disque, Android 11 permet de mettre en cache ces grands ensembles de données sur l'appareil à l'aide de blobs de données partagés. Pour en savoir plus sur le partage d'ensembles de données, consultez le guide détaillé sur le partage d'ensembles de données volumineux.

Effectuer un chiffrement basé sur les fichiers après un redémarrage OTA sans identifiants utilisateur

Une fois que l'appareil a terminé une mise à jour OTA et redémarré, les clés de chiffrement par identifiants (CE) placées dans l'espace de stockage protégé par identifiants sont immédiatement disponibles pour les opérations de chiffrement basé sur les fichiers (FBE). Cela signifie qu'après une mise à jour OTA, votre application peut reprendre les opérations nécessitant les clés CE avant que l'utilisateur ne saisisse son code, son schéma ou son mot de passe.

Performances et qualité

Débogage sans fil

Android 11 prend en charge le déploiement et le débogage de votre application sans fil à partir de votre poste de travail via Android Debug Bridge (adb). Vous pouvez par exemple déployer votre application débogable sur plusieurs appareils distants sans connecter physiquement votre appareil via USB ni devoir faire face aux problèmes de connexion USB courants, tels que l'installation de pilotes. Pour en savoir plus, consultez Exécuter des applications sur un appareil.

Installation d'APK ADB Incremental

L'installation d'APK volumineux (plus de 2 Go) sur un appareil peut prendre beaucoup de temps, même si une petite modification est apportée à une application. L'installation d'APK incrémentiel ADB (Android Debug Bridge) accélère ce processus en installant suffisamment de l'APK pour lancer l'application tout en diffusant les données restantes en arrière-plan. adb install utilisera automatiquement cette fonctionnalité si elle est compatible avec l'appareil et que vous avez installé la dernière version de SDK Platform-Tools. Si elle n'est pas compatible, la méthode d'installation par défaut est utilisée de manière silencieuse.

Utilisez la commande adb suivante pour utiliser la fonctionnalité. Si l'appareil n'est pas compatible avec l'installation incrémentielle, la commande échoue et affiche une explication détaillée.

adb install --incremental

Avant d'exécuter une installation incrémentielle d'APK ADB, vous devez signer votre APK et créer un fichier APK Signature Scheme v4. Le fichier de signature v4 doit être placé à côté de l'APK pour que cette fonctionnalité soit opérationnelle.

Détection d'erreurs à l'aide de l'allocateur de mémoire natif

GWP-ASan est une fonctionnalité d'allocation de mémoire native qui permet de détecter les bugs use-after-free et heap-buffer-overflow. Vous pouvez activer cette fonctionnalité de manière globale ou pour des sous-processus spécifiques de votre application. Pour en savoir plus, consultez le guide GWP-ASan.

API Neural Networks 1.3

Android 11 étend et améliore l'API Neural Networks (NNAPI).

Nouvelles opérations

La version 1.3 de NNAPI introduit un nouveau type d'opérande, TENSOR_QUANT8_ASYMM_SIGNED, pour prendre en charge le nouveau schéma de quantification de TensorFlow Lite.

De plus, NNAPI 1.3 introduit les nouvelles opérations suivantes :

  • QUANTIZED_LSTM
  • IF
  • WHILE
  • ELU
  • HARD_SWISH
  • FILL
  • RANK

Nouvelles commandes de ML

La version 1.3 de l'API NNAPI introduit de nouvelles commandes pour faciliter l'exécution du machine learning :

API Thermal du NDK

Lorsque les appareils sont trop chauds, ils peuvent ralentir le processeur et/ou le GPU, ce qui peut affecter les applications de manière inattendue. Les applications ou les jeux qui impliquent des graphismes complexes, de nombreux calculs ou une activité réseau soutenue sont plus susceptibles de rencontrer des problèmes.

Utilisez l'API thermique du NDK dans Android 11 pour surveiller les changements de température de l'appareil, puis prenez les mesures nécessaires pour limiter la consommation d'énergie et la température. Cette API est semblable à l'API Java Thermal. Vous pouvez l'utiliser pour recevoir des notifications en cas de changement d'état thermique ou pour interroger directement l'état actuel.

Texte et saisie

Transitions IME améliorées

Android 11 introduit de nouvelles API pour améliorer les transitions des éditeurs de mode de saisie (IME), tels que les claviers à l'écran. Ces API facilitent l'ajustement du contenu de votre application en synchronisation avec l'apparition et la disparition de l'IME, ainsi qu'avec d'autres éléments tels que les barres d'état et de navigation.

Pour afficher un IME lorsqu'un EditText est sélectionné, appelez view.getInsetsController().show(Type.ime()). (Vous pouvez appeler cette méthode sur n'importe quelle vue de la même hiérarchie que l'élément EditText sélectionné. Vous n'avez pas besoin de l'appeler spécifiquement sur l'élément EditText.) Pour masquer l'IME, appelez view.getInsetsController().hide(Type.ime()). Vous pouvez vérifier si un IME est actuellement visible en appelant view.getRootWindowInsets().isVisible(Type.ime()).

Pour synchroniser les vues de votre application avec l'apparition et la disparition de l'IME, définissez un écouteur sur une vue en fournissant un WindowInsetsAnimation.Callback à View.setWindowInsetsAnimationCallback(). (Vous pouvez définir cet écouteur sur n'importe quelle vue, il n'est pas nécessaire qu'il s'agisse d'un EditText.) L'IME appelle la méthode onPrepare() de votre écouteur, puis appelle onStart() au début de la transition. Il appelle ensuite onProgress() à chaque progression de la transition. Une fois la transition terminée, l'IME appelle onEnd(). À tout moment de la transition, vous pouvez connaître sa progression en appelant WindowInsetsAnimation.getFraction().

Pour découvrir comment utiliser ces API, consultez le nouvel exemple de code WindowInsetsAnimation.

Contrôler l'animation de l'IME

Vous pouvez également contrôler l'animation de l'IME ou l'animation d'une autre barre système, comme la barre de navigation. Pour ce faire, appelez d'abord setOnApplyWindowInsetsListener() pour définir un nouvel écouteur pour les modifications d'encarts de fenêtre :

Kotlin

rootView.setOnApplyWindowInsetsListener { rootView, windowInsets ->
    val barsIme = windowInsets.getInsets(Type.systemBars() or Type.ime())
    rootView.setPadding(barsIme.left, barsIme.top, barsIme.right, 
                          barsIme.bottom)

      // We return the new WindowInsets.CONSUMED to stop the insets being
      // dispatched any further into the view hierarchy. This replaces the
      // deprecated WindowInsets.consumeSystemWindowInsets() and related
      // functions.
    WindowInsets.CONSUMED
}

Java

mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
   @Override
   public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {

       Insets barsIME = insets.getInsets(Type.systemBars() | Type.ime());
       mRootView.setPadding(barsIme.left, barsIme.top, barsIme.right,
                             barsIme.bottom);

      // We return the new WindowInsets.CONSUMED to stop the insets being
      // dispatched any further into the view hierarchy. This replaces the
      // deprecated WindowInsets.consumeSystemWindowInsets() and related
      // functions.
       return WindowInsets.CONSUMED;
   }
});

Pour déplacer l'IME ou une autre barre système, appelez la méthode controlWindowInsetsAnimation() du contrôleur :

Kotlin

view.windowInsetsController.controlWindowInsetsAnimation(
       Type.ime(),
       1000,
       LinearInterpolator(),
       cancellationSignal,
       object : WindowInsetsAnimationControlListener() {
           fun onReady(controller: WindowInsetsAnimationController,
                         types: Int) {
               // update IME inset
             controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset),
                           1f /* alpha */, 0.1 /* fraction progress */)
           }
       }
);

Java

mRoot.getWindowInsetsController().controlWindowInsetsAnimation(
       Type.ime(), 1000, new LinearInterpolator(), cancellationSignal,
       new WindowInsetsAnimationControlListener() {
           @Override
           public void onReady(
                   @NonNull WindowInsetsAnimationController controller,
                   int types
                   ) {
                   // update IME inset
                   controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset),
                           1f /* alpha */, 0.1 /* fraction progress */);
           }

           @Override
           public void onCancelled() {}
       });

Mises à jour des bibliothèques ICU

Android 11 met à jour le package android.icu pour utiliser la version 66 de la bibliothèque ICU, par rapport à la version 63 d'Android 10. La nouvelle version de la bibliothèque inclut des données de paramètres régionaux CLDR mises à jour et un certain nombre d'améliorations de la compatibilité avec l'internationalisation dans Android.

Voici les principaux changements apportés aux nouvelles versions de la bibliothèque :

  • De nombreuses API de mise en forme sont désormais compatibles avec un nouveau type d'objet renvoyé qui étend FormattedValue.
  • L'API LocaleMatcher est améliorée avec une classe de compilateur, la compatibilité avec le type java.util.Locale et une classe de résultat contenant des données supplémentaires sur une correspondance.
  • Unicode 13 est désormais compatible.

Multimédia

Allocation de tampons MediaCodec

Android 11 inclut de nouvelles API MediaCodec qui permettent aux applications de mieux contrôler l'allocation des tampons d'entrée et de sortie. Cela permet à votre application de gérer la mémoire plus efficacement.

Nouveaux cours :
Nouvelles méthodes :

De plus, le comportement de deux méthodes dans MediaCodec.Callback() a changé :

onInputBufferAvailable()
Au lieu d'appeler MediaCodec.getInputBuffer() et MediaCodec.queueInputBuffer() avec l'index, si elles sont configurées pour utiliser l'API Block Model, les applications doivent utiliser MediaCodec.getQueueRequest avec l'index, en associant un LinearBlock/HardwareBuffer à l'emplacement.
onOutputBufferAvailable()
Au lieu d'appeler MediaCodec.getOutputBuffer() avec l'index, les applications peuvent utiliser MediaCodec.getOutputFrame() avec l'index pour obtenir l'objet OutputFrame avec plus d'informations et des tampons LinearBlock/HardwareBuffer.

Décodage à faible latence dans MediaCodec

Android 11 améliore MediaCodec pour prendre en charge le décodage à faible latence pour les jeux et d'autres applications en temps réel. Vous pouvez vérifier si un codec est compatible avec le décodage à faible latence en transmettant FEATURE_LowLatency à MediaCodecInfo.CodecCapabilities.isFeatureSupported().

Pour activer ou désactiver le décodage à faible latence, effectuez l'une des opérations suivantes :

Nouvelle fonction AAudio AAudioStream_release()

La fonction AAudioStream_close() libère et ferme un flux audio en même temps. Cela peut être dangereux. Si un autre processus tente d'accéder au flux après sa fermeture, il plantera.

La nouvelle fonction AAudioStream_release() libère le flux, mais ne le ferme pas. Cela libère ses ressources et laisse le flux dans un état connu. L'objet persiste jusqu'à ce que vous appeliez AAudioStream_close().

API MediaParser

MediaParser est une nouvelle API de bas niveau pour l'extraction de contenus multimédias. Il est plus flexible que MediaExtractor et offre un contrôle supplémentaire sur la fonctionnalité d'extraction de contenus multimédias.

Capture audio depuis un appareil USB

Lorsqu'une application sans autorisation RECORD_AUDIO utilise UsbManager pour demander un accès direct à un appareil audio USB avec fonctionnalité de capture audio (un casque USB, par exemple), un nouveau message d'avertissement demandant à l'utilisateur de confirmer l'autorisation d'utiliser l'appareil s'affiche. Le système ignore toutes les options "Toujours utiliser". L'utilisateur doit donc confirmer qu'il a lu l'avertissement et accorder l'autorisation chaque fois qu'une application demande l'accès.

Pour éviter ce comportement, votre application doit demander l'autorisation RECORD_AUDIO.

Accès simultané au micro

Android 11 ajoute de nouvelles méthodes aux API AudioRecord, MediaRecorder et AAudioStream. Ces méthodes activent et désactivent la possibilité de capturer simultanément, quel que soit le cas d'utilisation sélectionné. Consultez Partager l'entrée audio.

Sélecteur de sortie

Android 11 implémente un nouveau comportement pour les applications qui utilisent les API Cast et MediaRouter.

En plus d'accéder aux options de diffusion depuis une application, les options de changement d'appareil s'affichent également dans le lecteur multimédia du système. Cela permet à l'utilisateur de passer d'un appareil à un autre de manière fluide lorsqu'il change de contexte de visionnage et d'écoute, par exemple lorsqu'il regarde une vidéo dans la cuisine plutôt que sur un téléphone, ou lorsqu'il écoute un contenu audio à la maison ou en voiture. Consultez cet article pour en savoir plus.

Connectivité

Améliorations de Wi-Fi Passpoint

Pour en savoir plus sur les fonctionnalités Passpoint ajoutées dans Android 11, consultez Passpoint.

L'API Wi-Fi Suggestion est étendue

Android 11 étend l'API Wi-Fi Suggestion pour améliorer les fonctionnalités de gestion du réseau de votre application, y compris les suivantes :

  • Les applications de gestion de la connectivité peuvent gérer leurs propres réseaux en autorisant les demandes de déconnexion.
  • Les réseaux Passpoint sont intégrés à l'API Suggestion et peuvent être suggérés à l'utilisateur.
  • Les API Analytics vous permettent d'obtenir des informations sur la qualité de vos réseaux.

Mises à jour de CallScreeningService

À partir d'Android 11, un CallScreeningService peut demander des informations sur l'état de validation STIR/SHAKEN (verstat) pour les appels entrants. Ces informations sont fournies dans les détails des appels pour les appels entrants.

Si un CallScreeningService dispose de l'autorisation READ_CONTACTS, l'application est avertie lorsqu'un appel entrant provient d'un numéro figurant dans les contacts de l'utilisateur ou qu'un appel sortant est passé vers un tel numéro.

Pour en savoir plus, consultez Empêcher l'usurpation d'ID d'appelant.

Mises à jour de l'API Open Mobile

Pour en savoir plus sur la compatibilité avec l'OMAPI sur Android 11 et versions ultérieures, consultez Compatibilité avec les lecteurs Open Mobile API.

VPN performants

Les applications qui ciblent le niveau d'API 30 ou supérieur, ou qui s'exécutent sur des appareils lancés avec le niveau d'API 29 ou supérieur, peuvent appliquer IKEv2/IPsec aux VPN configurés par l'utilisateur et aux VPN basés sur des applications.

Les VPN s'exécutent de manière native sur le système d'exploitation, ce qui simplifie le code requis pour établir des connexions VPN IKEv2/IPsec dans une application.

Contrôle des accès au réseau par processus

Pour en savoir plus sur l'activation de l'accès réseau par processus, consultez Gérer l'utilisation du réseau.

Autoriser plusieurs configurations Passpoint installées avec le même FQDN

À partir d'Android 11, vous pouvez utiliser PasspointConfiguration.getUniqueId() pour obtenir un identifiant unique pour un objet PasspointConfiguration, ce qui permet aux utilisateurs de votre application d'installer plusieurs profils avec le même nom de domaine complet (FQDN).

Cette fonctionnalité est utile lorsqu'un opérateur déploie plusieurs combinaisons de mobile country code (MCC) et de mobile network code (MNC) sur son réseau, mais ne dispose que d'un seul FQDN. Sur Android 11 ou version ultérieure, il est possible d'installer plusieurs profils avec le même nom de domaine complet qui correspondra au réseau en tant que fournisseur d'accueil lorsque l'utilisateur installe une carte SIM avec un MCC ou un MNC.

Compatibilité avec l'antenne GNSS

Android 11 introduit la classe GnssAntennaInfo, qui permet à votre application d'utiliser davantage le positionnement au centimètre près que le système mondial de navigation par satellite (GNSS) peut fournir.

Pour en savoir plus, consultez le guide sur les informations d'étalonnage de l'antenne.

Graphiques

Décodeur d'images NDK

L'API ImageDecoder du NDK fournit une API standard pour les applications C/C++ Android permettant de décoder directement les images. Les développeurs d'applications n'ont plus besoin d'utiliser les API du framework (via JNI) ni d'intégrer des bibliothèques de décodage d'images tierces. Pour en savoir plus, consultez le guide du développeur sur le décodeur d'images.

API Fréquence d'images

Android 11 fournit une API qui permet aux applications d'informer le système de la fréquence d'images prévue, afin de réduire les saccades sur les appareils compatibles avec plusieurs fréquences d'actualisation. Pour en savoir plus sur l'utilisation de cette API, consultez le guide sur la fréquence d'images.

Demander et vérifier la compatibilité avec la faible latence

Certains écrans peuvent effectuer un post-traitement graphique, comme certains écrans externes et téléviseurs. Ce post-traitement améliore les graphismes, mais peut augmenter la latence. Les écrans plus récents compatibles avec HDMI 2.1 disposent d'un mode de faible latence automatique (ALLM, également appelé mode Jeu), qui réduit la latence en désactivant ce post-traitement. Pour en savoir plus sur l'ALLM, consultez la spécification HDMI 2.1.

Une fenêtre peut demander l'utilisation du mode à faible latence automatique, s'il est disponible. L'ALLM est particulièrement utile pour les applications telles que les jeux et la visioconférence, où une faible latence est plus importante que d'avoir les meilleurs graphismes possibles.

Pour activer ou désactiver le post-traitement minimal, appelez Window.setPreferMinimalPostProcessing() ou définissez l'attribut preferMinimalPostProcessing de la fenêtre sur true. Tous les écrans ne sont pas compatibles avec le post-traitement minimal. Pour savoir si un écran particulier est compatible, appelez la nouvelle méthode Display.isMinimalPostProcessingSupported().

Injection de couche de débogage graphique performante

Les applications peuvent désormais charger des couches graphiques externes (GLES, Vulkan) dans le code d'application natif pour exposer les mêmes fonctionnalités qu'une application débogable, mais sans entraîner de frais de performances. Cette fonctionnalité est particulièrement importante lorsque vous profilez votre application avec des outils tels que GAPID. Pour profiler votre application, incluez l'élément de métadonnées suivant dans le fichier manifeste de votre application au lieu de la rendre débogable :

<application ... >
    <meta-data android:name="com.android.graphics.injectLayers.enable"
                  android:value="true" />
</application>

Images et appareil photo

Couper le son et les vibrations des notifications pendant l'enregistrement actif

À partir d'Android 11, lorsque vous utilisez activement l'appareil photo, votre application peut couper uniquement les vibrations, les sons et les vibrations, ou aucun des deux, à l'aide de setCameraAudioRestriction().

Compatibilité étendue de l'appareil photo dans Android Emulator

Pour en savoir plus sur la compatibilité étendue des appareils photo dans l'émulateur à partir d'Android 11, consultez Compatibilité de l'appareil photo.

Compatibilité avec l'utilisation simultanée de plusieurs caméras

Android 11 ajoute des API pour interroger la compatibilité avec l'utilisation de plusieurs caméras à la fois, y compris une caméra avant et une caméra arrière.

Pour vérifier la compatibilité sur l'appareil sur lequel votre application est exécutée, utilisez les méthodes suivantes :

  • getConcurrentCameraIds() renvoie un Set de combinaisons d'ID de caméras pouvant diffuser simultanément avec des combinaisons de flux garanties lorsqu'elles sont configurées par le même processus d'application.
  • isConcurrentSessionConfigurationSupported() vérifie si les caméras peuvent accepter simultanément les configurations de session correspondantes.

Amélioration de la compatibilité avec les images HEIF comportant plusieurs images

À partir d'Android 11, si vous appelez ImageDecoder.decodeDrawable() et transmettez une image HEIF contenant une séquence d'images (comme une animation ou une photo en rafale), la méthode renvoie un AnimatedImageDrawable contenant l'intégralité de la séquence d'images. Sur les versions antérieures d'Android, la méthode renvoyait un BitmapDrawable d'une seule image.

Si l'image HEIF contient plusieurs images qui ne sont pas dans une séquence, vous pouvez récupérer une image individuelle en appelant MediaMetadataRetriever.getImageAtIndex().

Accessibilité

Mises à jour pour les développeurs de services d'accessibilité

Si vous créez un service d'accessibilité personnalisé, vous pouvez utiliser les fonctionnalités suivantes dans Android 11 :

  • L'explication d'un service d'accessibilité visible par l'utilisateur accepte désormais le code HTML et les images, en plus du texte brut. Cette flexibilité vous permet d'expliquer plus facilement aux utilisateurs finaux ce que fait votre service et comment il peut les aider.
  • Pour utiliser une description de l'état d'un élément d'interface utilisateur plus significative sémantiquement que contentDescription, appelez la méthode getStateDescription().
  • Pour demander que les événements tactiles contournent l'explorateur tactile du système, appelez setTouchExplorationPassthroughRegion(). De même, pour demander que les gestes contournent le détecteur de gestes du système, appelez setGestureDetectionPassthroughRegion().
  • Vous pouvez demander des actions IME, telles que "Entrée" et "Suivant", ainsi que des captures d'écran de fenêtres qui n'activent pas l'indicateur FLAG_SECURE.

Autres fonctionnalités

Motifs de sortie des processus d'application

Android 11 introduit la méthode ActivityManager.getHistoricalProcessExitReasons(), qui indique les raisons des arrêts récents de processus. Les applications peuvent utiliser cette méthode pour collecter des informations de diagnostic sur les plantages, par exemple pour déterminer si l'arrêt d'un processus est dû à des erreurs ANR, à des problèmes de mémoire ou à d'autres raisons. Vous pouvez également utiliser la nouvelle méthode setProcessStateSummary() pour stocker des informations d'état personnalisées en vue d'une analyse ultérieure.

La méthode getHistoricalProcessExitReasons() renvoie des instances de la classe ApplicationExitInfo, qui contient des informations sur l'arrêt d'un processus d'application. En appelant getReason() sur une instance de cette classe, vous pouvez déterminer pourquoi le processus de votre application a été arrêté. Par exemple, une valeur de retour de REASON_CRASH indique qu'une exception non gérée s'est produite dans votre application. Si votre application doit garantir l'unicité des événements de sortie, elle peut conserver un identifiant spécifique à l'application, tel qu'une valeur de hachage basée sur le code temporel de la méthode getTimestamp().

Ressources supplémentaires

Pour en savoir plus, consultez l'article sur les nouveaux outils Android 11 pour rendre les applications plus privées et stables sur Medium.

Chargeurs de ressources

Android 11 introduit une nouvelle API qui permet aux applications d'étendre de manière dynamique la façon dont les ressources sont recherchées et chargées. Les nouvelles classes d'API ResourcesLoader et ResourcesProvider sont principalement responsables de la fourniture de la nouvelle fonctionnalité. Ensemble, ils permettent de fournir des ressources et des éléments supplémentaires, ou de modifier les valeurs des ressources et des éléments existants.

Les objets ResourcesLoader sont des conteneurs qui fournissent des objets ResourcesProvider à l'instance Resources d'une application. À leur tour, les objets ResourcesProvider fournissent des méthodes pour charger des données de ressources à partir d'APK et de tables de ressources.

L'un des principaux cas d'utilisation de cette API est le chargement d'éléments personnalisés. Vous pouvez utiliser loadFromDirectory() pour créer un objet ResourcesProvider qui redirige la résolution des ressources et des éléments basés sur des fichiers, ce qui l'amène à rechercher un répertoire spécifique plutôt que l'APK de l'application. Vous pouvez accéder à ces éléments via la famille de méthodes open() de la classe d'API AssetManager, comme pour les éléments groupés dans l'APK.

Schéma de signature des APK v4

Android 11 est désormais compatible avec l'APK Signature Scheme v4. Ce schéma génère un nouveau type de signature dans un fichier distinct (apk-name.apk.idsig), mais est par ailleurs semblable aux versions 2 et 3. Aucune modification n'est apportée à l'APK. Ce schéma est compatible avec l'installation d'APK incrémentiel d'ADB, qui accélère l'installation d'APK.

Filtres d'intent dynamiques

Pour recevoir des intents, une application doit déclarer au moment de la compilation les types de données qu'elle peut recevoir en définissant un filtre d'intent dans le fichier manifeste de l'application. Sous Android 10 ou version antérieure, les applications ne peuvent pas modifier leurs filtres d'intent au moment de l'exécution. Cela pose problème pour les applications de virtualisation (telles que les machines virtuelles et les bureaux à distance), car elles n'ont aucun moyen de savoir exactement quel logiciel l'utilisateur va installer.

Android 11 introduit les groupes MIME, un nouvel élément de fichier manifeste qui permet à une application de déclarer un ensemble dynamique de types MIME dans un filtre d'intent et de le modifier de manière programmatique au moment de l'exécution. Pour utiliser un groupe MIME, incluez un élément de données dans le fichier manifeste de votre application avec le nouvel attribut android:mimeGroup :

<intent-filter>
  <action android:name="android.intent.action.SEND"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <data android:mimeGroup="myMimeGroup"/>
</intent-filter>

La valeur de l'attribut android:mimeGroup est un ID de chaîne arbitraire qui identifie le groupe MIME au moment de l'exécution. Vous pouvez accéder au contenu d'un groupe MIME et le mettre à jour en transmettant son ID aux nouvelles méthodes suivantes de la classe d'API PackageManager :

Lorsque vous ajoutez un type MIME à un groupe MIME de manière programmatique, il fonctionne exactement de la même manière qu'un type MIME statique explicitement déclaré dans le fichier manifeste.

Améliorations de la saisie automatique

Android 11 apporte des améliorations aux services de saisie automatique.

Identifiants d'indices dans AssistStructure.ViewNode

Il est souvent utile pour les services de saisie automatique de calculer un hachage de signature pour une vue en fonction de ses propriétés. L'indice de vue est une propriété particulièrement intéressante à inclure lors du calcul d'un hachage de signature, mais la chaîne d'indice peut changer en fonction des paramètres régionaux du téléphone. Pour résoudre ce problème, Android 11 étend AssistStructure.ViewNode avec une nouvelle méthode getHintIdEntry(), qui renvoie l'identifiant de ressource pour le texte d'un indice de vue. Cette méthode fournit une valeur indépendante des paramètres régionaux que vous pouvez utiliser pour calculer les hachages de signature.

Événements d'affichage des ensembles de données

Pour aider les services de saisie automatique à améliorer leurs suggestions, Android 11 permet d'identifier les cas où un service de saisie automatique a présenté des ensembles de données, mais où l'utilisateur n'en a sélectionné aucun. Dans Android 11, FillEventHistory signale un nouveau type d'événement TYPE_DATASETS_SHOWN. FillEventHistory consigne un événement de ce type chaque fois que le service de saisie automatique présente un ou plusieurs ensembles de données à l'utilisateur. Les services de saisie automatique peuvent utiliser ces événements conjointement avec l'événement TYPE_DATASET_SELECTED existant pour déterminer si l'utilisateur a sélectionné l'une des options de saisie automatique fournies.

Intégration de l'IME

Les claviers et autres IME peuvent désormais afficher des suggestions de saisie automatique de manière intégrée, dans une barre de suggestions ou une interface similaire, au lieu d'un menu déroulant. Pour protéger les informations sensibles telles que les mots de passe et les numéros de carte de crédit, les suggestions sont affichées pour l'utilisateur, mais ne sont pas connues de l'IME tant que l'utilisateur n'en sélectionne pas une. Pour savoir comment les IME et les gestionnaires de mots de passe peuvent prendre en charge cette fonctionnalité, consultez Intégrer la saisie automatique aux claviers.

Partage de données avec le service de capture de contenu

À partir d'Android 11, votre application peut partager des données avec le service de capture de contenu de l'appareil. Cette fonctionnalité permet à un appareil de fournir plus facilement des informations contextuelles, par exemple en affichant le nom d'un titre en cours de lecture dans l'environnement de l'utilisateur.

Pour que les données de votre application soient disponibles pour le service de capture de contenu, appelez la méthode shareData() sur une instance de ContentCaptureManager. Si le système accepte la demande de partage de données, votre application reçoit un descripteur de fichier en écriture seule à partager avec le service de capture de contenu.