Changements de comportement: applications ciblant Android 15 ou version ultérieure

Comme les versions précédentes, Android 15 inclut des modifications de comportement susceptibles d'affecter votre application. Les modifications de comportement suivantes s'appliquent exclusivement aux applications qui ciblent Android 15 ou version ultérieure. Si votre application cible Android 15 ou une version ultérieure, vous devez la modifier pour prendre en charge ces comportements correctement, le cas échéant.

Veillez également à consulter la liste des modifications de comportement qui affectent toutes les applications exécutées sous Android 15, quel que soit le targetSdkVersion de votre application.

Fonctionnalité de base

Android 15 modifie ou étend diverses fonctionnalités de base du système Android.

Modifications apportées aux services de premier plan

Nous apportons les modifications suivantes aux services de premier plan avec Android 15.

Comportement du délai avant expiration du service de premier plan pour la synchronisation des données

Android 15 introduit un nouveau comportement de délai d'inactivité dans dataSync pour les applications ciblant Android 15 ou version ultérieure. Ce comportement s'applique également au nouveau type de service de premier plan mediaProcessing.

Le système permet aux services dataSync d'une application de s'exécuter pendant six heures au total sur une période de 24 heures, après quoi le système appelle la méthode Service.onTimeout(int, int) du service en cours d'exécution (introduit dans Android 15). À ce stade, le service dispose de quelques secondes pour appeler Service.stopSelf(). Lorsque Service.onTimeout() est appelé, le service n'est plus considéré comme un service de premier plan. Si le service n'appelle pas Service.stopSelf(), un échec se produira avec le message d'erreur suivant: "Un service de premier plan de <fgs_type> ne s'est pas arrêté pendant son délai d'inactivité : <component_name>". Dans la version bêta 2, le message d'échec s'affiche en tant qu'erreur ANR, mais dans une prochaine version bêta, ce message d'échec générera une exception personnalisée.

Pour éviter les problèmes liés à ce changement de comportement, vous pouvez effectuer une ou plusieurs des opérations suivantes:

  1. Demandez à votre service d'implémenter la nouvelle méthode Service.onTimeout(int, int). Lorsque votre application reçoit le rappel, veillez à appeler stopSelf() en quelques secondes. (Si vous n'arrêtez pas l'application immédiatement, le système génère une défaillance.)
  2. Assurez-vous que les services dataSync de votre application ne s'exécutent pas pendant plus de six heures sur une période de 24 heures (sauf si l'utilisateur interagit avec l'application, en réinitialisant le minuteur).
  3. Ne démarrez les services de premier plan dataSync qu'à la suite d'une interaction directe de l'utilisateur. Étant donné que votre application est au premier plan au démarrage du service, votre service dispose des six heures complètes après que l'application passe en arrière-plan.
  4. Au lieu d'utiliser un service de premier plan dataSync, utilisez une autre API.

Si les services de premier plan dataSync de votre application ont été exécutés pendant six heures au cours des 24 dernières, vous ne pouvez pas démarrer un autre service de premier plan dataSync sauf si l'utilisateur a mis votre application au premier plan (ce qui réinitialise le minuteur). Si vous essayez de démarrer un autre service de premier plan dataSync, le système génère ForegroundServiceStartNotAllowedException avec un message d'erreur du type "Time limit already exceeded for premier plan service type dataSync".

Nouveau type de service de premier plan pour le traitement multimédia

Android 15 introduit un nouveau type de service de premier plan : mediaProcessing. Ce type de service convient pour des opérations telles que le transcodage de fichiers multimédias. Par exemple, une application multimédia peut télécharger un fichier audio et doit le convertir dans un autre format avant de le lire. Vous pouvez utiliser un service de premier plan mediaProcessing pour vous assurer que la conversion se poursuit même lorsque l'application est exécutée en arrière-plan.

Le système autorise les services mediaProcessing d'une application à s'exécuter pendant six heures au total sur une période de 24 heures, après quoi le système appelle la méthode Service.onTimeout(int, int) du service en cours d'exécution (introduite dans Android 15). Pour le moment, le service dispose de quelques secondes pour appeler Service.stopSelf(). Si le service n'appelle pas Service.stopSelf(), le système génère une exception interne. L'exception est enregistrée dans Logcat avec le message suivant:

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type mediaProcessing did not stop within its timeout: [component name]"

Pour éviter l'exception, vous pouvez effectuer l'une des opérations suivantes:

  1. Demandez à votre service d'implémenter la nouvelle méthode Service.onTimeout(int, int). Lorsque votre application reçoit le rappel, veillez à appeler stopSelf() dans un délai de quelques secondes. (Si vous n'arrêtez pas l'application immédiatement, le système génère une défaillance.)
  2. Assurez-vous que les services mediaProcessing de votre application ne s'exécutent pas pendant plus de six heures au total sur une période de 24 heures (sauf si l'utilisateur interagit avec l'application et réinitialise le minuteur).
  3. Ne démarrez les services de premier plan mediaProcessing qu'à la suite d'une interaction directe de l'utilisateur. Étant donné que votre application est au premier plan au démarrage du service, votre service dispose des six heures complètes suivant le passage de l'application en arrière-plan.
  4. Au lieu d'utiliser un service de premier plan mediaProcessing, utilisez une API alternative, comme WorkManager.

Si les services de premier plan mediaProcessing de votre application ont été exécutés pendant six heures au cours des 24 dernières heures, vous ne pouvez pas démarrer un autre service de premier plan mediaProcessing, sauf si l'utilisateur a mis votre application au premier plan (ce qui réinitialise le minuteur). Si vous essayez de démarrer un autre service de premier plan mediaProcessing, le système génère une erreur ForegroundServiceStartNotAllowedException avec un message d'erreur du type "Time limit already expired for premier service type mediaProcessing".

Pour en savoir plus sur le type de service mediaProcessing, consultez Modifications apportées aux types de services de premier plan pour Android 15: Traitement multimédia.

Tests

Pour tester le comportement de votre application, vous pouvez activer les délais avant expiration du traitement multimédia même si votre application ne cible pas Android 15 (à condition qu'elle s'exécute sur un appareil Android 15). Pour activer les délais avant expiration, exécutez la commande adb suivante:

adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name

Vous pouvez également ajuster le délai avant expiration pour tester plus facilement le comportement de votre application une fois la limite atteinte. Pour définir un nouveau délai avant expiration, exécutez la commande adb suivante:

adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds

Restrictions concernant les broadcast receivers BOOT_COMPLETED qui lancent les services de premier plan

De nouvelles restrictions s'appliquent aux broadcast receivers BOOT_COMPLETED qui lancent les services de premier plan. Les récepteurs BOOT_COMPLETED ne sont pas autorisés à lancer les types de services de premier plan suivants:

Si un récepteur BOOT_COMPLETED tente de lancer l'un de ces types de services de premier plan, le système génère une erreur ForegroundServiceStartNotAllowedException.

Restrictions concernant le démarrage des services de premier plan lorsqu'une application détient l'autorisation SYSTEM_ALERT_WINDOW

Auparavant, si une application détenait l'autorisation SYSTEM_ALERT_WINDOW, elle pouvait lancer un service de premier plan même si l'application était actuellement en arrière-plan (comme indiqué dans la section Exceptions des restrictions de démarrage en arrière-plan).

Si une application cible Android 15, cette exception est désormais plus restrictive. L'application doit désormais disposer de l'autorisation SYSTEM_ALERT_WINDOW et également disposer d'une fenêtre en superposition visible. Autrement dit, l'application doit d'abord lancer une fenêtre TYPE_APPLICATION_OVERLAY et celle-ci doit être visible avant de démarrer un service de premier plan.

Si votre application tente de démarrer un service de premier plan à partir de l'arrière-plan sans remplir ces nouvelles exigences (et qu'elle ne dispose pas d'une autre exception), le système génère une exception ForegroundServiceStartNotAllowedException.

Si votre application déclare l'autorisation SYSTEM_ALERT_WINDOW et lance des services de premier plan en arrière-plan, elle peut être affectée par cette modification. Si votre application reçoit un ForegroundServiceStartNotAllowedException, vérifiez l'ordre des opérations et assurez-vous qu'elle dispose déjà d'une fenêtre de superposition active avant de tenter de démarrer un service de premier plan en arrière-plan. Vous pouvez vérifier si votre fenêtre de superposition est actuellement visible en appelant View.getWindowVisibility(). Vous pouvez également ignorer View.onWindowVisibilityChanged() afin d'être averti chaque fois que la visibilité change.

Modifications concernant les cas dans lesquels les applications peuvent modifier l'état général du mode Ne pas déranger

Les applications qui ciblent Android 15 ne peuvent plus modifier l'état ni la règle globaux du mode Ne pas déranger sur un appareil (en modifiant les paramètres utilisateur ou en désactivant le mode Ne pas déranger). À la place, les applications doivent contribuer à un AutomaticZenRule, que le système combine dans une règle globale avec le schéma "most-restrictive-policy-wins" existant. Les appels d'API existantes qui ont précédemment affecté l'état global (setInterruptionFilter, setNotificationPolicy) entraînent la création ou la mise à jour d'un AutomaticZenRule implicite, qui est activé ou désactivé en fonction du cycle d'appel de ces appels d'API.

Notez que cette modification n'affecte le comportement observable que si l'application appelle setInterruptionFilter(INTERRUPTION_FILTER_ALL) et s'attend à ce que cet appel désactive un AutomaticZenRule précédemment activé par ses propriétaires.

Modifications d'OpenJDK 17

Android 15 poursuit le travail d'actualisation des bibliothèques principales d'Android pour aligner avec les fonctionnalités des dernières versions d'OpenJDK LTS.

L'une de ces modifications peut affecter la compatibilité des applications pour le ciblage des applications Android 15 (niveau d'API 35):

  • Modifications apportées aux API de mise en forme des chaînes: validation de l'index d'arguments, des options la largeur et la précision sont désormais plus strictes lorsque vous utilisez API String.format() et Formatter.format():

    Par exemple, l'exception suivante est levée lorsqu'un index d'argument de 0 est utilisée (%0 dans la chaîne de format):

    IllegalFormatArgumentIndexException: Illegal format argument index = 0
    

    Dans ce cas, le problème peut être résolu en utilisant un index d'argument de 1 (%1). dans la chaîne de format).

  • Modifications du type de composant de Arrays.asList(...).toArray(): lors de l'utilisation Arrays.asList(...).toArray(), le type de composant du tableau obtenu est Il s'agit désormais d'un élément Object, et non sur le type des éléments du tableau sous-jacent. Ainsi, le code suivant génère une exception ClassCastException:

    String[] elements = (String[]) Arrays.asList("one", "two").toArray();
    

    Dans ce cas, pour conserver String comme type de composant dans le résultat vous pouvez utiliser Collection.toArray(Object[]) à la place:

    String[] elements = Arrays.asList("two", "one").toArray(new String[0]);
    
  • Modifications apportées à la gestion du code de langue: lorsque vous utilisez l'API Locale, codes de langue pour l'hébreu, le yiddish et l'indonésien ne sont plus convertis et leur format obsolète (hébreu: iw, yiddish: ji et indonésien: in). Lorsque vous spécifiez le code de langue pour l'un de ces paramètres régionaux, utilisez les codes ISO 639-1 (hébreu: he, yiddish: yi et indonésien: id).

  • Modifications apportées aux séquences int aléatoires: suite aux modifications apportées dans https://bugs.openjdk.org/browse/JDK-8301574, les éléments suivants : Les méthodes Random.ints() renvoient désormais une séquence de nombres différente de celle les méthodes Random.nextInt():

    En règle générale, cette modification ne devrait pas entraîner de perturbations dans l'application, mais votre le code ne doit pas s'attendre à ce que la séquence générée à partir des méthodes Random.ints() correspond à Random.nextInt().

Sécurité

Android 15 inclut des modifications qui favorisent la sécurité du système afin de protéger les applications et les utilisateurs contre les applications malveillantes.

Lancement de l'activité en arrière-plan sécurisée

Android 15 protège les utilisateurs des applications malveillantes et leur donne plus de contrôle sur leurs appareils en ajoutant des modifications qui empêchent les applications malveillantes d'arrière-plan de mettre d'autres applications au premier plan, d'élever leurs privilèges et d'abuser des interactions utilisateur. Le lancement de l'activité en arrière-plan est limité depuis Android 10 (niveau d'API 29).

Empêcher les applications qui ne correspondent pas à l'UID principal de la pile de lancer des activités

Des applications malveillantes peuvent lancer l'activité d'une autre application dans la même tâche, puis se superposer, ce qui donne l'illusion d'être cette application. Cette attaque de "détournement de tâches" contourne les restrictions actuelles de lancement en arrière-plan, car elle se déroule toutes dans la même tâche visible. Pour atténuer ce risque, Android 15 ajoute un indicateur qui empêche les applications qui ne correspondent pas à l'UID principal de la pile de lancer des activités. Pour activer toutes les activités de votre application, mettez à jour l'attribut allowCrossUidActivitySwitchFromBelow dans le fichier AndroidManifest.xml de votre application:

<application android:allowCrossUidActivitySwitchFromBelow="false" >

Les nouvelles mesures de sécurité sont actives si toutes les conditions suivantes sont remplies:

  • L'application qui effectue le lancement cible Android 15.
  • L'application située au-dessus de la pile de tâches cible Android 15.
  • Les nouvelles protections sont activées pour toute activité visible.

Si les mesures de sécurité sont activées, les applications peuvent revenir à l'accueil plutôt que la dernière application visible si elles terminent leur propre tâche.

Autres modifications

En plus de la restriction de la correspondance UID, les modifications suivantes sont également incluses:

  • Modifiez les créateurs PendingIntent pour qu'ils bloquent le lancement des activités en arrière-plan par défaut. Cela empêche les applications de créer accidentellement un PendingIntent susceptible d'être utilisé de manière abusive par des acteurs malveillants.
  • N'affichez une application au premier plan que si l'expéditeur PendingIntent le permet. Ce changement vise à empêcher les applications malveillantes d'abuser de la possibilité de démarrer des activités en arrière-plan. Par défaut, les applications ne sont pas autorisées à placer la pile de tâches au premier plan, sauf si le créateur autorise les droits de lancement des activités en arrière-plan ou si l'expéditeur dispose de droits de lancement des activités en arrière-plan.
  • Contrôlez la manière dont l'activité principale d'une pile de tâches peut terminer sa tâche. Si l'activité principale termine une tâche, Android revient à la dernière tâche active. De plus, si une activité non principale termine sa tâche, Android revient à l'écran d'accueil. Il ne bloque pas la fin de cette activité.
  • Empêchez le lancement d'activités arbitraires provenant d'autres applications dans votre propre tâche. Ce changement empêche les applications malveillantes d'attaquer les utilisateurs d'hameçonnage en créant des activités qui semblent provenir d'autres applications.
  • Empêchez les fenêtres non visibles d'être prises en compte pour le lancement d'activités d'arrière-plan. Cela permet d'empêcher les applications malveillantes d'utiliser de manière abusive les lancements d'activités en arrière-plan pour afficher du contenu indésirable ou malveillant auprès des utilisateurs.

Intents plus sécurisés

Android 15 introduit de nouvelles mesures de sécurité pour rendre les intents plus sûrs et plus robustes. Ces modifications visent à prévenir les failles potentielles et l'usage abusif des intents, susceptibles d'être exploités par des applications malveillantes. Deux améliorations principales ont été apportées à la sécurité des intents dans Android 15:

  • Mettre en correspondance les filtres d'intent cibles:les intents qui ciblent des composants spécifiques doivent correspondre précisément aux spécifications de filtre d'intent de la cible. Si vous envoyez un intent pour lancer l'activité d'une autre application, le composant d'intent cible doit s'aligner sur les filtres d'intent déclarés de l'activité de réception.
  • Les intents doivent comporter des actions:les intents sans action ne correspondront plus à aucun filtre d'intent. Cela signifie que les intents utilisés pour démarrer des activités ou des services doivent avoir une action clairement définie.
  • Intents en attente:le créateur de l'intent en attente est traité comme l'expéditeur de l'intent englobant, et non comme l'expéditeur de l'intent en attente.

Kotlin


fun onCreate() {
    StrictMode.setVmPolicy(VmPolicy.Builder()
        .detectUnsafeIntentLaunch()
        .build()
    )
}

Java


public void onCreate() {
    StrictMode.setVmPolicy(new VmPolicy.Builder()
            .detectUnsafeIntentLaunch()
            .build());
}

Expérience utilisateur et UI du système

Android 15 inclut certaines modifications destinées à créer une expérience utilisateur plus cohérente et intuitive.

Modifications de l'encart de la fenêtre

Il existe deux modifications liées aux encarts de fenêtre dans Android 15: l'application bord à bord est appliquée par défaut, et il existe également des modifications de configuration, telles que la configuration par défaut des barres système.

Application bord à bord

Les applications sont bord à bord par défaut sur les appareils équipés d'Android 15 si elles sont ciblant Android 15 (niveau d'API 35).

<ph type="x-smartling-placeholder">
</ph>
Une application qui cible Android 14 et qui n'est pas de bord à bord sur Appareil Android 15


<ph type="x-smartling-placeholder">
</ph>
Une application qui cible Android 15 (niveau d'API 35) et qui est de bord à bord sur un appareil Android 15. Cette application utilise principalement des composants Compose Material 3 qui appliquent automatiquement les encarts. Cet écran n'est pas affecté par le Application bord à bord Android 15

Il s'agit d'une modification destructive qui pourrait avoir un impact négatif sur l'interface utilisateur de votre application. La les modifications affectent les zones d'interface utilisateur suivantes:

  • Barre de navigation par gestes <ph type="x-smartling-placeholder">
      </ph>
    • Transparent par défaut.
    • Le décalage inférieur est désactivé afin que le contenu s'affiche derrière la navigation système sauf si des encarts sont appliqués.
    • setNavigationBarColor et R.attr#navigationBarColor sont obsolète et n'affectent pas la navigation par gestes.
    • setNavigationBarContrastEnforced et R.attr#navigationBarContrastEnforced n'ont toujours aucun effet sur la navigation par gestes.
  • Navigation à trois boutons <ph type="x-smartling-placeholder">
      </ph>
    • L'opacité est définie sur 80% par défaut, et la couleur peut correspondre à celle de la fenêtre. en arrière-plan.
    • Décalage inférieur désactivé afin que le contenu s'affiche derrière la barre de navigation système sauf si des encarts sont appliqués.
    • setNavigationBarColor et R.attr#navigationBarColor sont définie pour correspondre à l'arrière-plan de la fenêtre par défaut. Arrière-plan de la fenêtre doit être un drawable couleur pour que cette valeur par défaut s'applique. Cette API est obsolète mais continue à affecter la navigation à trois boutons.
    • setNavigationBarContrastEnforced et R.attr#navigationBarContrastEnforced est défini sur "true" par défaut, ce qui ajoute Arrière-plan opaque à 80% pour une navigation à trois boutons.
  • Barre d'état <ph type="x-smartling-placeholder">
      </ph>
    • Transparent par défaut.
    • Le décalage supérieur est désactivé afin que le contenu s'affiche derrière la barre d'état, sauf et des encarts sont appliqués.
    • setStatusBarColor et R.attr#statusBarColor sont obsolètes et n'ont aucun effet sur Android 15.
    • setStatusBarContrastEnforced et R.attr#statusBarContrastEnforced sont obsolètes, mais ont toujours une sur Android 15.
  • Encoche <ph type="x-smartling-placeholder">
      </ph>
    • layoutInDisplayCutoutMode des fenêtres non flottantes doivent être LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS SHORT_EDGES, NEVER et Les DEFAULT sont interprétés comme ALWAYS, de sorte que les utilisateurs ne voient pas causée par l'encoche et s'affiche de bord à bord.

L'exemple suivant présente une application avant et après le ciblage Android 15 (niveau d'API 35), et avant et après l'application des encarts.

<ph type="x-smartling-placeholder">
</ph>
Une application qui cible Android 14 et qui n'est pas de bord à bord sur Appareil Android 15
Une application qui cible Android 15 (niveau d'API 35) et qui est de bord à bord sur un appareil Android 15. Toutefois, de nombreux éléments sont désormais masqués par l'état la barre de navigation, la barre de navigation à trois boutons ou l'encoche du fait d'Android 15, les mesures d'application de bord à bord. L'interface utilisateur masquée inclut Material 2 la barre d'application supérieure, les boutons d'action flottants et les éléments de liste.
Une application qui cible Android 15 (niveau d'API 35) est bord à bord un appareil Android 15 et applique des encarts afin que l'UI ne soit pas masquées.
Comment vérifier si votre application est déjà de bord à bord ?

Si votre application est déjà bord à bord et applique des encarts, n'ont quasiment aucun impact, sauf dans les cas suivants. Cependant, même si vous pensez vous n'êtes pas concerné, nous vous recommandons de tester votre application.

  • Vous disposez d'une fenêtre non flottante, telle qu'un Activity qui utilise SHORT_EDGES, NEVER ou DEFAULT au lieu de LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS Si votre application plante au lancement, en raison de votre écran de démarrage. Vous pouvez soit mettre à niveau splashscreen par rapport à 1.2.0-alpha01 ou une version ultérieure, ou définissez window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutInDisplayCutoutMode.always.
  • Il est possible que l'interface utilisateur soit masquée sur des écrans à faible trafic. Vérifier ces éléments les écrans moins consultés n'ont pas d'interface utilisateur obstruée. Les écrans qui affichent moins de trafic sont les suivants: <ph type="x-smartling-placeholder">
      </ph>
    • Écrans d'accueil ou de connexion
    • Pages de paramètres
Vérifier si votre application n'est pas déjà bord à bord

Si votre application n'est pas déjà bord à bord, vous êtes probablement affecté. Dans en plus des scénarios d'applications déjà bord à bord, tenez compte des éléments suivants:

  • Si votre application utilise des composants Material 3 ( androidx.compose.material3) dans Compose, par exemple TopAppBar, BottomAppBar et NavigationBar, il est probable que ces composants ne soient pas car ils gèrent automatiquement les encarts.
  • Si votre application utilise des composants Material 2 ( androidx.compose.material) dans Compose, ces composants ne gèrent pas automatiquement les encarts. Cependant, vous pouvez accéder aux encarts et les appliquer manuellement. Dans androidx.compose.material 1.6.0 puis utilisez le paramètre windowInsets pour appliquer les encarts manuellement BottomAppBar, TopAppBar BottomNavigation et NavigationRail. De même, utilisez le paramètre contentWindowInsets pour Scaffold.
  • Si votre application utilise des vues et des composants Material (com.google.android.material), Material Design principalement basé sur les vues Des composants tels que BottomNavigationView, BottomAppBar, NavigationRailView ou NavigationView gèrent les encarts et ne nécessitent aucune travail supplémentaire. Cependant, vous devez ajouter android:fitsSystemWindows="true" si vous utilisez AppBarLayout.
  • Pour les composables personnalisés, appliquez manuellement les encarts en tant que marge intérieure. Si votre contenu dans un Scaffold, vous pouvez utiliser des encarts à l'aide de l'Scaffold les valeurs de marge intérieure. Sinon, appliquez une marge intérieure à l'aide de l'une des WindowInsets.
  • Si votre application utilise des vues et des BottomSheet, SideSheet ou personnalisées des conteneurs, appliquez un remplissage à l'aide de ViewCompat.setOnApplyWindowInsetsListener Pour RecyclerView, appliquer une marge intérieure à l'aide de cet écouteur et ajouter clipToPadding="false"
Points à vérifier si votre application doit proposer une protection personnalisée en arrière-plan

Si votre application doit offrir une protection personnalisée en arrière-plan pour la navigation à trois boutons ou la barre d'état, votre application doit placer un composable ou une vue derrière la barre système avec WindowInsets.Type#tappableElement() pour obtenir les trois boutons hauteur de la barre de navigation ou WindowInsets.Type#statusBars.

Ressources de bord à bord supplémentaires

Consultez les vues Edge à Edge et Edge to Edge Compose. pour en savoir plus sur l'application d'encarts.

API obsolètes

Les API suivantes sont désormais obsolètes:

Configuration stable

Si votre application cible Android 15 (niveau d'API 35) ou une version ultérieure, Configuration non exclut plus longtemps les barres système. Si vous utilisez la taille d'écran Classe Configuration pour le calcul de la mise en page, à remplacer par une des alternatives comme ViewGroup, WindowInsets ou WindowMetricsCalculator selon vos besoins.

Configuration est disponible depuis l'API 1. Elle est généralement obtenue à partir de Activity.onConfigurationChanged Il fournit des informations telles que la densité de la fenêtre, l'orientation et les tailles. Une caractéristique importante de la taille des fenêtres renvoyé par Configuration signifie qu'il excluait auparavant les barres système.

La taille de configuration sert généralement à sélectionner des ressources, par exemple /res/layout-h500dp, et ce cas d'utilisation reste valide. Cependant, son utilisation pour le calcul de mise en page a toujours été déconseillé. Dans ce cas, vous devez migrer tout de suite. Vous devez remplacer l'utilisation de Configuration par quelque chose plus adapté à votre cas d'utilisation.

Si vous l'utilisez pour calculer la mise en page, utilisez un ViewGroup approprié, tel que CoordinatorLayout ou ConstraintLayout. Si vous l'utilisez pour déterminer la hauteur de la barre de navigation du système, utilisez WindowInsets. Si vous voulez connaître la taille actuelle de la fenêtre de votre application, utilisez computeCurrentWindowMetrics.

La liste suivante décrit les champs concernés par cette modification:

  • Les tailles Configuration.screenWidthDp et screenHeightDp ne sont plus disponibles exclure les barres système.
  • Configuration.smallestScreenWidthDp est indirectement affecté par les modifications à screenWidthDp et screenHeightDp.
  • Configuration.orientation est indirectement affecté par les modifications apportées à screenWidthDp et screenHeightDp sur les appareils proches de la position carrée.
  • Display.getSize(Point) est indirectement affecté par les modifications apportées à Configuration Cette fonctionnalité est obsolète depuis le niveau d'API 30.
  • Display.getMetrics() fonctionne déjà de cette manière depuis le niveau d'API 33.

Par défaut, l'attribut élégantTextHeight est défini sur "true".

Pour les applications ciblant Android 15, l'attribut elegantTextHeight TextView devient true par défaut, en remplaçant la police compacte utilisée par défaut par certains scripts associés à de grandes métriques verticales par un autre plus lisible. La police compacte a été introduite pour éviter de perturber les mises en page. Android 13 (niveau d'API 33) empêche bon nombre de ces failles en permettant à la mise en page du texte d'étirer la hauteur verticale à l'aide de l'attribut fallbackLineSpacing.

Dans Android 15, la police compacte reste dans le système. Votre application peut donc définir elegantTextHeight sur false pour obtenir le même comportement qu'auparavant, mais elle ne sera probablement pas compatible avec les prochaines versions. Ainsi, si votre application est compatible avec les scripts suivants (arabe, laotien, birman, gujarati, kannada, malayalam, odia, télougou ou thaï), testez-la en définissant elegantTextHeight sur true.

Comportement elegantTextHeight pour les applications ciblant Android 14 (niveau d'API 34) ou version antérieure.
Comportement de elegantTextHeight pour les applications ciblant Android 15.

Modifications de la largeur de TextView pour les lettres complexes

Dans les versions précédentes d'Android, certaines polices cursives ou certaines langues présentant une mise en forme complexe peuvent dessiner les lettres dans la zone du caractère précédent ou suivant. Dans certains cas, ces lettres étaient tronquées au début ou à la fin. À partir d'Android 15, un TextView alloue une largeur pour dessiner suffisamment d'espace pour ces lettres et permet aux applications de demander des marges intérieures supplémentaires à gauche pour éviter le rognage.

Étant donné que cette modification affecte la façon dont un TextView détermine la largeur, TextView alloue plus de largeur par défaut si l'application cible Android 15 ou version ultérieure. Vous pouvez activer ou désactiver ce comportement en appelant l'API setUseBoundsForWidth sur TextView.

L'ajout d'une marge intérieure à gauche peut entraîner un désalignement pour les mises en page existantes. C'est pourquoi cette marge intérieure n'est pas ajoutée par défaut, même pour les applications qui ciblent Android 15 ou version ultérieure. Toutefois, vous pouvez ajouter une marge intérieure supplémentaire pour empêcher le rognage en appelant setShiftDrawingOffsetForStartOverhang.

Les exemples suivants montrent comment ces modifications peuvent améliorer la mise en page du texte pour certaines polices et langues.

Mise en page standard pour le texte anglais dans une police cursive. Certaines lettres sont tronquées. Voici le code XML correspondant:

<TextView
    android:fontFamily="cursive"
    android:text="java" />
Mise en page pour le même texte en anglais avec une largeur et une marge intérieure supplémentaires. Voici le code XML correspondant:

<TextView
    android:fontFamily="cursive"
    android:text="java"
    android:useBoundsForWidth="true"
    android:shiftDrawingOffsetForStartOverhang="true" />
Disposition standard pour le texte en thaï. Certaines lettres sont tronquées. Voici le code XML correspondant:

<TextView
    android:text="คอมพิวเตอร์" />
Mise en page pour le même texte thaï avec une largeur et une marge intérieure supplémentaires. Voici le code XML correspondant:

<TextView
    android:text="คอมพิวเตอร์"
    android:useBoundsForWidth="true"
    android:shiftDrawingOffsetForStartOverhang="true" />

Hauteur de ligne par défaut en fonction des paramètres régionaux pour EditText

Dans les versions précédentes d'Android, la mise en page du texte étirait la hauteur du texte afin qu'elle corresponde à la hauteur de la ligne de la police correspondant aux paramètres régionaux actuels. Par exemple, si le contenu était en japonais, car la hauteur de ligne de la police japonaise est légèrement supérieure à celle d'une police latine, la hauteur du texte est devenue légèrement plus importante. Toutefois, malgré ces différences de hauteur de ligne, l'élément EditText a été dimensionné de manière uniforme, quels que soient les paramètres régionaux utilisés, comme illustré dans l'image suivante:

Trois zones représentant des éléments EditText pouvant contenir du texte de l'anglais (en), du japonais (ja) et du birman (my). La hauteur de EditText est la même, même si ces langues ont des hauteurs de ligne différentes les unes des autres.

Pour les applications ciblant Android 15, une hauteur de ligne minimale est désormais réservée à EditText afin qu'il corresponde à la police de référence pour les paramètres régionaux spécifiés, comme illustré dans l'image suivante:

Trois zones représentant des éléments EditText pouvant contenir du texte de l'anglais (en), du japonais (ja) et du birman (my). La hauteur de EditText inclut désormais de l'espace pour accueillir la hauteur de ligne par défaut pour les polices de ces langues.

Si nécessaire, votre application peut restaurer le comportement précédent en spécifiant l'attribut useLocalePreferredLineHeightForMinimum sur false. Elle peut également définir des métriques verticales minimales personnalisées à l'aide de l'API setMinimumFontMetrics en Kotlin et Java.

Appareil photo et contenus multimédias

Android 15 apporte les modifications suivantes au comportement de l'appareil photo et des contenus multimédias pour les applications qui ciblent Android 15 ou version ultérieure.

Restrictions concernant la demande de priorité audio

Les applications qui ciblent Android 15 doivent être l'application principale ou exécuter un service de premier plan pour demander la priorité audio. Si une application tente de demander la sélection alors qu'elle ne répond pas à l'une de ces exigences, l'appel renvoie AUDIOFOCUS_REQUEST_FAILED.

Pour en savoir plus sur la priorité audio, consultez Gérer la priorité audio.

Mise à jour des restrictions non SDK

Android 15 inclut des listes à jour de listes d'autorisations non SDK limitées grâce à une collaboration avec des développeurs Android tests internes. Dans la mesure du possible, nous nous assurons que des alternatives publiques sont disponibles avant de limiter les interfaces non SDK.

Si votre application ne cible pas Android 15, certaines de ces modifications pourrait ne pas vous affecter immédiatement. Toutefois, même s'il est possible que votre application accéder à certaines interfaces non SDK selon le niveau d'API cible de votre application, en utilisant des API la méthode ou le champ comporte toujours un risque élevé d'endommager votre application.

Si vous n'êtes pas sûr que votre application utilise des interfaces non SDK, vous pouvez Testez votre application pour le savoir. Si votre application repose sur un outil non SDK vous devez commencer à planifier une migration vers des alternatives SDK. Nous comprenons néanmoins que certaines applications ont des cas d'utilisation valables interfaces non SDK. Si vous ne trouvez pas d'alternative à l'utilisation d'un autre SDK d'une fonctionnalité de votre application, vous devez demander une nouvelle API publique.

Pour en savoir plus sur les modifications apportées à cette version d'Android, consultez Mises à jour des restrictions des interfaces non SDK dans Android 15. Pour en savoir plus sur les interfaces non SDK de manière générale, consultez la section Restrictions concernant les interfaces non SDK.