Mode de compatibilité pour grand écran

Android active un mode de compatibilité pour les applications qui déclarent des restrictions d'orientation ou de redimensionnement. Le mode de compatibilité garantit un comportement acceptable de l'application sur les appareils à grand écran, mais avec une facilité d'utilisation non optimale.

Les forçages par application permettent aux fabricants d'appareils de modifier le comportement des applications afin d'améliorer l'expérience utilisateur ou d'éviter que celles-ci ne plantent sur les grands écrans.

Problèmes de compatibilité courants

Lorsque les applications rencontrent des problèmes de compatibilité, ces problèmes sont généralement causés par des restrictions de l'orientation de l'application, des restrictions de redimensionnement et de format, une mauvaise gestion de l'orientation de l'aperçu de l'appareil photo et des API mal utilisées.

Format letterbox

Le format letterbox positionne l'application au centre de l'écran ou, sur les grands écrans, d'un côté ou de l'autre pour en faciliter l'accès. Des bandes (barres de couleur unie ou fond d'écran flouté) remplissent la zone d'affichage inutilisée sur les côtés, ou en haut et en bas de l'application.

Le format letterbox est souvent appliqué sur les appareils à grand écran, car les dimensions et le format de l'écran de l'appareil sont généralement différents de ceux des téléphones standards, pour lesquels la plupart des applications sont conçues.

Figure 1 : Une application limitée au mode portrait est mise au format letterbox sur une tablette en format paysage et sur un appareil pliable.

Problème

L'application n'est pas compatible avec toutes les configurations d'affichage, car elle a une orientation ou un format fixe ou n'est pas redimensionnable.

Parmi les paramètres de configuration qui contrôlent l'orientation et le redimensionnement de l'application, on trouve par exemple les suivants :

  • screenOrientation : spécifie une orientation fixe pour une application. Les applications peuvent également définir l'orientation au moment de l'exécution à l'aide de Activity#setRequestedOrientation().
  • resizeableActivity : indique si le système est autorisé ou non à redimensionner les applications pour les adapter aux fenêtres de différentes dimensions. Sur Android 11 (niveau d'API 30) ou version antérieure, ce paramètre indique si les applications sont compatibles ou non avec le mode multifenêtre. Sur Android 12 (niveau d'API 31) ou version ultérieure, ce paramètre indique si les applications sont compatibles ou non avec le mode multifenêtre sur les petits écrans (plus petite largeur < 600 dp). Sur Android 12 et versions ultérieures, les applications sont compatibles avec le mode multifenêtre sur les grands écrans (plus petite largeur >= 600 dp), quel que soit le réglage de ce paramètre.
  • maxAspectRatio : spécifie le format maximal accepté par l'application. Seules les applications avec resizeableActivity défini sur "false" peuvent définir maxAspectRatio.
  • minAspectRatio : spécifie le format minimal accepté par l'application. Seules les applications avec resizeableActivity défini sur "false" peuvent définir minAspectRatio.

Optimisation

L'application doit être compatible avec tous les appareils et toutes les orientations et tailles d'écran en mode multifenêtre. Supprimez toutes les restrictions d'orientation et de format fixe des mises en page et du fichier manifeste de votre application. Pour en savoir plus, consultez Assurer la compatibilité avec différentes tailles d'écran.

Solution de compatibilité

Si une application dont l'orientation ou le format est fixe s'exécute dans une fenêtre, mais n'est pas directement compatible avec la taille ou l'orientation de cette fenêtre, Android affiche l'application au format letterbox pour garantir la continuité.

À partir d'Android 12 (niveau d'API 31) et avec la version 12L (niveau d'API 32) ensuite, la plate-forme applique diverses améliorations aux applications au format letterbox. Les fabricants d'appareils mettent en œuvre les améliorations de l'interface utilisateur. Votre application peut donc en profiter, sans développement supplémentaire de votre part.

Android 12 (niveau d'API 31) introduit les améliorations esthétiques suivantes, que les fabricants d'appareils peuvent configurer :

  • Angles arrondis : les angles de la fenêtre de l'application ont un aspect plus élégant.
  • Transparence de la barre système : les barres d'état et de navigation, qui se superposent à l'application, sont semi-transparentes. Les icônes des barres sont donc toujours visibles sur l'arrière-plan du format letterbox.
  • Format configurable : vous pouvez ajuster le format de l'application pour la rendre plus esthétique.

Figure 2 : Application au format letterbox avec améliorations de l'interface utilisateur

La version 12L (niveau d'API 32) ajoute les améliorations fonctionnelles suivantes :

  • Positionnement configurable : sur les grands écrans, les fabricants d'appareils peuvent positionner l'application sur le côté gauche ou droit de l'écran, ce qui facilite les interactions.
  • Refonte du bouton de redémarrage : les fabricants d'appareils peuvent donner une nouvelle apparence au bouton de redémarrage du mode de compatibilité de taille afin d'en améliorer la reconnaissance par les utilisateurs.

Android 13 (niveau d'API 33) ajoute une boîte de dialogue pédagogique expliquant à l'utilisateur comment positionner l'application au format letterbox à l'écran ou comment inclure ce format en mode Écran partagé :

Figure 3 : Application au format letterbox avec boîte de dialogue pédagogique à destination de l'utilisateur.

Mode de compatibilité de taille

Le mode de compatibilité de taille est un format letterbox qui inclut une commande de redémarrage. Cette commande permet aux utilisateurs de redémarrer l'application et de redessiner l'écran. Android appelle le mode de compatibilité de taille pour les applications qui ne sont pas redimensionnables. Lorsqu'une activité est déplacée vers un conteneur d'affichage comportant des dimensions incompatibles, le système peut redimensionner l'application pour qu'elle occupe toute la largeur et/ou toute la longueur de l'écran de l'appareil.

Voici les modifications apportées à la configuration de l'appareil qui peuvent déclencher le mode de compatibilité de taille :

  • Rotation de l'appareil
  • Pliage ou dépliage d'appareils pliables
  • Passage du mode plein écran au mode Écran partagé

Problème

Le mode de compatibilité de taille s'applique généralement aux activités dont l'orientation ou le format sont limités, et qui sont configurées (ou déterminées par le système) comme non redimensionnables.

Votre application est considérée comme redimensionnable (et ne sera pas placée en mode de compatibilité de taille) si elle répond à l'un des critères suivants :

Si votre application ne remplit pas l'une de ces conditions, elle est considérée comme non redimensionnable. Elle est alors susceptible d'être placée en mode de compatibilité de taille.

Optimisation

L'application doit être compatible avec toutes les tailles d'écran. Rendez votre application redimensionnable en définissant l'attribut android:resizeableActivity de l'élément <activity> ou <application> sur "true" dans le fichier manifeste de l'application. Concevez des mises en page responsives/adaptatives pour votre application. Pour en savoir plus, consultez les pages Assurer la compatibilité avec différentes tailles d'écran et Compatibilité avec le mode multifenêtre.

Solution de compatibilité

Android place une application en mode de compatibilité de taille lorsque le système détermine qu'il peut améliorer l'affichage de l'application au format letterbox en redimensionnant l'application pour qu'elle occupe toute la largeur et/ou la longueur de la fenêtre d'affichage. Le système affiche une commande de redémarrage qui recrée le processus de l'application, recréant l'activité et redessinant l'écran. Consultez aussi la page Présentation des processus et des threads.

Boucles de clignotement

Lorsqu'une application n'est pas compatible avec toutes les orientations d'écran, elle peut demander de nouvelles orientations à plusieurs reprises lors d'une modification de la configuration, créant ainsi une boucle infinie qui fera clignoter l'écran ou pivoter l'application sans fin.

Problème

Sur Android 12 (niveau d'API 31) ou version ultérieure, les fabricants peuvent configurer leurs appareils de manière à ignorer les restrictions d'orientation spécifiées par les applications et à utiliser à la place ces restrictions pour activer les modes de compatibilité. Par exemple, un appareil pliable peut ignorer le paramètre android:screenOrientation="portrait" d'une activité lorsque celle-ci s'affiche sur l'écran intérieur de l'appareil au format tablette.

Si les restrictions d'orientation d'une application sont ignorées, l'application peut définir son orientation de façon programmatique en appelant Activity#setRequestedOrientation(). L'appel déclenche un redémarrage de l'application si celle-ci ne gère pas les modifications de configuration (voir Gérer les modifications de configuration). Après le redémarrage, les restrictions d'orientation de l'application sont à nouveau ignorées, l'application répète l'appel de setRequestedOrientation(), l'appel déclenche un redémarrage de l'application, et ainsi de suite dans une boucle perpétuelle.

Vous pouvez également rencontrer ce problème lorsque l'orientation naturelle (l'orientation usuelle déterminée par Android) de l'écran d'un appareil est le mode paysage (c'est-à-dire que l'appel de Display#getRotation() renvoie Surface.ROTATION_0 alors que l'appareil est en mode paysage). Par le passé, les applications considéraient que Display.getRotation() = Surface.ROTATION_0 indiquait que l'appareil était en mode portrait, mais ce n'est pas toujours le cas, par exemple sur l'écran interne du Pixel Fold et sur certaines tablettes.

Une application en mode paysage sur l'écran intérieur d'un Pixel Fold peut vérifier la rotation de l'écran, recevoir une valeur de ROTATION_0, supposer que l'orientation naturelle est le mode portrait et appeler setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT). Une fois que l'application a redémarré (en mode paysage), il est possible qu'elle vérifie à nouveau la rotation de l'écran, reçoive la valeur ROTATION_0, appelle setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT), etc., créant ainsi une boucle infinie.

Optimisation

Les applications ne doivent pas effectuer les opérations suivantes :

  • Définir une orientation par défaut avec Activity#setRequestedOrientation() dans la méthode onCreate() de l'activité, car la requête d'orientation peut être déclenchée de manière inattendue par des modifications de configuration non gérées
  • Supposer que l'orientation naturelle de l'appareil (ROTATION_0) est le mode portrait
  • Définir l'orientation en fonction de signaux qui ne sont pas liés à la taille de fenêtre actuelle, comme Display#getRotation(), la présence d'une FoldingFeature ou des API obsolètes (voir ci-dessous)

Solution de compatibilité

Android ignore les appels de Activity#setRequestedOrientation() dans les situations suivantes :

  • L'activité a déjà été relancée à partir d'un appel précédent de la méthode, ou le traitement de compatibilité de l'appareil photo permettant de forcer la rotation a été activé (voir Aperçu de l'appareil photo ci-dessous).

    Les fabricants d'appareils peuvent appliquer ce comportement à une application avec OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION.

  • L'activité a effectué plus de deux requêtes d'orientation en une seconde, ce qui indique qu'une boucle s'est produite. Parmi les deux requêtes de la boucle, Android utilise celle qui maximise la zone d'affichage de l'application.

    Les fabricants d'appareils peuvent appliquer ce comportement à une application avec OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED.

Aperçu de l'appareil photo

L'aperçu de l'appareil photo (ou viseur) des applications d'appareil photo peut être mal aligné ou déformé sur les tablettes, les ordinateurs portables et les écrans pliables.

Problème

La Définition de compatibilité Android spécifie que le capteur d'image d'un appareil photo "DOIT être orienté de sorte à faire correspondre la dimension longue de l'appareil photo à la dimension longue de l'écran".

Les applications supposent souvent que l'orientation de l'appareil et celle du capteur de l'appareil photo sont en mode portrait, ce qui est une hypothèse acceptable pour les téléphones mobiles standards. Cependant, l'orientation naturelle des tablettes et des ordinateurs portables, ainsi que celles du capteur de leurs appareils photo peuvent être en mode paysage. Par ailleurs, les nouveaux facteurs de forme, tels que les appareils pliables, peuvent avoir plusieurs orientations naturelles et différents capteurs d'appareil photo dans différentes orientations.

Le démarrage d'une activité avec une orientation d'appareil photo à laquelle l'application ne s'attend pas, ou le passage d'un appareil photo ou d'un écran à un autre (pour les appareils pliables) peut entraîner le mauvais alignement ou la distorsion de l'aperçu de l'appareil photo.

Optimisation

Les applications d'appareil photo doivent identifier et gérer correctement l'orientation de l'appareil et celle du capteur de l'appareil photo pour présenter un aperçu correctement aligné et à l'échelle. Les applications doivent calculer la rotation de l'appareil, la rotation des capteurs et le format de l'écran ou de la fenêtre, puis appliquer les résultats obtenus à l'aperçu de l'appareil photo. Pour en savoir plus, consultez la page Aperçu de l'appareil photo et l'article Introducing Camera Viewfinder (Présentation du viseur de l'appareil photo).

Solution de compatibilité

Un appareil est en orientation naturelle lorsque Display#getRotation() renvoie Surface.ROTATION_0. Le système calcule CameraCharacteristics.SENSOR_ORIENTATION à partir de l'orientation naturelle de l'appareil. Android adapte la fenêtre du mode portrait de l'application limitée au mode portrait à l'orientation naturelle de l'appareil, le comportement attendu par la plupart des applications. Android recadre également l'image du capteur de l'appareil photo lorsque le capteur est orienté en mode paysage alors que l'aperçu de l'appareil photo est en mode portrait. Voici quelques solutions de contournement spécifiques :

  • Forcer la rotation des aperçus de l'appareil photo pour les applications limitées au mode portrait : les applications limitées au mode portrait s'attendent à ce que l'orientation naturelle de l'appareil et l'orientation du capteur de l'appareil photo soient en mode portrait. Toutefois, sur Android 12 (niveau d'API 31) ou version ultérieure, les applications peuvent s'exécuter dans plusieurs orientations d'appareil si les fabricants d'appareils ignorent la spécification d'orientation.

    Lorsqu'une application limitée au mode portrait est connectée à l'appareil photo, Android force la rotation de l'application pour que la fenêtre de l'application en mode portrait corresponde à l'orientation naturelle de l'appareil.

    Sur la Pixel Tablet, la fenêtre de l'application en mode portrait est pivotée en mode portrait plein écran pour s'adapter à l'orientation naturelle de l'appareil. L'application occupe la totalité de l'écran après la rotation forcée.

    Sur l'écran intérieur du Pixel Fold, les activités limitées au mode portrait sont orientées en mode paysage pour correspondre à l'orientation naturelle lorsque l'appareil est déplié. Après la rotation forcée, l'application est mise au format letterbox.

  • Recadrage de la caméra avant intérieure : le capteur de la caméra avant du Pixel Fold est en mode paysage. En plus de forcer la rotation de l'aperçu de l'appareil photo sur l'écran intérieur du Pixel Fold, Android recadre le champ de vision de la caméra avant intérieure (paysage) pour que le capteur capture une vue dont l'orientation est l'inverse de l'orientation de l'appareil.

  • Forcer l'actualisation des aperçus de l'appareil photo : le système parcourt les méthodes d'activité.onStop() etonStart() (par défaut) ou onPause() et onResume() (appliquées par le forçage par application OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE) après la rotation forcée pour s'assurer que l'aperçu de l'appareil photo s'affiche correctement.

  • Mise à l'échelle du format : le système modifie de façon dynamique le format de l'aperçu de l'appareil photo qui a fait l'objet d'une rotation forcée, afin qu'il soit à un format minimal plus élevé, ce qui permet de s'assurer que l'aperçu de l'appareil photo est correctement mis à l'échelle.

Les développeurs d'applications peuvent ignorer ces solutions si les applications gèrent correctement l'aperçu de l'appareil photo. Consultez la section Forçages par application ci-dessous.

Mauvaises utilisations courantes d'API

Android prend désormais en charge des fonctionnalités telles que le mode multifenêtre et des appareils tels que les appareils pliables. Les anciennes API ont donc été abandonnées et remplacées par des API à jour, compatibles avec toutes les tailles d'écran et tous les facteurs de forme d'appareil. Toutefois, les API obsolètes sont toujours disponibles pour assurer la rétrocompatibilité.

Certaines API View sont conçues pour des besoins particuliers qui ne sont pas toujours bien compris par les développeurs.

Problème

Les développeurs continuent à utiliser des API Display obsolètes et supposent à tort que les API renvoient les limites de l'application au lieu des limites de la zone d'affichage de l'appareil. Les développeurs peuvent aussi utiliser à tort des API View spéciales pour obtenir des métriques d'affichage générales. Cela entraîne des erreurs de calcul lors du repositionnement des éléments d'interface utilisateur après des événements de redimensionnement de la fenêtre de l'application, ce qui entraîne des problèmes de mise en page.

API Display obsolètes et couramment utilisées de façon incorrecte :

Pour en savoir plus, consultez la page Compatibilité avec le mode multifenêtre.

API View mal utilisées :

Optimisation

Ne vous appuyez jamais sur la taille d'écran physique pour positionner les éléments d'interface utilisateur. Migrez votre application vers des API basées sur WindowMetrics, y compris les API WindowManager suivantes :

Solution de compatibilité

Deux forçages permettent d'ajuster les API Display obsolètes et les API View mal utilisées pour renvoyer les limites de l'application : ALWAYS_SANDBOX_DISPLAY_APIS pour les API Display et OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS pour les API View. ALWAYS_SANDBOX_DISPLAY_APIS est également appliqué par défaut aux applications éligibles au mode de compatibilité de taille.

Activités transparentes

Les activités transparentes sont le résultat de styles d'arrière-plan transparents, par exemple :

<style name="Transparent" parent="AppTheme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

Les thèmes associés aux boîtes de dialogue, tels que Theme.Material.Dialog, peuvent inclure des styles qui rendent les activités transparentes.

Les activités transparentes n'occupent pas tout l'espace d'affichage disponible. Elles sont donc difficiles à gérer sur les grands écrans, car la zone d'affichage disponible peut changer en fonction des changements de configuration tels que la rotation de l'appareil, le pliage et le dépliage de l'appareil, et le mode multifenêtre.

Problème

Sur les grands écrans, une activité transparente doit respecter les limites de la première activité opaque sous l'activité transparente dans la pile d'activités de la tâche. Cependant, une activité opaque qui lance une boîte de dialogue d'autorisation peut être un trampoline (une activité qui lance d'autres activités) qui disparaît après le lancement de la boîte de dialogue. C'est pourquoi le système ne peut pas déterminer les limites de l'activité opaque sous l'activité transparente.

Optimisation

Les activités transparentes héritent des contraintes de l'activité opaque supérieure située en dessous d'elles dans la pile d'activités d'une tâche. L'activité opaque doit être disponible tout au long du cycle de vie de l'activité transparente, de sa création à sa destruction. C'est pourquoi vous ne devez pas lancer de demandes d'autorisation à partir d'activités de trampoline.

Si une activité de trampoline lance une demande d'autorisation, il est possible que la boîte de dialogue d'autorisation ne s'affiche pas, car l'activité de trampoline a été détruite avant que l'utilisateur ait eu le temps de répondre à la boîte de dialogue.

Les applications doivent toujours lancer les demandes d'autorisation à partir d'activités qui restent visibles jusqu'à ce que l'utilisateur prenne une décision.

Coins arrondis

Une activité peut être transparente en utilisant un thème transparent ou en ne remplissant pas l'espace disponible à l'écran. Si une activité transparente remplit l'espace disponible à l'écran, le système applique automatiquement des angles arrondis à l'activité si le fabricant de l'appareil a configuré ce paramètre. Toutefois, si une activité transparente (comme une boîte de dialogue d'autorisation) ne remplit pas l'espace disponible, c'est à vous de décider si vous voulez lui appliquer des coins arrondis.

Les boîtes de dialogue d'autorisation ne remplissent pas l'espace d'affichage disponible, car leur mise en page utilise généralement LayoutParams.WRAP_CONTENT au lieu de LayoutParams.MATCH_PARENT.

Solution de compatibilité

Les activités qui lancent des activités de boîte de dialogue doivent rester visibles jusqu'à ce que l'utilisateur réponde à la boîte de dialogue.

Le système garantit qu'une activité transparente hérite de toutes les contraintes de la première activité opaque sous l'activité transparente dans la pile d'activités, y compris les contraintes liées aux éléments suivants :

  • Mode de compatibilité de taille
  • Orientation
  • Format

Jeux Unity

Sur Android, les jeux Unity s'exécutent en plein écran ou en mode multifenêtre. Toutefois, de nombreux jeux Unity perdent leur focus et arrêtent de dessiner du contenu lorsque l'application est placée en mode multifenêtre.

Problème

Unity a ajouté une option Resizable Window pour prendre en charge le mode multifenêtre sur Android depuis Unity 2019.4. Cependant, l'implémentation initiale ne réagissait pas correctement au cycle de vie de l'activité en mode multifenêtre et UnityPlayer interrompait la lecture lorsque l'application perdait son focus. Le lecteur affichait écran noir ou la dernière image figée du jeu. Le jeu ne reprenait alors pas tant que l'utilisateur n'avait pas appuyé sur l'écran. De nombreuses applications qui utilisent le moteur Unity rencontrent ce problème et s'affichent sous la forme d'une fenêtre noire en mode multifenêtre.

Optimisation

Mettez à niveau Unity vers la version 2019.4.40 ou une version ultérieure, puis réexportez votre jeu. Laissez l'option Resizable Window cochée dans les paramètres du lecteur Android. Sinon, le jeu se met en pause lorsqu'il n'est pas au premier plan, même s'il est entièrement visible en mode multifenêtre.

Solution de compatibilité

Les fabricants d'appareils peuvent appliquer le forçage par application OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS pour fournir un faux événement de focus à une application en mode multifenêtre. Ce forçage permet à l'activité de redessiner le contenu au lieu d'afficher un écran noir.

Tester votre application pour identifier les problèmes de compatibilité

Pour tester votre application et comprendre son comportement avec différents facteurs de forme, consultez les ressources suivantes :

Est au format letterbox

Vérifiez que chaque activité peut utiliser tout l'espace d'affichage disponible pour l'application. Tout d'abord, déclarez le code suivant dans votre dossier de test :

Kotlin

fun Activity.isLetterboxed() : Boolean {
    if (isInMultiWindowMode) return false

    val wmc = WindowMetricsCalculator.getOrCreate()
    val currentBounds = wmc.computeCurrentWindowMetrics(this).bounds
    val maxBounds = wmc.computeMaximumWindowMetrics(this).bounds

    val isScreenPortrait = maxBounds.height() > maxBounds.width()

    return if (isScreenPortrait) {
        currentBounds.height() < maxBounds.height()
    } else {
        currentBounds.width() < maxBounds.width()
    }
}

Java

public boolean isLetterboxed(Activity activity) {
    if (activity.isInMultiWindowMode()) {
        return false;
    }

    WindowMetricsCalculator wmc = WindowMetricsCalculator.getOrCreate();
    Rect currentBounds = wmc.computeCurrentWindowMetrics(activity).getBounds()
    Rect maxBounds = wmc.computeMaximumWindowMetrics(activity).getBounds();

    boolean isScreenPortrait = maxBounds.height() > maxBounds.width();

    return (isScreenPortrait)
        ? currentBounds.height() < maxBounds.height()
        : currentBounds.width() < maxBounds.width();
}

Exécutez ensuite un test pour vérifier le comportement et vous assurer que l'activité cible n'est pas au format letterbox :

Kotlin

@get:Rule
val activityRule = ActivityScenarioRule(MainActivity::class.java)

@Test
fun activity_launched_notLetterBoxed() {
    activityRule.scenario.onActivity {
        assertThat(it.isLetterboxed()).isFalse()
    }
}

Java

@Rule
public ActivityScenarioRule rule = new ActivityScenarioRule<>(MainActivity.class);

public void activity_launched_notLetterBoxed() {
    try (ActivityScenario scenario = ActivityScenario.launch(MainActivity.class)) {
        scenario.onActivity(activity -> {
            assertThat(isLetterboxed(activity)).isFalse();
        });
    }
}

Idéalement, n'exécutez ce type de test que jusqu'à ce qu'il réussisse et confirme que les activités de votre application occupent la totalité de l'espace d'affichage disponible pour l'application. Testez votre application sur tous les types d'appareils pour garantir un comportement cohérent.

Forçages par application

Android fournit des forçages qui modifient le comportement configuré des applications. Par exemple, le forçage FORCE_RESIZE_APP indique au système de contourner le mode de compatibilité de taille et de redimensionner l'application pour qu'elle s'adapte aux dimensions d'affichage, même si resizeableActivity="false" est défini dans le fichier manifeste de l'application.

Les fabricants appliquent des forçages aux applications sélectionnées sur des appareils à grand écran spécifiques. Sur Android 14 (niveau d'API 34) ou version ultérieure, les utilisateurs peuvent appliquer des forçages aux applications via les paramètres de l'appareil.

Forçages par application et par utilisateur

Sur Android 14 ou version ultérieure, un menu de paramètres permet aux utilisateurs de modifier le format des applications. Les appareils à grand écran tels que la Pixel Tablet et le Pixel Fold implémentent le menu.

Le menu contient la liste de toutes les applications installées sur l'appareil. Les utilisateurs choisissent une application, puis définissent le format de l'application sur 3:4, 1:1, plein écran ou toute autre valeur configurée par le fabricant de l'appareil. Les utilisateurs peuvent également rétablir le format par défaut de l'application, c'est-à-dire la valeur spécifiée dans le fichier manifeste de l'application.

Les applications peuvent désactiver le remplacement de compatibilité en définissant les balises PackageManager.Property suivantes:


  • PROPRIÉTÉ_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE

    Pour désactiver le forçage de compatibilité du format utilisateur, ajoutez la propriété au fichier manifeste de votre application et définissez la valeur sur false:

    <application>
        <property
            android:name="android.window.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE"
            android:value="false" />
    </application>
    

    Votre appli sera exclue de la liste des applis dans les paramètres de l'appareil. Les utilisateurs ne pourront pas modifier le format de l'application.

    Définir la propriété sur true n'a aucun effet.


  • PROPRIÉTÉ_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE

    Pour désactiver l'option plein écran du forçage de compatibilité du format utilisateur, ajoutez la propriété au fichier manifeste de votre application et définissez la valeur sur false:

    <application>
        <property
            android:name="android.window.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE"
            android:value="false" />
    </application>
    

    L'option plein écran a été supprimée de la liste des options de format dans les paramètres de l'appareil. Les utilisateurs ne pourront pas appliquer le remplacement plein écran à votre application.

    Définir cette propriété sur true n'a aucun effet.

Optimisez votre application pour les grands écrans:ne définissez pas de restrictions de format dans votre application. Utilisez des classes de taille de fenêtre pour accepter différentes mises en page en fonction de la quantité d'espace d'affichage disponible.

Forçages par application du fabricant de l'appareil

Les fabricants appliquent des forçages au niveau de chaque application sur des appareils spécifiques. Par défaut, les Pixel Tablet et Pixel Fold appliquent certains forçages à diverses applications.

Les applications peuvent désactiver la plupart des forçages (voir le tableau forçages par application ci-dessous).

Vous pouvez tester votre application avec des forçages activés ou désactivés à l'aide du framework de compatibilité (voir Outils de framework de compatibilité). Lorsque cette option est activée, les forçages s'appliquent à l'ensemble de l'application.

Vous pouvez aussi utiliser Android Debug Bridge (adb) pour activer ou désactiver les forçages et déterminer ceux qui s'appliquent à votre application.

Activez ou désactivez les forçages comme suit :

adb shell am compat enable/disable <override name/id> <package>

Pour la Pixel Tablet et le Pixel Fold, vérifiez quels forçages s'appliquent à votre application :

adb shell dumpsys platform_compat | grep <package name>

Le tableau suivant recense les forçages disponibles, ainsi que des conseils sur comment optimiser votre application afin qu'elle n'ait pas besoin d'utiliser des forçages. Vous pouvez ajouter des indicateurs de propriété au fichier manifeste de votre application pour désactiver certains forçages.

Forçages par application
Type Nom ID Description
Redimensionnement FORCE_RESIZE_APP 174042936 Contourne le mode de compatibilité de taille pour l'application lors des modifications de configuration.
FORCE_NON_RESIZE_APP 181136395 Force le mode de compatibilité pour l'application en cas de modification de la configuration.
Format OVERRIDE_MIN_ASPECT_RATIO 174042980 Forçage faisant office de gardien et qui doit être activé pour appliquer tout autre forçage de format.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY 203647190 Si cette option est activée (valeur par défaut), le champ d'application du forçage est limité aux activités en mode portrait.
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM 180326845 Définit le format minimal sur 3:2.
OVERRIDE_MIN_ASPECT_RATIO_LARGE 180326787 Définit le format minimal sur 16:9.
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN 208648326 Modifie le format minimal pour qu'il s'adapte à 50 % de la taille de l'écran (ou du format de l'écran partagé).
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN 218959984 Désactive le forçage du format minimal afin que les applications s'affichent en plein écran lorsque l'appareil est en mode portrait.
Orientation OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT 265452344 Force l'orientation en mode portrait lorsque l'orientation d'une activité n'est pas définie.
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR 265451093 Force l'orientation nosensor (utiliser l'orientation naturelle de l'appareil) lorsque l'orientation d'une activité n'est pas définie.
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE 266124927 Fait pivoter les applications limitées au mode paysage de 180 degrés.
OVERRIDE_ANY_ORIENTATION 265464455 Permet de forcer n'importe quelle orientation.
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA 265456536 Limite le champ d'application du forçage de l'orientation aux moments où l'application est connectée à l'appareil photo.
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION 255940284 Définit l'orientation naturelle fixe paysage pour l'écran lorsqu'une tâche est en plein écran (y compris au format letterbox).
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION 254631730 Ignore les requêtes d'orientation de l'application pour éviter les boucles de rotation.
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED 273509367 Ignore les requêtes d'orientation répétées lors du redémarrage d'une activité. Si Android détecte qu'une application demande au moins deux nouvelles orientations en une seconde, le système considère qu'il s'agit d'une boucle de rotation et applique le forçage.
OVERRIDE_RESPECT_REQUESTED_ORIENTATION 236283604 Empêche la mise au format letterbox en désactivant le paramètre de requête d'orientation pour le fabricant de l'appareil.
API bac à sable NEVER_SANDBOX_DISPLAY_APIS 184838306 Empêche la modification du comportement de toute API d'affichage.
ALWAYS_SANDBOX_DISPLAY_APIS 185004937 Force les API Display dans l'application à renvoyer les limites de l'application. Les API Display renvoient les limites d'affichage de l'écran, mais il arrive parfois que l'application suppose que les API Display renvoient les limites de l'application, ce qui entraîne des problèmes d'UI.
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS 237531167 Force les API View utilisées dans l'application à renvoyer les limites de l'application. Les API View renvoient les limites d'affichage de l'écran, mais il arrive parfois que l'application suppose que les API View renvoient les limites de l'application, ce qui entraîne des problèmes d'UI.
Compatibilité d'appareil photo OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION 263959004 Désactive la rotation forcée. Par défaut, la rotation de toutes les applications d'appareil photo à orientation fixe est forcée lorsque l'aperçu de l'appareil photo est ouvert.
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH 264304459 Supprime l'actualisation forcée par défaut qui s'applique lors de la rotation forcée d'un aperçu d'appareil photo.
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE 264301586 Remplace l'actualisation forcée par une actualisation en douceur en cas de rotation forcée d'un aperçu d'appareil photo, ce qui permet de conserver l'état lors de la rotation forcée. Par défaut, Android applique une actualisation forcée lorsque la rotation de l'aperçu de l'appareil photo est forcée. En cas d'actualisation forcée, certaines applications peuvent perdre leur état ou afficher un écran noir, en fonction de la mise en cache de leur état précédent.
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT 250678880 Recadre le tampon d'image de la caméra avant intérieure. Si le forçage est désactivé, le recadrage de la caméra avant intérieure est supprimé, et le champ de vision de l'aperçu de l'appareil photo est augmenté. Par défaut, sur le Pixel Fold, le système recadre l'aperçu de l'appareil photo de toutes les applications de la caméra avant intérieure.
Divers OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS 263259275 Empêche l'application d'afficher un écran noir lorsqu'elle perd son focus en mode Écran partagé. L'application attend le retour du focus avant de dessiner son contenu. L'application peut donc se figer ou afficher un écran noir. Le forçage permet à Android d'envoyer un faux événement de focus à l'application, ce qui lui indique de recommencer à dessiner le contenu.

FORCE_RESIZE_APP

Force le redimensionnement des packages auxquels le forçage est appliqué. Ne permet pas de modifier si l'application peut passer en mode multifenêtre ou non, mais permet à l'application de se redimensionner sans passer par le mode de compatibilité de taille lorsque l'écran est redimensionné.

Comment les applications peuvent obtenir le même résultat que le forçage

Définissez l'attribut android:resizeableActivity sur "true" ou l'indicateur de métadonnées android.supports_size_changes sur "true" (pour permettre le redimensionnement tout en désactivant le mode multifenêtre avec android:resizeableActivity défini sur "false") dans le fichier manifeste de l'application.

Comment optimiser les applications

Utilisez des mises en page responsives/adaptatives pour permettre aux applications de s'adapter à toutes les tailles d'écran et à tous les formats. Consultez la page Assurer la compatibilité avec différentes tailles d'écran.

Comment désactiver ou refuser le forçage

Définissez l'indicateur de propriété PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES sur "false".

Indicateurs de propriété pour ajuster le forçage

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
  android:value="true|false"/>

Commandes adb pour tester le forçage

Pour appliquer le forçage et faire en sorte que l'application puisse être redimensionnée :

adb shell am compat enable FORCE_RESIZE_APP <package>

Pour supprimer le forçage :

adb shell am compat disable FORCE_RESIZE_APP <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

FORCE_NON_RESIZE_APP

Interdit le redimensionnement des packages auxquels le forçage est appliqué et active le mode de compatibilité de taille en cas de modification de la configuration.

Comment les applications peuvent obtenir le même résultat que le forçage

Définissez l'attribut android:resizeableActivity et l'indicateur de métadonnées android.supports_size_changes sur "false" dans le fichier manifeste de l'application, et déclarez une restriction d'orientation ou de format.

Comment optimiser les applications

Toutes les applications dont le comportement est correct en cas de redimensionnement doivent définir android:resizeableActivity ou android.supports_size_changes sur "true". Toutes les autres applications doivent être améliorées afin que leur comportement soit correct en cas de redimensionnement. Consultez android:resizeableActivity.

Comment désactiver ou refuser le forçage

Définissez l'indicateur de propriété PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES sur "false".

Indicateurs de propriété pour ajuster le forçage

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
  android:value="true|false"/>

Commandes adb pour tester le forçage

Pour appliquer le forçage et faire en sorte que l'application ne puisse pas être redimensionnée :

adb shell am compat enable FORCE_NON_RESIZE_APP <package>

Pour supprimer le forçage :

adb shell am compat disable FORCE_NON_RESIZE_APP <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_MIN_ASPECT_RATIO

Forçage qui fait office de gardien pour tous les traitements qui imposent un format minimal donné.

Comment les applications peuvent obtenir le même résultat que le forçage

Définissez android:minAspectRatio au niveau de l'activité ou de l'application.

Comment optimiser les applications

Vous ne devez pas définir de restrictions de format dans votre application. Assurez-vous que votre application est compatible avec différentes tailles d'écran. Utilisez des classes de taille de fenêtre pour prendre en charge différentes mises en page en fonction de la quantité d'espace qu'occupe votre application à l'écran. Consultez l'API WindowSizeClass Compose et l'API View WindowSizeClass.

Comment désactiver ou refuser le forçage

Spécifiez une restriction de format ou définissez l'indicateur de propriété PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE sur "false".

Indicateurs de propriété pour ajuster le forçage

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE"
  android:value="false"/>

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO <package>

Pour supprimer le forçage :

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY

Limite les traitements qui forcent un format minimal donné pour les activités en mode portrait uniquement. Ce forçage est activé par défaut, mais ne s'applique que si OVERRIDE_MIN_ASPECT_RATIO est également activé.

Comment les applications peuvent obtenir le même résultat que le forçage

Voir OVERRIDE_MIN_ASPECT_RATIO.

Comment optimiser les applications

Voir OVERRIDE_MIN_ASPECT_RATIO.

Comment désactiver ou refuser le forçage

Voir OVERRIDE_MIN_ASPECT_RATIO.

Indicateurs de propriété pour ajuster le forçage

Voir OVERRIDE_MIN_ASPECT_RATIO.

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

Pour supprimer le forçage :

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_MIN_ASPECT_RATIO_MEDIUM

Définit le format minimal de l'activité sur une valeur moyenne (3:2).

Comment les applications peuvent obtenir le même résultat que le forçage

Voir OVERRIDE_MIN_ASPECT_RATIO.

Comment optimiser les applications

Voir OVERRIDE_MIN_ASPECT_RATIO.

Comment désactiver ou refuser le forçage

Voir OVERRIDE_MIN_ASPECT_RATIO.

Indicateurs de propriété pour ajuster le forçage

Voir OVERRIDE_MIN_ASPECT_RATIO.

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

Pour supprimer le forçage :

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_MIN_ASPECT_RATIO_LARGE

Définit le format minimal de l'activité sur une valeur élevée (16:9).

Comment les applications peuvent obtenir le même résultat que le forçage

Voir OVERRIDE_MIN_ASPECT_RATIO.

Comment optimiser les applications

Voir OVERRIDE_MIN_ASPECT_RATIO.

Comment désactiver ou refuser le forçage

Voir OVERRIDE_MIN_ASPECT_RATIO.

Indicateurs de propriété pour ajuster le forçage

Voir OVERRIDE_MIN_ASPECT_RATIO.

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>

Pour supprimer le forçage :

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN

Permet l'utilisation du format d'écran partagé. Autorise une application à utiliser tout l'espace disponible en mode écran partagé, évitant ainsi le format letterbox.

Comment les applications peuvent obtenir le même résultat que le forçage

Voir OVERRIDE_MIN_ASPECT_RATIO.

Comment optimiser les applications

Voir OVERRIDE_MIN_ASPECT_RATIO.

Comment désactiver ou refuser le forçage

Voir OVERRIDE_MIN_ASPECT_RATIO.

Indicateurs de propriété pour ajuster le forçage

Voir OVERRIDE_MIN_ASPECT_RATIO.

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

Pour supprimer le forçage :

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN

Désactive le forçage du format minimal en plein écran en mode portrait afin d'utiliser tout l'espace disponible sur l'écran.

Comment les applications peuvent obtenir le même résultat que le forçage

Voir OVERRIDE_MIN_ASPECT_RATIO.

Comment optimiser les applications

Voir OVERRIDE_MIN_ASPECT_RATIO.

Comment désactiver ou refuser le forçage

Voir OVERRIDE_MIN_ASPECT_RATIO.

Indicateurs de propriété pour ajuster le forçage

Voir OVERRIDE_MIN_ASPECT_RATIO.

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

Pour supprimer le forçage :

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT

Active l'orientation portrait pour toutes les activités du package. À moins que OVERRIDE_ANY_ORIENTATION ne soit activé, le forçage n'est utilisé que lorsqu'aucune autre orientation fixe n'a été spécifiée par l'activité.

Comment les applications peuvent obtenir le même résultat que le forçage

Définissez l'attribut de manifeste activity:screenOrientation ou utilisez l'API Activity#setRequestedOrientation.

Comment optimiser les applications

Votre application doit être compatible avec toutes les orientations. Un changement d'orientation est un changement de configuration qui peut être géré de deux manières : laisser le système détruire et recréer l'application, ou gérer les changements de configuration vous-même. Si vous gérez vous-même les modifications de configuration, l'état de l'application peut être conservé à l'aide d'un ViewModel. Dans de très rares cas, vous pouvez décider de verrouiller l'orientation sur les petits écrans uniquement. Toutefois, cela risque de ne pas être mis à l'échelle et de permettre à l'utilisateur de faire pivoter l'application si nécessaire. Sur Android 12L et versions ultérieures, l'orientation fixe peut être remplacée par la configuration de l'appareil. Pour en savoir plus sur la gestion des modifications de configuration et sur la prise en charge de toutes les orientations, consultez Gérer les modifications de configuration, Présentation de ViewModel et Orientation de l'application limitée sur les téléphones, mais pas sur les appareils à grand écran.

Comment désactiver ou refuser le forçage

Définissez l'indicateur de propriété PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE sur "false".

Indicateurs de propriété pour ajuster le forçage

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
  android:value="true|false"/>

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

Pour supprimer le forçage :

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR

Active l'orientation nosensor pour toutes les activités du package. À moins que OVERRIDE_ANY_ORIENTATION ne soit activé, le forçage n'est utilisé que lorsqu'aucune autre orientation fixe n'a été spécifiée par l'activité.

Comment les applications peuvent obtenir le même résultat que le forçage

Définissez l'attribut de manifeste activity:screenOrientation ou utilisez l'API Activity#setRequestedOrientation.

Comment optimiser les applications

Voir OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Comment désactiver ou refuser le forçage

Définissez l'indicateur de propriété PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE sur "false".

Indicateurs de propriété pour ajuster le forçage

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
  android:value="true|false"/>

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

Pour supprimer le forçage :

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE

Active l'orientation reverseLandscape pour toutes les activités du package. À moins que OVERRIDE_ANY_ORIENTATION ne soit activé, le forçage n'est utilisé que lorsqu'aucune autre orientation fixe n'a été spécifiée par l'activité.

Comment les applications peuvent obtenir le même résultat que le forçage

Définissez l'attribut de manifeste activity:screenOrientation ou utilisez l'API Activity#setRequestedOrientation.

Comment optimiser les applications

Voir OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Comment désactiver ou refuser le forçage

Définissez l'indicateur de propriété PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE sur "false".

Indicateurs de propriété pour ajuster le forçage

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
  android:value="true|false"/>

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

Pour supprimer le forçage :

adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_ANY_ORIENTATION

Permet aux forçages OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR et OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE de remplacer n'importe quelle orientation.

Comment les applications peuvent obtenir le même résultat que le forçage

Définissez l'attribut de manifeste activity:screenOrientation ou utilisez l'API Activity#setRequestedOrientation.

Comment optimiser les applications

Voir OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Comment désactiver ou refuser le forçage

Définissez l'indicateur de propriété PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE sur "false".

Indicateurs de propriété pour ajuster le forçage

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
  android:value="true|false"/>

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>

Pour supprimer le forçage :

adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA

Permet de limiter l'application des forçages OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR et OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE aux moments où la connexion de l'appareil photo est active.

Comment les applications peuvent obtenir le même résultat que le forçage

Définissez l'attribut de manifeste activity:screenOrientation ou utilisez l'API Activity#setRequestedOrientation.

Comment optimiser les applications

Voir OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Comment désactiver ou refuser le forçage

Définissez l'indicateur de propriété PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE sur "false".

Indicateurs de propriété pour ajuster le forçage

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
  android:value="true|false"/>

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

Pour supprimer le forçage :

adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION

Limite l'orientation de l'écran à l'orientation naturelle en mode paysage lorsque les conditions suivantes sont remplies :

  • L'activité est en plein écran.
  • La propriété du composant de désactivation PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE n'est pas activée.
  • Le paramètre permettant d'ignorer la demande d'orientation du fabricant de l'appareil est activé pour l'écran
  • L'orientation naturelle de l'écran est en mode paysage.

Comment les applications peuvent obtenir le même résultat que le forçage

Non applicable. Le problème doit être résolu dans la logique de l'application.

Comment optimiser les applications

Voir OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Comment désactiver ou refuser le forçage

Définissez l'indicateur de propriété PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE sur "false".

Indicateurs de propriété pour ajuster le forçage

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE"
  android:value="true|false"/>

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

Pour supprimer le forçage :

adb shell am compat disable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION

Active la règle de compatibilité qui ignore la mise à jour de l'orientation de l'application en réponse à l'appel de Activity#setRequestedOrientation() par l'application lorsque l'application est en cours de redémarrage ou qu'elle dispose d'un traitement de compatibilité d'appareil photo actif.

Comment les applications peuvent obtenir le même résultat que le forçage

Définissez l'indicateur de propriété PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION sur "true".

Comment optimiser les applications

Voir OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Comment désactiver ou refuser le forçage

Définissez l'indicateur de propriété PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION sur "false".

Indicateurs de propriété pour ajuster le forçage

<property android:name="android.window.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION"
  android:value="true|false"/>

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

Pour supprimer le forçage :

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED

Active la règle de compatibilité qui ignore l'orientation demandée par une application lorsque l'application appelle Activity#setRequestedOrientation() plus de deux fois en une seconde si une activité n'est pas mise au format letterbox pour obtenir une orientation fixe

Comment les applications peuvent obtenir le même résultat que le forçage

Non applicable. Le problème doit être résolu dans la logique de l'application.

Comment optimiser les applications

Voir OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Comment désactiver ou refuser le forçage

Définissez l'indicateur de propriété PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED sur "false".

Indicateurs de propriété pour ajuster le forçage

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED"
  android:value="false"/>

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

Pour supprimer le forçage :

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_RESPECT_REQUESTED_ORIENTATION

Pour les packages, désactive le comportement permettant d'ignorer les requêtes d'orientation qui peut être activé par les fabricants d'appareils pour une zone d'affichage ou l'ensemble de l'écran.

Comment les applications peuvent obtenir le même résultat que le forçage

Non applicable. Le problème doit être résolu dans la logique de l'application.

Comment optimiser les applications

Voir OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Comment désactiver ou refuser le forçage

Aucun refus possible. La désactivation du forçage peut être dangereuse si l'application n'est pas compatible avec un appareil sur lequel le fabricant de l'appareil ignore le paramètre de requête d'orientation activé. Pour désactiver le forçage, contactez le service Relations avec les développeurs Android.

Indicateurs de propriété pour ajuster le forçage

Aucun indicateur de propriété pour ce forçage.

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

Pour supprimer le forçage :

adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

NEVER_SANDBOX_DISPLAY_APIS

Force le bac à sable de l'API Display à ne jamais être appliqué aux packages pour une activité en mode letterbox ou en mode de compatibilité de taille. Les API Display continuent de fournir des limites de zone d'affichage.

Comment les applications peuvent obtenir le même résultat que le forçage

Déclarez le caractère redimensionnable des activités en définissant l'attribut de fichier manifeste android:resizeableActivity sur "true" ou l'indicateur de métadonnées android.supports_size_changes sur "true".

Comment optimiser les applications

Les applications qui déclarent être entièrement redimensionnables ne doivent jamais s'appuyer sur la taille d'écran pour positionner les éléments d'interface utilisateur. Migrez votre application vers des API à jour qui fournissent WindowMetrics. Si vous utilisez Jetpack Compose, servez-vous de l'API WindowSizeClass pour dessiner l'UI en fonction de la surface d'écran de l'application sur l'écran actuel. Consultez la page Assurer la compatibilité avec différentes tailles d'écran.

Comment désactiver ou refuser le forçage

Aucun refus possible. Migrez vers des API non obsolètes.

Indicateurs de propriété pour ajuster le forçage

Aucun indicateur de propriété pour ce forçage.

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>

Pour supprimer le forçage :

adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

ALWAYS_SANDBOX_DISPLAY_APIS

Force le bac à sable de l'API Display à toujours être appliqué aux packages quel que soit le mode de fenêtrage. Les API Display fournissent toujours les limites de l'application.

Comment les applications peuvent obtenir le même résultat que le forçage

Déclarez le caractère non redimensionnable des activités en définissant l'attribut android:resizeableActivity sur "false" ou l'indicateur de métadonnées android.supports_size_changes sur "false".

Comment optimiser les applications

Les applications qui déclarent être entièrement redimensionnables ne doivent jamais s'appuyer sur la taille d'écran pour positionner les éléments d'interface utilisateur. Migrez votre application pour utiliser des API à jour qui fournissent WindowMetrics au lieu d'API obsolètes. Voir WindowMetricsCalculator.

Comment désactiver ou refuser le forçage

Aucun refus possible. Migrez vers des API non obsolètes.

Indicateurs de propriété pour ajuster le forçage

Aucun indicateur de propriété pour ce forçage.

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable ALWAYS_SANDBOX_DISPLAY_APIS <package>

Pour supprimer le forçage :

adb shell am compat disable ALWAYS_SANDBOX_DISPLAY_APIS <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS

Oblige les packages à mettre en bac à sable les API View suivantes en fonction des limites de l'activité :

Comment les applications peuvent obtenir le même résultat que le forçage

Pour résoudre le problème dans le code d'application, utilisez des API qui fournissent les limites de la fenêtre de l'application et les décalages par rapport à la fenêtre de l'application plutôt que les limites de l'écran de l'appareil et les décalages par rapport à l'écran de l'appareil.

Comment optimiser les applications

Les applications doivent utiliser les API View, en tenant compte du fait que le format letterbox et le mode multifenêtre sont susceptibles d'être appliqués à l'application. Voir WindowMetricsCalculator.

Comment désactiver ou refuser le forçage

Définissez l'indicateur de propriété PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS sur "false".

Indicateurs de propriété pour ajuster le forçage

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS"
  android:value="false"/>

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

Pour supprimer le forçage :

adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION

Désactive la rotation forcée. Améliore l'expérience utilisateur dans certaines applications.

Comment les applications peuvent obtenir le même résultat que le forçage

Définissez l'indicateur de propriété PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION sur "false".

Comment optimiser les applications

Ne vous appuyez pas sur l'orientation du capteur de l'appareil photo mise en cache ni aux informations sur l'appareil. Pour obtenir des conseils en matière de compatibilité de l'appareil photo, consultez Présentation du viseur de l'appareil photo (Présentation du viseur de l'appareil photo) et Prendre en charge les surfaces redimensionnables dans votre application d'appareil photo.

Comment désactiver ou refuser le forçage

Définissez l'indicateur de propriété PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION sur "true".

Indicateurs de propriété pour ajuster le forçage

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION"
  android:value="true|false"/>

Commandes adb pour tester le forçage

Pour appliquer le forçage, ce qui supprime la rotation forcée :

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

Pour supprimer le forçage, ce qui permet de forcer la rotation :

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH

Désactive l'actualisation de l'activité après la rotation forcée. Améliore l'expérience utilisateur dans les applications lorsque l'actualisation entraîne une perte d'état.

Comment les applications peuvent obtenir le même résultat que le forçage

Définissez l'indicateur de propriété PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH sur "false".

Comment optimiser les applications

Ne vous appuyez pas sur l'orientation du capteur de l'appareil photo mise en cache ni aux informations sur l'appareil. Pour obtenir des conseils en matière de compatibilité de l'appareil photo, consultez Présentation du viseur de l'appareil photo (Présentation du viseur de l'appareil photo) et Prendre en charge les surfaces redimensionnables dans votre application d'appareil photo.

Comment désactiver ou refuser le forçage

Définissez l'indicateur de propriété PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH sur "true".

Indicateurs de propriété pour ajuster le forçage

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH"
  android:value="true|false"/>

Commandes adb pour tester le forçage

Pour appliquer le forçage, ce qui supprime l'actualisation de l'activité :

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

Pour supprimer le forçage, ce qui permet l'actualisation de l'activité :

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE

Lorsque ce forçage est appliqué à des packages, l'actualisation de l'activité peut se faire à l'aide du cycle onResume() → onPause() → onResume() au lieu du cycle onResume() → onStop() → onResume() après la rotation forcée pour compatibilité de l'appareil photo.

Comment les applications peuvent obtenir le même résultat que le forçage

Définissez l'indicateur de propriété PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE sur "true".

Comment optimiser les applications

Ne vous appuyez pas sur l'orientation du capteur de l'appareil photo mise en cache ni aux informations sur l'appareil. Pour obtenir des conseils en matière de compatibilité de l'appareil photo, consultez Présentation du viseur de l'appareil photo (Présentation du viseur de l'appareil photo) et Prendre en charge les surfaces redimensionnables dans votre application d'appareil photo.

Comment désactiver ou refuser le forçage

Définissez l'indicateur de propriété PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE sur "false".

Indicateurs de propriété pour ajuster le forçage

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE"
  android:value="true|false"/>

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

Pour supprimer le forçage :

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT

Force le recadrage de la sortie de l'appareil photo dans l'orientation opposée lorsque l'orientation de l'appareil photo en mode portrait ne correspond pas à l'orientation naturelle de l'appareil. De nombreuses applications ne gèrent pas cette situation et affichent des images étirées dans le cas contraire.

Comment les applications peuvent obtenir le même résultat que le forçage

Définissez l'indicateur de propriété PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT sur "true".

Comment optimiser les applications

Ne vous appuyez pas sur l'orientation du capteur de l'appareil photo mise en cache ni aux informations sur l'appareil. Pour obtenir des conseils en matière de compatibilité de l'appareil photo, consultez Présentation du viseur de l'appareil photo (Présentation du viseur de l'appareil photo) et Prendre en charge les surfaces redimensionnables dans votre application d'appareil photo.

Comment désactiver ou refuser le forçage

Définissez l'indicateur de propriété PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT sur "false".

Indicateurs de propriété pour ajuster le forçage

<property android:name="android.camera.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT"
  android:value="true|false"/>

Commandes adb pour tester le forçage

Pour appliquer le forçage, qui applique un recadrage de la caméra avant intérieure :

adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

Pour supprimer ce forçage, ce qui supprime le recadrage de la caméra avant intérieure :

adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION

Empêche les applications de désactiver le partage d'écran (voir Projection multimédia). Implémentation lorsque les applications font un usage abusif de l'API createConfigForDefaultDisplay() pour forcer la capture en plein écran et compromettre la confidentialité des utilisateurs en exposant le contenu des notifications (qui sont capturées en plein écran, mais pas le partage d'écran de l'application), ainsi que toutes les applications, quel que soit le mode de fenêtrage.

Comment les applications peuvent obtenir le même résultat que le forçage

Autorisez le comportement de projection multimédia par défaut (implémenté dans Android 14, niveau d'API 34, avec createScreenCaptureIntent()), ce qui permet aux utilisateurs de partager la totalité de l'écran ou une seule fenêtre d'application, quel que soit le mode de fenêtrage. Vous pouvez également appeler createScreenCaptureIntent(MediaProjectionConfig) avec un argument MediaProjectionConfig renvoyé par un appel à createConfigForUserChoice().

Comment optimiser les applications

Permettez aux utilisateurs d'indiquer s'ils souhaitent partager l'intégralité de l'écran de l'appareil ou une fenêtre d'application lors de la projection multimédia (comportement par défaut à partir d'Android 14).

Faites en sorte que votre application puisse être redimensionnée (resizeableActivity="true") pour qu'elle soit compatible avec le mode multifenêtre.

Comment désactiver ou refuser le forçage

En raison de l'importance de la confidentialité des utilisateurs, votre application ne peut pas désactiver ni refuser ce forçage.

Indicateurs de propriété pour ajuster le forçage

Aucune

Commandes adb pour tester le forçage

Pour appliquer le forçage, ce qui annule la désactivation du partage d'écran partiel au niveau de l'application (c'est-à-dire qui active le partage d'écran partiel):

adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

Pour supprimer le forçage, ce qui permet de désactiver le partage d'écran partiel dans l'application:

adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS

Active l'envoi d'un focus factice pour les applications qui ne possèdent pas de focus en mode Écran partagé. Certains moteurs de jeu attendent d'obtenir le focus avant de dessiner le contenu de l'application. Ainsi, le focus fictif permet aux applications d'éviter d'afficher un écran noir lorsqu'elles sont réactivées et qu'elles ne possèdent pas encore le focus.

Comment les applications peuvent obtenir le même résultat que le forçage

Définissez l'indicateur de propriété PROPERTY_COMPAT_ENABLE_FAKE_FOCUS sur "true".

Comment optimiser les applications

Vous pouvez éviter ce problème si votre application gère plusieurs orientations et que la configuration est modifiée correctement. Faites en sorte que votre application soit compatible avec les grands écrans en suivant les consignes relatives à la qualité des applis sur les grands écrans.

Si vous exécutez le moteur de jeu Unity, passez à la version 2019.4.40 ou ultérieure, puis réexportez votre jeu. Laissez l'option Resizable Window cochée dans les paramètres du lecteur Android.

Comment désactiver ou refuser le forçage

Définissez l'indicateur de propriété PROPERTY_COMPAT_ENABLE_FAKE_FOCUS sur "false".

Indicateurs de propriété pour ajuster le forçage

<property android:name="android.window.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS"
  android:value="true|false"/>

Commandes adb pour tester le forçage

Pour appliquer le forçage :

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

Pour supprimer le forçage :

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

Remarque : les commandes appliquent ou suppriment le forçage de manière temporaire uniquement.

Ressources supplémentaires