Modalità di compatibilità del dispositivo

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

I override per app consentono ai produttori di dispositivi, ai proprietari di dispositivi virtuali1 e agli utenti di modificare il comportamento delle app per migliorare il layout o impedire che le app smettano di funzionare su determinati dispositivi.

Android 16

Android 16 (livello API 36) ignora l'orientamento dello schermo, le proporzioni e le limitazioni di ridimensionamento delle app per migliorare il layout delle app sui fattori di forma con larghezza minima >= 600 dp.

I seguenti override per app non sono funzionali per le app che hanno come target il livello API 36:

Disattiva

La tua app può avere come target il livello API 36, ma disattivare il comportamento di Android 16, nel qual caso OVERRIDE_ANY_ORIENTATION_TO_USER non è applicabile.

Dichiarare la proprietà del manifest

Per disattivare il comportamento del livello API 36, dichiara la proprietà manifestPROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY.

Per disattivare un'attività specifica, imposta la proprietà nell'elemento <activity>:

<activity ...>
    <property
        android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
        android:value="true" />
    ...
</activity>

Per disattivare la funzionalità per l'intera app, imposta la proprietà nell'elemento <application>:

<application ...>
    <property
        android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
        android:value="true" />
    ...
</application>

Dispositivi di riferimento

I seguenti dispositivi potrebbero richiedere override per app a causa di configurazioni insolite o non 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 verticale, i layout delle app e l'anteprima della videocamera potrebbero non corrispondere alla visualizzazione del dispositivo.
  • Foldable orizzontali:alcuni dispositivi pieghevoli, come Pixel Fold, sono in orientamento verticale quando sono chiusi, ma in orientamento orizzontale quando sono aperti. Se le app presuppongono che l'orientamento aperto sia verticale, è probabile che si verifichino loop di sfarfallio o problemi di layout.
  • Smartphone pieghevoli a conchiglia: gli smartphone a conchiglia aperti sono in genere in orientamento verticale. Tuttavia, quando sono chiusi, gli smartphone hanno in genere un piccolo display in orientamento orizzontale. Le app devono identificare e adattarsi ai diversi orientamenti dei display.
  • Display esterni:alcuni dispositivi possono avviare una sessione di finestre del desktop su display esterni collegati. Le app devono eseguire query sui display esterni per ottenere informazioni come dimensioni e risoluzione dello schermo; in caso contrario, potrebbero fare ipotesi errate sui display, il che può portare a un comportamento errato dell'app.
  • Display dell'auto:molti, ma non tutti, i display dell'auto sono orizzontali. Lo sviluppo di app parcheggiate per i display delle auto è simile allo sviluppo per tablet.

Problemi di compatibilità comuni

Le app riscontrano problemi di compatibilità più spesso a causa di limitazioni dell'orientamento, di limitazioni di ridimensionamento e proporzioni, di gestione errata dell'orientamento dell'anteprima della videocamera e di API utilizzate in modo errato.

Letterboxing

Il letterbox posiziona l'app al centro dello schermo o, su schermi di grandi dimensioni, su un lato o sull'altro per un accesso comodo. Le barre (barre a tinta unita o sfondi sfocati) riempiono l'area di visualizzazione inutilizzata lungo i lati o la parte superiore e inferiore dell'app.

Il letterbox si verifica spesso sui dispositivi con schermi di grandi dimensioni perché le dimensioni e le proporzioni del display del dispositivo sono in genere diverse da quelle degli smartphone standard, per i quali sono progettate la maggior parte delle app.

Figura 1. L'app limitata all'orientamento verticale viene visualizzata con barre nere su tablet orizzontali e pieghevoli.

Problema

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

Le impostazioni di configurazione che controllano l'orientamento e il ridimensionamento delle app includono quanto segue:

  • 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 variabili. Su Android 11 (livello API 30) e versioni precedenti, specifica se le app supportano la modalità multi-finestra. Su Android 12 (livello API 31) e versioni successive, specifica se le app supportano la modalità multi-finestra su schermi piccoli (classe di dimensioni della finestra compatta). Su Android 12 e versioni successive, le app supportano la modalità multi-finestra su schermi di grandi dimensioni (classe di dimensioni della finestra media o espansa) 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 dei dispositivi 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 aggiunge bande nere all'app per preservare la continuità.

A partire da Android 12 (livello API 31) e continuando con 12L (livello API 32), la piattaforma applica una serie di miglioramenti alle app con letterbox. I produttori di dispositivi implementano i miglioramenti dell'interfaccia utente. Non è necessario eseguire ulteriori sviluppi per la tua app per usufruire dei 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, il che rende sempre visibili le icone sulle barre sullo sfondo letterbox.
  • Formato configurabile: il formato dell'app può essere regolato per migliorarne l'aspetto.

Figura 2. App in letterbox con miglioramenti dell'interfaccia utente.

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

  • Posizionamento configurabile:sugli schermi di grandi dimensioni, i produttori di dispositivi possono posizionare l'app sul lato sinistro o destro del display, rendendo più semplice l'interazione.

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

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

Figura 3. App in formato letterbox con finestra di dialogo di istruzioni per l'utente.

Modalità di compatibilità delle dimensioni

La modalità di compatibilità delle dimensioni è il letterbox che mantiene le proporzioni dell'app e include un controllo di riavvio. Il controllo consente agli utenti di riavviare l'app e ridisegnare la visualizzazione. Android richiama la modalità di compatibilità delle dimensioni per le app che non sono ridimensionabili. Quando un'attività viene spostata in un contenitore di visualizzazione incompatibile con le dimensioni dell'attività, il sistema potrebbe ridimensionare l'app per riempire il display del dispositivo in 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 in genere si applica alle attività con limitazioni di orientamento o proporzioni e configurate (o determinate dal sistema) in modo da non essere ridimensionabili.

La tua app è considerata ridimensionabile e non verrà 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 del display. Rendi ridimensionabile la tua app impostando l'attributo android:resizeableActivity dell'elemento <activity> o <application> su true nel manifest dell'app. Progetta layout adattabili/reattivi per la tua app. Per ulteriori informazioni, vedi Supportare diverse dimensioni di visualizzazione e Supportare la modalità multi-finestra.

Soluzione alternativa per la compatibilità

Android inserisce un'app in modalità di compatibilità delle dimensioni quando il sistema determina che la visualizzazione dell'app 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 di processi e thread.

Modalità di compatibilità dello schermo

La modalità di compatibilità dello schermo impedisce il riavvio di un'app quando si sposta tra schermi diversi, il che può attivare una modifica della configurazione, ad esempio una modifica della modalità colore, della disponibilità del touchscreen o della densità dello schermo.

La modalità di compatibilità del display è attivata per impostazione predefinita per i giochi (in base al flag android:appCategory) per migliorare la stabilità e la continuità. A differenza della modalità di compatibilità delle dimensioni, la modalità di compatibilità dello schermo non blocca la configurazione dell'app. L'app può comunque ricevere tutti gli aggiornamenti della configurazione tramite API come il callback onConfigurationChanged(), ma viene risparmiato un riavvio distruttivo. Ciò significa che i giochi che supportano correttamente API come onConfigurationChanged() possono comunque aggiornare in modo reattivo la propria UI anche se sono in modalità di compatibilità di visualizzazione.

Per disattivare la modalità di compatibilità con la visualizzazione e gestire le modifiche alla configurazione nella tua app, dichiara il supporto per le modifiche alla configurazione nel file AndroidManifest.xml dell'app e gestisci le modifiche alla configurazione nel callback onConfigurationChanged().

<activity
    android:name=".MyGameActivity"
    android:configChanges="colorMode|touchscreen|density|...">
    ...
</activity>

Loop tremolanti

Quando un'app non supporta tutti gli orientamenti di visualizzazione, potrebbe richiedere ripetutamente nuovi orientamenti quando si verifica una modifica della configurazione, creando un loop infinito che fa sfarfallare il display o ruotare l'app all'infinito.

Problema

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

Se le limitazioni di orientamento di un'app vengono ignorate, l'app può impostare programmaticamente il proprio orientamento chiamando Activity#setRequestedOrientation(). La chiamata attiva il riavvio dell'app se l'app non gestisce le modifiche alla configurazione (vedi Gestire le modifiche alla configurazione). Dopo il riavvio, le limitazioni dell'orientamento dell'app vengono nuovamente ignorate, l'app ripete la chiamata a setRequestedOrientation(), la chiamata attiva un riavvio dell'app e così via in un ciclo auto-perpetuante.

Un altro modo in cui potresti riscontrare questo problema è quando l'orientamento naturale (l'orientamento solito determinato da Android) dello schermo di un dispositivo è orizzontale (ovvero, la chiamata Display#getRotation() restituisce Surface.ROTATION_0 mentre il dispositivo ha un formato orizzontale). Storicamente, le app hanno sempre presupposto che Display.getRotation() = Surface.ROTATION_0 indichi che il dispositivo è in orientamento verticale, ma non è sempre così, ad esempio sullo schermo interno di alcuni dispositivi pieghevoli e su alcuni tablet.

Un'app in orientamento orizzontale su un display interno pieghevole potrebbe controllare la rotazione dello schermo, ricevere un valore di ROTATION_0, presupporre che l'orientamento naturale del dispositivo sia verticale e chiamare setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ) per riconfigurare il layout dell'app. Dopo il riavvio dell'app (in orientamento orizzontale), potrebbe controllare di nuovo la rotazione dello schermo, ricevere un valore di 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 in modo imprevisto da modifiche alla configurazione non gestite.
  • Supponi che l'orientamento naturale del dispositivo (ROTATION_0) sia verticale
  • Imposta l'orientamento in base a segnali non correlati alle dimensioni attuali della finestra, ad esempio Display#getRotation(), presenza di un FoldingFeature o API ritirate.

Soluzione alternativa per la compatibilità

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

  • L'attività è già stata riavviata da una chiamata precedente al metodo o è stato attivato il trattamento di rotazione forzata della compatibilità della videocamera (vedi Anteprima della videocamera di seguito).

    I produttori di dispositivi possono applicare questo comportamento a un'app con OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION.

  • L'attività ha effettuato più di due richieste di orientamento in un secondo, il che indica che si è verificato un loop. Delle due richieste nel ciclo, Android utilizza quella che massimizza l'area di visualizzazione dell'app.

    I produttori di dispositivi possono applicare questo comportamento a un'app con OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED.

  • I proprietari dei dispositivi virtuali hanno eseguito l'override della chiamata al metodo su alcuni dispositivi.

Anteprima fotocamera

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

Problema

Il Compatibility Definition Document di Android afferma che un sensore di immagine della videocamera "DEVE essere orientato in modo che la dimensione lunga della videocamera sia allineata alla dimensione lunga dello schermo".

Le app spesso presuppongono che l'orientamento del dispositivo e del sensore della videocamera sia verticale, un'ipotesi ragionevole sugli smartphone standard. Tuttavia, l'orientamento naturale di tablet e laptop e dei relativi sensori della fotocamera può essere orizzontale. Inoltre, i nuovi fattori di forma come i pieghevoli possono avere più orientamenti naturali e più sensori della fotocamera in orientamenti diversi.

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

Ottimizzazione

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

Soluzione alternativa per la compatibilità

Un dispositivo è in orientamento naturale quando Display#getRotation() restituisce Surface.ROTATION_0. Il sistema calcola CameraCharacteristics.SENSOR_ORIENTATION dall'orientamento naturale del dispositivo. Android allinea la finestra verticale delle app con orientamento verticale con l'orientamento naturale del dispositivo, che è quello che si aspettano la maggior parte delle app. Android ritaglia anche l'immagine del sensore della videocamera quando l'orientamento del sensore è orizzontale e l'anteprima della videocamera è verticale. Le soluzioni alternative specifiche includono:

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

    Quando un'app con orientamento verticale limitato è connessa alla videocamera, Android forza la rotazione dell'app per allineare la finestra verticale dell'app all'orientamento naturale del dispositivo.

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

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

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

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

  • Scalabilità delle proporzioni:il sistema modifica dinamicamente le proporzioni dell'anteprima della videocamera ruotata forzatamente a un rapporto di aspetto minimo più elevato, il che garantisce che l'anteprima della videocamera venga scalata correttamente.

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

API utilizzate in modo improprio

Poiché Android ha aggiunto il supporto per funzionalità come la modalità multi-finestra e dispositivi come i pieghevoli, le API legacy sono state ritirate e sostituite da API aggiornate che funzionano per tutte le dimensioni del display e i fattori di forma dei dispositivi. Tuttavia, le API ritirate sono ancora disponibili per la retrocompatibilità.

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

Problema

Gli sviluppatori continuano a utilizzare le API Display obsolete e presumono erroneamente che le API restituiscano i limiti dell'app anziché quelli dell'area di visualizzazione del dispositivo. Oppure gli sviluppatori utilizzano erroneamente API di visualizzazione per scopi speciali per ottenere metriche di visualizzazione generali. Il risultato sono errori di calcolo durante il riposizionamento degli elementi dell'interfaccia utente dopo gli eventi di ridimensionamento della finestra dell'app, che causano problemi di layout.

API Display deprecate e utilizzate in modo errato:

Per ulteriori informazioni, vedi Supporto della modalità multi-finestra.

API View utilizzate in modo improprio:

Ottimizzazione

Non fare mai affidamento sulle dimensioni fisiche del display per posizionare gli elementi dell'interfaccia utente. Esegui la migrazione della tua app alle API basate su WindowMetrics, incluse le seguenti API WindowManager:

Soluzione alternativa per la compatibilità

Due override modificano le API Display ritirate e le API View utilizzate in modo improprio per restituire i limiti dell'app: ALWAYS_SANDBOX_DISPLAY_APIS per le API Display; OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS per le API View. ALWAYS_SANDBOX_DISPLAY_APIS viene applicato per impostazione predefinita anche alle app che soddisfano i requisiti 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 correlati 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 del dispositivo, l'apertura e la chiusura del dispositivo e la modalità multi-finestra.

Problema

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

Ottimizzazione

Le attività trasparenti ereditano i vincoli dall'attività opaca più in alto nella pila di attività di un'attività. L'attività opaca deve essere disponibile per l'intero ciclo di vita dell'attività trasparente, dalla creazione all'eliminazione. Per questo motivo, non avviare richieste di autorizzazione da attività trampolino.

Se un'attività trampolino avvia una richiesta di autorizzazione, l'utente potrebbe non essere in grado di visualizzare la finestra di dialogo delle autorizzazioni perché l'attività trampolino sarà stata distrutta 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 le 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 riempiono lo spazio di visualizzazione disponibile. Se un'attività trasparente riempie lo spazio di visualizzazione disponibile, 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 delle autorizzazioni) non riempie lo spazio disponibile, spetta a te decidere se applicare o meno gli angoli arrotondati.

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

Soluzione alternativa per la compatibilità

Mantieni visibili le attività che avviano attività di dialogo finché l'utente non ha risposto 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
  • Proporzioni

Giochi Unity

I giochi Unity vengono eseguiti a schermo intero su Android o in modalità multi-finestra. Tuttavia, molti giochi Unity perdono la messa a fuoco e interrompono il disegno dei contenuti quando l'app viene inserita 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 reagiva correttamente al ciclo di vita dell'attività in modalità multi-finestra, causando la sospensione della riproduzione da parte di UnityPlayer quando l'app perde la messa a fuoco. Il giocatore ha visualizzato una schermata nera o l'ultimo fotogramma bloccato della partita. Il gioco è ripreso solo quando l'utente ha toccato lo schermo. Molte app che utilizzano il motore Unity riscontrano 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 successive ed esporta nuovamente il gioco. Mantieni selezionata l'opzione Resizable Window nelle impostazioni del player Android, altrimenti il gioco si mette in pausa quando non è in primo piano anche se è completamente visibile in modalità multi-finestra.

Soluzione alternativa per la compatibilità

I produttori di dispositivi possono applicare l'override OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS per app per fornire un evento di messa a fuoco fittizio a un'app in modalità multi-finestra. L'override consente all'attività di ridisegnare i contenuti e non essere oscurati.

Finestre delle app

Quando le app vengono eseguite in un ambiente di finestre del desktop, potrebbero essere disponibili modalità di compatibilità aggiuntive.

Le app con orientamento bloccato sono ridimensionabili liberamente. Anche se un'attività è bloccata sull'orientamento verticale, gli utenti possono comunque ridimensionare l'app in orientamento orizzontale.

Animazione del ridimensionamento di un&#39;app verticale in orizzontale.

Tuttavia, se un'attività viene dichiarata non ridimensionabile (resizeableActivity = false), la relativa UI viene scalata mantenendo le stesse proporzioni.

Animazione del ridimensionamento dell&#39;app. L&#39;interfaccia utente viene scalata per riempire la finestra del desktop.

Anteprima della videocamera nel sistema di finestre del computer

Quando le app nella finestra del desktop avviano un'anteprima della videocamera, la UI del mirino viene scalata mantenendo le proporzioni originali. Il resto della finestra dell'app può essere ridimensionato liberamente.

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

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

È in formato 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 isLetterboxed(activity: AppCompatActivity): 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(AppCompatActivity 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();
}

Quindi esegui un test per verificare il comportamento e assicurarti che l'attività di destinazione non sia letterbox:

Kotlin

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

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

Java

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

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

Idealmente, esegui questo tipo di test solo finché non viene superato e non viene verificato che le attività della tua app occupano l'intero spazio di visualizzazione disponibile per l'app. Testa la 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 FORCE_RESIZE_APP indica al sistema di ignorare la modalità di compatibilità delle dimensioni e ridimensionare l'app in modo che si adatti alle dimensioni del display anche se resizeableActivity="false" è specificato nel manifest dell'app.

I produttori di dispositivi applicano override a determinate app o a tutte le app su dispositivi specifici con schermo di grandi dimensioni. Su Android 14 (livello API 34) e versioni successive, gli utenti possono applicare override alle app tramite le impostazioni del dispositivo. Su Android 16 (livello API 36) e versioni successive, i proprietari di dispositivi virtuali applicano override su determinati dispositivi che gestiscono.

Override per app per utente

Su Android 14 e versioni successive, un menu delle impostazioni consente agli utenti di modificare le proporzioni delle app. I dispositivi con schermo grande, 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 poi impostano le proporzioni dell'app su 3:4, 1:1, schermo intero o un altro valore configurato dal produttore del dispositivo. Gli utenti possono anche reimpostare le proporzioni sui valori predefiniti dell'app, specificati nel 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 l'override della compatibilità delle proporzioni utente, aggiungi la proprietà al 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 delle 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 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 a schermo intero viene rimossa dall'elenco delle opzioni di proporzioni nelle impostazioni del dispositivo. Gli utenti non potranno applicare l'override 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 delle proporzioni nell'app. Utilizza le classi di dimensioni della finestra per supportare layout diversi in base alla quantità di spazio di visualizzazione disponibile.

Override per app del dispositivo

I produttori di dispositivi e i proprietari di dispositivi virtuali (selezionare app attendibili e privilegiate) applicano gli override in base all'app su dispositivi specifici, tra cui tablet, dispositivi pieghevoli, dispositivi ChromeOS e display per auto. I dispositivi di riferimento potrebbero applicare per impostazione predefinita alcuni degli override a una serie di app.

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à). Se attivata, gli override vengono applicati all'intera app.

Puoi anche utilizzare Android Debug Bridge (adb) per attivare o disattivare gli override e determinare quali si applicano 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 quali override si applicano alla tua app:

adb shell dumpsys platform_compat | grep <package name>

La tabella seguente elenca gli override disponibili e fornisce indicazioni su come ottimizzare l'app in modo che non debba fare affidamento sugli override. Puoi aggiungere flag di proprietà al manifest dell'app per disattivare alcuni override.

Override per app
Tipo Nome ID Descrizione
Ridimensionamento FORCE_RESIZE_APP 174042936 Ignora la modalità di compatibilità delle dimensioni per l'app in caso di modifiche alla configurazione.
FORCE_NON_RESIZE_APP 181136395 Forza l'app in modalità di compatibilità delle dimensioni in caso di modifiche alla configurazione.
Proporzioni OVERRIDE_MIN_ASPECT_RATIO 174042980 Override del gatekeeper che deve essere attivato per applicare qualsiasi altro override del formato.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY 203647190 Se abilitati (impostazione predefinita), i limiti sostituiscono l'ambito per le attività solo in verticale.
OVERRIDE_MIN_ASPECT_RATIO_SMALL 349045028 Modifica le proporzioni minime in 4:3.
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 per adattarsi al 50% delle dimensioni del display (o alle proporzioni dello schermo diviso).
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN 218959984 Disattiva l'override delle proporzioni minime in modo che le app siano a schermo intero quando il dispositivo è in verticale.
Orientamento OVERRIDE_ANY_ORIENTATION 265464455 Consente di ignorare qualsiasi orientamento.
OVERRIDE_ANY_ORIENTATION_TO_USER 310816437 Esegue l'override delle limitazioni di orientamento, ridimensionamento e proporzioni.
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT 265452344 Esegue l'override dell'orientamento in verticale quando un'attività ha un orientamento non definito.
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR 265451093 Esegue l'override dell'orientamento impostandolo su nosensor (utilizza l'orientamento naturale del dispositivo) quando un'attività ha un orientamento non definito.
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE 266124927 Ruota di 180 gradi le app solo orizzontali.
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA 265456536 Limita l'ambito dell'override dell'orientamento a quando l'app è connessa alla videocamera.
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION 255940284 Imposta la visualizzazione sull'orientamento orizzontale naturale fisso quando un'attività è a schermo intero (inclusa la visualizzazione 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 entro un secondo, il sistema considera questa situazione un ciclo infinito di rotazione e applica l'override.
OVERRIDE_RESPECT_REQUESTED_ORIENTATION 236283604 Impedisce il letterbox disattivando l'impostazione di ignoramento della richiesta di orientamento del produttore del dispositivo.
API Sandbox NEVER_SANDBOX_DISPLAY_APIS 184838306 Impedisce la modifica del comportamento di qualsiasi API Display.
ALWAYS_SANDBOX_DISPLAY_APIS 185004937 Forza le API Display nell'app a restituire i limiti dell'app. Le API Display restituiscono i limiti dell'area di visualizzazione logica, ma a volte l'app presuppone che le API Display restituiscano i limiti dell'app, il che comporta problemi di UI.
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS 237531167 Forza le API View utilizzate nell'app a restituire i limiti dell'app. Le API View restituiscono i limiti dell'area di visualizzazione logica, ma a volte l'app presuppone che le API View restituiscano i limiti dell'app, il che comporta problemi di UI.
Compatibilità della videocamera OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION 263959004 Disattiva la rotazione forzata. Per impostazione predefinita, tutte le app per videocamere a orientamento fisso vengono ruotate forzatamente quando viene aperta l'anteprima della videocamera.
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH 264304459 Rimuove l'aggiornamento forzato predefinito applicato quando l'anteprima di una videocamera viene ruotata forzatamente.
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE 264301586 Passa dall'aggiornamento forzato a un aggiornamento leggero quando l'anteprima di una videocamera viene ruotata forzatamente, il che aiuta a preservare lo stato durante la rotazione forzata. Per impostazione predefinita, Android applica un aggiornamento forzato quando l'anteprima della videocamera viene ruotata forzatamente. L'aggiornamento forzato può causare problemi con le app che perdono lo stato o diventano nere a seconda di come hanno memorizzato nella cache lo stato precedente.
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT 250678880 Ritaglia il buffer dell'immagine della fotocamera anteriore interna. Se l'override è disattivato, il ritaglio della fotocamera anteriore interna viene rimosso e il campo visivo dell'anteprima della videocamera viene aumentato. Per impostazione predefinita su alcuni dispositivi pieghevoli (vedi dispositivi di riferimento), il sistema ritaglia l'anteprima della fotocamera di tutte le app fotocamera quando si utilizza la fotocamera frontale interna.
Vari OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS 263259275 Impedisce che l'app venga oscurata quando perde la messa a fuoco in modalità schermo diviso. L'app attende il focus prima di disegnare i contenuti, il che può causare il blocco o l'oscuramento dell'app. L'override consente ad Android di inviare un evento di messa a fuoco fittizio all'app, che segnala all'app di iniziare di nuovo a disegnare i contenuti.

FORCE_RESIZE_APP

Forza i pacchetti a cui viene applicata l'override a essere ridimensionabili e in grado di entrare in modalità multi-finestra. Si applica a tutte le dimensioni dei display.

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

Nel file manifest dell'app, imposta l'attributo android:resizeableActivity su true.

Come ottimizzare le app

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

Come disattivare o disattivare l'override

Imposta il flag della proprietà PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES su false.

Flag della proprietà per regolare l'override

<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 ridimensionabile l'app:

adb shell am compat enable FORCE_RESIZE_APP <package>

Per rimuovere l'override:

adb shell am compat disable FORCE_RESIZE_APP <package>

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

FORCE_NON_RESIZE_APP

Forza i pacchetti a cui viene applicato l'override a non essere ridimensionabili e a entrare in modalità di compatibilità delle dimensioni in caso di modifiche alla configurazione. Si applica a tutte le dimensioni del display.

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

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

Come ottimizzare le app

Tutte le app che si comportano bene se ridimensionate devono avere android:resizeableActivity o android.supports_size_changes impostato su true. Le altre app devono essere migliorate per funzionare correttamente 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 della proprietà per regolare l'override

<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 l'override:

adb shell am compat disable FORCE_NON_RESIZE_APP <package>

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

OVERRIDE_MIN_ASPECT_RATIO

Il gatekeeper per tutti gli override che forzano un determinato rapporto di aspetto 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 del formato nella tua app. Assicurati che la tua app supporti diverse dimensioni di visualizzazione. Utilizza le classi di dimensioni della finestra per supportare layout diversi in base alla quantità di spazio disponibile per la tua app sullo schermo. Consulta l'API Compose WindowSizeClass e l'API View WindowSizeClass.

Come disattivare o disattivare l'override

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

Flag della proprietà per regolare l'override

<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 l'override:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>

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

OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY

Limita le impostazioni dell'app che forzano un determinato rapporto di aspetto minimo per le attività con orientamento solo verticale. È abilitata per impostazione predefinita e viene applicata solo se è abilitata anche l'opzione 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 della proprietà per regolare l'override

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 l'override:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

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

OVERRIDE_MIN_ASPECT_RATIO_SMALL

Imposta le proporzioni minime dell'attività su un valore piccolo (4:3).

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 della proprietà per regolare l'override

Vedi OVERRIDE_MIN_ASPECT_RATIO.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>

Per rimuovere l'override:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>

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

OVERRIDE_MIN_ASPECT_RATIO_MEDIUM

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 della proprietà per regolare l'override

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 l'override:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

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

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 della proprietà per regolare l'override

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 l'override:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`

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

OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN

Consente l'utilizzo delle proporzioni dello schermo diviso. Consente a un'app di utilizzare 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 della proprietà per regolare l'override

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 l'override:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

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

OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN

Disattiva l'override delle proporzioni minime 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 della proprietà per regolare l'override

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 l'override:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

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

OVERRIDE_ANY_ORIENTATION

Consente di eseguire l'override di qualsiasi orientamento con i seguenti override:

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

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

Come ottimizzare le app

La tua app deve supportare tutti gli orientamenti. Una modifica dell'orientamento è una modifica della configurazione, che può essere gestita in due modi: consentendo al sistema di distruggere e ricreare l'app o gestendo autonomamente le modifiche alla configurazione. Se gestisci personalmente le modifiche alla configurazione, lo stato dell'app può essere conservato utilizzando ViewModel. In casi molto limitati, puoi decidere di bloccare l'orientamento solo sui display di piccole dimensioni, anche se in questo modo la scalabilità potrebbe non essere ottimale come se l'utente potesse ruotare l'app in base alle esigenze. Su Android 12L e versioni successive, l'orientamento fisso può essere ignorato dalla configurazione del dispositivo. Per ulteriori informazioni sulla gestione delle modifiche alla configurazione e sul supporto di tutti gli orientamenti, consulta Gestire le modifiche alla configurazione, Panoramica di ViewModel e Orientamento dell'app limitato su smartphone, ma non su dispositivi con schermo di grandi dimensioni.

Come disattivare o disattivare l'override

Imposta il flag della proprietà PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE su false.

Flag della proprietà per regolare l'override

<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_ANY_ORIENTATION <package>

Per rimuovere l'override:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>

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

OVERRIDE_ANY_ORIENTATION_TO_USER

Consente all'app di riempire lo spazio di visualizzazione disponibile. Ignora le limitazioni relative a orientamento, ridimensionamento e proporzioni specificate nel file manifest dell'app. Inoltre, ignora le chiamate a Activity#setRequestedOrientation() o Activity#getRequestedOrientation().

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

  • Non impostare l'attributo android:screenOrientation del manifest o impostalo su "user".

  • Imposta l'attributo manifest android:resizeableActivity su true.

  • Sugli schermi piccoli, per supportare il ridimensionamento delle app disabilitando la modalità multi-finestra con android:resizeableActivity=false, imposta il flag di metadati android.supports_size_changes su true. Non impostare minAspectRatio e maxAspectRatio.

Come ottimizzare le app

Consenti alla tua app di supportare tutti gli orientamenti; non impostare una specifica screenOrientation nel manifest dell'app. Supporta il ridimensionamento delle app, la modalità multi-finestra e tutti i formati dello schermo impostando l'attributo android:resizeableActivity nel manifest dell'app su true. Vedi Supportare dimensioni del display diverse.

Come disattivare o disattivare l'override

Vedi OVERRIDE_ANY_ORIENTATION.

Flag della proprietà per regolare l'override

Vedi OVERRIDE_ANY_ORIENTATION.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

Per rimuovere l'override:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

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

OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT

Attiva l'orientamento verticale per tutte le attività nel pacchetto. A meno che OVERRIDE_ANY_ORIENTATION non sia abilitato, l'override viene utilizzato solo quando l'attività non ha specificato un altro orientamento fisso.

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

Vedi OVERRIDE_ANY_ORIENTATION.

Come ottimizzare le app

Vedi OVERRIDE_ANY_ORIENTATION.

Come disattivare o disattivare l'override

Vedi OVERRIDE_ANY_ORIENTATION.

Flag della proprietà per regolare l'override

Vedi OVERRIDE_ANY_ORIENTATION.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

Per rimuovere l'override:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

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

OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR

Attiva l'orientamento nosensor per tutte le attività nel pacchetto. A meno che non sia attivato OVERRIDE_ANY_ORIENTATION, l'override viene utilizzato solo quando l'attività non ha specificato un altro orientamento fisso.

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

Vedi OVERRIDE_ANY_ORIENTATION.

Come ottimizzare le app

Vedi OVERRIDE_ANY_ORIENTATION.

Come disattivare o disattivare l'override

Vedi OVERRIDE_ANY_ORIENTATION.

Flag della proprietà per regolare l'override

Vedi OVERRIDE_ANY_ORIENTATION.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

Per rimuovere l'override:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

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

OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE

Attiva l'orientamento reverseLandscape per tutte le attività nel pacchetto. A meno che non sia attivato OVERRIDE_ANY_ORIENTATION, l'override viene utilizzato solo quando l'attività non ha specificato un altro orientamento fisso.

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

Vedi OVERRIDE_ANY_ORIENTATION.

Come ottimizzare le app

Vedi OVERRIDE_ANY_ORIENTATION.

Come disattivare o disattivare l'override

Vedi OVERRIDE_ANY_ORIENTATION.

Flag della proprietà per regolare l'override

Vedi OVERRIDE_ANY_ORIENTATION.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

Per rimuovere l'override:

adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

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

OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA

Gli override 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

Vedi OVERRIDE_ANY_ORIENTATION.

Come ottimizzare le app

Vedi OVERRIDE_ANY_ORIENTATION.

Come disattivare o disattivare l'override

Vedi OVERRIDE_ANY_ORIENTATION.

Flag della proprietà per regolare l'override

Vedi OVERRIDE_ANY_ORIENTATION.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

Per rimuovere l'override:

adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

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

OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION

Limita l'orientamento del display all'orientamento orizzontale naturale quando si verificano le seguenti condizioni:

  • L'attività è a schermo intero
  • La proprietà del componente di disattivazione PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE non è attivata
  • L'impostazione Ignora richiesta di orientamento del produttore del dispositivo è attivata 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 deve essere risolto nella logica dell'applicazione.

Come ottimizzare le app

Vedi OVERRIDE_ANY_ORIENTATION.

Come disattivare o disattivare l'override

Imposta il flag della proprietà PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE su false.

Flag della proprietà per regolare l'override

<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 l'override:

adb shell am compat disable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

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

OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION

Attiva il criterio di compatibilità che salta l'aggiornamento dell'orientamento dell'app in risposta alla chiamata Activity#setRequestedOrientation() quando l'app viene riavviata o ha un trattamento di compatibilità della videocamera attivo.

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

Imposta il flag della proprietà PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION su true.

Come ottimizzare le app

Vedi OVERRIDE_ANY_ORIENTATION.

Come disattivare o disattivare l'override

Imposta il flag della proprietà PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION su false.

Flag della proprietà per regolare l'override

<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 l'override:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

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

OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED

Attiva il criterio di compatibilità che ignora l'orientamento richiesto da un'app in risposta alla chiamata dell'app Activity#setRequestedOrientation() più di due volte in un 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 deve essere risolto nella logica dell'applicazione.

Come ottimizzare le app

Vedi OVERRIDE_ANY_ORIENTATION.

Come disattivare o disattivare l'override

Imposta il flag della proprietà PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED su false.

Flag della proprietà per regolare l'override

<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 l'override:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

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

OVERRIDE_RESPECT_REQUESTED_ORIENTATION

Esclude i pacchetti dal comportamento di richiesta di ignorare l'orientamento che può essere attivato dai produttori di dispositivi per un'area di visualizzazione o l'intero display.

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

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

Come ottimizzare le app

Vedi OVERRIDE_ANY_ORIENTATION.

Come disattivare o disattivare l'override

Nessuna disattivazione. La disattivazione dell'override può essere pericolosa se l'app non è compatibile con un dispositivo in cui è attivata l'impostazione che consente al produttore del dispositivo di ignorare la richiesta di orientamento. Contatta Android Developer Relations per disattivare l'override.

Flag della proprietà per regolare l'override

Nessun flag di proprietà per questo override.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

Per rimuovere l'override:

adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

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

NEVER_SANDBOX_DISPLAY_APIS

Forza i pacchetti a non applicare mai il sandboxing dell'API Display per un'attività in modalità di compatibilità con le dimensioni o con letterbox. Le API Display continuano a fornire i limiti dell'area di visualizzazione.

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

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

Come ottimizzare le app

Le app che dichiarano di essere completamente ridimensionabili non devono mai fare affidamento sulle dimensioni del display per posizionare gli elementi dell'interfaccia utente. Esegui la migrazione della tua app ad API aggiornate che forniscono WindowMetrics. Se utilizzi Jetpack Compose, sfrutta l'API WindowSizeClass per disegnare la UI in base alla quantità di spazio sullo schermo disponibile per l'app sul display corrente. Vedi Utilizzare le classi di dimensioni della finestra.

Come disattivare o disattivare l'override

Nessuna disattivazione. Esegui la migrazione dalle API deprecate.

Flag della proprietà per regolare l'override

Nessun flag di proprietà per questo override.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>

Per rimuovere l'override:

adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>

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

ALWAYS_SANDBOX_DISPLAY_APIS

Forza l'applicazione del sandboxing API Display ai pacchetti indipendentemente dalla modalità finestra. Le API Display forniscono sempre i limiti dell'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 android.supports_size_changes dei metadati su false.

Come ottimizzare le app

Le app che dichiarano di essere completamente ridimensionabili non devono mai fare affidamento sulle dimensioni del display per posizionare gli elementi dell'interfaccia utente. Esegui la migrazione della tua app dalle API obsolete a API aggiornate che forniscono WindowMetrics. Vedi WindowMetricsCalculator.

Come disattivare o disattivare l'override

Nessuna disattivazione. Esegui la migrazione dalle API deprecate.

Flag della proprietà per regolare l'override

Nessun flag di proprietà per questo override.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable ALWAYS_SANDBOX_DISPLAY_APIS <package>

Per rimuovere l'override:

adb shell am compat disable ALWAYS_SANDBOX_DISPLAY_APIS <package>

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

OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS

Forza i pacchetti a eseguire il sandboxing delle seguenti API View nei limiti dell'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 vengano applicate all'app la modalità letterbox e la modalità multi-finestra. Vedi WindowMetricsCalculator.

Come disattivare o disattivare l'override

Imposta il flag della proprietà PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS su false.

Flag della proprietà per regolare l'override

<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 l'override:

adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

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

OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION

Disattiva 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 della proprietà PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION su false.

Come ottimizzare le app

Non fare affidamento sull'orientamento memorizzato nella cache del sensore della videocamera o sulle informazioni del dispositivo. Per indicazioni sulla compatibilità della videocamera, consulta Introduzione al mirino della videocamera e Supporto delle superfici ridimensionabili nell'app Fotocamera.

Come disattivare o disattivare l'override

Imposta il flag della proprietà PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION su true.

Flag della proprietà per regolare l'override

<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 temporaneamente l'override.

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 della 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 della proprietà PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH su true.

Flag della proprietà per regolare l'override

<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 temporaneamente l'override.

OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE

Fa sì che i pacchetti a cui viene applicato eseguano l'aggiornamento dell'attività utilizzando un ciclo onResume()onPause()onResume() anziché onResume()onStop()onResume() dopo la rotazione forzata della compatibilità della videocamera.

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

Imposta il flag della 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 della proprietà PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE su false.

Flag della proprietà per regolare l'override

<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 l'override:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

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

OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT

Forza il ritaglio dell'output della videocamera nell'orientamento opposto quando l'orientamento verticale della videocamera non è allineato all'orientamento naturale del dispositivo. Molte app non gestiscono questa situazione e visualizzano le immagini allungate.

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

Imposta il flag della 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 della proprietà PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT su false.

Flag della proprietà per regolare l'override

<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 temporaneamente l'override.

OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION

Impedisce alle app di disattivare la condivisione dello schermo dell'app (vedi Proiezione dei contenuti multimediali). Implementato quando le app utilizzano in modo improprio l'API createConfigForDefaultDisplay() per forzare l'acquisizione a schermo intero e compromettere la privacy dell'utente esponendo i contenuti delle notifiche, che vengono acquisite a schermo intero ma non con la condivisione dello schermo dell'app, e tutte le app indipendentemente dalla modalità finestra.

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

Consenti il comportamento predefinito di proiezione dei contenuti multimediali (implementato in Android 14, livello API 34, con createScreenCaptureIntent()), che consente agli utenti di decidere se condividere l'intero schermo o una singola finestra dell'app indipendentemente dalla modalità finestra. In alternativa, chiama createScreenCaptureIntent(MediaProjectionConfig) con un argomento MediaProjectionConfig restituito da una chiamata a createConfigForUserChoice().

Come ottimizzare le app

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

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

Come disattivare o disattivare l'override

A causa della serietà della privacy degli utenti, la tua app non può disattivare o disattivare questo override.

Flag della proprietà per regolare l'override

Nessuno.

Comandi adb per testare l'override

Per applicare l'override, che annulla la disattivazione della condivisione dello schermo parziale (ovvero la attiva):

adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

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

adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

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

OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS

Consente l'invio di un focus fittizio per le app senza focus in modalità schermo diviso. Alcuni motori di gioco attendono di ottenere lo stato attivo prima di disegnare i contenuti dell'app; pertanto, lo stato attivo fittizio aiuta le app a evitare di rimanere oscurate quando vengono riprese e non hanno ancora lo stato attivo.

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

Imposta il flag della proprietà PROPERTY_COMPAT_ENABLE_FAKE_FOCUS su true.

Come ottimizzare le app

Puoi evitare questo problema se la tua app gestisce bene più orientamenti e modifiche alla configurazione. Prepara la tua app per i grandi schermi seguendo le linee guida per la qualità delle app per i grandi schermi.

Se esegui il motore di gioco Unity, esegui l'upgrade alla versione 2019.4.40 o successive ed esporta nuovamente il gioco. Mantieni selezionata l'opzione Finestra ridimensionabile nelle impostazioni del player Android.

Come disattivare o disattivare l'override

Imposta il flag della proprietà PROPERTY_COMPAT_ENABLE_FAKE_FOCUS su false.

Flag della proprietà per regolare l'override

<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 l'override:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

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

OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS

Quando l'override è abilitato, l'attività riceve la configurazione accoppiata con i margini della barra dei sottotitoli codificati. Normalmente, gli inserti della barra delle didascalie sono disaccoppiati dalla configurazione.

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

Attiva la visualizzazione edge-to-edge o aggiorna l'SDK di destinazione dell'app al livello API 35 o superiore. Vedi quanto segue:

Come ottimizzare le app

Puoi evitare questo problema se la tua app attiva la visualizzazione edge-to-edge o ha come target il livello API 35 o versioni successive.

Come disattivare o disattivare l'override

Attiva la visualizzazione edge-to-edge o scegli come target il livello API 35 o versioni successive.

Flag della proprietà per regolare l'override

Nessuno.

Comandi adb per testare l'override

Per applicare l'override:

adb shell am compat enable OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS <package>

Per rimuovere l'override:

adb shell am compat disable OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS <package>

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

Risorse aggiuntive


  1. Il proprietario di un dispositivo virtuale è un'app attendibile o con privilegi che gestisce un dispositivo virtuale. I proprietari di dispositivi virtuali creano dispositivi virtuali per il rendering delle app e poi le proiettano su dispositivi remoti, come personal computer, dispositivi di realtà virtuale o sistemi di infotainment per auto. Il proprietario del dispositivo virtuale si trova su un dispositivo locale, ad esempio uno smartphone.