Modalità di compatibilità del dispositivo

Android attiva una modalità di compatibilità per le app che dichiarano limitazioni di orientamento o ridimensionabilità. La modalità di compatibilità garantisce un comportamento accettabile delle app su dispositivi con schermi di grandi dimensioni e smartphone a conchiglia pieghevoli, ma con un'usabilità non ottimale.

Gli override per app consentono ai produttori di dispositivi di modificare il comportamento delle app per migliorare l'esperienza utente o impedire che le app si interrompano su dispositivi specifici.

Dispositivi di riferimento

I seguenti dispositivi potrebbero richiedere override per app a causa di configurazioni o configurazioni insolite che non sono ben supportate dalle app:

  • Tablet: l'orientamento naturale di alcuni tablet, come Pixel Tablet, è orizzontale. Un dispositivo è nel suo orientamento naturale quando Display#getRotation() restituisce Surface.ROTATION_0. Se le app presuppongono che ROTATION_0 sia in verticale, i layout delle app e l'anteprima della fotocamera potrebbero non corrispondere al display del dispositivo.
  • pieghevoli orizzontali:alcuni dispositivi pieghevoli, come Pixel Fold, hanno l'orientamento verticale quando sono piegati, mentre l'orientamento orizzontale è quando sono aperti. Se le app presuppongono che l'orientamento non piegato sia verticale, è probabile che si verifichino loop di sfarfallio o problemi di layout.
  • Telefoni a conchiglia pieghevoli:i telefoni a conchiglia aperti sono in genere in orientamento verticale. Una volta piegati, però, gli smartphone di solito hanno un piccolo display con orientamento orizzontale. Le app devono identificare e adattare i diversi orientamenti dei display.

Problemi comuni di compatibilità

Le app presentano problemi di compatibilità più spesso a causa di restrizioni di orientamento delle app, ridimensionabilità e proporzioni, gestione non corretta dell'orientamento dell'anteprima della fotocamera e utilizzo improprio delle API.

Letterboxing

Il letterbox posiziona l'app al centro dello schermo oppure, su schermi grandi, da un lato o dall'altro per facilitare l'accesso. Gli opaci (barre a tinta unita o sfondo sfocato) riempiono l'area di visualizzazione inutilizzata lungo i lati o in alto e in basso nell'app.

Il Letterbox viene spesso utilizzato sui dispositivi con schermi di grandi dimensioni, perché le dimensioni e le proporzioni del display del dispositivo sono generalmente diverse da quelle dei telefoni standard, per i quali la maggior parte delle app è progettata.

Figura 1. L'app limitata all'orientamento verticale è in formato letterbox sui tablet con orientamento orizzontale e pieghevoli.

Problema

L'app non supporta tutte le configurazioni del display perché ha orientamento fisso, proporzioni fisse o non è ridimensionabile.

Le impostazioni di configurazione che controllano l'orientamento e la ridimensionabilità dell'app includono le seguenti:

  • screenOrientation: specifica un orientamento fisso per un'app. Le app possono anche impostare l'orientamento in fase di runtime utilizzando Activity#setRequestedOrientation().

  • resizeableActivity: indica se il sistema può ridimensionare le app per adattarle a finestre di dimensioni diverse. Su Android 11 (livello API 30) e versioni precedenti, consente di specificare se le app supportano la modalità multi-finestra. Su Android 12 (livello API 31) e versioni successive, consente di specificare se le app supportano la modalità multi-finestra su schermi piccoli (sw < 600 dp). Su Android 12 e versioni successive, le app supportano la modalità multi-finestra su schermi di grandi dimensioni (sw >= 600 dp), indipendentemente da questa impostazione.

  • maxAspectRatio: specifica le proporzioni massime supportate dall'app. Solo le app con resizeableActivity impostato su false possono impostare maxAspectRatio.

  • minAspectRatio: specifica le proporzioni minime supportate dall'app. Solo le app con resizeableActivity impostato su false possono impostare minAspectRatio.

Ottimizzazione

L'app deve supportare tutti gli orientamenti e le dimensioni di visualizzazione del dispositivo e della modalità multi-finestra. Rimuovi tutte le limitazioni relative all'orientamento e alle proporzioni fisse dai layout dell'app e dal file manifest dell'app.

Soluzione alternativa per la compatibilità

Se un'app con orientamento fisso o proporzioni fisse viene eseguita in una finestra in cui l'app non supporta direttamente le dimensioni o l'orientamento della finestra, Android utilizza le lettere maiuscole dell'app per preservare la continuità.

A partire da Android 12 (livello API 31) e poi 12L (livello API 32), la piattaforma applica una serie di miglioramenti alle app letterbox. I produttori di dispositivi implementano i miglioramenti dell'interfaccia utente. Non è necessario alcun ulteriore sviluppo affinché la tua app possa trarre vantaggio dai miglioramenti.

Android 12 (livello API 31) introduce i seguenti miglioramenti estetici, che possono essere configurati dai produttori di dispositivi:

  • Angoli arrotondati:gli angoli della finestra dell'app hanno un aspetto più raffinato.
  • Trasparenza della barra di sistema: le barre di stato e di navigazione, che si sovrappongono all'app, sono semitrasparenti, pertanto le icone sulle barre sono sempre visibili sullo sfondo della casella di posta.
  • Proporzioni configurabili: le proporzioni dell'app possono essere modificate per migliorarne l'aspetto.

Figura 2. App in formato Letterbox con miglioramenti dell'interfaccia utente.

12L (livello API 32) aggiunge i seguenti miglioramenti funzionali:

  • Posizionamento configurabile: su schermi di grandi dimensioni, i produttori di dispositivi possono posizionare l'app sul lato destro o sinistro del display, semplificando l'interazione.

  • Pulsante di riavvio riprogettato: i produttori di dispositivi possono dare al pulsante di riavvio un nuovo aspetto per la modalità di compatibilità delle dimensioni, per un migliore riconoscimento da parte degli utenti.

Android 13 (livello API 33) aggiunge una finestra di dialogo informativa per gli utenti sul posizionamento dell'app letterbox sullo schermo o sull'inclusione della letterbox in modalità schermo diviso:

Figura 3. App in formato Letterbox con finestra di dialogo informativa per gli utenti.

Modalità di compatibilità delle dimensioni

La modalità di compatibilità delle dimensioni è letterbox che include un controllo di riavvio. Il controllo consente agli utenti di riavviare l'app e di disegnare nuovamente il display. Android richiama la modalità di compatibilità delle dimensioni per le app ritenute non ridimensionabili. Quando un'attività viene spostata in un contenitore display incompatibile con le dimensioni dell'attività, il sistema può ridimensionare l'app per riempire almeno una dimensione.

Le modifiche alla configurazione del dispositivo che possono attivare la modalità di compatibilità delle dimensioni includono le seguenti:

  • Rotazione del dispositivo
  • Dispositivo pieghevole che si piega o si apre
  • Passare dalla modalità di visualizzazione a schermo intero a quella a schermo diviso e viceversa

Problema

La modalità di compatibilità delle dimensioni si applica in genere alle attività limitate nell'orientamento o nelle proporzioni e configurate (o determinate dal sistema) per non essere ridimensionabili.

L'app è considerata ridimensionabile e non sarà inserita in modalità di compatibilità delle dimensioni se soddisfa uno dei seguenti criteri:

Se la tua app non soddisfa nessuna delle condizioni, viene considerata non ridimensionabile e potrebbe essere inserita in modalità di compatibilità delle dimensioni.

Ottimizzazione

L'app deve supportare tutte le dimensioni di visualizzazione. Rendi la tua app ridimensionabile impostando l'attributo android:resizeableActivity dell'elemento <activity> o <application> su true nel file manifest dell'app. Progetta layout reattivi/adattivi per la tua app. Per ulteriori informazioni, vedi Supportare schermi di dimensioni diverse e Supporto multi-finestra.

Soluzione alternativa per la compatibilità

Android mette un'app in modalità di compatibilità delle dimensioni quando il sistema stabilisce che la visualizzazione dell'app in formato letterbox può essere migliorata ridimensionando l'app in modo che riempia la finestra di visualizzazione in almeno una dimensione. Il sistema mostra un controllo di riavvio che ricrea il processo dell'app, ricreando l'attività e ridisegnando il display. Vedi anche Panoramica su processi e thread.

Anelli sfarfallanti

Se un'app non supporta tutti gli orientamenti del display, potrebbe richiedere ripetutamente nuovi orientamenti ogni volta che si apporta una modifica alla configurazione, creando un ciclo infinito che fa sfarfallare il display o far ruotare all'infinito l'app.

Problema

Su Android 12 (livello API 31) e versioni successive, i produttori di dispositivi possono configurare i propri dispositivi in modo da ignorare le limitazioni di orientamento specificate dalle app e utilizzare invece le limitazioni per applicare le modalità di compatibilità. Ad esempio, un dispositivo pieghevole potrebbe ignorare l'impostazione android:screenOrientation="portrait" di un'attività quando l'attività viene visualizzata sullo schermo interno del tablet, in formato orizzontale.

Se le limitazioni di orientamento vengono ignorate, l'app può impostarne l'orientamento in modo programmatico chiamando il numero Activity#setRequestedOrientation(). La chiamata attiva un riavvio dell'app se quest'ultima non gestisce le modifiche alla configurazione (vedi Gestire le modifiche alla configurazione). Dopo il riavvio, le limitazioni di orientamento dell'app vengono nuovamente ignorate, l'app ripete la chiamata a setRequestedOrientation(), la chiamata attiva il riavvio dell'app e così via in un loop che si attiva automaticamente.

Un altro modo è quando l'orientamento naturale (il normale orientamento stabilito da Android) dello schermo di un dispositivo è orizzontale (la chiamata a Display#getRotation() restituisce Surface.ROTATION_0 mentre il dispositivo ha proporzioni orizzontali). In passato, le app presupponevano che Display.getRotation() = Surface.ROTATION_0 indichi che il dispositivo sia in orientamento verticale, ma non è sempre così, ad esempio sullo schermo interno di alcuni dispositivi pieghevoli e su alcuni tablet.

Un'app con orientamento orizzontale su un display interno pieghevole potrebbe controllare la rotazione dello schermo, ricevere il valore ROTATION_0, presumere che l'orientamento naturale del dispositivo sia verticale e chiamare setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ) per riconfigurare il layout dell'app. Dopo il riavvio (in orientamento orizzontale), l'app potrebbe controllare di nuovo la rotazione dello schermo, ricevere il valore ROTATION_0, chiamare setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) e continuare il ciclo infinito.

Ottimizzazione

Le app non devono:

  • Imposta un orientamento predefinito con Activity#setRequestedOrientation() nel metodo onCreate() dell'attività perché la richiesta di orientamento può essere attivata inaspettatamente da modifiche alla configurazione non gestite
  • Supponiamo che l'orientamento naturale del dispositivo (ROTATION_0) sia verticale
  • Imposta l'orientamento in base a indicatori non correlati alla dimensione attuale della finestra, ad esempio Display#getRotation(), la presenza di un FoldingFeature o le API ritirate.

Soluzione alternativa per la compatibilità

Android ignora le chiamate a Activity#setRequestedOrientation() nelle seguenti situazioni:

Anteprima fotocamera

L'anteprima della fotocamera (o il mirino) delle app della fotocamera può essere disallineata o distorta su tablet, laptop e display pieghevoli.

Problema

Il Android Compatibility Definition Document afferma che il sensore fotografico della fotocamera "DEVE essere orientato in modo che la dimensione lunga della fotocamera sia allineata alla dimensione lunga dello schermo".

Le app spesso presuppongono che l'orientamento del dispositivo e l'orientamento del sensore della fotocamera siano verticali, un presupposto ragionevole sui telefoni cellulari standard. Tuttavia, l'orientamento naturale di tablet e laptop e dei sensori della fotocamera può essere orizzontale. Inoltre, nuovi fattori di forma come i pieghevoli possono avere più orientamenti naturali e diversi sensori della fotocamera con orientamenti diversi.

L'avvio di un'attività con un orientamento della fotocamera non previsto dall'app o il passaggio da una fotocamera o da uno schermo del dispositivo all'altro (per dispositivi pieghevoli) può causare un'anteprima della fotocamera disallineata o distorta.

Ottimizzazione

Le app Fotocamera devono identificare e gestire correttamente l'orientamento del dispositivo e l'orientamento del sensore della fotocamera per presentare un'anteprima della fotocamera allineata e scalata correttamente. Le app devono calcolare la rotazione del dispositivo, la rotazione dei sensori e le proporzioni dello schermo o della finestra, quindi applicare i risultati all'anteprima della fotocamera. Per indicazioni dettagliate, vedi Anteprima della fotocamera e Introduzione al mirino della fotocamera.

Soluzione alternativa per la compatibilità

Un dispositivo è in orientamento naturale quando Display#getRotation() restituisce Surface.ROTATION_0. Il sistema calcola CameraCharacteristics.SENSOR_ORIENTATION in base all'orientamento naturale del dispositivo. Android allinea la finestra verticale delle app con limitazioni per l'utilizzo verticale all'orientamento naturale del dispositivo, che è l'orientamento previsto per la maggior parte delle app. Android ritaglia l'immagine del sensore della fotocamera anche quando l'orientamento del sensore è orizzontale e l'anteprima della fotocamera è verticale. Le soluzioni specifiche includono le seguenti:

  • Forza la rotazione delle anteprime della fotocamera per le app limitate all'orientamento verticale: le app limitate all'orientamento verticale prevedono che l'orientamento naturale del dispositivo e l'orientamento del sensore della fotocamera siano verticali. Tuttavia, su Android 12 (livello API 31) e versioni successive, le app possono essere eseguite con diversi orientamenti del dispositivo se i produttori ignorano la specifica dell'orientamento.

    Quando un'app con limitazioni per l'orientamento verticale è collegata alla fotocamera, Android forza la rotazione per allineare la finestra verticale dell'app all'orientamento naturale del dispositivo.

    Su alcuni tablet (vedi i dispositivi di riferimento), la finestra verticale dell'app viene ruotata a schermo intero per allinearsi all'orientamento naturale del dispositivo. Dopo la rotazione forzata, l'app occupa lo schermo intero.

    Sullo schermo interno orizzontale dei pieghevoli (vedi i dispositivi di riferimento), le attività in modalità solo verticale vengono ruotate in orizzontale per allinearsi all'orientamento naturale aperto. L'app viene creata in formato letterbox dopo la rotazione forzata.

  • Ritaglio della fotocamera anteriore interna: il sensore della fotocamera anteriore interna su alcuni pieghevoli è in orientamento orizzontale. Oltre a forzare la rotazione dell'anteprima della fotocamera sul display interno pieghevole, Android ritaglia il campo visivo della fotocamera anteriore interna (orizzontale) in modo che il sensore acquisisca una visuale opposta all'orientamento del dispositivo.

  • Forza l'aggiornamento delle anteprime della fotocamera: dopo la rotazione forzata, il sistema utilizza i metodi di attività onStop() e onStart() (per impostazione predefinita) o onPause() e onResume() (applicati dall'OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE per app override) per assicurarsi che l'anteprima della fotocamera venga visualizzata correttamente.

  • Ridimensionamento delle proporzioni: il sistema modifica dinamicamente le proporzioni dell'anteprima della fotocamera con rotazione forzata a un formato minimo più elevato, in modo da garantire che l'anteprima della fotocamera venga scalata correttamente.

Gli sviluppatori di app possono ignorare queste soluzioni alternative se le app gestiscono correttamente l'anteprima della fotocamera. Consulta Override per app.

API utilizzate spesso in modo improprio

Man mano che Android ha aggiunto il supporto di funzionalità come la modalità multi-finestra e di dispositivi come i pieghevoli, le API legacy sono state deprecate e sostituite da API aggiornate che funzionano per tutte le dimensioni di visualizzazione e tutti i fattori di forma dei dispositivi. Tuttavia, le API deprecate sono ancora disponibili per la compatibilità con le versioni precedenti.

Alcune API View sono progettate per scopi speciali non sempre ben compresi dagli sviluppatori.

Problema

Gli sviluppatori continuano a utilizzare le API Display deprecate e presuppongono erroneamente che le API restituiscano i limiti delle app anziché i limiti dell'area di visualizzazione dei dispositivi. Oppure gli sviluppatori usano erroneamente API di visualizzazione per scopi specifici per ottenere metriche di visualizzazione generali. Il risultato sono calcoli errati durante il riposizionamento degli elementi dell'interfaccia utente dopo gli eventi di ridimensionamento della finestra dell'app, causando problemi di layout.

API display deprecate e utilizzate comunemente:

Per ulteriori informazioni, consulta Supporto multi-finestra.

API per le visualizzazioni utilizzate in modo improprio:

Ottimizzazione

Non fare mai affidamento sulle dimensioni di visualizzazione fisica per il posizionamento degli elementi UI. Esegui la migrazione dell'app alle API in base a WindowMetrics, incluse le seguenti API WindowManager:

Soluzione alternativa per la compatibilità

Due override modificano le API Display deprecate e hanno utilizzato in modo improprio le API View per restituire i limiti dell'app: ALWAYS_SANDBOX_DISPLAY_APIS per le API Display; OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS per le API View. Per impostazione predefinita, ALWAYS_SANDBOX_DISPLAY_APIS viene anche applicato anche alle app idonee per la modalità di compatibilità delle dimensioni.

Attività trasparenti

Le attività trasparenti sono il risultato di stili di sfondo trasparenti, ad esempio:

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

I temi relativi alle finestre di dialogo, come Theme.MaterialComponents.Dialog, possono includere stili che rendono le attività trasparenti.

Le attività trasparenti non coprono tutto lo spazio di visualizzazione disponibile, il che le rende difficili da gestire perché l'area di visualizzazione disponibile può cambiare in base alle modifiche alla configurazione, come la rotazione dei dispositivi, la chiusura e l'apertura dei dispositivi e la modalità multi-finestra.

Problema

Un'attività trasparente deve essere conforme ai limiti della prima attività opaca sotto l'attività trasparente nello stack di attività delle attività. Tuttavia, un'attività opaca che avvia una finestra di dialogo di autorizzazione può essere un trampolino (un'attività che avvia un'altra attività e poi scompare); pertanto, il sistema non può determinare i limiti dell'attività del trampolino che ha avviato l'attività della finestra di dialogo delle autorizzazioni trasparente.

Ottimizzazione

Le attività trasparenti ereditano i vincoli dall'attività più opaca in alto sotto di loro nello stack di attività di un'attività. L'attività opaca deve essere disponibile per l'intero ciclo di vita dell'attività trasparente, dalla creazione dell'attività alla distruzione. Per questo motivo, non avviare richieste di autorizzazione da attività di trampolini.

Se un'attività del trampolino avvia una richiesta di autorizzazione, l'utente potrebbe non essere in grado di visualizzare la finestra di dialogo delle autorizzazioni perché l'attività del trampolino sarà stata eliminata prima che l'utente abbia avuto la possibilità di rispondere alla finestra di dialogo e le dimensioni e la posizione dell'attività della finestra di dialogo potrebbero essere state calcolate in modo errato.

Le app devono sempre avviare richieste di autorizzazione da attività che rimangono visibili finché l'utente non ha preso una decisione in merito all'autorizzazione.

Angoli arrotondati

Un'attività può essere trasparente a causa di uno stile che specifica la trasparenza dello sfondo o perché i contenuti dell'attività non occupano lo spazio di visualizzazione disponibile. Se lo spazio di visualizzazione disponibile è riempito da un'attività trasparente, il sistema applica automaticamente gli angoli arrotondati all'attività quando configurato per farlo dal produttore del dispositivo. Tuttavia, se un'attività trasparente (come una finestra di dialogo di autorizzazione) non riempie lo spazio disponibile, spetta a te decidere se applicare o meno gli angoli arrotondati.

Le finestre di dialogo di autorizzazione non occupano lo spazio di visualizzazione disponibile perché il layout della finestra di dialogo utilizza in genere LayoutParams.WRAP_CONTENT anziché LayoutParams.MATCH_PARENT.

Soluzione alternativa per la compatibilità

Mantieni visibili le attività che avviano le attività delle finestre di dialogo finché l'utente non risponde alla finestra di dialogo.

Il sistema garantisce che un'attività trasparente erediti tutti i vincoli della prima attività opaca sotto l'attività trasparente nello stack di attività, inclusi i vincoli relativi a:

  • Modalità di compatibilità delle dimensioni
  • Orientamento
  • Formato

Giochi Unity

I giochi Unity vengono eseguiti su Android a schermo intero o in modalità multi-finestra. Tuttavia, molti giochi Unity perdono lo stato attivo e smettono di disegnare contenuti quando l'app è attivata in modalità multi-finestra.

Problema

Unity ha aggiunto un'opzione Resizable Window in Unity 2019.4 per supportare la modalità multi-finestra su Android. Tuttavia, l'implementazione iniziale non ha reagito correttamente al ciclo di vita delle attività in modalità multi-finestra, causando la sospensione della riproduzione di UnityPlayer quando l'app perde lo stato attivo. Il giocatore ha visualizzato una schermata nera o l'ultimo frame bloccato del gioco. Il gameplay è ripreso solo quando l'utente ha toccato lo schermo. Molte app che utilizzano il motore Unity presentano questo problema e vengono visualizzate come una finestra nera in modalità multi-finestra.

Ottimizzazione

Esegui l'upgrade di Unity alla versione 2019.4.40 o successiva ed esporta nuovamente il tuo gioco. Mantieni selezionata l'opzione Resizable Window nelle impostazioni del player Android, altrimenti il gioco viene messo in pausa quando non è a fuoco, anche se è interamente visibile in modalità multi-finestra.

Soluzione alternativa per la compatibilità

I produttori di dispositivi possono applicare l'override per app OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS per fornire un evento di focus falso a un'app in modalità multi-finestra. L'override consente all'attività di ridisegnare i contenuti senza essere oscurata.

Testare l'app per verificare la presenza di problemi di compatibilità

Per testare la tua app e capire come si comporta nei diversi fattori di forma, utilizza le seguenti risorse:

È letterbox

Verifica che ogni attività possa utilizzare tutto lo spazio di visualizzazione disponibile per l'app. Innanzitutto, dichiara il seguente codice nella cartella di 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();
}

Poi esegui un test per asserire il comportamento e assicurati che l'attività target non sia composta da 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<MainActivity> rule = new ActivityScenarioRule<>(MainActivity.class);

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

L'ideale è eseguire questo tipo di test solo finché non viene superato e afferma che le attività occupano l'intero spazio di visualizzazione disponibile per l'app. Esegui il test della tua app su tutti i tipi di dispositivi per garantire un comportamento coerente.

Override per app

Android fornisce override che modificano il comportamento configurato delle app. Ad esempio, l'override di FORCE_RESIZE_APP indica al sistema di ignorare la modalità di compatibilità delle dimensioni e di ridimensionare l'app per adattarla alle dimensioni display anche se resizeableActivity="false" è specificato nel file manifest dell'app.

I produttori di dispositivi applicano override per determinate app (o tutte le app) su specifici dispositivi con schermi di grandi dimensioni. Su Android 14 (livello API 34) e versioni successive, gli utenti possono applicare override alle app tramite le impostazioni del dispositivo.

Override per app per utente

Su Android 14 e versioni successive, un menu Impostazioni consente agli utenti di modificare le proporzioni delle app. I dispositivi con schermi di grandi dimensioni, come i dispositivi di riferimento, implementano il menu.

Il menu contiene un elenco di tutte le app installate sul dispositivo. Gli utenti scelgono un'app e quindi impostano le proporzioni dell'app su 3:4, 1:1, a schermo intero o su un altro valore configurato dal produttore del dispositivo. Gli utenti possono anche reimpostare le proporzioni sui valori predefiniti dell'app, specificati nel file manifest dell'app.

Le app possono disattivare l'override della compatibilità impostando i seguenti tag PackageManager.Property:

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE

    Per disattivare la sostituzione della compatibilità delle proporzioni utente, aggiungi la proprietà al file manifest dell'app e imposta il valore su false:

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

    La tua app verrà esclusa dall'elenco di app nelle impostazioni del dispositivo. Gli utenti non potranno eseguire l'override delle proporzioni dell'app.

    L'impostazione della proprietà su true non ha alcun effetto.

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE

    Per disattivare l'opzione a schermo intero dell'override della compatibilità delle proporzioni utente, aggiungi la proprietà al file manifest dell'app e imposta il valore su false:

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

    L'opzione per la visualizzazione a schermo intero viene rimossa dall'elenco delle opzioni per le proporzioni nelle impostazioni del dispositivo. Gli utenti non potranno applicare l'override della modalità a schermo intero alla tua app.

    L'impostazione di questa proprietà su true non ha alcun effetto.

Ottimizza l'app per tutti gli schermi: non impostare limitazioni relative alle proporzioni nell'app. Utilizza le classi di dimensioni delle finestre per supportare layout diversi in base alla quantità di spazio di visualizzazione disponibile.

Override per app del produttore del dispositivo

I produttori di dispositivi applicano gli override in base alle singole app su determinati dispositivi. I dispositivi di riferimento potrebbero applicare alcuni override a una serie di app per impostazione predefinita.

Le app possono disattivare la maggior parte degli override (vedi la tabella Override per app di seguito).

Puoi testare la tua app con gli override attivati o disattivati utilizzando il framework di compatibilità (vedi Strumenti del framework di compatibilità). Quando l'opzione è attiva, gli override vengono applicati all'intera app.

Puoi anche utilizzare Android Debug Bridge (adb) per attivare o disattivare gli override e stabilire quali override applicare alla tua app.

Attiva o disattiva gli override nel seguente modo:

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

Per i dispositivi di riferimento, controlla gli override applicati alla tua app:

adb shell dumpsys platform_compat | grep <package name>

La seguente tabella elenca gli override disponibili insieme a indicazioni su come ottimizzare l'app in modo che l'app non debba fare affidamento su override. Puoi aggiungere flag di proprietà al file manifest dell'app per disattivare alcune sostituzioni.

Override per app
Tipo Nome ID Descrizione
Ridimensionabilità FORCE_RESIZE_APP 174042936 Bypassa la modalità di compatibilità delle dimensioni per l'app quando viene modificata la configurazione.
FORCE_NON_RESIZE_APP 181136395 Forza l'attivazione della modalità di compatibilità delle dimensioni nell'app in caso di modifiche alla configurazione.
Proporzioni OVERRIDE_MIN_ASPECT_RATIO 174042980 Override gatekeeper che deve essere attivato per applicare eventuali altre sostituzioni delle proporzioni.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY 203647190 Se questa opzione è abilitata (impostazione predefinita), limita l'ambito dell'override alle attività solo verticale.
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM 180326845 Modifica le proporzioni minime in 3:2.
OVERRIDE_MIN_ASPECT_RATIO_LARGE 180326787 Modifica le proporzioni minime in 16:9.
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN 208648326 Modifica le proporzioni minime in modo che si adattino al 50% delle dimensioni del display (o alle proporzioni dello schermo diviso).
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN 218959984 Disattiva la sostituzione delle proporzioni minime in modo che le app siano a schermo intero quando il dispositivo è in verticale.
Orientamento OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT 265452344 Consente di sostituire l'orientamento su verticale quando un'attività ha un orientamento non definito.
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR 265451093 Consente di sostituire l'orientamento su nosensor (utilizza l'orientamento naturale del dispositivo) quando un'attività ha un orientamento indefinito.
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE 266124927 Ruota le app in modalità orizzontale di 180 gradi.
OVERRIDE_ANY_ORIENTATION 265464455 Consente di eseguire l'override di qualsiasi orientamento.
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA 265456536 Limita l'ambito della sostituzione dell'orientamento al momento in cui l'app è connessa alla fotocamera.
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION 255940284 Imposta il display sull'orientamento naturale orizzontale fisso quando un'attività è a schermo intero (anche in formato letterbox).
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION 254631730 Ignora le richieste di orientamento dell'app per evitare loop infiniti di rotazione.
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED 273509367 Ignora le richieste di orientamento ripetute durante il riavvio di un'attività. Se Android rileva che un'app richiede almeno due nuovi orientamenti in un secondo, il sistema lo considera un ciclo infinito di rotazione e applica l'override.
OVERRIDE_RESPECT_REQUESTED_ORIENTATION 236283604 Impedisce il letterbox disattivando l'impostazione della richiesta di orientamento che il produttore del dispositivo ignora.
API Sandbox NEVER_SANDBOX_DISPLAY_APIS 184838306 Impedisce di modificare il comportamento delle API di visualizzazione.
ALWAYS_SANDBOX_DISPLAY_APIS 185004937 Forza l'API Display nell'app a restituire i limiti dell'app. Le API Display restituiscono limiti dell'area di visualizzazione logici, ma a volte l'app presuppone che le API di Display restituiscano limiti dell'app, causando problemi nell'interfaccia utente.
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS 237531167 Forza l'API View utilizzata nell'app a restituire i limiti dell'app. Le API View restituiscono limiti dell'area di visualizzazione logici, ma a volte l'app presuppone che le API di View restituiscano limiti dell'app, causando problemi nell'interfaccia utente.
Compatibilità fotocamera OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION 263959004 Disattiva la rotazione forzata. Per impostazione predefinita, tutte le app della fotocamera con orientamento fisso vengono ruotate forzatamente quando l'anteprima della fotocamera è aperta.
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH 264304459 Rimuove l'aggiornamento forzato predefinito applicato quando viene forzata la rotazione dell'anteprima della fotocamera.
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE 264301586 Imposta l'aggiornamento forzato su un aggiornamento leggero quando viene forzata la rotazione dell'anteprima della fotocamera, per preservare lo stato durante la rotazione forzata. Per impostazione predefinita, Android applica un aggiornamento forzato quando viene forzata la rotazione dell'anteprima della fotocamera. L'aggiornamento forzato può causare problemi di perdita dello stato o di oscuramento delle app, a seconda di come le app hanno memorizzato lo stato precedente nella cache.
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT 250678880 Ritaglia il buffer dell'immagine della fotocamera anteriore interna. Se l'override viene disattivato, il ritaglio della fotocamera anteriore interna viene rimosso e il campo visivo dell'anteprima della fotocamera viene aumentato. Per impostazione predefinita, su alcuni pieghevoli (vedi i dispositivi di riferimento), il sistema ritaglia l'anteprima della fotocamera di tutte le app della fotocamera quando viene utilizzata la fotocamera anteriore interna.
Vari OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS 263259275 Impedisce che l'app venga oscurata quando perde lo stato attivo in modalità schermo diviso. L'app attende lo stato attivo prima di disegnarne i contenuti, causando il blocco o l'oscuramento dell'app. L'override consente ad Android di inviare un falso evento di stato attivo all'app, che indica all'app di iniziare di nuovo a tracciare i contenuti.

APP_FORCE_RESIZE

Forza il ridimensionamento dei pacchetti a cui viene applicato l'override. Non cambia se l'app può essere impostata in modalità multi-finestra, ma consente all'app di ridimensionarla senza attivare la modalità di compatibilità delle dimensioni quando lo schermo viene ridimensionato.

In che modo le app possono ottenere lo stesso risultato dell'override

Nel file manifest dell'app, imposta l'attributo android:resizeableActivity su true oppure, per supportare il ridimensionamento durante la disattivazione della modalità multi-finestra con android:resizeableActivity=false, imposta il flag di metadati android.supports_size_changes su true.

Come ottimizzare le app

Utilizza i layout adattabili/adattivi per consentire alle app di adattarsi a tutte le dimensioni e proporzioni del display. Vedi Supportare schermi di dimensioni diverse.

Come disattivare o disattivare l'override

Imposta il flag della proprietà PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES su false.

Flag proprietà da modificare

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

Comandi adb per testare l'override

Per applicare l'override e rendere l'app ridimensionabile:

adb shell am compat enable FORCE_RESIZE_APP <package>

Per rimuovere la sostituzione:

adb shell am compat disable FORCE_RESIZE_APP <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

FORCE_NON_RESIZE_APP

Forza la non ridimensionabile dei pacchetti a cui viene applicato l'override e inserisci la modalità di compatibilità delle dimensioni quando apporti modifiche alla configurazione.

In che modo le app possono ottenere lo stesso risultato dell'override

Imposta sia l'attributo android:resizeableActivity sia il flag di metadati android.supports_size_changes su false nel file manifest dell'app e dichiara una limitazione di orientamento o proporzioni.

Come ottimizzare le app

Per tutte le app che si comportano correttamente se ridimensionate è necessario impostare android:resizeableActivity o android.supports_size_changes su true. Le altre app dovrebbero essere migliorate per comportarsi bene quando vengono ridimensionate. Vedi android:resizeableActivity.

Come disattivare o disattivare l'override

Imposta il flag della proprietà PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES su false.

Flag proprietà da modificare

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

Comandi adb per testare l'override

Per applicare l'override e rendere l'app non ridimensionabile:

adb shell am compat enable FORCE_NON_RESIZE_APP <package>

Per rimuovere la sostituzione:

adb shell am compat disable FORCE_NON_RESIZE_APP <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_MIN_ASPECT_RATIO

Il gatekeeper per tutti gli override che forzano un determinato formato minimo.

In che modo le app possono ottenere lo stesso risultato dell'override

Imposta android:minAspectRatio a livello di attività o app.

Come ottimizzare le app

Non impostare limitazioni relative alle proporzioni nell'app. Assicurati che l'app supporti schermi di dimensioni diverse. Utilizza le classi di dimensioni delle finestre per supportare layout diversi in base alla quantità di spazio a disposizione dell'app sullo schermo. Vedi API Compose WindowSizeClass e API View WindowSizeClass.

Come disattivare o disattivare l'override

Specifica una limitazione per le proporzioni o imposta il flag della proprietà PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE su false.

Flag proprietà da modificare

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

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO <package>

Per rimuovere la sostituzione:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY

Limita le impostazioni dell'app che forzano un determinato formato minimo per le attività con orientamento solo verticale. Attivato per impostazione predefinita e ha effetto solo se è abilitato anche OVERRIDE_MIN_ASPECT_RATIO.

In che modo le app possono ottenere lo stesso risultato dell'override

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Come ottimizzare le app

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Come disattivare o disattivare l'override

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Flag proprietà da modificare

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

Per rimuovere la sostituzione:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_MIN_ASPECT_RATIO_MEDIO

Imposta le proporzioni minime dell'attività su un valore medio (3:2)

In che modo le app possono ottenere lo stesso risultato dell'override

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Come ottimizzare le app

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Come disattivare o disattivare l'override

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Flag proprietà da modificare

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

Per rimuovere la sostituzione:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_MIN_ASPECT_RATIO_LARGE

Imposta le proporzioni minime dell'attività su un valore elevato (16:9)

In che modo le app possono ottenere lo stesso risultato dell'override

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Come ottimizzare le app

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Come disattivare o disattivare l'override

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Flag proprietà da modificare

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>

Per rimuovere la sostituzione:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN

Consente di attivare l'utilizzo delle proporzioni dello schermo diviso. Consente a un'app di usare tutto lo spazio disponibile in modalità schermo diviso, evitando il letterbox.

In che modo le app possono ottenere lo stesso risultato dell'override

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Come ottimizzare le app

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Come disattivare o disattivare l'override

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Flag proprietà da modificare

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

Per rimuovere la sostituzione:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN

Disattiva la sostituzione delle proporzioni minime in modalità a schermo intero verticale per utilizzare tutto lo spazio disponibile sullo schermo.

In che modo le app possono ottenere lo stesso risultato dell'override

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Come ottimizzare le app

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Come disattivare o disattivare l'override

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Flag proprietà da modificare

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

Per rimuovere la sostituzione:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT

Attiva l'orientamento verticale per tutte le attività nel pacchetto. A meno che OVERRIDE_ANY_ORIENTATION non sia abilitata, l'override viene utilizzato solo quando l'attività non ha specificato altri orientamenti fissi.

In che modo le app possono ottenere lo stesso risultato dell'override

Imposta l'attributo del file manifest activity:screenOrientation o utilizza l'API Activity#setRequestedOrientation().

Come ottimizzare le app

L'app deve supportare tutti gli orientamenti. Un cambiamento di orientamento è una modifica della configurazione, che può essere gestita in due modi: consentendo al sistema di eliminare e ricreare l'app oppure di gestire manualmente le modifiche alla configurazione. Se gestisci autonomamente le modifiche alla configurazione, lo stato dell'app può essere conservato utilizzando ViewModel. In casi molto limitati, puoi decidere di bloccare l'orientamento solo su display piccoli, anche se questo potrebbe non essere ridimensionato e consentire all'utente di ruotare l'app a seconda delle esigenze. Su Android 12L e versioni successive, l'orientamento fisso può essere sostituito dalla configurazione del dispositivo. Per ulteriori informazioni sulla gestione delle modifiche alla configurazione e sul supporto di tutti gli orientamenti, vedi Gestire le modifiche alla configurazione, Panoramica di ViewModel e Orientamento delle app limitato sui telefoni, ma non su dispositivi con schermi di grandi dimensioni.

Come disattivare o disattivare l'override

Imposta il flag della proprietà PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE su false.

Flag proprietà da modificare

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

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

Per rimuovere la sostituzione:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR

Attiva l'orientamento nosensor per tutte le attività nel pacchetto. A meno che OVERRIDE_ANY_ORIENTATION non sia abilitato, l'override viene utilizzato solo quando non è stato specificato nessun altro orientamento fisso dall'attività.

In che modo le app possono ottenere lo stesso risultato dell'override

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Come ottimizzare le app

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Come disattivare o disattivare l'override

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Flag proprietà da modificare

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT. '``

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

Per rimuovere la sostituzione:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE

Attiva l'orientamento inverso orizzontale per tutte le attività nel pacchetto. A meno che OVERRIDE_ANY_ORIENTATION non sia abilitato, l'override viene utilizzato solo quando non è stato specificato nessun altro orientamento fisso dall'attività.

In che modo le app possono ottenere lo stesso risultato dell'override

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Come ottimizzare le app

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Come disattivare o disattivare l'override

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Flag proprietà da modificare

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

Per rimuovere la sostituzione:

adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_ANY_ORIENTATION

Consente OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR e OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE esegue l'override per qualsiasi orientamento.

In che modo le app possono ottenere lo stesso risultato dell'override

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Come ottimizzare le app

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Come disattivare o disattivare l'override

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Flag proprietà da modificare

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>

Per rimuovere la sostituzione:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_ORIENTATION_SOLO_PER_FOTOCAMERA

I limiti OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR e OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE hanno effetto solo quando la connessione della videocamera è attiva.

In che modo le app possono ottenere lo stesso risultato dell'override

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Come ottimizzare le app

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Come disattivare o disattivare l'override

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Flag proprietà da modificare

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

Per rimuovere la sostituzione:

adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION

Limita l'orientamento del display all'orientamento naturale orizzontale quando sono soddisfatte le seguenti condizioni:

  • L'attività è a schermo intero
  • La proprietà del componente di disattivazione PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE non è abilitata
  • L'impostazione "Ignora richiesta di orientamento" del produttore del dispositivo è abilitata per il display
  • L'orientamento naturale del display è orizzontale

In che modo le app possono ottenere lo stesso risultato dell'override

Non applicabile. Il problema dovrebbe essere risolto nella logica dell'applicazione.

Come ottimizzare le app

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Come disattivare o disattivare l'override

Imposta il flag della proprietà PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE su false.

Flag proprietà da modificare

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

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

Per rimuovere la sostituzione:

adb shell am compat disable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION

Consente di attivare il criterio di conformità che salta l'aggiornamento dell'orientamento dell'app in risposta a chiamate dell'app Activity#setRequestedOrientation() quando l'app viene riavviata o è attiva la compatibilità della fotocamera.

In che modo le app possono ottenere lo stesso risultato dell'override

Imposta il flag di proprietà PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION su true.

Come ottimizzare le app

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Come disattivare o disattivare l'override

Imposta il flag di proprietà PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION su false.

Flag proprietà da modificare

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

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

Per rimuovere la sostituzione:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED

Attiva il criterio di compatibilità che ignora l'orientamento richiesto da un'app in risposta all'app che chiama Activity#setRequestedOrientation() per più di due volte al secondo se un'attività non è letterbox per l'orientamento fisso.

In che modo le app possono ottenere lo stesso risultato dell'override

Non applicabile. Il problema dovrebbe essere risolto nella logica dell'applicazione.

Come ottimizzare le app

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Come disattivare o disattivare l'override

Imposta il flag proprietà PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED su false.

Flag proprietà da modificare

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

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

Per rimuovere la sostituzione:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_RESPECT_REQUESTED_ORIENTATION

Esclude il comportamento di richiesta di orientamento che può essere attivato dai produttori del dispositivo per un'area di visualizzazione o per l'intero display.

In che modo le app possono ottenere lo stesso risultato dell'override

Non applicabile. Il problema dovrebbe essere risolto nella logica dell'applicazione.

Come ottimizzare le app

Consulta OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Come disattivare o disattivare l'override

Nessuna disattivazione. La disattivazione dell'override può essere pericolosa se l'app non è compatibile con un dispositivo su cui è attivata l'impostazione "Ignora richiesta di orientamento" del produttore del dispositivo. Contatta il team Android Developer Relations per disattivare l'override.

Flag proprietà da modificare

Nessun flag di proprietà per questa sostituzione.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

Per rimuovere la sostituzione:

adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

NEVER_SANDBOX_DISPLAY_APIS

Impone ai pacchetti di non applicare mai la sandbox dell'API Display a un'attività in modalità letterbox o compatibilità dimensioni. Le API Display continuano a fornire limiti per l'area di visualizzazione.

In che modo le app possono ottenere lo stesso risultato dell'override

Dichiara le attività ridimensionabili impostando l'attributo manifest android:resizeableActivity su true o il flag di metadati android.supports_size_changes su true.

Come ottimizzare le app

Le app che dichiarano di essere completamente ridimensionabili non devono mai basarsi sulle dimensioni di visualizzazione per posizionare gli elementi UI. Esegui la migrazione della tua app alle API aggiornate che forniscono WindowMetrics. Se usi Jetpack Compose, sfrutta l'API WindowSizeClass per disegnare l'UI in base all'area dello schermo occupata dall'app sul display attuale. Consulta Classi di dimensioni delle finestre.

Come disattivare o disattivare l'override

Nessuna disattivazione. Esegui la migrazione dalle API deprecate.

Flag proprietà da modificare

Nessun flag di proprietà per questa sostituzione.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>

Per rimuovere la sostituzione:

adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

API DISPLAY_ALWAYS_SANDBOX_DISPLAY

Forza l'applicazione sempre della sandbox dell'API Display ai pacchetti indipendentemente dalla modalità windowing. Le API Display forniscono sempre i limiti delle app.

In che modo le app possono ottenere lo stesso risultato dell'override

Dichiara le attività non ridimensionabili impostando l'attributo android:resizeableActivity su false o il flag di metadati android.supports_size_changes su false.

Come ottimizzare le app

Le app che dichiarano di essere completamente ridimensionabili non devono mai basarsi sulle dimensioni di visualizzazione per posizionare gli elementi UI. Esegui la migrazione della tua app dalle API deprecate ad API aggiornate che forniscono WindowMetrics. Consulta WindowMetricsCalculator.

Come disattivare o disattivare l'override

Nessuna disattivazione. Esegui la migrazione dalle API deprecate.

Flag proprietà da modificare

Nessun flag di proprietà per questa sostituzione.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable ALWAYS_SANDBOX_DISPLAY_APIS <package>

Per rimuovere la sostituzione:

adb shell am compat disable ALWAYS_SANDBOX_DISPLAY_APIS <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS

Forza la sandbox delle seguenti API di View dei pacchetti nei limiti di attività:

In che modo le app possono ottenere lo stesso risultato dell'override

Risolvi il problema nel codice dell'applicazione utilizzando API che forniscono i limiti della finestra dell'app e gli offset relativi alla finestra dell'app, anziché i limiti del display del dispositivo e gli offset relativi al display del dispositivo.

Come ottimizzare le app

Le app devono utilizzare le API View, tenendo conto della possibilità che sia applicata la modalità letterbox e multi-finestra all'app. Consulta WindowMetricsCalculator.

Come disattivare o disattivare l'override

Imposta il flag di proprietà PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS su false.

Flag proprietà da modificare

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

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

Per rimuovere la sostituzione:

adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION

Disabilita la rotazione forzata. Migliora l'esperienza utente su alcune app.

In che modo le app possono ottenere lo stesso risultato dell'override

Imposta il flag di proprietà PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION su false.

Come ottimizzare le app

Non fare affidamento sull'orientamento del sensore della fotocamera nella cache o sulle informazioni del dispositivo. Per indicazioni sulla compatibilità della fotocamera, consulta l'articolo Introduzione al mirino della fotocamera e Supportare le superfici ridimensionabili nell'app Fotocamera.

Come disattivare o disattivare l'override

Imposta il flag di proprietà PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION su true.

Flag proprietà da modificare

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

Comandi adb per testare l'override

Per applicare l'override, che rimuove la rotazione forzata:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

Per rimuovere l'override, che consente la rotazione forzata:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH

Disattiva l'aggiornamento dell'attività dopo la rotazione forzata. Migliora l'esperienza utente quando l'aggiornamento causa la perdita di stato nelle app.

In che modo le app possono ottenere lo stesso risultato dell'override

Imposta il flag di proprietà PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH su false.

Come ottimizzare le app

Vedi OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Come disattivare o disattivare l'override

Imposta il flag di proprietà PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH su true.

Flag proprietà da modificare

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

Comandi adb per testare l'override

Per applicare l'override, che rimuove l'aggiornamento dell'attività:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

Per rimuovere l'override, che consente l'aggiornamento dell'attività:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE

Imposta i pacchetti a cui è applicato per aggiornare l'attività utilizzando un ciclo onResume()onPause()onResume() anziché onResume()onStop()onResume() dopo la rotazione forzata della compatibilità della fotocamera.

In che modo le app possono ottenere lo stesso risultato dell'override

Imposta il flag di proprietà PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE su true.

Come ottimizzare le app

Vedi OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Come disattivare o disattivare l'override

Imposta il flag di proprietà PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE su false.

Flag proprietà da modificare

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

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

Per rimuovere la sostituzione:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT

Forza il ritaglio dell'output della fotocamera nell'orientamento opposto quando l'orientamento verticale della fotocamera non è allineato con l'orientamento naturale del dispositivo. Molte app non gestiscono questa situazione e, in caso contrario, visualizzano immagini allungate.

In che modo le app possono ottenere lo stesso risultato dell'override

Imposta il flag di proprietà PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT su true.

Come ottimizzare le app

Vedi OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Come disattivare o disattivare l'override

Imposta il flag di proprietà PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT su false.

Flag proprietà da modificare

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

Comandi adb per testare l'override

Per applicare l'override, che applica il ritaglio della fotocamera anteriore interna:

adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

Per rimuovere l'override, che rimuove il ritaglio della fotocamera anteriore interna:

adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION

Impedisce alle app di disattivare la condivisione della schermata dell'app (vedi Proiezione di contenuti multimediali). Implementata quando le app fanno un uso improprio dell'API createConfigForDefaultDisplay() per forzare l'acquisizione a schermo intero e mettere a rischio la privacy dell'utente esponendo i contenuti delle notifiche, che vengono acquisite con la condivisione a schermo intero ma non la schermata delle app, e tutte le app indipendentemente dalla modalità windowing.

In che modo le app possono ottenere lo stesso risultato dell'override

Consente il comportamento predefinito di proiezione multimediale (implementato in Android 14, a livello API 34, con createScreenCaptureIntent()), che consente agli utenti di decidere se condividere lo schermo intero o una singola finestra dell'app indipendentemente dalla modalità windowing. Oppure chiama createScreenCaptureIntent(MediaProjectionConfig) con un argomento MediaProjectionConfig restituito da una chiamata a createConfigForUserChoice().

Come ottimizzare le app

Consente agli utenti di scegliere se condividere l'intero display del dispositivo o una finestra dell'app durante la proiezione di contenuti multimediali, che è il comportamento predefinito a partire da Android 14.

Rendi la tua app ridimensionabile (resizeableActivity="true") per supportare la modalità multi-finestra.

Come disattivare o disattivare l'override

Data la gravità della privacy dell'utente, la tua app non può disattivare o disattivare questo override.

Flag proprietà da modificare

Nessuna.

Comandi adb per testare l'override

Per applicare l'override, che annulla la disattivazione della condivisione dello schermo parziale da parte dell'app (ovvero la condivisione dello schermo parziale):

adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

Per rimuovere l'override, che consente di disattivare la condivisione dello schermo parziale da parte dell'app:

adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS

Attiva l'invio di una falsa messa a fuoco per le app non pertinenti in modalità schermo diviso. Alcuni motori di gioco attendono di concentrarsi prima di disegnare i contenuti dell'app; pertanto, la contraffazione consente alle app di evitare di rimanere oscurate quando vengono riprese e non ancora impostate sullo stato attivo.

In che modo le app possono ottenere lo stesso risultato dell'override

Imposta il flag di proprietà PROPERTY_COMPAT_ENABLE_FAKE_FOCUS su true.

Come ottimizzare le app

Puoi evitare questo problema se l'app gestisce più orientamenti e modifiche di configurazione bene. Prepara l'app per schermi di grandi dimensioni seguendo le norme sulla qualità dell'app per schermi grandi.

Se esegui il motore grafico Unity, esegui l'upgrade alla versione 2019.4.40 o successiva ed esporta nuovamente il gioco. Mantieni selezionata l'opzione Resizable Window nelle impostazioni di Android Player.

Come disattivare o disattivare l'override

Imposta il flag di proprietà PROPERTY_COMPAT_ENABLE_FAKE_FOCUS su false.

Flag proprietà da modificare

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

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

Per rimuovere la sostituzione:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

Nota:i comandi applicano o rimuovono l'override solo temporaneamente.

Risorse aggiuntive