Android 6.0 (M) offre de nouvelles fonctionnalités pour les utilisateurs et les développeurs d'applications. Ce document présente les API les plus notables.
Premiers pas en tant que développeur
Pour commencer à créer des applications pour Android 6.0, vous devez d'abord télécharger le SDK Android. Utilisez ensuite SDK Manager pour télécharger la plate-forme et les images système du SDK Android 6.0.
Mettre à jour votre niveau d'API cible
Pour mieux optimiser votre application pour les appareils équipés d'Android, définissez targetSdkVersion
sur "23"
, installez votre application sur une image système Android, testez-la, puis publiez l'application mise à jour avec cette modification.
Vous pouvez utiliser les API Android tout en prenant en charge les versions antérieures en ajoutant à votre code des conditions qui vérifient le niveau d'API du système avant d'exécuter les API non compatibles avec votre minSdkVersion
.
Pour en savoir plus sur la rétrocompatibilité, consultez Prendre en charge différentes versions de plate-forme.
Pour en savoir plus sur le fonctionnement des niveaux d'API, consultez Qu'est-ce que le niveau d'API ?
Authentification par empreinte digitale
Cette version propose de nouvelles API vous permettant d'authentifier les utilisateurs à l'aide de leurs empreintes digitales sur les appareils compatibles. Utilisez ces API conjointement avec le système Android Keystore.
Pour authentifier des utilisateurs via une analyse d'empreinte digitale, obtenez une instance de la nouvelle classe FingerprintManager
et appelez la méthode authenticate()
. Votre application doit s'exécuter sur un appareil compatible avec un lecteur d'empreinte digitale. Vous devez implémenter l'interface utilisateur du flux d'authentification par empreinte digitale dans votre application et utiliser l'icône d'empreinte digitale Android standard dans votre UI.
L'icône d'empreinte digitale Android (c_fp_40px.png
) est incluse dans l'exemple d'authentification biométrique.
Si vous développez plusieurs applications qui utilisent l'authentification par empreinte digitale, notez que chaque application doit authentifier l'empreinte digitale de l'utilisateur indépendamment.
Pour utiliser cette fonctionnalité dans votre application, ajoutez d'abord l'autorisation USE_FINGERPRINT
dans votre fichier manifeste.
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
Pour découvrir une implémentation de l'authentification par empreinte digitale dans une application, consultez l'exemple d'authentification biométrique. Pour découvrir comment utiliser ces API d'authentification avec d'autres API Android, regardez la vidéo API Fingerprint et API de paiement.
Si vous testez cette fonctionnalité, procédez comme suit:
- Si ce n'est pas déjà fait, installez Android SDK Tools révision 24.3.
- Enregistrez une nouvelle empreinte dans l'émulateur en accédant à Settings > Security > Fingerprint (Paramètres > Sécurité > Empreinte digitale), puis en suivant les instructions d'enregistrement.
- Utilisez un émulateur pour émuler les événements tactiles de l'empreinte digitale avec la commande suivante. Utilisez la même commande pour émuler des événements tactiles d'empreinte digitale sur l'écran de verrouillage ou dans votre application.
adb -e emu finger touch <finger_id>
Sous Windows, vous devrez peut-être exécuter
telnet 127.0.0.1 <emulator-id>
, suivi definger touch <finger_id>
.
Confirmer les identifiants
Votre application peut authentifier les utilisateurs en fonction de la date à laquelle ils ont déverrouillé leur appareil pour la dernière fois. Cette fonctionnalité évite aux utilisateurs de devoir mémoriser des mots de passe supplémentaires spécifiques à l'application et évite d'avoir à implémenter votre propre interface utilisateur d'authentification. Votre application doit utiliser cette fonctionnalité en conjonction avec une implémentation de clé publique ou secrète pour l'authentification des utilisateurs.
Pour définir le délai avant expiration pendant lequel la même clé peut être réutilisée après qu'un utilisateur a été authentifié, appelez la nouvelle méthode setUserAuthenticationValidityDurationSeconds()
lorsque vous configurez un KeyGenerator
ou un KeyPairGenerator
.
Évitez d'afficher excessivement la boîte de dialogue de réauthentification. Vos applications doivent d'abord essayer d'utiliser l'objet cryptographique. Si le délai avant expiration expire, utilisez la méthode createConfirmDeviceCredentialIntent()
pour réauthentifier l'utilisateur dans votre application.
Association d'applications
Cette version améliore le système d'intents d'Android en fournissant une association d'applications plus efficace. Cette fonctionnalité vous permet d'associer une application à un domaine Web qui vous appartient. Sur la base de cette association, la plate-forme peut déterminer l'application par défaut à utiliser pour gérer un lien Web particulier et ne pas demander aux utilisateurs de sélectionner une application. Pour découvrir comment implémenter cette fonctionnalité, consultez la section Gérer les liens d'application.
Sauvegarde automatique des applications
Le système effectue désormais une sauvegarde et une restauration complètes des données pour les applications. Pour activer ce comportement, votre application doit cibler Android 6.0 (niveau d'API 23). Vous n'avez pas besoin d'ajouter de code supplémentaire. Si les utilisateurs suppriment leurs comptes Google, leurs données de sauvegarde sont également supprimées. Pour en savoir plus sur le fonctionnement de cette fonctionnalité et sur la configuration des éléments à sauvegarder sur le système de fichiers, consultez la section Configurer la sauvegarde automatique pour les applications.
Partage direct
Cette version vous fournit des API pour rendre le partage intuitif et rapide pour les utilisateurs. Vous pouvez désormais définir des cibles de partage direct qui lancent une activité spécifique dans votre application. Ces cibles de partage direct sont exposées aux utilisateurs via le menu Partager. Cette fonctionnalité permet aux utilisateurs de partager du contenu avec des cibles, telles que des contacts, dans d'autres applications. Par exemple, la cible de partage direct peut lancer une activité dans une autre application de réseau social, ce qui permet à l'utilisateur de partager du contenu directement avec un ami ou une communauté spécifique dans cette application.
Pour activer les cibles de partage direct, vous devez définir une classe qui étend la classe ChooserTargetService
. Déclarez votre service dans le fichier manifeste. Dans cette déclaration, spécifiez l'autorisation BIND_CHOOSER_TARGET_SERVICE
et un filtre d'intent à l'aide de l'action SERVICE_INTERFACE
.
L'exemple suivant montre comment déclarer le ChooserTargetService
dans votre fichier manifeste.
<service android:name=".ChooserTargetService" android:label="@string/service_name" android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE"> <intent-filter> <action android:name="android.service.chooser.ChooserTargetService" /> </intent-filter> </service>
Pour chaque activité que vous souhaitez exposer à ChooserTargetService
, ajoutez un élément <meta-data>
nommé "android.service.chooser.chooser_target_service"
dans le fichier manifeste de votre application.
<activity android:name=".MyShareActivity” android:label="@string/share_activity_label"> <intent-filter> <action android:name="android.intent.action.SEND" /> </intent-filter> <meta-data android:name="android.service.chooser.chooser_target_service" android:value=".ChooserTargetService" /> </activity>
Interactions vocales
Cette version fournit une nouvelle API d'interaction vocale qui, avec les actions vocales, vous permet d'intégrer des expériences vocales conversationnelles à vos applications. Appelez la méthode isVoiceInteraction()
pour déterminer si une commande vocale a déclenché votre activité. Si c'est le cas, votre application peut utiliser la classe VoiceInteractor
pour demander une confirmation vocale à l'utilisateur, sélectionner une option dans une liste, etc.
La plupart des interactions vocales proviennent d'une action vocale de l'utilisateur. Cependant, une activité d'interaction vocale peut également démarrer sans intervention de l'utilisateur. Par exemple, une autre application lancée via une interaction vocale peut également envoyer un intent pour lancer une interaction vocale. Pour déterminer si votre activité a été lancée à partir d'une requête vocale de l'utilisateur ou d'une autre application d'interaction vocale, appelez la méthode isVoiceInteractionRoot()
. Si une autre application a lancé votre activité, la méthode renvoie false
. Votre application peut alors inviter l'utilisateur à confirmer qu'il a bien l'intention d'effectuer cette action.
Pour en savoir plus sur l'implémentation des commandes vocales, consultez le site pour les développeurs de commandes vocales.
API Assist
Cette version offre aux utilisateurs une nouvelle façon d'interagir avec vos applications via un assistant. Pour utiliser cette fonctionnalité, l'utilisateur doit autoriser l'assistant à utiliser le contexte actuel. Une fois l'Assistant activé, l'utilisateur peut l'appeler dans n'importe quelle application en appuyant de manière prolongée sur le bouton Accueil.
Votre application peut choisir de ne pas partager le contexte actuel avec l'assistant en définissant l'indicateur FLAG_SECURE
. En plus de l'ensemble d'informations standard que la plate-forme transmet à l'assistant, votre application peut partager des informations supplémentaires à l'aide de la nouvelle classe AssistContent
.
Pour fournir à l'Assistant un contexte supplémentaire à partir de votre application, procédez comme suit:
- Implémentez l'interface
Application.OnProvideAssistDataListener
. - Enregistrez cet écouteur à l'aide de
registerOnProvideAssistDataListener()
. - Pour fournir des informations contextuelles spécifiques à l'activité, remplacez le rappel
onProvideAssistData()
et, éventuellement, le nouveau rappelonProvideAssistContent()
.
Appareils de stockage adoptable
Avec cette version, les utilisateurs peuvent adopter des périphériques de stockage externes tels que des cartes SD. L'adoption d'un appareil de stockage externe chiffre et formate l'appareil pour qu'il se comporte comme un stockage interne. Cette fonctionnalité permet aux utilisateurs de déplacer à la fois les applications et les données privées de ces applications entre des appareils de stockage. Lors du déplacement d'applications, le système respecte la préférence android:installLocation
dans le fichier manifeste.
Si votre application accède aux API ou aux champs suivants, sachez que les chemins d'accès aux fichiers qu'ils renvoient changent de manière dynamique lorsque l'application est déplacée entre des appareils de stockage interne et externe. Lorsque vous créez des chemins d'accès aux fichiers, il est fortement recommandé de toujours appeler ces API de manière dynamique. N'utilisez pas de chemins d'accès codés en dur et ne conservez pas de chemins d'accès complets créés précédemment.
- Méthodes
Context
: - Champs
ApplicationInfo
:
Pour déboguer cette fonctionnalité, vous pouvez activer l'adoption d'une clé USB connectée à un appareil Android via un câble USB On-The-Go (OTG) en exécutant la commande suivante:
$ adb shell sm set-force-adoptable true
Notifications
Cette version apporte les modifications d'API suivantes pour les notifications:
- Nouveau niveau de filtre
INTERRUPTION_FILTER_ALARMS
correspondant au nouveau mode Ne pas déranger Alarmes uniquement. - Nouvelle valeur de catégorie
CATEGORY_REMINDER
permettant de distinguer les rappels planifiés par l'utilisateur des autres événements (CATEGORY_EVENT
) et des autres alarmes (CATEGORY_ALARM
). - Nouvelle classe
Icon
que vous pouvez joindre à vos notifications via les méthodessetSmallIcon()
etsetLargeIcon()
. De même, la méthodeaddAction()
accepte désormais un objetIcon
au lieu d'un ID de ressource drawable. - Nouvelle méthode
getActiveNotifications()
qui permet à vos applications de savoir quelles notifications sont actuellement actives.
Compatibilité avec les stylets Bluetooth
Cette version offre une meilleure prise en charge de la saisie utilisateur à l'aide d'un stylet Bluetooth. Les utilisateurs peuvent associer et connecter un stylet Bluetooth compatible à leur téléphone ou à leur tablette. Lorsqu'il est connecté, les informations de position de l'écran tactile sont fusionnées avec les informations de pression et de bouton du stylet pour offrir une plus grande plage d'expression qu'avec l'écran tactile seul. Votre application peut écouter les pressions sur le bouton du stylet et effectuer des actions secondaires en enregistrant des objets View.OnContextClickListener
et GestureDetector.OnContextClickListener
dans votre activité.
Utilisez les méthodes et constantes MotionEvent
pour détecter les interactions avec le bouton du stylet:
- Si l'utilisateur touche un stylet avec un bouton sur l'écran de votre application, la méthode
getTooltype()
renvoieTOOL_TYPE_STYLUS
. - Pour les applications ciblant Android 6.0 (niveau d'API 23), la méthode
getButtonState()
renvoieBUTTON_STYLUS_PRIMARY
lorsque l'utilisateur appuie sur le bouton principal du stylet. Si le stylet dispose d'un deuxième bouton, la même méthode renvoieBUTTON_STYLUS_SECONDARY
lorsque l'utilisateur appuie dessus. Si l'utilisateur appuie simultanément sur les deux boutons, la méthode renvoie les deux valeurs OR (BUTTON_STYLUS_PRIMARY
|BUTTON_STYLUS_SECONDARY
). -
Pour les applications ciblant une version de plate-forme inférieure, la méthode
getButtonState()
renvoieBUTTON_SECONDARY
(pour l'appui sur le bouton du stylet principal),BUTTON_TERTIARY
(pour l'appui sur le bouton secondaire du stylet), ou les deux.
Amélioration de la recherche Bluetooth Low Energy
Si votre application effectue des recherches Bluetooth basse consommation, utilisez la nouvelle méthode setCallbackType()
pour spécifier que vous souhaitez que le système envoie des notifications aux rappels lorsqu'il trouve pour la première fois, ou après une longue période, un paquet d'annonce correspondant à l'ScanFilter
défini. Cette approche de numérisation est plus économe en énergie que celle fournie dans la version précédente de la plate-forme.
Compatibilité de la version 1 de Hotspot 2.0
Cette version est compatible avec la spécification Hotspot 2.0 version 1 sur les appareils Nexus 6 et Nexus 9. Pour provisionner des identifiants de point d'accès 2.0 dans votre application, utilisez les nouvelles méthodes de la classe WifiEnterpriseConfig
, telles que setPlmn()
et setRealm()
. Dans l'objet WifiConfiguration
, vous pouvez définir les champs FQDN
et providerFriendlyName
.
La nouvelle méthode isPasspointNetwork()
indique si un réseau détecté représente un point d'accès Hotspot 2.0.
Mode d'affichage 4K
La plate-forme permet désormais aux applications de demander que la résolution d'affichage soit mise à niveau vers le rendu 4K sur du matériel compatible. Pour interroger la résolution physique actuelle, utilisez les nouvelles API Display.Mode
. Si l'UI est dessinée à une résolution logique inférieure et est mise à l'échelle à une résolution physique plus élevée, sachez que la résolution physique renvoyée par la méthode getPhysicalWidth()
peut différer de la résolution logique signalée par getSize()
.
Vous pouvez demander au système de modifier la résolution physique de votre application pendant son exécution en définissant la propriété preferredDisplayModeId
de la fenêtre de votre application. Cette fonctionnalité est utile si vous souhaitez passer à une résolution d'affichage 4K. En mode d'affichage 4K, l'UI continue de s'afficher dans la résolution d'origine (par exemple, 1080p) et est ajustée au format 4K, mais les objets SurfaceView
peuvent afficher du contenu dans la résolution native.
Listes de couleurs "ColorStateLists" pouvant être personnalisées
Les attributs de thème sont désormais pris en charge dans ColorStateList
pour les appareils équipés d'Android 6.0 (niveau d'API 23). Les méthodes Resources.getColorStateList()
et Resources.getColor()
sont désormais obsolètes. Si vous appelez ces API, appelez plutôt les nouvelles méthodes Context.getColorStateList()
ou Context.getColor()
. Ces méthodes sont également disponibles dans la bibliothèque appcompat v4 via ContextCompat
.
Fonctionnalités audio
Cette version apporte des améliorations au traitement audio sur Android, y compris les suivantes:
- Compatibilité avec le protocole MIDI et les nouvelles API
android.media.midi
. Utilisez ces API pour envoyer et recevoir des événements MIDI. - Nouvelles classes
AudioRecord.Builder
etAudioTrack.Builder
pour créer respectivement des objets de capture et de lecture audio numérique, et configurer les propriétés de source et de destination audio pour remplacer les valeurs par défaut du système. - Crochets d'API permettant d'associer des périphériques audio et d'entrée. Cette fonctionnalité est particulièrement utile si votre application permet aux utilisateurs de lancer une recherche vocale à partir d'une manette de jeu ou d'une télécommande connectée à Android TV. Le système appelle le nouveau rappel
onSearchRequested()
lorsque l'utilisateur lance une recherche. Pour déterminer si le périphérique d'entrée de l'utilisateur dispose d'un micro intégré, récupérez l'objetInputDevice
à partir de ce rappel, puis appelez la nouvelle méthodehasMicrophone()
. - Nouvelle méthode
getDevices()
qui vous permet de récupérer la liste de tous les appareils audio actuellement connectés au système. Vous pouvez également enregistrer un objetAudioDeviceCallback
si vous souhaitez que le système avertisse votre application lorsqu'un appareil audio se connecte ou se déconnecte.
Fonctionnalités vidéo
Cette version ajoute de nouvelles fonctionnalités aux API de traitement vidéo, y compris les suivantes:
- Nouvelle classe
MediaSync
qui aide les applications à afficher de manière synchrone des flux audio et vidéo. Les tampons audio sont envoyés de manière non bloquante et sont renvoyés via un rappel. Il est également compatible avec le débit de lecture dynamique. - Nouvel événement
EVENT_SESSION_RECLAIMED
, qui indique qu'une session ouverte par l'application a été récupérée par le gestionnaire de ressources. Si votre application utilise des sessions DRM, vous devez gérer cet événement et vous assurer de ne pas utiliser une session récupérée. - Nouveau code d'erreur
ERROR_RECLAIMED
, qui indique que le Gestionnaire de ressources a récupéré la ressource multimédia utilisée par le codec. À cette exception près, le codec doit être libéré, car il est passé à l'état terminal. - Nouvelle interface
getMaxSupportedInstances()
pour obtenir un indice sur le nombre maximal d'instances de codec simultanées compatibles. - Nouvelle méthode
setPlaybackParams()
pour définir la vitesse de lecture multimédia pour la lecture au ralenti ou en accéléré. Il étire ou accélère également automatiquement la lecture audio en conjonction avec la vidéo.
Fonctionnalités de l'appareil photo
Cette version inclut les nouvelles API suivantes pour accéder à la lampe de poche de l'appareil photo et pour retravailler les images de l'appareil photo:
API Flashlight
Si un appareil photo est équipé d'un flash, vous pouvez appeler la méthode setTorchMode()
pour activer ou désactiver le mode lampe de poche du flash sans ouvrir l'appareil photo. L'application ne détient pas la propriété exclusive du flash ni de l'appareil photo. Le mode lampe de poche est désactivé et devient indisponible chaque fois que l'appareil photo devient indisponible ou que d'autres ressources de l'appareil photo qui maintiennent la lampe de poche allumée deviennent indisponibles. D'autres applications peuvent également appeler setTorchMode()
pour désactiver le mode lampe de poche. Lorsque la dernière application qui a activé le mode lampe de poche est fermée, le mode lampe de poche est désactivé.
Vous pouvez enregistrer un rappel pour être informé de l'état du mode lampe de poche en appelant la méthode registerTorchCallback()
. La première fois que le rappel est enregistré, il est immédiatement appelé avec l'état du mode lampe de poche de tous les appareils photo actuellement connus dotés d'un flash. Si le mode lampe de poche est activé ou désactivé, la méthode onTorchModeChanged()
est appelée.
API de retraitement
L'API Camera2
est étendue pour prendre en charge le reprocessing d'images au format YUV et opaque privé. Pour déterminer si ces fonctionnalités de retraitement sont disponibles, appelez getCameraCharacteristics()
et recherchez la clé REPROCESS_MAX_CAPTURE_STALL
. Si un appareil est compatible avec le retraitement, vous pouvez créer une session de capture de caméra à retraiter en appelant createReprocessableCaptureSession()
, puis en créant des requêtes pour le retraitement du tampon d'entrée.
Utilisez la classe ImageWriter
pour connecter le flux de tampon d'entrée à l'entrée de reprocessing de la caméra. Pour obtenir un tampon vide, suivez ce modèle de programmation:
- Appelez la méthode
dequeueInputImage()
. - Remplir les données dans le tampon d'entrée.
- Envoyez le tampon à l'appareil photo en appelant la méthode
queueInputImage()
.
Si vous utilisez un objet ImageWriter
avec une image PRIVATE
, votre application ne peut pas accéder directement aux données de l'image. Transmettez plutôt l'image PRIVATE
directement à ImageWriter
en appelant la méthode queueInputImage()
sans aucune copie de tampon.
La classe ImageReader
est désormais compatible avec les flux d'images au format PRIVATE
. Cette prise en charge permet à votre application de gérer une file d'attente circulaire d'images de sortie ImageReader
, de sélectionner une ou plusieurs images et de les envoyer à ImageWriter
pour un nouveau traitement par l'appareil photo.
Fonctionnalités Android for Work
Cette version inclut les nouvelles API Android for Work suivantes:
- Commandes améliorées pour les appareils d'entreprise à usage unique:le propriétaire de l'appareil peut désormais contrôler les paramètres suivants pour améliorer la gestion des appareils COSU (détenus par l'entreprise et à usage unique) :
- Désactivez ou réactivez le clavier de verrouillage à l'aide de la méthode
setKeyguardDisabled()
. - Désactivez ou réactivez la barre d'état (y compris les réglages rapides, les notifications et le geste de balayage vers le haut pour la navigation qui lance Google Now) à l'aide de la méthode
setStatusBarDisabled()
. - Désactivez ou réactivez le démarrage sécurisé avec la constante
UserManager
DISALLOW_SAFE_BOOT
. - Empêchez l'écran de s'éteindre lorsqu'il est branché à l'aide de la constante
STAY_ON_WHILE_PLUGGED_IN
.
- Désactivez ou réactivez le clavier de verrouillage à l'aide de la méthode
- Installation et désinstallation silencieuses d'applications par le propriétaire de l'appareil:un propriétaire d'appareil peut désormais installer et désinstaller silencieusement des applications à l'aide des API
PackageInstaller
, indépendamment de Google Play for Work. Vous pouvez désormais provisionner des appareils via un propriétaire d'appareil qui récupère et installe des applications sans intervention de l'utilisateur. Cette fonctionnalité permet d'activer le provisionnement en un seul geste des kiosques ou d'autres appareils de ce type sans activer de compte Google. - Accès silencieux aux certificats d'entreprise : lorsqu'une application appelle
choosePrivateKeyAlias()
, avant que l'utilisateur ne soit invité à sélectionner un certificat, le propriétaire du profil ou de l'appareil peut désormais appeler la méthodeonChoosePrivateKeyAlias()
pour fournir l'alias de manière silencieuse à l'application à l'origine de la demande. Cette fonctionnalité vous permet d'accorder aux applications gérées l'accès aux certificats sans intervention de l'utilisateur. - Acceptation automatique des mises à jour du système. En définissant une stratégie de mise à jour du système avec
setSystemUpdatePolicy()
, un propriétaire d'appareil peut désormais accepter automatiquement une mise à jour du système, par exemple dans le cas d'un appareil kiosque, ou reporter la mise à jour et empêcher l'utilisateur de l'effectuer pendant 30 jours maximum. De plus, un administrateur peut définir une période quotidienne pendant laquelle une mise à jour doit être effectuée, par exemple pendant les heures où un appareil de borne n'est pas utilisé. Lorsqu'une mise à jour du système est disponible, le système vérifie si l'application de contrôle des règles relatives aux appareils a défini une stratégie de mise à jour du système et se comporte en conséquence. -
Installation de certificats déléguée:un profil ou un propriétaire d'appareil peut désormais autoriser une application tierce à appeler ces API de gestion de certificats
DevicePolicyManager
: - Suivi de l'utilisation des données Un propriétaire de profil ou d'appareil peut désormais interroger les statistiques d'utilisation des données visibles dans Paramètres > Utilisation des données à l'aide des nouvelles méthodes
NetworkStatsManager
. Les propriétaires de profil sont automatiquement autorisés à interroger les données du profil qu'ils gèrent, tandis que les propriétaires d'appareils ont accès aux données d'utilisation de l'utilisateur principal géré. - Gestion des autorisations d'exécution :
Un profil ou un propriétaire d'appareil peut définir une stratégie d'autorisation pour toutes les demandes d'exécution de toutes les applications utilisant
setPermissionPolicy()
, afin d'inviter l'utilisateur à accorder l'autorisation, ou de l'accorder ou de la refuser automatiquement de manière silencieuse. Si cette dernière règle est définie, l'utilisateur ne peut pas modifier la sélection effectuée par le profil ou le propriétaire de l'appareil dans l'écran des autorisations de l'application dans Paramètres. - VPN dans les paramètres:les applications de VPN sont désormais visibles dans Paramètres > Plus > VPN. De plus, les notifications qui accompagnent l'utilisation du VPN sont désormais spécifiques à la configuration de ce VPN. Pour "Propriétaire du profil", les notifications dépendent de la configuration du VPN pour un profil géré, un profil personnel ou les deux. Pour un propriétaire d'appareil, les notifications indiquent si le VPN est configuré pour l'ensemble de l'appareil.
- Notification d'état professionnel:une icône de porte-documents dans la barre d'état s'affiche désormais chaque fois qu'une application du profil géré effectue une activité au premier plan. De plus, si l'appareil est déverrouillé directement pour l'activité d'une application dans le profil géré, un toast s'affiche pour informer l'utilisateur qu'il se trouve dans le profil professionnel.